@happyvertical/smrt-core 0.40.69 → 0.41.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.
Files changed (237) hide show
  1. package/AGENTS.md +29 -4
  2. package/README.md +20 -1
  3. package/agents/change-feed.md +1 -1
  4. package/agents/query-bounds.md +45 -0
  5. package/agents/schema-paths.md +786 -0
  6. package/dist/browser.d.ts +1 -0
  7. package/dist/browser.d.ts.map +1 -1
  8. package/dist/browser.js +5 -3
  9. package/dist/cascade.d.ts +120 -0
  10. package/dist/cascade.d.ts.map +1 -0
  11. package/dist/cascade.js +430 -0
  12. package/dist/cascade.js.map +1 -0
  13. package/dist/change-feed.d.ts +34 -2
  14. package/dist/change-feed.d.ts.map +1 -1
  15. package/dist/change-feed.js +52 -11
  16. package/dist/change-feed.js.map +1 -1
  17. package/dist/class.d.ts +36 -3
  18. package/dist/class.d.ts.map +1 -1
  19. package/dist/class.js +87 -9
  20. package/dist/class.js.map +1 -1
  21. package/dist/collection-cache.js +0 -0
  22. package/dist/collection-cache.js.map +1 -1
  23. package/dist/collection.d.ts +130 -2
  24. package/dist/collection.d.ts.map +1 -1
  25. package/dist/collection.js +290 -57
  26. package/dist/collection.js.map +1 -1
  27. package/dist/config.d.ts +10 -0
  28. package/dist/config.d.ts.map +1 -1
  29. package/dist/config.js.map +1 -1
  30. package/dist/database.d.ts +8 -0
  31. package/dist/database.d.ts.map +1 -1
  32. package/dist/database.js +16 -8
  33. package/dist/database.js.map +1 -1
  34. package/dist/db-errors.d.ts +105 -0
  35. package/dist/db-errors.d.ts.map +1 -0
  36. package/dist/db-errors.js +382 -0
  37. package/dist/db-errors.js.map +1 -0
  38. package/dist/decorators/index.d.ts +80 -6
  39. package/dist/decorators/index.d.ts.map +1 -1
  40. package/dist/decorators/index.js +102 -12
  41. package/dist/decorators/index.js.map +1 -1
  42. package/dist/dispatch/bus.d.ts.map +1 -1
  43. package/dist/dispatch/bus.js +4 -3
  44. package/dist/dispatch/bus.js.map +1 -1
  45. package/dist/dispatch/collections/Dispatches.d.ts.map +1 -1
  46. package/dist/dispatch/collections/Dispatches.js +19 -4
  47. package/dist/dispatch/collections/Dispatches.js.map +1 -1
  48. package/dist/dispatch/types.d.ts +5 -0
  49. package/dist/dispatch/types.d.ts.map +1 -1
  50. package/dist/embedded-write-queue.d.ts +46 -0
  51. package/dist/embedded-write-queue.d.ts.map +1 -0
  52. package/dist/embedded-write-queue.js +66 -0
  53. package/dist/embedded-write-queue.js.map +1 -0
  54. package/dist/embeddings/storage.d.ts +7 -0
  55. package/dist/embeddings/storage.d.ts.map +1 -1
  56. package/dist/embeddings/storage.js +29 -12
  57. package/dist/embeddings/storage.js.map +1 -1
  58. package/dist/errors.d.ts +31 -3
  59. package/dist/errors.d.ts.map +1 -1
  60. package/dist/errors.js +34 -2
  61. package/dist/errors.js.map +1 -1
  62. package/dist/generators/changes-route.d.ts.map +1 -1
  63. package/dist/generators/changes-route.js +6 -3
  64. package/dist/generators/changes-route.js.map +1 -1
  65. package/dist/generators/mcp-runtime-template.d.ts +8 -0
  66. package/dist/generators/mcp-runtime-template.d.ts.map +1 -1
  67. package/dist/generators/mcp-runtime-template.js +38 -4
  68. package/dist/generators/mcp-runtime-template.js.map +1 -1
  69. package/dist/generators/mcp.d.ts +16 -0
  70. package/dist/generators/mcp.d.ts.map +1 -1
  71. package/dist/generators/mcp.js +41 -3
  72. package/dist/generators/mcp.js.map +1 -1
  73. package/dist/generators/rest.d.ts +22 -0
  74. package/dist/generators/rest.d.ts.map +1 -1
  75. package/dist/generators/rest.js +34 -3
  76. package/dist/generators/rest.js.map +1 -1
  77. package/dist/hierarchical.js +1 -1
  78. package/dist/index.d.ts +7 -1
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +12 -5
  81. package/dist/interceptors.d.ts +21 -0
  82. package/dist/interceptors.d.ts.map +1 -1
  83. package/dist/interceptors.js +27 -1
  84. package/dist/interceptors.js.map +1 -1
  85. package/dist/manifest/generator.d.ts.map +1 -1
  86. package/dist/manifest/generator.js +4 -7
  87. package/dist/manifest/generator.js.map +1 -1
  88. package/dist/manifest/static-manifest.js +10 -10
  89. package/dist/manifest/static-manifest.js.map +1 -1
  90. package/dist/manifest/store.js +1 -1
  91. package/dist/manifest/store.js.map +1 -1
  92. package/dist/manifest.json +19 -19
  93. package/dist/migrations/differ.d.ts +211 -9
  94. package/dist/migrations/differ.d.ts.map +1 -1
  95. package/dist/migrations/differ.js +613 -50
  96. package/dist/migrations/differ.js.map +1 -1
  97. package/dist/migrations/generator.d.ts +31 -4
  98. package/dist/migrations/generator.d.ts.map +1 -1
  99. package/dist/migrations/generator.js +49 -5
  100. package/dist/migrations/generator.js.map +1 -1
  101. package/dist/migrations/index.d.ts +4 -2
  102. package/dist/migrations/index.d.ts.map +1 -1
  103. package/dist/migrations/index.js +6 -3
  104. package/dist/migrations/minor-units.d.ts +162 -0
  105. package/dist/migrations/minor-units.d.ts.map +1 -0
  106. package/dist/migrations/minor-units.js +381 -0
  107. package/dist/migrations/minor-units.js.map +1 -0
  108. package/dist/migrations/orchestrate.js +35 -6
  109. package/dist/migrations/orchestrate.js.map +1 -1
  110. package/dist/migrations/sqlite-rebuild.d.ts +142 -0
  111. package/dist/migrations/sqlite-rebuild.d.ts.map +1 -0
  112. package/dist/migrations/sqlite-rebuild.js +514 -0
  113. package/dist/migrations/sqlite-rebuild.js.map +1 -0
  114. package/dist/migrations/tracker.d.ts +114 -1
  115. package/dist/migrations/tracker.d.ts.map +1 -1
  116. package/dist/migrations/tracker.js +331 -16
  117. package/dist/migrations/tracker.js.map +1 -1
  118. package/dist/migrations/types.d.ts +19 -4
  119. package/dist/migrations/types.d.ts.map +1 -1
  120. package/dist/migrations.js +6 -3
  121. package/dist/object.d.ts +142 -10
  122. package/dist/object.d.ts.map +1 -1
  123. package/dist/object.js +196 -41
  124. package/dist/object.js.map +1 -1
  125. package/dist/postgres-timeouts.d.ts +240 -0
  126. package/dist/postgres-timeouts.d.ts.map +1 -0
  127. package/dist/postgres-timeouts.js +204 -0
  128. package/dist/postgres-timeouts.js.map +1 -0
  129. package/dist/query-bounds.d.ts +101 -0
  130. package/dist/query-bounds.d.ts.map +1 -0
  131. package/dist/query-bounds.js +177 -0
  132. package/dist/query-bounds.js.map +1 -0
  133. package/dist/registry/class-registration.d.ts.map +1 -1
  134. package/dist/registry/class-registration.js +3 -1
  135. package/dist/registry/class-registration.js.map +1 -1
  136. package/dist/registry/manifest-field-merge.d.ts +12 -0
  137. package/dist/registry/manifest-field-merge.d.ts.map +1 -1
  138. package/dist/registry/manifest-field-merge.js +14 -2
  139. package/dist/registry/manifest-field-merge.js.map +1 -1
  140. package/dist/registry/schema-builder.d.ts +22 -1
  141. package/dist/registry/schema-builder.d.ts.map +1 -1
  142. package/dist/registry/schema-builder.js +205 -165
  143. package/dist/registry/schema-builder.js.map +1 -1
  144. package/dist/registry/types.d.ts +35 -3
  145. package/dist/registry/types.d.ts.map +1 -1
  146. package/dist/registry.d.ts +41 -46
  147. package/dist/registry.d.ts.map +1 -1
  148. package/dist/registry.js +61 -83
  149. package/dist/registry.js.map +1 -1
  150. package/dist/scanner/manifest-generator.d.ts +45 -0
  151. package/dist/scanner/manifest-generator.d.ts.map +1 -1
  152. package/dist/scanner/manifest-generator.js +92 -28
  153. package/dist/scanner/manifest-generator.js.map +1 -1
  154. package/dist/scanner/types.d.ts +5 -0
  155. package/dist/scanner/types.d.ts.map +1 -1
  156. package/dist/scanner/types.js.map +1 -1
  157. package/dist/schema/conflict-target.d.ts +104 -0
  158. package/dist/schema/conflict-target.d.ts.map +1 -0
  159. package/dist/schema/conflict-target.js +129 -0
  160. package/dist/schema/conflict-target.js.map +1 -0
  161. package/dist/schema/ddl/base-strategy.d.ts.map +1 -1
  162. package/dist/schema/ddl/base-strategy.js +2 -2
  163. package/dist/schema/ddl/base-strategy.js.map +1 -1
  164. package/dist/schema/ddl/duckdb-strategy.d.ts.map +1 -1
  165. package/dist/schema/ddl/duckdb-strategy.js +2 -1
  166. package/dist/schema/ddl/duckdb-strategy.js.map +1 -1
  167. package/dist/schema/ddl/postgres-strategy.d.ts.map +1 -1
  168. package/dist/schema/ddl/postgres-strategy.js +12 -1
  169. package/dist/schema/ddl/postgres-strategy.js.map +1 -1
  170. package/dist/schema/generator.d.ts +307 -6
  171. package/dist/schema/generator.d.ts.map +1 -1
  172. package/dist/schema/generator.js +510 -87
  173. package/dist/schema/generator.js.map +1 -1
  174. package/dist/schema/index-utils.d.ts +120 -0
  175. package/dist/schema/index-utils.d.ts.map +1 -1
  176. package/dist/schema/index-utils.js +242 -1
  177. package/dist/schema/index-utils.js.map +1 -1
  178. package/dist/schema/index.d.ts +3 -0
  179. package/dist/schema/index.d.ts.map +1 -1
  180. package/dist/schema/index.js +4 -1
  181. package/dist/schema/live-parity.d.ts +90 -0
  182. package/dist/schema/live-parity.d.ts.map +1 -0
  183. package/dist/schema/live-parity.js +602 -0
  184. package/dist/schema/live-parity.js.map +1 -0
  185. package/dist/schema/manifest-schema.d.ts +121 -0
  186. package/dist/schema/manifest-schema.d.ts.map +1 -0
  187. package/dist/schema/manifest-schema.js +267 -0
  188. package/dist/schema/manifest-schema.js.map +1 -0
  189. package/dist/schema/schema-aggregator.d.ts +24 -10
  190. package/dist/schema/schema-aggregator.d.ts.map +1 -1
  191. package/dist/schema/schema-aggregator.js +35 -90
  192. package/dist/schema/schema-aggregator.js.map +1 -1
  193. package/dist/schema/system-table-shapes.d.ts +65 -0
  194. package/dist/schema/system-table-shapes.d.ts.map +1 -0
  195. package/dist/schema/system-table-shapes.js +187 -0
  196. package/dist/schema/system-table-shapes.js.map +1 -0
  197. package/dist/schema/types.d.ts +103 -4
  198. package/dist/schema/types.d.ts.map +1 -1
  199. package/dist/schema/utils.d.ts +2 -1
  200. package/dist/schema/utils.d.ts.map +1 -1
  201. package/dist/schema/utils.js +5 -3
  202. package/dist/schema/utils.js.map +1 -1
  203. package/dist/schema.js +4 -1
  204. package/dist/smrt-knowledge.json +20 -8
  205. package/dist/sync/apply.d.ts.map +1 -1
  206. package/dist/sync/apply.js +9 -16
  207. package/dist/sync/apply.js.map +1 -1
  208. package/dist/system/compatibility.d.ts +42 -0
  209. package/dist/system/compatibility.d.ts.map +1 -1
  210. package/dist/system/compatibility.js +182 -9
  211. package/dist/system/compatibility.js.map +1 -1
  212. package/dist/system/index.d.ts +1 -0
  213. package/dist/system/index.d.ts.map +1 -1
  214. package/dist/system/index.js +3 -2
  215. package/dist/system/retention.d.ts +237 -0
  216. package/dist/system/retention.d.ts.map +1 -0
  217. package/dist/system/retention.js +497 -0
  218. package/dist/system/retention.js.map +1 -0
  219. package/dist/system/schema.d.ts +100 -15
  220. package/dist/system/schema.d.ts.map +1 -1
  221. package/dist/system/schema.js +81 -45
  222. package/dist/system/schema.js.map +1 -1
  223. package/dist/system/types.d.ts +0 -2
  224. package/dist/system/types.d.ts.map +1 -1
  225. package/dist/testing/database.d.ts.map +1 -1
  226. package/dist/testing/database.js +1 -0
  227. package/dist/testing/database.js.map +1 -1
  228. package/dist/vite-plugin/index.d.ts.map +1 -1
  229. package/dist/vite-plugin/index.js +4 -9
  230. package/dist/vite-plugin/index.js.map +1 -1
  231. package/dist/vite-plugin/sveltekit-generator.d.ts.map +1 -1
  232. package/dist/vite-plugin/sveltekit-generator.js +71 -5
  233. package/dist/vite-plugin/sveltekit-generator.js.map +1 -1
  234. package/dist/vite-plugin/web-collections.d.ts.map +1 -1
  235. package/dist/vite-plugin/web-collections.js +6 -4
  236. package/dist/vite-plugin/web-collections.js.map +1 -1
  237. package/package.json +5 -5
