@happyvertical/smrt-core 0.37.9 → 0.37.11

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.
@@ -0,0 +1,174 @@
1
+ import { resolveApiActionSet } from "./sveltekit-generator.js";
2
+ //#region src/vite-plugin/web-collections.ts
3
+ /**
4
+ * Field types that are relationship pseudo-columns rather than persisted
5
+ * public-DTO columns — they never appear on the wire as scalar values.
6
+ */
7
+ var RELATIONSHIP_FIELD_TYPES = /* @__PURE__ */ new Set(["oneToMany", "manyToMany"]);
8
+ /**
9
+ * Field types that describe a relationship to another model. A superset of
10
+ * {@link RELATIONSHIP_FIELD_TYPES}: `foreignKey`/`crossPackageRef` are persisted
11
+ * scalar id columns (they DO appear on the wire), while `oneToMany`/`manyToMany`
12
+ * are pseudo-columns — but all four carry a `related` edge to a sibling model.
13
+ */
14
+ var RELATIONSHIP_EDGE_TYPES = /* @__PURE__ */ new Set([
15
+ "foreignKey",
16
+ "crossPackageRef",
17
+ "oneToMany",
18
+ "manyToMany"
19
+ ]);
20
+ /** Resolve a manifest object by qualified name or simple class name. */
21
+ function findByName(manifest, name) {
22
+ return Object.values(manifest.objects).find((candidate) => candidate.qualifiedName === name || candidate.className === name);
23
+ }
24
+ /**
25
+ * Normalize a relationship field's `related` value to a resolvable class name.
26
+ *
27
+ * Thunk forward-ref decorators — `@foreignKey(() => Scene)`, used heavily in
28
+ * video/voice for models that reference a class declared later — serialize as
29
+ * the RAW arrow-function source string `"() => Scene"` in the manifest, which
30
+ * neither `className` nor `qualifiedName` matches. Extract the target class
31
+ * name from the thunk so the edge resolves. Plain (`"Scene"`) and qualified
32
+ * (`"@happyvertical/smrt-assets:Asset"`) forms contain no `=>` and pass through
33
+ * untouched — the qualified `:` separator is preserved.
34
+ *
35
+ * Kept local to the relationship-edge path on purpose: extends-chain resolution
36
+ * never sees a thunk, so `findByName` and the scanner stay unchanged.
37
+ */
38
+ function normalizeRelatedName(related) {
39
+ const thunk = related.match(/=>\s*([A-Za-z_$][\w$]*)/);
40
+ return thunk ? thunk[1] : related.trim();
41
+ }
42
+ /**
43
+ * True when `obj` is (transitively) a SmrtCollection subclass. Collection
44
+ * classes describe access, not row shapes, so they never become web
45
+ * collection definitions.
46
+ *
47
+ * NOTE: deliberately stronger than sveltekit-generator's private
48
+ * `isCollectionClass`, which only inspects the direct base / a type argument.
49
+ * A deeper subclass (`SpecialWidgetCollection extends WidgetCollection`)
50
+ * carries no type argument of its own; without walking the extends chain it
51
+ * would be mistaken for a model and claim its base model's REST collection.
52
+ */
53
+ function isWebCollectionClass(manifest, obj, seen = /* @__PURE__ */ new Set()) {
54
+ if (obj.extends === "SmrtCollection" || !!obj.extendsTypeArg) return true;
55
+ const parentName = obj.extendsQualified || obj.extends;
56
+ if (!parentName || seen.has(parentName)) return false;
57
+ seen.add(parentName);
58
+ const parent = findByName(manifest, parentName);
59
+ return parent ? isWebCollectionClass(manifest, parent, seen) : false;
60
+ }
61
+ /**
62
+ * True when some ancestor model maps to the SAME REST collection (a shared STI
63
+ * table). The STI base model owns the shared table's single definition.
64
+ */
65
+ function isStiChildModel(manifest, obj) {
66
+ const seen = /* @__PURE__ */ new Set();
67
+ let parentName = obj.extendsQualified || obj.extends;
68
+ while (parentName && !seen.has(parentName)) {
69
+ seen.add(parentName);
70
+ const parent = findByName(manifest, parentName);
71
+ if (!parent) return false;
72
+ if (parent.collection === obj.collection) return true;
73
+ parentName = parent.extendsQualified || parent.extends;
74
+ }
75
+ return false;
76
+ }
77
+ /**
78
+ * Select the manifest entries that become web collection definitions: one per
79
+ * REST collection, STI children folding into their base model, collection
80
+ * classes excluded, and only models that expose `list` (a read surface is
81
+ * required to materialize a collection). Uses the canonical
82
+ * {@link resolveApiActionSet} so the exposed-action set matches exactly what
83
+ * the REST/SvelteKit generators actually emit.
84
+ */
85
+ function selectWebCollectionEntries(manifest) {
86
+ const byCollection = /* @__PURE__ */ new Map();
87
+ for (const obj of Object.values(manifest.objects)) {
88
+ if (isWebCollectionClass(manifest, obj)) continue;
89
+ const exposedActions = resolveApiActionSet(obj);
90
+ if (!exposedActions.has("list")) continue;
91
+ const isStiChild = isStiChildModel(manifest, obj);
92
+ const existing = byCollection.get(obj.collection);
93
+ if (existing && !(existing.isStiChild && !isStiChild)) continue;
94
+ byCollection.set(obj.collection, {
95
+ collection: obj.collection,
96
+ obj,
97
+ actions: [...exposedActions].sort(),
98
+ isStiChild
99
+ });
100
+ }
101
+ return [...byCollection.values()].map(({ collection, obj, actions }) => ({
102
+ collection,
103
+ obj,
104
+ actions
105
+ }));
106
+ }
107
+ /**
108
+ * Build the informational per-field metadata for a web collection definition:
109
+ * the persisted public-DTO columns only. Relationship pseudo-fields, STI meta
110
+ * internals, transient (unpersisted) and sensitive (wire-stripped) fields are
111
+ * excluded — they are not columns a client reads back over the REST surface.
112
+ */
113
+ function buildWebFieldDefinitions(obj) {
114
+ const fields = {};
115
+ for (const [fieldName, field] of Object.entries(obj.fields ?? {})) {
116
+ if (RELATIONSHIP_FIELD_TYPES.has(field.type)) continue;
117
+ if (field.type === "meta") continue;
118
+ if (field.transient) continue;
119
+ if (field.sensitive) continue;
120
+ fields[fieldName] = {
121
+ type: field.type,
122
+ ...field.required !== void 0 ? { required: field.required } : {},
123
+ ...field.default !== void 0 ? { default: field.default } : {}
124
+ };
125
+ }
126
+ return fields;
127
+ }
128
+ /**
129
+ * Build the manifest-derived relationship edges for a web collection
130
+ * definition (#1761): one entry per relationship field (`foreignKey`,
131
+ * `crossPackageRef`, `oneToMany`, `manyToMany`) whose `related` target resolves
132
+ * to another API-exposed REST collection.
133
+ *
134
+ * These edges drive relationship-derived cache invalidation in the browser
135
+ * client-data runtime: mutating this collection invalidates the caches of the
136
+ * collections named here. The invalidation graph is thus derived entirely from
137
+ * the manifest — no hand-wired cache keys.
138
+ *
139
+ * An edge is SKIPPED (not emitted) when:
140
+ * - `related` is missing, or
141
+ * - `related` cannot be resolved to a manifest object (e.g. a cross-package
142
+ * target not present in this package's manifest), or
143
+ * - the resolved target is not itself an API-exposed web collection (no read
144
+ * surface to invalidate — it never appears in {@link selectWebCollectionEntries}).
145
+ *
146
+ * Self-referential edges (a collection related to itself) are kept: the runtime
147
+ * always invalidates the mutated collection anyway, so a self edge is harmless
148
+ * and keeping it avoids a special case.
149
+ */
150
+ function buildWebRelationships(obj, manifest) {
151
+ const exposedCollections = new Set(selectWebCollectionEntries(manifest).map((entry) => entry.collection));
152
+ const relationships = [];
153
+ const seen = /* @__PURE__ */ new Set();
154
+ for (const [fieldName, field] of Object.entries(obj.fields ?? {})) {
155
+ if (!RELATIONSHIP_EDGE_TYPES.has(field.type)) continue;
156
+ if (!field.related) continue;
157
+ const target = findByName(manifest, normalizeRelatedName(field.related));
158
+ if (!target) continue;
159
+ if (!exposedCollections.has(target.collection)) continue;
160
+ const dedupeKey = `${fieldName}:${target.collection}`;
161
+ if (seen.has(dedupeKey)) continue;
162
+ seen.add(dedupeKey);
163
+ relationships.push({
164
+ field: fieldName,
165
+ kind: field.type,
166
+ relatedCollection: target.collection
167
+ });
168
+ }
169
+ return relationships;
170
+ }
171
+ //#endregion
172
+ export { buildWebFieldDefinitions, buildWebRelationships, selectWebCollectionEntries };
173
+
174
+ //# sourceMappingURL=web-collections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-collections.js","names":[],"sources":["../../src/vite-plugin/web-collections.ts"],"sourcesContent":["/**\n * Manifest → web collection selection (single source of truth).\n *\n * The browser client data runtime (`@happyvertical/smrt-web`, #1761) consumes\n * one typed collection definition per API-exposed REST collection. Three\n * emission sites need the SAME selection and field rules, or the emitted\n * runtime values and their declared types drift apart:\n *\n * - the `\\0smrt:web` runtime virtual module (JSON literal — {@link generateWebModule})\n * - the `@happyvertical/smrt-virt-web` ambient d.ts (vite-plugin)\n * - the physical `@smrt/web` d.ts (prebuild, for `tsc`-only consumers)\n *\n * All three import {@link selectWebCollectionEntries} from here so the value\n * emission and the type emission can never disagree.\n */\n\nimport type {\n FieldDefinition,\n SmartObjectDefinition,\n SmartObjectManifest,\n} from '../scanner/types.js';\nimport { resolveApiActionSet } from './sveltekit-generator.js';\n\n/**\n * Field types that are relationship pseudo-columns rather than persisted\n * public-DTO columns — they never appear on the wire as scalar values.\n */\nconst RELATIONSHIP_FIELD_TYPES: ReadonlySet<FieldDefinition['type']> = new Set([\n 'oneToMany',\n 'manyToMany',\n]);\n\n/**\n * Field types that describe a relationship to another model. A superset of\n * {@link RELATIONSHIP_FIELD_TYPES}: `foreignKey`/`crossPackageRef` are persisted\n * scalar id columns (they DO appear on the wire), while `oneToMany`/`manyToMany`\n * are pseudo-columns — but all four carry a `related` edge to a sibling model.\n */\nconst RELATIONSHIP_EDGE_TYPES: ReadonlySet<FieldDefinition['type']> = new Set([\n 'foreignKey',\n 'crossPackageRef',\n 'oneToMany',\n 'manyToMany',\n]);\n\n/** Informational per-column metadata carried by a collection definition. */\nexport interface WebFieldDefinition {\n type: FieldDefinition['type'];\n required?: boolean;\n default?: unknown;\n}\n\n/** The relationship kinds a web collection edge can describe. */\nexport type WebRelationshipKind =\n | 'foreignKey'\n | 'crossPackageRef'\n | 'oneToMany'\n | 'manyToMany';\n\n/**\n * One manifest-derived relationship edge from a collection to a sibling REST\n * collection. Consumed by the browser client-data runtime to invalidate\n * dependent collection caches when this collection is mutated (#1761) — the\n * cache-invalidation graph is derived entirely from these edges, never\n * hand-wired. SMRT-owned data: no client-engine type appears here.\n */\nexport interface WebRelationship {\n /** The declaring field carrying the relationship (e.g. `groupId`, `items`). */\n field: string;\n /** The relationship kind, mirroring the manifest field type. */\n kind: WebRelationshipKind;\n /** REST collection name the edge resolves to (e.g. `ad_groups`). */\n relatedCollection: string;\n}\n\n/** One selected REST collection and the model that owns its definition. */\nexport interface WebCollectionEntry {\n /** REST collection name (pluralized), e.g. `products`. */\n collection: string;\n /** The manifest object that owns this collection's definition. */\n obj: SmartObjectDefinition;\n /** Sorted set of exposed CRUD + custom actions. */\n actions: string[];\n}\n\n/** Resolve a manifest object by qualified name or simple class name. */\nfunction findByName(\n manifest: SmartObjectManifest,\n name: string,\n): SmartObjectDefinition | undefined {\n return Object.values(manifest.objects).find(\n (candidate) =>\n candidate.qualifiedName === name || candidate.className === name,\n );\n}\n\n/**\n * Normalize a relationship field's `related` value to a resolvable class name.\n *\n * Thunk forward-ref decorators — `@foreignKey(() => Scene)`, used heavily in\n * video/voice for models that reference a class declared later — serialize as\n * the RAW arrow-function source string `\"() => Scene\"` in the manifest, which\n * neither `className` nor `qualifiedName` matches. Extract the target class\n * name from the thunk so the edge resolves. Plain (`\"Scene\"`) and qualified\n * (`\"@happyvertical/smrt-assets:Asset\"`) forms contain no `=>` and pass through\n * untouched — the qualified `:` separator is preserved.\n *\n * Kept local to the relationship-edge path on purpose: extends-chain resolution\n * never sees a thunk, so `findByName` and the scanner stay unchanged.\n */\nfunction normalizeRelatedName(related: string): string {\n const thunk = related.match(/=>\\s*([A-Za-z_$][\\w$]*)/);\n return thunk ? thunk[1] : related.trim();\n}\n\n/**\n * True when `obj` is (transitively) a SmrtCollection subclass. Collection\n * classes describe access, not row shapes, so they never become web\n * collection definitions.\n *\n * NOTE: deliberately stronger than sveltekit-generator's private\n * `isCollectionClass`, which only inspects the direct base / a type argument.\n * A deeper subclass (`SpecialWidgetCollection extends WidgetCollection`)\n * carries no type argument of its own; without walking the extends chain it\n * would be mistaken for a model and claim its base model's REST collection.\n */\nfunction isWebCollectionClass(\n manifest: SmartObjectManifest,\n obj: SmartObjectDefinition,\n seen: Set<string> = new Set(),\n): boolean {\n // Truthy check (not `!== undefined`) mirrors the scanner's own\n // manifest-generator: a scanner that emits `extendsTypeArg: null` for a\n // non-generic base must not be misread as a collection.\n if (obj.extends === 'SmrtCollection' || !!obj.extendsTypeArg) {\n return true;\n }\n const parentName = obj.extendsQualified || obj.extends;\n if (!parentName || seen.has(parentName)) return false;\n seen.add(parentName);\n const parent = findByName(manifest, parentName);\n return parent ? isWebCollectionClass(manifest, parent, seen) : false;\n}\n\n/**\n * True when some ancestor model maps to the SAME REST collection (a shared STI\n * table). The STI base model owns the shared table's single definition.\n */\nfunction isStiChildModel(\n manifest: SmartObjectManifest,\n obj: SmartObjectDefinition,\n): boolean {\n const seen = new Set<string>();\n let parentName = obj.extendsQualified || obj.extends;\n while (parentName && !seen.has(parentName)) {\n seen.add(parentName);\n const parent = findByName(manifest, parentName);\n if (!parent) return false;\n if (parent.collection === obj.collection) return true;\n parentName = parent.extendsQualified || parent.extends;\n }\n return false;\n}\n\n/**\n * Select the manifest entries that become web collection definitions: one per\n * REST collection, STI children folding into their base model, collection\n * classes excluded, and only models that expose `list` (a read surface is\n * required to materialize a collection). Uses the canonical\n * {@link resolveApiActionSet} so the exposed-action set matches exactly what\n * the REST/SvelteKit generators actually emit.\n */\nexport function selectWebCollectionEntries(\n manifest: SmartObjectManifest,\n): WebCollectionEntry[] {\n const byCollection = new Map<\n string,\n WebCollectionEntry & { isStiChild: boolean }\n >();\n\n for (const obj of Object.values(manifest.objects)) {\n if (isWebCollectionClass(manifest, obj)) continue;\n\n const exposedActions = resolveApiActionSet(obj);\n if (!exposedActions.has('list')) continue;\n\n const isStiChild = isStiChildModel(manifest, obj);\n const existing = byCollection.get(obj.collection);\n // One definition per REST collection. The STI BASE model owns it: a child\n // only wins while no base has been recorded yet, so the result is\n // independent of declaration / scan order.\n if (existing && !(existing.isStiChild && !isStiChild)) continue;\n\n byCollection.set(obj.collection, {\n collection: obj.collection,\n obj,\n actions: [...exposedActions].sort(),\n isStiChild,\n });\n }\n\n return [...byCollection.values()].map(({ collection, obj, actions }) => ({\n collection,\n obj,\n actions,\n }));\n}\n\n/**\n * Build the informational per-field metadata for a web collection definition:\n * the persisted public-DTO columns only. Relationship pseudo-fields, STI meta\n * internals, transient (unpersisted) and sensitive (wire-stripped) fields are\n * excluded — they are not columns a client reads back over the REST surface.\n */\nexport function buildWebFieldDefinitions(\n obj: SmartObjectDefinition,\n): Record<string, WebFieldDefinition> {\n const fields: Record<string, WebFieldDefinition> = {};\n for (const [fieldName, field] of Object.entries(obj.fields ?? {})) {\n if (RELATIONSHIP_FIELD_TYPES.has(field.type)) continue;\n if (field.type === 'meta') continue;\n if (field.transient) continue;\n if (field.sensitive) continue;\n fields[fieldName] = {\n type: field.type,\n ...(field.required !== undefined ? { required: field.required } : {}),\n ...(field.default !== undefined ? { default: field.default } : {}),\n };\n }\n return fields;\n}\n\n/**\n * Build the manifest-derived relationship edges for a web collection\n * definition (#1761): one entry per relationship field (`foreignKey`,\n * `crossPackageRef`, `oneToMany`, `manyToMany`) whose `related` target resolves\n * to another API-exposed REST collection.\n *\n * These edges drive relationship-derived cache invalidation in the browser\n * client-data runtime: mutating this collection invalidates the caches of the\n * collections named here. The invalidation graph is thus derived entirely from\n * the manifest — no hand-wired cache keys.\n *\n * An edge is SKIPPED (not emitted) when:\n * - `related` is missing, or\n * - `related` cannot be resolved to a manifest object (e.g. a cross-package\n * target not present in this package's manifest), or\n * - the resolved target is not itself an API-exposed web collection (no read\n * surface to invalidate — it never appears in {@link selectWebCollectionEntries}).\n *\n * Self-referential edges (a collection related to itself) are kept: the runtime\n * always invalidates the mutated collection anyway, so a self edge is harmless\n * and keeping it avoids a special case.\n */\nexport function buildWebRelationships(\n obj: SmartObjectDefinition,\n manifest: SmartObjectManifest,\n): WebRelationship[] {\n // The set of REST collections that are actually materialized as web\n // collections. An edge to a model outside this set has no client cache to\n // invalidate, so it is dropped.\n const exposedCollections = new Set(\n selectWebCollectionEntries(manifest).map((entry) => entry.collection),\n );\n\n const relationships: WebRelationship[] = [];\n const seen = new Set<string>();\n for (const [fieldName, field] of Object.entries(obj.fields ?? {})) {\n if (!RELATIONSHIP_EDGE_TYPES.has(field.type)) continue;\n if (!field.related) continue;\n\n // Normalize first: `@foreignKey(() => Scene)` thunks serialize as the raw\n // \"() => Scene\" source, which findByName cannot match on its own.\n const target = findByName(manifest, normalizeRelatedName(field.related));\n if (!target) continue;\n if (!exposedCollections.has(target.collection)) continue;\n\n // De-dupe on (field, relatedCollection): a model never declares the same\n // field twice, but guard anyway so the emitted edge list is stable.\n const dedupeKey = `${fieldName}:${target.collection}`;\n if (seen.has(dedupeKey)) continue;\n seen.add(dedupeKey);\n\n relationships.push({\n field: fieldName,\n kind: field.type as WebRelationshipKind,\n relatedCollection: target.collection,\n });\n }\n return relationships;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-core",
3
- "version": "0.37.9",
3
+ "version": "0.37.11",
4
4
  "description": "Core AI agent framework with standardized collections, object-relational mapping, and code generators",
5
5
  "author": "HappyVertical",
6
6
  "type": "module",
@@ -154,9 +154,9 @@
154
154
  "tsx": "^4.22.4",
155
155
  "typescript": "^5.9.3",
156
156
  "yaml": "^2.9.0",
157
- "@happyvertical/smrt-config": "0.37.9",
158
- "@happyvertical/smrt-types": "0.37.9",
159
- "@happyvertical/smrt-scanner": "0.37.9"
157
+ "@happyvertical/smrt-config": "0.37.11",
158
+ "@happyvertical/smrt-scanner": "0.37.11",
159
+ "@happyvertical/smrt-types": "0.37.11"
160
160
  },
161
161
  "peerDependencies": {
162
162
  "@huggingface/transformers": ">=3.0.0 <4.0.0",