@happyvertical/smrt-core 0.54.2 → 0.54.3

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 (138) hide show
  1. package/AGENTS.md +6 -1
  2. package/README.md +8 -0
  3. package/agents/change-feed.md +7 -12
  4. package/agents/generators.md +13 -0
  5. package/agents/object-runtime.md +8 -0
  6. package/agents/schema-paths.md +14 -0
  7. package/dist/audit-context.d.ts +4 -0
  8. package/dist/audit-context.d.ts.map +1 -0
  9. package/dist/audit-context.js +16 -0
  10. package/dist/audit-context.js.map +1 -0
  11. package/dist/audit.d.ts +34 -0
  12. package/dist/audit.d.ts.map +1 -0
  13. package/dist/audit.js +63 -0
  14. package/dist/audit.js.map +1 -0
  15. package/dist/browser.d.ts +2 -1
  16. package/dist/browser.d.ts.map +1 -1
  17. package/dist/browser.js +4 -3
  18. package/dist/cascade.d.ts +1 -1
  19. package/dist/cascade.d.ts.map +1 -1
  20. package/dist/cascade.js +10 -7
  21. package/dist/cascade.js.map +1 -1
  22. package/dist/change-feed.js +1 -1
  23. package/dist/collection.d.ts +9 -2
  24. package/dist/collection.d.ts.map +1 -1
  25. package/dist/collection.js +59 -4
  26. package/dist/collection.js.map +1 -1
  27. package/dist/embedded-write-queue.d.ts +2 -0
  28. package/dist/embedded-write-queue.d.ts.map +1 -1
  29. package/dist/embedded-write-queue.js +12 -5
  30. package/dist/embedded-write-queue.js.map +1 -1
  31. package/dist/generators/changes-route.js +1 -1
  32. package/dist/generators/mcp-runtime-template.d.ts +2 -0
  33. package/dist/generators/mcp-runtime-template.d.ts.map +1 -1
  34. package/dist/generators/mcp-runtime-template.js +18 -16
  35. package/dist/generators/mcp-runtime-template.js.map +1 -1
  36. package/dist/generators/mcp-tool-name.d.ts +6 -0
  37. package/dist/generators/mcp-tool-name.d.ts.map +1 -1
  38. package/dist/generators/mcp-tool-name.js.map +1 -1
  39. package/dist/generators/mcp.d.ts +34 -1
  40. package/dist/generators/mcp.d.ts.map +1 -1
  41. package/dist/generators/mcp.js +148 -110
  42. package/dist/generators/mcp.js.map +1 -1
  43. package/dist/generators/rest.d.ts.map +1 -1
  44. package/dist/generators/rest.js +16 -7
  45. package/dist/generators/rest.js.map +1 -1
  46. package/dist/index.d.ts +3 -1
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +9 -7
  49. package/dist/junction.d.ts +29 -10
  50. package/dist/junction.d.ts.map +1 -1
  51. package/dist/junction.js +31 -12
  52. package/dist/junction.js.map +1 -1
  53. package/dist/knowledge.js +1 -1
  54. package/dist/knowledge.js.map +1 -1
  55. package/dist/manifest/manifest-loader.d.ts.map +1 -1
  56. package/dist/manifest/manifest-loader.js +1 -1
  57. package/dist/manifest/manifest-loader.js.map +1 -1
  58. package/dist/manifest/static-manifest.d.ts.map +1 -1
  59. package/dist/manifest/static-manifest.js +106 -9
  60. package/dist/manifest/static-manifest.js.map +1 -1
  61. package/dist/manifest/store.d.ts +8 -0
  62. package/dist/manifest/store.d.ts.map +1 -1
  63. package/dist/manifest/store.js +12 -2
  64. package/dist/manifest/store.js.map +1 -1
  65. package/dist/manifest.json +119 -9
  66. package/dist/migrations/differ.d.ts +3 -3
  67. package/dist/migrations/differ.d.ts.map +1 -1
  68. package/dist/migrations/differ.js +8 -4
  69. package/dist/migrations/differ.js.map +1 -1
  70. package/dist/object.d.ts +1 -0
  71. package/dist/object.d.ts.map +1 -1
  72. package/dist/object.js +19 -7
  73. package/dist/object.js.map +1 -1
  74. package/dist/registry/class-registration.d.ts.map +1 -1
  75. package/dist/registry/class-registration.js +75 -10
  76. package/dist/registry/class-registration.js.map +1 -1
  77. package/dist/registry/collection-resolution.d.ts +2 -2
  78. package/dist/registry/collection-resolution.d.ts.map +1 -1
  79. package/dist/registry/collection-resolution.js +2 -1
  80. package/dist/registry/collection-resolution.js.map +1 -1
  81. package/dist/registry/collision-policy.d.ts +8 -0
  82. package/dist/registry/collision-policy.d.ts.map +1 -1
  83. package/dist/registry/collision-policy.js +2 -2
  84. package/dist/registry/collision-policy.js.map +1 -1
  85. package/dist/registry/framework-base-classes.d.ts.map +1 -1
  86. package/dist/registry/framework-base-classes.js +2 -1
  87. package/dist/registry/framework-base-classes.js.map +1 -1
  88. package/dist/registry/schema-builder.d.ts.map +1 -1
  89. package/dist/registry/schema-builder.js +33 -4
  90. package/dist/registry/schema-builder.js.map +1 -1
  91. package/dist/registry/shared-state.d.ts +6 -0
  92. package/dist/registry/shared-state.d.ts.map +1 -1
  93. package/dist/registry/shared-state.js +12 -1
  94. package/dist/registry/shared-state.js.map +1 -1
  95. package/dist/registry/types.d.ts +7 -1
  96. package/dist/registry/types.d.ts.map +1 -1
  97. package/dist/registry.d.ts +7 -1
  98. package/dist/registry.d.ts.map +1 -1
  99. package/dist/registry.js +25 -3
  100. package/dist/registry.js.map +1 -1
  101. package/dist/scanner/manifest-generator.d.ts.map +1 -1
  102. package/dist/scanner/manifest-generator.js +5 -1
  103. package/dist/scanner/manifest-generator.js.map +1 -1
  104. package/dist/scanner/types.d.ts +8 -0
  105. package/dist/scanner/types.d.ts.map +1 -1
  106. package/dist/scanner/types.js.map +1 -1
  107. package/dist/schema/ddl/duckdb-strategy.d.ts.map +1 -1
  108. package/dist/schema/ddl/duckdb-strategy.js +1 -0
  109. package/dist/schema/ddl/duckdb-strategy.js.map +1 -1
  110. package/dist/schema/ddl/null-equal-index.d.ts.map +1 -1
  111. package/dist/schema/ddl/null-equal-index.js +4 -2
  112. package/dist/schema/ddl/null-equal-index.js.map +1 -1
  113. package/dist/schema/generator.d.ts +3 -0
  114. package/dist/schema/generator.d.ts.map +1 -1
  115. package/dist/schema/generator.js +38 -0
  116. package/dist/schema/generator.js.map +1 -1
  117. package/dist/smrt-knowledge.json +74 -20
  118. package/dist/sync/apply.d.ts +2 -0
  119. package/dist/sync/apply.d.ts.map +1 -1
  120. package/dist/sync/apply.js +7 -3
  121. package/dist/sync/apply.js.map +1 -1
  122. package/dist/utils/scanner-module.d.ts +9 -0
  123. package/dist/utils/scanner-module.d.ts.map +1 -1
  124. package/dist/vite-plugin/index.d.ts +14 -0
  125. package/dist/vite-plugin/index.d.ts.map +1 -1
  126. package/dist/vite-plugin/index.js +58 -18
  127. package/dist/vite-plugin/index.js.map +1 -1
  128. package/dist/vite-plugin/package-stamp.d.ts +41 -0
  129. package/dist/vite-plugin/package-stamp.d.ts.map +1 -0
  130. package/dist/vite-plugin/package-stamp.js +33 -0
  131. package/dist/vite-plugin/package-stamp.js.map +1 -0
  132. package/dist/vite-plugin/sveltekit-generator.js +5 -3
  133. package/dist/vite-plugin/sveltekit-generator.js.map +1 -1
  134. package/dist/vite-plugin/sync-apply-route.d.ts.map +1 -1
  135. package/dist/vite-plugin/sync-apply-route.js +10 -0
  136. package/dist/vite-plugin/sync-apply-route.js.map +1 -1
  137. package/dist/vite-plugin.js +2 -2
  138. package/package.json +10 -10