@@ -27,6 +27,23 @@ export declare class ManifestGenerator {
27
27
  smrtDependencies?: string[];
28
28
  includeVisibility?: SmrtVisibility[];
29
29
  }): SmartObjectManifest;
30
+ /**
31
+ * Run every manifest generation pass, in order, on a manifest whose
32
+ * `objects` have been collected. This is THE pass sequence: the OXC vite
33
+ * plugin (`vite-plugin/index.ts`) and `ManifestBuilder.buildManifest()`
34
+ * call it too, so the three producers cannot drift — before #2360
35
+ * `ManifestBuilder` skipped the report passes and its manifests carried
36
+ * `(slug, context)` conflict indexes for `@report` classes while the
37
+ * runtime upserted on the report's group columns.
38
+ *
39
+ * @param manifest - manifest with `objects` populated (and
40
+ * `smrtDependencies` set, so external STI bases resolve)
41
+ * @param options - package metadata for the agent-manifest pass
42
+ */
43
+ applyGenerationPasses(manifest: SmartObjectManifest, options?: {
44
+ packageName?: string;
45
+ packageJson?: PackageJsonLike;
46
+ }): void;
30
47
  /**
31
48
  * Materialize tenantScoped schema fields.
32
49
  *
@@ -68,6 +85,27 @@ export declare class ManifestGenerator {
68
85
  generateSchemas(manifest: SmartObjectManifest): void;
69
86
  normalizeReportObjects(manifest: SmartObjectManifest): void;
70
87
  normalizeReportTenantScope(manifest: SmartObjectManifest): void;
88
+ /**
89
+ * Materialize the tenant-aware default conflict target (#2360).
90
+ *
91
+ * A tenant-scoped class that declares no `@smrt({ conflictColumns })` keys
92
+ * on `[tenant column, ...natural key]` — `(tenant_id, slug, context)` for
93
+ * a class-per-table object, `(tenant_id, slug, context, _meta_type)` for a
94
+ * single-table hierarchy — so two tenants can each own the same slug and
95
+ * neither `save()` adopts the other's row. Writing the resolved key into
96
+ * `decoratorConfig.conflictColumns` (mirroring `normalizeReportObjects`)
97
+ * makes the manifest, the generated schema, the knowledge artifact and
98
+ * `ObjectRegistry.getConflictColumns()` read one value.
99
+ *
100
+ * Only schema owners are normalized: an STI child inherits the table (and
101
+ * therefore the key) from its root, and `getConflictColumns()` resolves a
102
+ * child through its root at runtime. Explicit `conflictColumns` and
103
+ * `@report` classes (keyed by `normalizeReportObjects`) are left alone.
104
+ * Runs after `injectTenantScopedFields()` and `mergeInheritedFields()` so
105
+ * the tenant field and the inherited `tableStrategy` are in place, and
106
+ * before `generateSchemas()`.
107
+ */
108
+ normalizeConflictColumns(manifest: SmartObjectManifest): void;
71
109
  private resolveSamePackageForeignKeyColumnTypes;
