Skip to content

Commit ca10858

Browse files
Merge pull request #1200 from objectstack-ai/copilot/fix-sys-sys-object-issues
Fix doubly-prefixed FQN for ObjectOS system objects
2 parents 418c789 + ac86546 commit ca10858

11 files changed

Lines changed: 81 additions & 27 deletions

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Fixed
11+
- **Doubly-prefixed FQN for `@objectstack/objectos` system objects** — The ObjectOS-layer object definitions (`SysObject`, `SysView`, `SysAgent`, `SysTool`, `SysFlow`, `SysMetadata`) were being registered with fully-qualified names like `sys__sys_object`, `sys__sys_view`, `sys__sys_metadata`, because each object hard-coded a `sys_` prefix into its `name` **and** its manifest was registered under `namespace: 'sys'`, causing `SchemaRegistry.computeFQN(namespace, name)` to apply the prefix twice. The object `name` values are now the unprefixed short form (`object`, `view`, `agent`, `tool`, `flow`, `metadata`), producing the correct FQNs (`sys__object`, `sys__view`, `sys__agent`, `sys__tool`, `sys__flow`). `SysMetadata` (which would collide with the canonical `sys__metadata` owned by `@objectstack/metadata`) is now exported separately and excluded from the auto-registered `SystemObjects` catalog to avoid ownership conflicts; consumers that need it can still import it directly. See `packages/objectos/src/objects/*.ts` and `packages/objectos/src/registry.ts`.
12+
1013
### Added
1114
- **Environment-per-database multi-tenancy (`service-tenant` v4.1)** — Refactored the multi-tenant architecture from "per-organization database" to **per-environment database** high-isolation, with a hard split between Control Plane (environment registry / addressing / credentials / RBAC) and Data Plane (one physical database per environment). See [`docs/adr/0002-environment-database-isolation.md`](docs/adr/0002-environment-database-isolation.md) for the full rationale and trade-offs.
1215
- **Zod protocol schemas** (`packages/spec/src/cloud/environment.zod.ts`): `EnvironmentSchema`, `EnvironmentDatabaseSchema`, `DatabaseCredentialSchema`, `EnvironmentMemberSchema`, `EnvironmentTypeSchema`, `EnvironmentStatusSchema`, `EnvironmentRoleSchema`, `DatabaseCredentialStatusSchema`, `ProvisionEnvironmentRequest/ResponseSchema`, `ProvisionOrganizationRequest/ResponseSchema`. `TenantDatabaseSchema` is now marked `@deprecated`.

packages/metadata/src/plugin.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ export class MetadataPlugin implements Plugin {
8282
});
8383