package/dist/registry.js CHANGED
@@ -3,6 +3,8 @@ import { defaultConflictColumns, resolveOwnershipTenantColumn, resolveTenantColu
3
3
  import { classnameToTablename, toSnakeCase } from "./utils/naming.js";
4
4
  import { buildCascadePlan } from "./cascade.js";
5
5
  import { applyOneToManyChildAccessors } from "./child-accessors.js";
6
+ import "./utils.js";
7
+ import { SmrtCollection } from "./collection.js";
6
8
  import { applyPendingDecoratorRegistrations } from "./decorators/compatibility.js";
7
9
  import { bumpRegistryGeneration, getRegistryGeneration } from "./registry/generation.js";
8
10
  import { createQualifiedName, isQualifiedName, parseQualifiedName, readPreviousQualifiedNames } from "./utils/qualified-names.js";
@@ -18,7 +20,6 @@ import { findClass, findClassesByName, getAllClasses, getCanonicalClassName, get
18
20
  import { getAllFields, getAllMethods, getInheritanceChain, mergeFieldConfigs } from "./registry/inheritance-resolver.js";
19
21
  import { resolveCollectionCacheConfig } from "./registry/cache-config.js";
20
22
  import { compileValidators } from "./registry/validator.js";
21
- import "./utils.js";
22
23
  import { isFrameworkBaseClass } from "./registry/framework-base-classes.js";
23
24
  import { createFieldFromManifest, manifestFieldDiffers, mergeManifestField } from "./registry/manifest-field-merge.js";
24
25
  import { applyRuntimeOverrides, clearRuntimeOverrides, getRuntimeOverride, registerRuntimeOverride } from "./registry/runtime-overrides.js";
@@ -29,7 +30,6 @@ import { getEmbeddingClasses, getEmbeddingConfig, getProjectEmbeddingConfig, has
29
30
  import { getDependencyGraph, getRelationshipMap, resolveRelationshipTarget } from "./registry/relationship-graph.js";
30
31
  import { SMRT_COLLECTION_BASE_NAMES, isSmrtCollectionExtendsName } from "./registry/collection-resolution.js";
31
32
  import { getAllSchemas, getAllSchemasAsDefinitions, getSchema, getSchemaDDL, getTableName } from "./registry/schema-builder.js";
32
- import { SmrtCollection } from "./collection.js";
33
33
  import { createLogger } from "@happyvertical/logger";
34
34
  //#region src/registry.ts
35
35
  /**
@@ -2193,6 +2193,7 @@ var ObjectRegistry = class ObjectRegistry {
2193
2193
  const tableStrategy = ObjectRegistry.getTableStrategy(className);
2194
2194
  const ownerName = tableStrategy === "sti" ? ObjectRegistry.getSTIBase(className) : null;
2195
2195
  const owner = ownerName && ownerName !== className ? ObjectRegistry.findClass(ownerName) ?? registered : registered;
2196
+ if (registered !== owner && registered.config?.conflictColumns?.length) return registered.config.conflictColumns;
2196
2197
  if (owner.config?.conflictColumns) return owner.config.conflictColumns;
2197
2198
  if (owner.config?.report) {
2198
2199
  const reportConflictColumns = Array.from(owner.fields.entries()).filter(([, field]) => {
@@ -2206,6 +2207,21 @@ var ObjectRegistry = class ObjectRegistry {
2206
2207
  if (primaryKeyColumns.length > 0) return primaryKeyColumns;
2207
2208
  return defaultConflictColumns(tableStrategy, ObjectRegistry.getOwnershipTenantColumn(className));
2208
2209
  }
2210
+ /** Subtypes with their own partial unique conflict index. */
2211
+ static getSTIConflictOverrides(className) {
2212
+ if (ObjectRegistry.getTableStrategy(className) !== "sti") return [];
2213
+ const root = ObjectRegistry.getSTIBase(className);
2214
+ if (!root) return [];
2215
+ return ObjectRegistry.getDescendants(root).filter((name) => Boolean(ObjectRegistry.findClass(name)?.config?.conflictColumns?.length)).sort();
2216
+ }
2217
+ /** SQL predicate shared by partial conflict indexes and atomic insert targets. */
2218
+ static getConflictPredicate(className) {
2219
+ const overrides = ObjectRegistry.getSTIConflictOverrides(className);
2220
+ const qualified = ObjectRegistry.findClass(className)?.qualifiedName ?? className;
2221
+ const quote = (value) => "'" + value.replaceAll("'", "''") + "'";
2222
+ if (overrides.includes(qualified)) return `_meta_type = ${quote(qualified)}`;
2223
+ return overrides.length ? overrides.map((name) => `_meta_type <> ${quote(name)}`).join(" AND ") : void 0;
2224
+ }
2209
2225
  /**
2210
2226
  * The column that owns a table's rows for natural-key identity: the
2211
2227
  * declared tenant column ({@link ObjectRegistry.getTenantColumn}), else
@@ -2254,7 +2270,7 @@ var ObjectRegistry = class ObjectRegistry {
2254
2270
  * package's `registerTenantScopedClass('Team', { field: 'organizationId' })`
2255
2271
  * is the canonical producer.
2256
2272
  *
2257
- * Core reads these only to protect ownership on save
2273
+ * Core reads these to protect ownership on save and record audit ownership
2258
2274
  * ({@link ObjectRegistry.getOwnershipColumns}); they never change the
2259
2275
  * conflict target or the schema, which are build-time contracts a runtime
2260
2276
  * registration cannot alter without breaking `ON CONFLICT` binding. The
@@ -2287,6 +2303,12 @@ var ObjectRegistry = class ObjectRegistry {
2287
2303
  const declared = ObjectRegistry.getTenantColumn(className);
2288
2304
  if (declared) columns.add(declared);
2289
2305
  for (const [name, field] of ObjectRegistry.getFields(className)) if (field.__tenancy?.isTenantIdField || field._meta?.__tenancy?.isTenantIdField) columns.add(toSnakeCase(name));
2306
+ for (const column of ObjectRegistry.getRuntimeOwnershipColumns(className)) columns.add(column);
2307
+ return columns;
2308
+ }
2309
+ /** Runtime ownership sources only; fresh, qualified and independent of schema/conflict targets. */
2310
+ static getRuntimeOwnershipColumns(className) {
2311
+ const columns = /* @__PURE__ */ new Set();
2290
2312
  const qualifiedName = ObjectRegistry.findClass(className)?.qualifiedName ?? className;
2291
2313
  for (const source of ObjectRegistry.ownershipColumnSources) for (const column of source(qualifiedName) ?? []) if (column) columns.add(column);
2292
2314
  return columns;