@happyvertical/smrt-core 0.56.0 → 0.56.2
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 +6 -0
- package/agents/browser-entry.md +5 -0
- package/agents/generators.md +61 -0
- package/agents/object-runtime.md +17 -0
- package/dist/browser.d.ts +2 -0
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +3 -1
- package/dist/cookbook/engine/commands.d.ts.map +1 -1
- package/dist/cookbook/engine/commands.js +12 -0
- package/dist/cookbook/engine/commands.js.map +1 -1
- package/dist/cookbook/engine/defaults.d.ts.map +1 -1
- package/dist/cookbook/engine/defaults.js +8 -0
- package/dist/cookbook/engine/defaults.js.map +1 -1
- package/dist/cookbook/engine/document.d.ts +4 -0
- package/dist/cookbook/engine/document.d.ts.map +1 -1
- package/dist/cookbook/engine/document.js +11 -3
- package/dist/cookbook/engine/document.js.map +1 -1
- package/dist/cookbook/engine/engine.d.ts.map +1 -1
- package/dist/cookbook/engine/engine.js +3 -1
- package/dist/cookbook/engine/engine.js.map +1 -1
- package/dist/cookbook/engine/schemas.d.ts.map +1 -1
- package/dist/cookbook/engine/schemas.js +8 -0
- package/dist/cookbook/engine/schemas.js.map +1 -1
- package/dist/cookbook/engine/types.d.ts +5 -1
- package/dist/cookbook/engine/types.d.ts.map +1 -1
- package/dist/cookbook/engine/types.js.map +1 -1
- package/dist/generators/index.d.ts +1 -0
- package/dist/generators/index.d.ts.map +1 -1
- package/dist/generators/index.js +2 -1
- package/dist/generators/mcp-runtime-template.d.ts +3 -0
- package/dist/generators/mcp-runtime-template.d.ts.map +1 -1
- package/dist/generators/mcp-runtime-template.js +30 -4
- package/dist/generators/mcp-runtime-template.js.map +1 -1
- package/dist/generators/mcp.d.ts +5 -0
- package/dist/generators/mcp.d.ts.map +1 -1
- package/dist/generators/mcp.js +78 -7
- package/dist/generators/mcp.js.map +1 -1
- package/dist/generators.js +2 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/interceptors.d.ts +7 -0
- package/dist/interceptors.d.ts.map +1 -1
- package/dist/interceptors.js +15 -1
- package/dist/interceptors.js.map +1 -1
- package/dist/manifest/browser-capability.generated.d.ts.map +1 -1
- package/dist/manifest/browser-capability.generated.js +47 -5
- package/dist/manifest/browser-capability.generated.js.map +1 -1
- package/dist/manifest/index.js +1 -1
- package/dist/manifest/manifest-loader.d.ts.map +1 -1
- package/dist/manifest/manifest-loader.js +1 -2
- package/dist/manifest/manifest-loader.js.map +1 -1
- package/dist/manifest/static-manifest.js +1 -1
- package/dist/manifest/static-manifest.js.map +1 -1
- package/dist/manifest/store.js +1 -1
- package/dist/manifest.json +1 -1
- package/dist/mcp-serializer.d.ts +38 -0
- package/dist/mcp-serializer.d.ts.map +1 -0
- package/dist/mcp-serializer.js +60 -0
- package/dist/mcp-serializer.js.map +1 -0
- package/dist/object.d.ts +1 -0
- package/dist/object.d.ts.map +1 -1
- package/dist/object.js +44 -13
- package/dist/object.js.map +1 -1
- package/dist/registry/collection-exposure.d.ts +99 -0
- package/dist/registry/collection-exposure.d.ts.map +1 -0
- package/dist/registry/collection-exposure.js +135 -0
- package/dist/registry/collection-exposure.js.map +1 -0
- package/dist/registry/types.d.ts +13 -0
- package/dist/registry/types.d.ts.map +1 -1
- package/dist/registry.d.ts +8 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +76 -3
- package/dist/registry.js.map +1 -1
- package/dist/scanner/manifest-generator.d.ts +14 -0
- package/dist/scanner/manifest-generator.d.ts.map +1 -1
- package/dist/scanner/manifest-generator.js +66 -13
- package/dist/scanner/manifest-generator.js.map +1 -1
- package/dist/smrt-knowledge.json +13 -11
- package/dist/utils/import-project-vite.js +1 -1
- package/dist/utils/import-workspace-module.js +1 -1
- package/dist/utils/sha256.js +2 -2
- package/dist/vite-plugin/dev-plane-route.js +1 -1
- package/dist/vite-plugin/import-build-aware.js +1 -1
- package/dist/vite-plugin/index.js +2 -2
- package/dist/vite-plugin/resources-route.js +1 -1
- package/dist/vite-plugin/sveltekit-generator.d.ts.map +1 -1
- package/dist/vite-plugin/sveltekit-generator.js +5 -1
- package/dist/vite-plugin/sveltekit-generator.js.map +1 -1
- package/package.json +16 -10
- package/dist/node_modules/.pnpm/@noble_hashes@2.4.0/node_modules/@noble/hashes/_md.js +0 -169
- package/dist/node_modules/.pnpm/@noble_hashes@2.4.0/node_modules/@noble/hashes/_md.js.map +0 -1
- package/dist/node_modules/.pnpm/@noble_hashes@2.4.0/node_modules/@noble/hashes/_u64.js +0 -13
- package/dist/node_modules/.pnpm/@noble_hashes@2.4.0/node_modules/@noble/hashes/_u64.js.map +0 -1
- package/dist/node_modules/.pnpm/@noble_hashes@2.4.0/node_modules/@noble/hashes/sha2.js +0 -198
- package/dist/node_modules/.pnpm/@noble_hashes@2.4.0/node_modules/@noble/hashes/sha2.js.map +0 -1
- package/dist/node_modules/.pnpm/@noble_hashes@2.4.0/node_modules/@noble/hashes/utils.js +0 -243
- package/dist/node_modules/.pnpm/@noble_hashes@2.4.0/node_modules/@noble/hashes/utils.js.map +0 -1
- package/dist/node_modules/.pnpm/balanced-match@4.0.4/node_modules/balanced-match/dist/esm/index.js +0 -51
- package/dist/node_modules/.pnpm/balanced-match@4.0.4/node_modules/balanced-match/dist/esm/index.js.map +0 -1
- package/dist/node_modules/.pnpm/brace-expansion@5.0.11/node_modules/brace-expansion/dist/esm/index.js +0 -202
- package/dist/node_modules/.pnpm/brace-expansion@5.0.11/node_modules/brace-expansion/dist/esm/index.js.map +0 -1
- package/dist/node_modules/.pnpm/minimatch@10.2.6/node_modules/minimatch/dist/esm/assert-valid-pattern.js +0 -10
- package/dist/node_modules/.pnpm/minimatch@10.2.6/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map +0 -1
- package/dist/node_modules/.pnpm/minimatch@10.2.6/node_modules/minimatch/dist/esm/ast.js +0 -514
- package/dist/node_modules/.pnpm/minimatch@10.2.6/node_modules/minimatch/dist/esm/ast.js.map +0 -1
- package/dist/node_modules/.pnpm/minimatch@10.2.6/node_modules/minimatch/dist/esm/brace-expressions.js +0 -124
- package/dist/node_modules/.pnpm/minimatch@10.2.6/node_modules/minimatch/dist/esm/brace-expressions.js.map +0 -1
- package/dist/node_modules/.pnpm/minimatch@10.2.6/node_modules/minimatch/dist/esm/escape.js +0 -21
- package/dist/node_modules/.pnpm/minimatch@10.2.6/node_modules/minimatch/dist/esm/escape.js.map +0 -1
- package/dist/node_modules/.pnpm/minimatch@10.2.6/node_modules/minimatch/dist/esm/index.js +0 -629
- package/dist/node_modules/.pnpm/minimatch@10.2.6/node_modules/minimatch/dist/esm/index.js.map +0 -1
- package/dist/node_modules/.pnpm/minimatch@10.2.6/node_modules/minimatch/dist/esm/unescape.js +0 -28
- package/dist/node_modules/.pnpm/minimatch@10.2.6/node_modules/minimatch/dist/esm/unescape.js.map +0 -1
|
@@ -137,6 +137,8 @@ export declare class ManifestGenerator {
|
|
|
137
137
|
* @param manifest - The manifest to process in-place
|
|
138
138
|
*/
|
|
139
139
|
generateSchemas(manifest: SmartObjectManifest): void;
|
|
140
|
+
/** A report model's generated surface defaults to `list`/`get`. */
|
|
141
|
+
applyReportSurfaceDefaults(manifest: SmartObjectManifest): void;
|
|
140
142
|
normalizeReportObjects(manifest: SmartObjectManifest): void;
|
|
141
143
|
normalizeReportTenantScope(manifest: SmartObjectManifest): void;
|
|
142
144
|
/**
|
|
@@ -226,6 +228,18 @@ export declare class ManifestGenerator {
|
|
|
226
228
|
* @param manifest - The manifest to process in-place
|
|
227
229
|
*/
|
|
228
230
|
mergeInheritedFields(manifest: SmartObjectManifest): void;
|
|
231
|
+
/**
|
|
232
|
+
* Fail the build when a collection class opens a generated CRUD write (MCP
|
|
233
|
+
* or CLI) that its model keeps closed. Runs after inheritance, so only a
|
|
234
|
+
* collection's own `@smrt()` surface can trip it.
|
|
235
|
+
*/
|
|
236
|
+
private assertCollectionExposure;
|
|
237
|
+
/**
|
|
238
|
+
* Whether a class descends from any SMRT collection base (`SmrtCollection`,
|
|
239
|
+
* `SmrtJunction`, `SmrtJunctionBase`, `SmrtReportCollection`), following
|
|
240
|
+
* parents declared in this manifest.
|
|
241
|
+
*/
|
|
242
|
+
private extendsAnyCollectionBase;
|
|
229
243
|
/**
|
|
230
244
|
* Check if a class extends SmrtCollection (directly or indirectly)
|
|
231
245
|
*
|
|
@@ -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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"}
|
|
@@ -3,9 +3,11 @@ import { defaultConflictColumns, resolveOwnershipTenantColumn, resolveTenantColu
|
|
|
3
3
|
import { resolveForeignKeyDeleteAction, resolveForeignKeyUpdateAction } from "../schema/foreign-key-policy.js";
|
|
4
4
|
import { classnameToTablename, toSnakeCase } from "../utils/naming.js";
|
|
5
5
|
import { assertScopedPackageName, createQualifiedName, isQualifiedNameAliasFormat, readPreviousQualifiedNames } from "../utils/qualified-names.js";
|
|
6
|
+
import { isSmrtCollectionExtendsName } from "../registry/collection-resolution.js";
|
|
6
7
|
import "./types.js";
|
|
7
8
|
import { loadExternalManifestSync, lookupInManifest } from "../manifest/manifest-loader.js";
|
|
8
9
|
import { VERBOSE_ENABLED } from "../registry/shared-state.js";
|
|
10
|
+
import { findCollectionWriteEscalations, formatCollectionWriteEscalations, inheritCollectionExposure } from "../registry/collection-exposure.js";
|
|
9
11
|
import { generateToolManifest } from "../tools/tool-generator.js";
|
|
10
12
|
import { createManifestClassNamePredicate, resolveApiMethodExposure, resolveCustomActionMetadata, resolveEffectiveActionMetadata } from "../generators/custom-action.js";
|
|
11
13
|
import { FIELD_UI_FORMATS, FIELD_UI_FORMAT_TYPES, FIELD_UI_WIDGETS, FIELD_UI_WIDGET_TYPES, RELATIONSHIP_ROLES, displayLabelFieldProblem, isFieldUIFormat, isFieldUIWidget, isRelationshipRole, resolveDisplayLabelField } from "../ui-metadata.js";
|
|
@@ -226,6 +228,7 @@ var ManifestGenerator = class {
|
|
|
226
228
|
this.assertQualifiedNameAliases(manifest);
|
|
227
229
|
this.normalizeReportTenantScope(manifest);
|
|
228
230
|
this.injectTenantScopedFields(manifest);
|
|
231
|
+
this.applyReportSurfaceDefaults(manifest);
|
|
229
232
|
this.mergeInheritedFields(manifest);
|
|
230
233
|
const objectsByName = new Map(Object.values(manifest.objects).map((objectDef) => [objectDef.className, objectDef]));
|
|
231
234
|
for (const objectDef of Object.values(manifest.objects)) {
|
|
@@ -270,6 +273,7 @@ var ManifestGenerator = class {
|
|
|
270
273
|
};
|
|
271
274
|
}
|
|
272
275
|
}
|
|
276
|
+
this.assertCollectionExposure(manifest);
|
|
273
277
|
this.assertRecipeOptions(manifest);
|
|
274
278
|
this.assertRecipeHelp(manifest);
|
|
275
279
|
applyRecipeDemo(manifest, options?.packageName);
|
|
@@ -667,11 +671,18 @@ var ManifestGenerator = class {
|
|
|
667
671
|
}
|
|
668
672
|
}
|
|
669
673
|
}
|
|
670
|
-
|
|
674
|
+
/** A report model's generated surface defaults to `list`/`get`. */
|
|
675
|
+
applyReportSurfaceDefaults(manifest) {
|
|
671
676
|
for (const obj of Object.values(manifest.objects)) {
|
|
672
677
|
if (!obj.decoratorConfig?.report) continue;
|
|
673
678
|
obj.decoratorConfig.api ??= { include: ["list", "get"] };
|
|
674
679
|
obj.decoratorConfig.mcp ??= { include: ["list", "get"] };
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
normalizeReportObjects(manifest) {
|
|
683
|
+
this.applyReportSurfaceDefaults(manifest);
|
|
684
|
+
for (const obj of Object.values(manifest.objects)) {
|
|
685
|
+
if (!obj.decoratorConfig?.report) continue;
|
|
675
686
|
if (obj.decoratorConfig.conflictColumns) continue;
|
|
676
687
|
const tenantScoped = obj.decoratorConfig.tenantScoped;
|
|
677
688
|
const tenantField = tenantScoped && typeof tenantScoped === "object" ? tenantScoped.field || "tenantId" : tenantScoped ? "tenantId" : void 0;
|
|
@@ -1103,10 +1114,13 @@ var ManifestGenerator = class {
|
|
|
1103
1114
|
}
|
|
1104
1115
|
logger.debug(`[manifest-generator] ✅ ${obj.className} now has ${Object.keys(mergedFields).length} fields (including inherited)`);
|
|
1105
1116
|
}
|
|
1106
|
-
for (const obj of Object.values(manifest.objects))
|
|
1117
|
+
for (const obj of Object.values(manifest.objects)) {
|
|
1118
|
+
const isCollection = obj.extends === "SmrtCollection" || this.extendsCollection(obj, objectsByName);
|
|
1119
|
+
if (!isCollection && !this.extendsAnyCollectionBase(obj, objectsByName)) continue;
|
|
1107
1120
|
const itemClass = this.findItemClass(obj, manifest, objectsByName);
|
|
1108
|
-
if (itemClass)
|
|
1109
|
-
|
|
1121
|
+
if (!itemClass || itemClass === obj) continue;
|
|
1122
|
+
logger.debug(`[manifest-generator] ${obj.className} is a collection class for ${itemClass.className}`);
|
|
1123
|
+
if (isCollection) {
|
|
1110
1124
|
if (itemClass.decoratorConfig?.tableName) {
|
|
1111
1125
|
obj.decoratorConfig = obj.decoratorConfig || {};
|
|
1112
1126
|
obj.decoratorConfig.tableName = itemClass.decoratorConfig.tableName;
|
|
@@ -1116,19 +1130,58 @@ var ManifestGenerator = class {
|
|
|
1116
1130
|
logger.debug(`[manifest-generator] ${obj.className} inherits collection: '${itemClass.collection}' from item class ${itemClass.className} (was '${obj.collection}')`);
|
|
1117
1131
|
obj.collection = itemClass.collection;
|
|
1118
1132
|
}
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1133
|
+
}
|
|
1134
|
+
const inherited = inheritCollectionExposure(obj.decoratorConfig || {}, itemClass.decoratorConfig || {}, {
|
|
1135
|
+
collection: new Set(Object.keys(obj.methods || {})),
|
|
1136
|
+
item: new Set(Object.keys(itemClass.methods || {}))
|
|
1137
|
+
});
|
|
1138
|
+
if (Object.keys(inherited).length > 0) {
|
|
1139
|
+
obj.decoratorConfig = {
|
|
1140
|
+
...obj.decoratorConfig || {},
|
|
1141
|
+
...inherited
|
|
1142
|
+
};
|
|
1143
|
+
logger.debug(`[manifest-generator] ${obj.className} inherits ${Object.keys(inherited).join(", ")} exposure from item class ${itemClass.className}`);
|
|
1128
1144
|
}
|
|
1129
1145
|
}
|
|
1130
1146
|
}
|
|
1131
1147
|
/**
|
|
1148
|
+
* Fail the build when a collection class opens a generated CRUD write (MCP
|
|
1149
|
+
* or CLI) that its model keeps closed. Runs after inheritance, so only a
|
|
1150
|
+
* collection's own `@smrt()` surface can trip it.
|
|
1151
|
+
*/
|
|
1152
|
+
assertCollectionExposure(manifest) {
|
|
1153
|
+
const objectsByName = new Map(Object.values(manifest.objects).map((objectDef) => [objectDef.className, objectDef]));
|
|
1154
|
+
const findings = [];
|
|
1155
|
+
for (const obj of Object.values(manifest.objects)) {
|
|
1156
|
+
if (obj.extends !== "SmrtCollection" && !this.extendsCollection(obj, objectsByName) && !this.extendsAnyCollectionBase(obj, objectsByName)) continue;
|
|
1157
|
+
const itemClass = this.findItemClass(obj, manifest, objectsByName);
|
|
1158
|
+
if (!itemClass || itemClass === obj) continue;
|
|
1159
|
+
const escalations = findCollectionWriteEscalations(obj.decoratorConfig || {}, itemClass.decoratorConfig || {});
|
|
1160
|
+
if (escalations.length > 0) findings.push({
|
|
1161
|
+
collection: obj.qualifiedName || obj.className,
|
|
1162
|
+
model: itemClass.qualifiedName || itemClass.className,
|
|
1163
|
+
escalations
|
|
1164
|
+
});
|
|
1165
|
+
}
|
|
1166
|
+
if (findings.length > 0) throw new ConfigurationError(formatCollectionWriteEscalations(findings), "CONFIG_COLLECTION_EXPOSURE");
|
|
1167
|
+
}
|
|
1168
|
+
/**
|
|
1169
|
+
* Whether a class descends from any SMRT collection base (`SmrtCollection`,
|
|
1170
|
+
* `SmrtJunction`, `SmrtJunctionBase`, `SmrtReportCollection`), following
|
|
1171
|
+
* parents declared in this manifest.
|
|
1172
|
+
*/
|
|
1173
|
+
extendsAnyCollectionBase(obj, objectsByName) {
|
|
1174
|
+
let current = obj;
|
|
1175
|
+
const visited = /* @__PURE__ */ new Set();
|
|
1176
|
+
while (current?.extends) {
|
|
1177
|
+
if (isSmrtCollectionExtendsName(current.extends)) return true;
|
|
1178
|
+
if (visited.has(current.extends)) return false;
|
|
1179
|
+
visited.add(current.extends);
|
|
1180
|
+
current = objectsByName.get(current.extends);
|
|
1181
|
+
}
|
|
1182
|
+
return false;
|
|
1183
|
+
}
|
|
1184
|
+
/**
|
|
1132
1185
|
* Check if a class extends SmrtCollection (directly or indirectly)
|
|
1133
1186
|
*
|
|
1134
1187
|
* @param obj - The object definition to check
|