@happyvertical/smrt-core 0.51.39 → 0.53.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +9 -0
- package/README.md +8 -2
- package/agents/model-moves.md +114 -0
- package/agents/object-runtime.md +3 -1
- package/agents/run-once.md +16 -7
- package/agents/schema-paths.md +79 -0
- package/dist/cascade.d.ts.map +1 -1
- package/dist/cascade.js +6 -3
- package/dist/cascade.js.map +1 -1
- package/dist/collection.d.ts +10 -1
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +14 -4
- package/dist/collection.js.map +1 -1
- package/dist/errors.d.ts +18 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +21 -0
- package/dist/errors.js.map +1 -1
- package/dist/generators/preflight-route.d.ts.map +1 -1
- package/dist/generators/preflight-route.js +1 -1
- package/dist/generators/preflight-route.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/knowledge.d.ts.map +1 -1
- package/dist/knowledge.js +3 -0
- package/dist/knowledge.js.map +1 -1
- package/dist/manifest/static-manifest.d.ts.map +1 -1
- package/dist/manifest/static-manifest.js +9 -1
- package/dist/manifest/static-manifest.js.map +1 -1
- package/dist/manifest/store.js +1 -1
- package/dist/manifest/store.js.map +1 -1
- package/dist/manifest.json +9 -1
- package/dist/migrations/differ.d.ts +56 -0
- package/dist/migrations/differ.d.ts.map +1 -1
- package/dist/migrations/differ.js +152 -27
- package/dist/migrations/differ.js.map +1 -1
- package/dist/migrations/index.d.ts +1 -0
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +2 -1
- package/dist/migrations/null-equal-indexes.js +1 -1
- package/dist/migrations/orchestrate.d.ts +7 -0
- package/dist/migrations/orchestrate.d.ts.map +1 -1
- package/dist/migrations/orchestrate.js +4 -2
- package/dist/migrations/orchestrate.js.map +1 -1
- package/dist/migrations/qualified-name-aliases.d.ts +134 -0
- package/dist/migrations/qualified-name-aliases.d.ts.map +1 -0
- package/dist/migrations/qualified-name-aliases.js +294 -0
- package/dist/migrations/qualified-name-aliases.js.map +1 -0
- package/dist/migrations/tracker.d.ts +29 -1
- package/dist/migrations/tracker.d.ts.map +1 -1
- package/dist/migrations/tracker.js +92 -7
- package/dist/migrations/tracker.js.map +1 -1
- package/dist/migrations.js +2 -1
- package/dist/object.d.ts +128 -0
- package/dist/object.d.ts.map +1 -1
- package/dist/object.js +333 -44
- package/dist/object.js.map +1 -1
- package/dist/polymorphic-association.d.ts +18 -0
- package/dist/polymorphic-association.d.ts.map +1 -1
- package/dist/polymorphic-association.js +27 -2
- package/dist/polymorphic-association.js.map +1 -1
- package/dist/registry/class-registration.d.ts.map +1 -1
- package/dist/registry/class-registration.js +27 -4
- package/dist/registry/class-registration.js.map +1 -1
- package/dist/registry/name-resolver.d.ts +8 -2
- package/dist/registry/name-resolver.d.ts.map +1 -1
- package/dist/registry/name-resolver.js +17 -8
- package/dist/registry/name-resolver.js.map +1 -1
- package/dist/registry/qualified-name-aliases.d.ts +109 -0
- package/dist/registry/qualified-name-aliases.d.ts.map +1 -0
- package/dist/registry/qualified-name-aliases.js +286 -0
- package/dist/registry/qualified-name-aliases.js.map +1 -0
- package/dist/registry/relationship-graph.d.ts.map +1 -1
- package/dist/registry/relationship-graph.js +1 -1
- package/dist/registry/relationship-graph.js.map +1 -1
- package/dist/registry/schema-builder.d.ts.map +1 -1
- package/dist/registry/schema-builder.js +7 -5
- package/dist/registry/schema-builder.js.map +1 -1
- package/dist/registry/types.d.ts +26 -0
- package/dist/registry/types.d.ts.map +1 -1
- package/dist/registry.d.ts +127 -6
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +234 -14
- package/dist/registry.js.map +1 -1
- package/dist/scanner/index.d.ts +1 -1
- package/dist/scanner/index.d.ts.map +1 -1
- package/dist/scanner/manifest-generator.d.ts +14 -2
- package/dist/scanner/manifest-generator.d.ts.map +1 -1
- package/dist/scanner/manifest-generator.js +48 -9
- package/dist/scanner/manifest-generator.js.map +1 -1
- package/dist/scanner/types.d.ts +21 -0
- package/dist/scanner/types.d.ts.map +1 -1
- package/dist/scanner/types.js.map +1 -1
- package/dist/schema/conflict-target.d.ts +68 -11
- package/dist/schema/conflict-target.d.ts.map +1 -1
- package/dist/schema/conflict-target.js +75 -12
- package/dist/schema/conflict-target.js.map +1 -1
- package/dist/schema/foreign-key-ddl.d.ts +17 -1
- package/dist/schema/foreign-key-ddl.d.ts.map +1 -1
- package/dist/schema/foreign-key-ddl.js +29 -3
- package/dist/schema/foreign-key-ddl.js.map +1 -1
- package/dist/schema/foreign-key-policy.d.ts +8 -0
- package/dist/schema/foreign-key-policy.d.ts.map +1 -1
- package/dist/schema/foreign-key-policy.js +2 -1
- package/dist/schema/foreign-key-policy.js.map +1 -1
- package/dist/schema/generator.d.ts +7 -0
- package/dist/schema/generator.d.ts.map +1 -1
- package/dist/schema/generator.js +18 -10
- package/dist/schema/generator.js.map +1 -1
- package/dist/schema/text-cast-probe.d.ts +50 -1
- package/dist/schema/text-cast-probe.d.ts.map +1 -1
- package/dist/schema/text-cast-probe.js +46 -11
- package/dist/schema/text-cast-probe.js.map +1 -1
- package/dist/schema/types.d.ts +6 -0
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/scripts/browser-plain-json-regression.mjs +4 -1
- package/dist/smrt-knowledge.json +22 -11
- package/dist/utils/qualified-names.d.ts +11 -0
- package/dist/utils/qualified-names.d.ts.map +1 -1
- package/dist/utils/qualified-names.js +21 -1
- package/dist/utils/qualified-names.js.map +1 -1
- package/package.json +11 -11
package/dist/scanner/index.d.ts
CHANGED
|
@@ -8,5 +8,5 @@
|
|
|
8
8
|
* import { OxcScanner, ManifestAdapter } from '@happyvertical/smrt-scanner';
|
|
9
9
|
*/
|
|
10
10
|
export { generateManifest, ManifestGenerator } from './manifest-generator.js';
|
|
11
|
-
export type { AgentAdminRouteManifest, AgentComponentDeclaration, AgentFeature, AgentManifest, AgentMenuItem, AgentPermission, AgentUISlotManifest, FieldDefinition, MethodDefinition, ScanOptions, ScanResult, SmartObjectDefinition, SmartObjectManifest, } from './types.js';
|
|
11
|
+
export type { AgentAdminRouteManifest, AgentComponentDeclaration, AgentCreateEntryManifest, AgentFeature, AgentManifest, AgentMenuItem, AgentPermission, AgentUISlotManifest, FieldDefinition, MethodDefinition, ScanOptions, ScanResult, SmartObjectDefinition, SmartObjectManifest, } from './types.js';
|
|
12
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,YAAY,EACV,uBAAuB,EACvB,yBAAyB,EACzB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,YAAY,EACV,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
|
|
@@ -63,6 +63,17 @@ export declare class ManifestGenerator {
|
|
|
63
63
|
*/
|
|
64
64
|
injectTenantScopedFields(manifest: SmartObjectManifest): void;
|
|
65
65
|
private injectTenantScopedField;
|
|
66
|
+
/**
|
|
67
|
+
* Validate every `decoratorConfig.previousQualifiedNames` declaration
|
|
68
|
+
* (#3338). The declaration rides into the manifest verbatim — it is the
|
|
69
|
+
* lazy loader's alias index — so a malformed or colliding alias must stop
|
|
70
|
+
* the build rather than ship a manifest the runtime will refuse:
|
|
71
|
+
*
|
|
72
|
+
* - an array of scoped `@scope/package:ClassName` strings, each listed once;
|
|
73
|
+
* - never the object's own qualified name, nor any object of this manifest;
|
|
74
|
+
* - never declared by two objects of this manifest.
|
|
75
|
+
*/
|
|
76
|
+
assertQualifiedNameAliases(manifest: SmartObjectManifest): void;
|
|
66
77
|
assertTenantScopedSchemaContract(manifest: SmartObjectManifest): void;
|
|
67
78
|
private getTenantScopedSchemaOwner;
|
|
68
79
|
private getTenantScopedFieldTypeFailure;
|
|
@@ -98,8 +109,9 @@ export declare class ManifestGenerator {
|
|
|
98
109
|
/**
|
|
99
110
|
* Materialize the tenant-aware default conflict target (#2360).
|
|
100
111
|
*
|
|
101
|
-
* A tenant-
|
|
102
|
-
*
|
|
112
|
+
* A tenant-owned class — tenant-scoped, or carrying an undeclared
|
|
113
|
+
* `tenantId` field (`resolveOwnershipTenantColumn()`) — that declares no
|
|
114
|
+
* `@smrt({ conflictColumns })` keys on `[tenant column, ...natural key]` — `(tenant_id, slug, context)` for
|
|
103
115
|
* a class-per-table object, `(tenant_id, slug, context, _meta_type)` for a
|
|
104
116
|
* single-table hierarchy — so two tenants can each own the same slug and
|
|
105
117
|
* neither `save()` adopts the other's row. Writing the resolved key into
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-generator.d.ts","sourceRoot":"","sources":["../../src/scanner/manifest-generator.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"manifest-generator.d.ts","sourceRoot":"","sources":["../../src/scanner/manifest-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
+
import { defaultConflictColumns, resolveOwnershipTenantColumn, resolveTenantColumn } from "../schema/conflict-target.js";
|
|
1
2
|
import { resolveForeignKeyDeleteAction } from "../schema/foreign-key-policy.js";
|
|
2
3
|
import { classnameToTablename, toSnakeCase } from "../utils/naming.js";
|
|
3
4
|
import "./types.js";
|
|
4
|
-
import { createQualifiedName } from "../utils/qualified-names.js";
|
|
5
|
+
import { createQualifiedName, isQualifiedNameAliasFormat, readPreviousQualifiedNames } from "../utils/qualified-names.js";
|
|
5
6
|
import { generateToolManifest } from "../tools/tool-generator.js";
|
|
6
7
|
import { createManifestClassNamePredicate, resolveApiMethodExposure, resolveCustomActionMetadata, resolveEffectiveActionMetadata } from "../generators/custom-action.js";
|
|
7
8
|
import { VERBOSE_ENABLED } from "../registry/shared-state.js";
|
|
8
|
-
import { defaultConflictColumns, resolveTenantColumn } from "../schema/conflict-target.js";
|
|
9
9
|
import { SchemaGenerator } from "../schema/generator.js";
|
|
10
10
|
import { isTestFile } from "./test-file-patterns.js";
|
|
11
11
|
import { loadExternalManifestSync, lookupInManifest } from "../manifest/manifest-loader.js";
|
|
@@ -201,6 +201,7 @@ var ManifestGenerator = class {
|
|
|
201
201
|
* @param options - package metadata for the agent-manifest pass
|
|
202
202
|
*/
|
|
203
203
|
applyGenerationPasses(manifest, options) {
|
|
204
|
+
this.assertQualifiedNameAliases(manifest);
|
|
204
205
|
this.normalizeReportTenantScope(manifest);
|
|
205
206
|
this.injectTenantScopedFields(manifest);
|
|
206
207
|
this.mergeInheritedFields(manifest);
|
|
@@ -270,6 +271,40 @@ var ManifestGenerator = class {
|
|
|
270
271
|
};
|
|
271
272
|
logger.debug(`[manifest-generator] Injected ${fieldName} field for ${objectDef.className} (tenantScoped: ${JSON.stringify(tenantConfig)})`);
|
|
272
273
|
}
|
|
274
|
+
/**
|
|
275
|
+
* Validate every `decoratorConfig.previousQualifiedNames` declaration
|
|
276
|
+
* (#3338). The declaration rides into the manifest verbatim — it is the
|
|
277
|
+
* lazy loader's alias index — so a malformed or colliding alias must stop
|
|
278
|
+
* the build rather than ship a manifest the runtime will refuse:
|
|
279
|
+
*
|
|
280
|
+
* - an array of scoped `@scope/package:ClassName` strings, each listed once;
|
|
281
|
+
* - never the object's own qualified name, nor any object of this manifest;
|
|
282
|
+
* - never declared by two objects of this manifest.
|
|
283
|
+
*/
|
|
284
|
+
assertQualifiedNameAliases(manifest) {
|
|
285
|
+
const ownNames = /* @__PURE__ */ new Set();
|
|
286
|
+
for (const [key, obj] of Object.entries(manifest.objects)) ownNames.add(obj.qualifiedName ?? key);
|
|
287
|
+
const claimedBy = /* @__PURE__ */ new Map();
|
|
288
|
+
for (const key of Object.keys(manifest.objects).sort(compareText)) {
|
|
289
|
+
const obj = manifest.objects[key];
|
|
290
|
+
const owner = obj.qualifiedName ?? key;
|
|
291
|
+
const declared = obj.decoratorConfig?.previousQualifiedNames;
|
|
292
|
+
if (declared === void 0) continue;
|
|
293
|
+
if (!Array.isArray(declared)) throw new Error(`[manifest-generator] ${owner}: previousQualifiedNames must be an array of qualified names ("@package/name:ClassName").`);
|
|
294
|
+
const aliases = readPreviousQualifiedNames(obj.decoratorConfig);
|
|
295
|
+
if (aliases.length !== declared.length) throw new Error(`[manifest-generator] ${owner}: previousQualifiedNames must contain only string literals.`);
|
|
296
|
+
const seen = /* @__PURE__ */ new Set();
|
|
297
|
+
for (const alias of aliases) {
|
|
298
|
+
if (!isQualifiedNameAliasFormat(alias)) throw new Error(`[manifest-generator] ${owner}: previousQualifiedNames entry "${alias}" is not a qualified name ("@package/name:ClassName").`);
|
|
299
|
+
if (seen.has(alias)) throw new Error(`[manifest-generator] ${owner}: previousQualifiedNames lists "${alias}" more than once.`);
|
|
300
|
+
seen.add(alias);
|
|
301
|
+
if (ownNames.has(alias)) throw new Error(`[manifest-generator] ${owner}: previousQualifiedNames "${alias}" names a live object of this package; an alias may only name a class that no longer exists.`);
|
|
302
|
+
const other = claimedBy.get(alias);
|
|
303
|
+
if (other) throw new Error(`[manifest-generator] previousQualifiedNames "${alias}" is declared by both ${other} and ${owner}; an old name can resolve to only one class.`);
|
|
304
|
+
claimedBy.set(alias, owner);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
273
308
|
assertTenantScopedSchemaContract(manifest) {
|
|
274
309
|
const failures = [];
|
|
275
310
|
for (const objectDef of Object.values(manifest.objects)) {
|
|
@@ -464,8 +499,9 @@ var ManifestGenerator = class {
|
|
|
464
499
|
/**
|
|
465
500
|
* Materialize the tenant-aware default conflict target (#2360).
|
|
466
501
|
*
|
|
467
|
-
* A tenant-
|
|
468
|
-
*
|
|
502
|
+
* A tenant-owned class — tenant-scoped, or carrying an undeclared
|
|
503
|
+
* `tenantId` field (`resolveOwnershipTenantColumn()`) — that declares no
|
|
504
|
+
* `@smrt({ conflictColumns })` keys on `[tenant column, ...natural key]` — `(tenant_id, slug, context)` for
|
|
469
505
|
* a class-per-table object, `(tenant_id, slug, context, _meta_type)` for a
|
|
470
506
|
* single-table hierarchy — so two tenants can each own the same slug and
|
|
471
507
|
* neither `save()` adopts the other's row. Writing the resolved key into
|
|
@@ -489,9 +525,7 @@ var ManifestGenerator = class {
|
|
|
489
525
|
if (obj.decoratorConfig.report) continue;
|
|
490
526
|
if (this.isSTIChildClass(obj, manifest)) continue;
|
|
491
527
|
const tenantScoped = obj.decoratorConfig.tenantScoped;
|
|
492
|
-
|
|
493
|
-
const { tenantConfig } = this.normalizeTenantScopedConfig(tenantScoped);
|
|
494
|
-
const tenantColumn = resolveTenantColumn(tenantConfig.field, (fieldName) => Boolean(obj.fields[fieldName]), toSnakeCase);
|
|
528
|
+
const tenantColumn = resolveOwnershipTenantColumn(tenantScoped ? resolveTenantColumn(this.normalizeTenantScopedConfig(tenantScoped).tenantConfig.field, (fieldName) => Boolean(obj.fields[fieldName]), toSnakeCase) : void 0, (column) => Object.keys(obj.fields).some((fieldName) => toSnakeCase(fieldName) === column));
|
|
495
529
|
if (!tenantColumn) continue;
|
|
496
530
|
obj.decoratorConfig.conflictColumns = defaultConflictColumns(obj.decoratorConfig.tableStrategy === "sti" ? "sti" : "cti", tenantColumn);
|
|
497
531
|
}
|
|
@@ -547,7 +581,8 @@ var ManifestGenerator = class {
|
|
|
547
581
|
const { action } = resolveForeignKeyDeleteAction({
|
|
548
582
|
declared: field._meta?.onDelete,
|
|
549
583
|
isConflictColumn: conflictColumns.has(columnName),
|
|
550
|
-
isTenantIdField: false
|
|
584
|
+
isTenantIdField: false,
|
|
585
|
+
columnName
|
|
551
586
|
});
|
|
552
587
|
for (const sourceSchema of sourceSchemas) {
|
|
553
588
|
const sourceColumn = sourceSchema.columns[columnName];
|
|
@@ -660,11 +695,13 @@ var ManifestGenerator = class {
|
|
|
660
695
|
if (!sqlType && !referenceKind) continue;
|
|
661
696
|
const columnName = toSnakeCase(fieldName);
|
|
662
697
|
if (!obj.schema.columns[columnName]) continue;
|
|
663
|
-
|
|
698
|
+
const column = {
|
|
664
699
|
...obj.schema.columns[columnName],
|
|
665
700
|
...sqlType ? { type: String(sqlType).toUpperCase() } : {},
|
|
666
701
|
...referenceKind ? { referenceKind } : {}
|
|
667
702
|
};
|
|
703
|
+
if (String(column.type).toUpperCase() === "UUID" && column.default === "") delete column.default;
|
|
704
|
+
obj.schema.columns[columnName] = column;
|
|
668
705
|
}
|
|
669
706
|
}
|
|
670
707
|
getReferenceKind(field) {
|
|
@@ -1615,6 +1652,7 @@ ${fields}
|
|
|
1615
1652
|
}
|
|
1616
1653
|
}
|
|
1617
1654
|
const adminRoutes = obj.staticProperties?.adminRoutes ?? [];
|
|
1655
|
+
const createEntries = obj.staticProperties?.createEntries ?? [];
|
|
1618
1656
|
const signalSubscriptions = obj.staticProperties?.signalSubscriptions ?? [];
|
|
1619
1657
|
obj.agent = {
|
|
1620
1658
|
name: obj.className,
|
|
@@ -1624,6 +1662,7 @@ ${fields}
|
|
|
1624
1662
|
description: agentConfig.description,
|
|
1625
1663
|
uiSlots,
|
|
1626
1664
|
...adminRoutes.length > 0 ? { adminRoutes } : {},
|
|
1665
|
+
...createEntries.length > 0 ? { createEntries } : {},
|
|
1627
1666
|
...signalSubscriptions.length > 0 ? { signalSubscriptions } : {},
|
|
1628
1667
|
permissions,
|
|
1629
1668
|
features,
|