8484
ctx.logger.info('Registered system metadata objects', {
85-
metadata: ['sys_metadata', 'sys_metadata_history'],
86-
objectos: Object.keys(SystemObjects),
85+
metadata: ['sys__metadata', 'sys__metadata_history'],
86+
objectos: Object.keys(SystemObjects).map((name) => `sys__${name}`),
8787
});
8888
} catch {
8989
// ObjectQL not loaded yet — objects will be discovered via legacy fallback

packages/objectos/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ await metadataService.registerSystemObjects(SystemObjects);
6161

6262
// Or register individual objects
6363
import { SysObject } from '@objectstack/objectos/objects';
64-
await metadataService.register('object', 'sys_object', SysObject);
64+
await metadataService.register('object', 'object', SysObject);
6565
```
6666

6767
## Design Philosophy

packages/objectos/src/objects/sys-agent.object.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@ import { ObjectSchema, Field } from '@objectstack/spec/data';
66
* sys_agent Object Definition
77
*
88
* Represents AI agent metadata as queryable data.
9+
*
10+
* Registered under namespace `sys`, so the fully qualified name (FQN) is
11+
* `sys__agent` (produced by `SchemaRegistry.computeFQN(namespace, name)`).
912
*/
1013
export const SysAgent = ObjectSchema.create({
11-
name: 'sys_agent',
14+
name: 'agent',
1215
namespace: 'sys',
1316
label: 'AI Agent',
1417
pluralLabel: 'AI Agents',

packages/objectos/src/objects/sys-flow.object.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@ import { ObjectSchema, Field } from '@objectstack/spec/data';
66
* sys_flow Object Definition
77
*
88
* Represents flow metadata as queryable data.
9+
*
10+
* Registered under namespace `sys`, so the fully qualified name (FQN) is
11+
* `sys__flow` (produced by `SchemaRegistry.computeFQN(namespace, name)`).
912
*/
1013
export const SysFlow = ObjectSchema.create({
11-
name: 'sys_flow',
14+
name: 'flow',
1215
namespace: 'sys',
1316
label: 'Flow',
1417
pluralLabel: 'Flows',

packages/objectos/src/objects/sys-metadata.object.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { SysMetadata } from './sys-metadata.object';
55

66
describe('SysMetadata Object', () => {
77
it('should have correct object name', () => {
8-
expect(SysMetadata.name).toBe('sys_metadata');
8+
expect(SysMetadata.name).toBe('metadata');
99
});
1010

1111
it('should have sys namespace', () => {

packages/objectos/src/objects/sys-metadata.object.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,18 @@ import { ObjectSchema, Field } from '@objectstack/spec/data';
66
* sys_metadata Object Definition
77
*
88
* Generic metadata envelope for ALL metadata types.
9-
* This is the source of truth for package management, version control, and deployment.
9+
*
10+
* ⚠️ NOTE: The canonical `sys__metadata` object used by the runtime is owned
11+
* by `@objectstack/metadata` (see `packages/metadata/src/objects/sys-metadata.object.ts`).
12+
* This richer schema is preserved here as a reference/design artifact for the
13+
* ObjectOS layer but is **not** auto-registered by `SystemObjects` — registering
14+
* it would cause an ownership conflict on the FQN `sys__metadata`.
15+
*
16+
* If you need to consume it directly, import the exported constant; do not
17+
* register it alongside `@objectstack/metadata` without coordinating ownership.
1018
*/
1119
export const SysMetadata = ObjectSchema.create({
12-
name: 'sys_metadata',
20+
name: 'metadata',
1321
namespace: 'sys',
1422
label: 'Metadata Record',
1523
pluralLabel: 'Metadata Records',

packages/objectos/src/objects/sys-object.object.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@ import { ObjectSchema, Field } from '@objectstack/spec/data';
77
*
88
* Represents object metadata as queryable data.
99
* Allows Studio to browse/filter/search object definitions using the Object Protocol.
10+
*
11+
* Registered under namespace `sys`, so the fully qualified name (FQN) is
12+
* `sys__object` (produced by `SchemaRegistry.computeFQN(namespace, name)`).
1013
*/
1114
export const SysObject = ObjectSchema.create({
12-
name: 'sys_object',
15+
name: 'object',
1316
namespace: 'sys',
1417
label: 'Object Definition',
1518
pluralLabel: 'Object Definitions',

packages/objectos/src/objects/sys-tool.object.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@ import { ObjectSchema, Field } from '@objectstack/spec/data';
66
* sys_tool Object Definition
77
*
88
* Represents AI tool metadata as queryable data.
9+
*
10+
* Registered under namespace `sys`, so the fully qualified name (FQN) is
11+
* `sys__tool` (produced by `SchemaRegistry.computeFQN(namespace, name)`).
912
*/
1013
export const SysTool = ObjectSchema.create({
11-
name: 'sys_tool',
14+
name: 'tool',
1215
namespace: 'sys',
1316
label: 'AI Tool',
1417
pluralLabel: 'AI Tools',

packages/objectos/src/objects/sys-view.object.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@ import { ObjectSchema, Field } from '@objectstack/spec/data';
66
* sys_view Object Definition
77
*
88
* Represents view metadata as queryable data.
9+
*
10+
* Registered under namespace `sys`, so the fully qualified name (FQN) is
11+
* `sys__view` (produced by `SchemaRegistry.computeFQN(namespace, name)`).
912
*/
1013
export const SysView = ObjectSchema.create({
11-
name: 'sys_view',
14+
name: 'view',
1215
namespace: 'sys',
1316
label: 'View Definition',
1417
pluralLabel: 'View Definitions',

0 commit comments

Comments
 (0)