72
110
  private findForeignKeyTargetSchema;
73
111
  private getObjectTableName;
@@ -109,6 +147,13 @@ export declare class ManifestGenerator {
109
147
  * inheritance-resolver.ts`). Keep the two lists in sync.
110
148
  */
111
149
  private extendsFrameworkAbstractBase;
150
+ /**
151
+ * Resolve a class name (simple `Content` or qualified `@pkg:Content`) to
152
+ * the key it is stored under in `manifest.objects`, or `undefined` when the
153
+ * manifest does not carry it. Manifest keys are qualified names; `extends`
154
+ * and {@link findSTIBaseInfo} report simple names.
155
+ */
156
+ private resolveManifestKey;
112
157
  /**
113
158
  * Find full STI base class info (className + tableName)
114
159
  *
@@ -1 +1 @@
1
- {"version":3,"file":"manifest-generator.d.ts","sourceRoot":"","sources":["../../src/scanner/manifest-generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manifest-generator.d.ts","sourceRoot":"","sources":["../../src/scanner/manifest-generator.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
+ import { classnameToTablename, toSnakeCase } from "../utils/naming.js";
1
2
  import "./types.js";
2
3
  import { createQualifiedName } from "../utils/qualified-names.js";
3
4
  import { generateToolManifest } from "../tools/tool-generator.js";
4
5
  import { resolveCustomActionMetadata } from "../generators/custom-action.js";
5
- import { classnameToTablename, toSnakeCase } from "../utils/naming.js";
6
+ import { defaultConflictColumns, resolveTenantColumn } from "../schema/conflict-target.js";
6
7
  import { SchemaGenerator } from "../schema/generator.js";
7
8
  import { isTestFile } from "./test-file-patterns.js";
8
9
  import { loadExternalManifestSync, lookupInManifest } from "../manifest/manifest-loader.js";
@@ -100,15 +101,35 @@ var ManifestGenerator = class {
100
101
  }
101
102
  manifest.objects[manifestKey] = objectDef;
102
103
  }
104
+ this.applyGenerationPasses(manifest, {
105
+ packageName: options?.packageName,
106
+ packageJson: options?.packageJson
107
+ });
108
+ return manifest;
109
+ }
110
+ /**
111
+ * Run every manifest generation pass, in order, on a manifest whose
112
+ * `objects` have been collected. This is THE pass sequence: the OXC vite
113
+ * plugin (`vite-plugin/index.ts`) and `ManifestBuilder.buildManifest()`
114
+ * call it too, so the three producers cannot drift — before #2360
115
+ * `ManifestBuilder` skipped the report passes and its manifests carried
116
+ * `(slug, context)` conflict indexes for `@report` classes while the
117
+ * runtime upserted on the report's group columns.
118
+ *
119
+ * @param manifest - manifest with `objects` populated (and
120
+ * `smrtDependencies` set, so external STI bases resolve)
121
+ * @param options - package metadata for the agent-manifest pass
122
+ */
123
+ applyGenerationPasses(manifest, options) {
103
124
  this.normalizeReportTenantScope(manifest);
104
125
  this.injectTenantScopedFields(manifest);
105
126
  this.mergeInheritedFields(manifest);
106
127
  this.normalizeReportObjects(manifest);
128
+ this.normalizeConflictColumns(manifest);
107
129
  this.generateValidationRules(manifest);
108
130
  this.generateSchemas(manifest);
109
131
  this.assertTenantScopedSchemaContract(manifest);
110
132
  this.generateAgentManifests(manifest, options?.packageName, options?.packageJson);
111
- return manifest;
112
133
  }
113
134
  /**
114
135
  * Materialize tenantScoped schema fields.
@@ -285,26 +306,17 @@ var ManifestGenerator = class {
285
306
  generateSchemas(manifest) {
286
307
  const generator = new SchemaGenerator();
287
308
  const aggregatedManifest = this.createAggregatedManifest(manifest);
288
- const processedSTIBases = /* @__PURE__ */ new Set();
289
- const localObjects = new Set(Object.values(manifest.objects).map((o) => o.className));
290
309
  for (const [name, obj] of Object.entries(manifest.objects)) {
291
310
  if (FRAMEWORK_ABSTRACT_BASE_NAMES.has(obj.className)) continue;
292
311
  const tableName = obj.decoratorConfig?.tableName || this.classNameToTableName(obj.className);
293
- if (obj.decoratorConfig?.tableStrategy === "sti") {
294
- if (processedSTIBases.has(name)) continue;
295
- processedSTIBases.add(name);
296
- logger.info(`[manifest-generator] Generating STI schema for ${name} (table: ${tableName})`);
297
- obj.schema = generator.generateSTISchemaFromManifest(name, tableName, obj.fields, aggregatedManifest, obj.decoratorConfig);
312
+ if (obj.decoratorConfig?.tableStrategy === "sti" || this.isSTIChildClass(obj, manifest)) {
313
+ const stiRoot = this.findSTIBaseInfo(obj, manifest);
314
+ const rootKey = stiRoot ? this.resolveManifestKey(stiRoot.className, aggregatedManifest) ?? stiRoot.className : name;
315
+ const rootTableName = stiRoot?.tableName || tableName;
316
+ const rootConfig = aggregatedManifest.objects[rootKey]?.decoratorConfig ?? obj.decoratorConfig;
317
+ logger.info(`[manifest-generator] Generating STI schema for ${name} (root: ${rootKey}, table: ${rootTableName})`);
318
+ obj.schema = generator.generateSTISchemaFromManifest(rootKey, rootTableName, obj.fields, aggregatedManifest, rootConfig);
298
319
  this.applySqlTypeOverrides(obj);
299
- } else if (this.isSTIChildClass(obj, manifest)) {
300
- const stiBase = this.findSTIBaseInfo(obj, manifest);
301
- if (stiBase && localObjects.has(stiBase.className)) logger.info(`[manifest-generator] Skipping schema for STI child ${name} (base ${stiBase?.className} is local)`);
302
- else {
303
- const baseTableName = stiBase?.tableName || tableName;
304
- logger.info(`[manifest-generator] Generating STI schema for ${name} (external base: ${stiBase?.className}, table: ${baseTableName})`);
305
- obj.schema = generator.generateSTISchemaFromManifest(stiBase?.className || name, baseTableName, obj.fields, aggregatedManifest, obj.decoratorConfig);
306
- this.applySqlTypeOverrides(obj);
307
- }
308
320
  } else {
309
321
  logger.info(`[manifest-generator] Generating CTI schema for ${name} (table: ${tableName})`);
310
322
  obj.schema = generator.generateCTISchemaFromManifest(name, tableName, obj.fields, obj.decoratorConfig);
@@ -335,12 +347,51 @@ var ManifestGenerator = class {
335
347
  obj.decoratorConfig.tenantScoped ??= { mode: "optional" };
336
348
  }
337
349
  }
350
+ /**
351
+ * Materialize the tenant-aware default conflict target (#2360).
352
+ *
353
+ * A tenant-scoped class that declares no `@smrt({ conflictColumns })` keys
354
+ * on `[tenant column, ...natural key]` — `(tenant_id, slug, context)` for
355
+ * a class-per-table object, `(tenant_id, slug, context, _meta_type)` for a
356
+ * single-table hierarchy — so two tenants can each own the same slug and
357
+ * neither `save()` adopts the other's row. Writing the resolved key into
358
+ * `decoratorConfig.conflictColumns` (mirroring `normalizeReportObjects`)
359
+ * makes the manifest, the generated schema, the knowledge artifact and
360
+ * `ObjectRegistry.getConflictColumns()` read one value.
361
+ *
362
+ * Only schema owners are normalized: an STI child inherits the table (and
363
+ * therefore the key) from its root, and `getConflictColumns()` resolves a
364
+ * child through its root at runtime. Explicit `conflictColumns` and
365
+ * `@report` classes (keyed by `normalizeReportObjects`) are left alone.
366
+ * Runs after `injectTenantScopedFields()` and `mergeInheritedFields()` so
367
+ * the tenant field and the inherited `tableStrategy` are in place, and
368
+ * before `generateSchemas()`.
369
+ */
370
+ normalizeConflictColumns(manifest) {
371
+ for (const obj of Object.values(manifest.objects)) {
372
+ if (!obj.decoratorConfig) continue;
373
+ if (FRAMEWORK_ABSTRACT_BASE_NAMES.has(obj.className)) continue;
374
+ if (obj.decoratorConfig.conflictColumns) continue;
375
+ if (obj.decoratorConfig.report) continue;
376
+ if (this.isSTIChildClass(obj, manifest)) continue;
377
+ const tenantScoped = obj.decoratorConfig.tenantScoped;
378
+ if (!tenantScoped) continue;
379
+ const { tenantConfig } = this.normalizeTenantScopedConfig(tenantScoped);
380
+ const tenantColumn = resolveTenantColumn(tenantConfig.field, (fieldName) => Boolean(obj.fields[fieldName]), toSnakeCase);
381
+ if (!tenantColumn) continue;
382
+ obj.decoratorConfig.conflictColumns = defaultConflictColumns(obj.decoratorConfig.tableStrategy === "sti" ? "sti" : "cti", tenantColumn);
383
+ }
384
+ }
338
385
  resolveSamePackageForeignKeyColumnTypes(manifest, generator) {
339
386
  const schemaByTable = /* @__PURE__ */ new Map();
387
+ const schemasByTable = /* @__PURE__ */ new Map();
340
388
  const ownerBySchema = /* @__PURE__ */ new Map();
341
389
  const changedSchemas = /* @__PURE__ */ new Set();
342
390
  for (const [name, obj] of Object.entries(manifest.objects)) if (obj.schema?.tableName) {
343
391
  schemaByTable.set(obj.schema.tableName, obj.schema);
392
+ const siblings = schemasByTable.get(obj.schema.tableName) ?? [];
393
+ siblings.push(obj.schema);
394
+ schemasByTable.set(obj.schema.tableName, siblings);
344
395
  ownerBySchema.set(obj.schema, {
345
396
  name,
346
397
  obj
@@ -349,20 +400,22 @@ var ManifestGenerator = class {
349
400
  for (const obj of Object.values(manifest.objects)) {
350
401
  const sourceTable = this.getObjectTableName(obj);
351
402
  if (!sourceTable) continue;
352
- const sourceSchema = schemaByTable.get(sourceTable);
353
- if (!sourceSchema) continue;
403
+ const sourceSchemas = schemasByTable.get(sourceTable);
404
+ if (!sourceSchemas || sourceSchemas.length === 0) continue;
354
405
  for (const [fieldName, field] of Object.entries(obj.fields || {})) {
355
406
  if (field.type !== "foreignKey" || !field.related || field._meta?.sqlType) continue;
356
407
  const columnName = toSnakeCase(fieldName);
357
- const sourceColumn = sourceSchema.columns[columnName];
358
- if (!sourceColumn) continue;
359
408
  const targetIdType = this.findForeignKeyTargetSchema(field.related, manifest, schemaByTable)?.columns.id?.type;
360
- if (!targetIdType || sourceColumn.type === targetIdType) continue;
361
- sourceSchema.columns[columnName] = {
362
- ...sourceColumn,
363
- type: targetIdType
364
- };
365
- changedSchemas.add(sourceSchema);
409
+ if (!targetIdType) continue;
410
+ for (const sourceSchema of sourceSchemas) {
411
+ const sourceColumn = sourceSchema.columns[columnName];
412
+ if (!sourceColumn || sourceColumn.type === targetIdType) continue;
413
+ sourceSchema.columns[columnName] = {
414
+ ...sourceColumn,
415
+ type: targetIdType
416
+ };
417
+ changedSchemas.add(sourceSchema);
418
+ }
366
419
  }
367
420
  }
368
421
  for (const schema of changedSchemas) this.refreshManifestSchemaDDL(schema, generator, ownerBySchema.get(schema), manifest);
@@ -536,6 +589,17 @@ var ManifestGenerator = class {
536
589
  return false;
537
590
  }
538
591
  /**
592
+ * Resolve a class name (simple `Content` or qualified `@pkg:Content`) to
593
+ * the key it is stored under in `manifest.objects`, or `undefined` when the
594
+ * manifest does not carry it. Manifest keys are qualified names; `extends`
595
+ * and {@link findSTIBaseInfo} report simple names.
596
+ */
597
+ resolveManifestKey(className, manifest) {
598
+ if (manifest.objects[className]) return className;
599
+ const simpleName = className.includes(":") ? className.slice(className.lastIndexOf(":") + 1) : className;
600
+ for (const [key, obj] of Object.entries(manifest.objects)) if (obj.qualifiedName === className || obj.className === simpleName) return key;
601
+ }
602
+ /**
539
603
  * Find full STI base class info (className + tableName)
540
604
  *
541
605
  * Walks up the inheritance chain to find the STI base class and returns