@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
package/dist/registry.js CHANGED
@@ -1,6 +1,7 @@
1
+ import { ConfigurationError } from "./errors.js";
2
+ import { classnameToTablename, toSnakeCase } from "./utils/naming.js";
1
3
  import { applyOneToManyChildAccessors } from "./child-accessors.js";
2
4
  import { applyPendingDecoratorRegistrations } from "./decorators/compatibility.js";
3
- import { ConfigurationError } from "./errors.js";
4
5
  import { clearRegistryDiagnostics, flushRegistryDiagnostics, getRegistryDiagnostics, recordRegistryDiagnostic } from "./registry/diagnostics.js";
5
6
  import { createQualifiedName, isQualifiedName, parseQualifiedName } from "./utils/qualified-names.js";
6
7
  import { cloneManifestSchemaColumns, discoverCachedManifestSync, getNodeBuiltins, loadExternalManifestSyncWithNode } from "./manifest/store.js";
@@ -11,7 +12,7 @@ import { getClasses, getCollectionCache, getCollectionTableNames, getCollections
11
12
  import { findClass, findClassesByName, getAllClasses, getCanonicalClassName, getClass, getClassByConstructor, getClassByQualifiedName, getClassInPackage, getClassNames, getClassesByPackage, getClassesByVisibility, getPublicClasses, getQualifiedClassNames, hasClass, hasClassCaseInsensitive, resolveType } from "./registry/name-resolver.js";
12
13
  import { getAllFields, getAllMethods, getInheritanceChain, mergeFieldConfigs } from "./registry/inheritance-resolver.js";
13
14
  import { resolveCollectionCacheConfig } from "./registry/cache-config.js";
14
- import { classnameToTablename, toSnakeCase } from "./utils/naming.js";
15
+ import { defaultConflictColumns, resolveTenantColumn } from "./schema/conflict-target.js";
15
16
  import "./utils.js";
16
17
  import { createFieldFromManifest, manifestFieldDiffers, mergeManifestField } from "./registry/manifest-field-merge.js";
17
18
  import { compileValidators } from "./registry/validator.js";
@@ -1664,16 +1665,29 @@ var ObjectRegistry = class ObjectRegistry {
1664
1665
  /**
1665
1666
  * Get the conflict columns for UPSERT operations on a class
1666
1667
  *
1667
- * Returns custom conflict columns if specified, otherwise defaults based on
1668
- * table strategy:
1669
- * - CTI: ['slug', 'context']
1670
- * - STI: ['slug', 'context', '_meta_type']
1668
+ * The conflict target is a property of the TABLE, resolved from its
1669
+ * schema-owning class — the STI root for a single-table hierarchy, the
1670
+ * class itself otherwise — so every class sharing a table upserts on the
1671
+ * same key the schema indexes. In order:
1672
+ *
1673
+ * 1. explicit `@smrt({ conflictColumns })` on the schema owner;
1674
+ * 2. `@report` classes: `[tenant column, ...group/bucket columns]`, or
1675
+ * `['id']` when the report declares no grouping;
1676
+ * 3. a custom primary key (`@field({ primaryKey: true })`): the declared
1677
+ * primary-key column(s) — the only unique key such a table has;
1678
+ * 4. the strategy default — CTI `['slug', 'context']`, STI
1679
+ * `['slug', 'context', '_meta_type']` — led by the tenant column when
1680
+ * the schema owner is tenant-scoped (#2360): tenant-scoped rows are
1681
+ * unique per tenant, and without the tenant column a second tenant's
1682
+ * `save()` of the same natural key updated the first tenant's row
1683
+ * through `DO UPDATE SET`.
1671
1684
  *
1672
1685
  * STI subclasses share a table, so the discriminator participates in
1673
1686
  * identity — two subtypes can coexist with the same (slug, context). The
1674
- * matching unique constraint on `(slug, context, _meta_type)` must exist
1675
- * in the live schema; if a deployment carries a stale 2-column unique
1676
- * instead, run `smrt db:migrate` to repair it (see issue #1165).
1687
+ * matching unique index must exist in the live schema; if a deployment
1688
+ * carries a stale shape, `smrt db:migrate` swaps it in place (issue #1165,
1689
+ * #2360). NULL-tenant rows dedup through the SDK's null-aware upsert
1690
+ * (`IS NOT DISTINCT FROM`), see `schema/conflict-target.ts`.
1677
1691
  *
1678
1692
  * @param className - Name of the class to get conflict columns for
1679
1693
  * @returns Array of column names to use for conflict detection
@@ -1686,26 +1700,53 @@ var ObjectRegistry = class ObjectRegistry {
1686
1700
  *
1687
1701
  * ObjectRegistry.getConflictColumns('EventParticipant');
1688
1702
  * // Returns: ['event_id', 'profile_id']
1703
+ *
1704
+ * @smrt({ tenantScoped: true })
1705
+ * class Document extends SmrtObject {}
1706
+ *
1707
+ * ObjectRegistry.getConflictColumns('Document');
1708
+ * // Returns: ['tenant_id', 'slug', 'context']
1689
1709
  * ```
1690
1710
  */
1691
1711
  static getConflictColumns(className) {
1692
1712
  const registered = ObjectRegistry.findClass(className);
1693
- if (!registered) return ["slug", "context"];
1694
- if (registered.config?.conflictColumns) return registered.config.conflictColumns;
1695
- if (registered.config?.report) {
1696
- const tenantField = registered.tenantScopedConfig?.field;
1697
- const tenantColumn = tenantField && registered.fields.has(tenantField) ? toSnakeCase(tenantField) : "";
1698
- const reportConflictColumns = Array.from(registered.fields.entries()).filter(([, field]) => {
1713
+ if (!registered) return defaultConflictColumns("cti");
1714
+ const tableStrategy = ObjectRegistry.getTableStrategy(className);
1715
+ const ownerName = tableStrategy === "sti" ? ObjectRegistry.getSTIBase(className) : null;
1716
+ const owner = ownerName && ownerName !== className ? ObjectRegistry.findClass(ownerName) ?? registered : registered;
1717
+ if (owner.config?.conflictColumns) return owner.config.conflictColumns;
1718
+ if (owner.config?.report) {
1719
+ const reportConflictColumns = Array.from(owner.fields.entries()).filter(([, field]) => {
1699
1720
  const kind = field?._meta?.__report?.kind ?? field?.__report?.kind;
1700
1721
  return kind === "group" || kind === "bucket";
1701
1722
  }).map(([fieldName]) => toSnakeCase(fieldName));
1723
+ const tenantColumn = ObjectRegistry.getTenantColumn(className);
1702
1724
  return reportConflictColumns.length > 0 ? [...tenantColumn ? [tenantColumn] : [], ...reportConflictColumns] : ["id"];
1703
1725
  }
1704
- return ObjectRegistry.getTableStrategy(className) === "sti" ? [
1705
- "slug",
1706
- "context",
1707
- "_meta_type"
1708
- ] : ["slug", "context"];
1726
+ const primaryKeyColumns = Array.from(owner.fields.entries()).filter(([, field]) => field?._meta?.primaryKey === true).map(([fieldName]) => toSnakeCase(fieldName));
1727
+ if (primaryKeyColumns.length > 0) return primaryKeyColumns;
1728
+ return defaultConflictColumns(tableStrategy, ObjectRegistry.getTenantColumn(className));
1729
+ }
1730
+ /**
1731
+ * The tenant column of the table a class writes to, or `undefined` when its
1732
+ * schema owner (the STI root for a single-table hierarchy, the class itself
1733
+ * otherwise) is not tenant-scoped (#2360).
1734
+ *
1735
+ * Resolved from the owner's normalized `tenantScoped` configuration
1736
+ * (`@smrt({ tenantScoped })`, or `@TenantScoped()` carried by the
1737
+ * manifest), never from the standalone tenancy registry: the schema
1738
+ * generator and `getConflictColumns()` must agree before any interceptor
1739
+ * is enabled.
1740
+ *
1741
+ * @param className - Name of the class (simple or qualified)
1742
+ * @returns The snake_case tenant column name, e.g. `tenant_id`
1743
+ */
1744
+ static getTenantColumn(className) {
1745
+ const registered = ObjectRegistry.findClass(className);
1746
+ if (!registered) return void 0;
1747
+ const ownerName = ObjectRegistry.getTableStrategy(className) === "sti" ? ObjectRegistry.getSTIBase(className) : null;
1748
+ const owner = ownerName && ownerName !== className ? ObjectRegistry.findClass(ownerName) ?? registered : registered;
1749
+ return resolveTenantColumn(owner.tenantScopedConfig?.field, (fieldName) => owner.fields.has(fieldName), toSnakeCase);
1709
1750
  }
1710
1751
  /**
1711
1752
  * Get the tenant scoping configuration for a class (Issue #688)
@@ -1830,69 +1871,6 @@ var ObjectRegistry = class ObjectRegistry {
1830
1871
  return descendants;
1831
1872
  }
1832
1873
  /**
1833
- * Persist registry state to system tables
1834
- *
1835
- * Saves all registered class metadata to the _smrt_registry system table
1836
- * for runtime introspection and debugging. This enables applications to
1837
- * query what SMRT objects exist and their configurations.
1838
- *
1839
- * @param db - Database interface to persist to
1840
- * @returns Promise that resolves when persistence is complete
1841
- * @example
1842
- * ```typescript
1843
- * // After registering all classes
1844
- * await ObjectRegistry.persistToDatabase(db);
1845
- *
1846
- * // Later, query the system table
1847
- * const rows = await db.all('SELECT * FROM _smrt_registry');
1848
- * console.log('Registered classes:', rows.map(r => r.class_name));
1849
- * ```
1850
- */
1851
- static async persistToDatabase(db) {
1852
- for (const [className, registered] of ObjectRegistry.classes.entries()) {
1853
- const fieldsData = {};
1854
- for (const [key, value] of registered.fields) fieldsData[key] = {
1855
- type: value.type,
1856
- options: value.options
1857
- };
1858
- await db.upsert("_smrt_registry", ["class_name"], {
1859
- class_name: className,
1860
- schema_version: "1.0.0",
1861
- fields: JSON.stringify(fieldsData),
1862
- relationships: JSON.stringify(ObjectRegistry.getRelationships(className)),
1863
- config: JSON.stringify(registered.config),
1864
- manifest: JSON.stringify({
1865
- name: registered.name,
1866
- tableName: registered.schema?.tableName,
1867
- tools: registered.tools
1868
- }),
1869
- last_updated: /* @__PURE__ */ new Date()
1870
- });
1871
- }
1872
- }
1873
- /**
1874
- * Load registry metadata from system tables
1875
- *
1876
- * Reads the _smrt_registry system table to inspect what classes
1877
- * have been registered. This is primarily for introspection and
1878
- * debugging - actual class registration happens via @smrt() decorator.
1879
- *
1880
- * @param db - Database interface to load from
1881
- * @returns Promise resolving to array of class metadata
1882
- * @example
1883
- * ```typescript
1884
- * const metadata = await ObjectRegistry.loadFromDatabase(db);
1885
- * for (const meta of metadata) {
1886
- * console.log(`Class: ${meta.class_name}`);
1887
- * console.log(`Table: ${JSON.parse(meta.manifest).tableName}`);
1888
- * }
1889
- * ```
1890
- */
1891
- static async loadFromDatabase(db) {
1892
- const { rows } = await db.query("SELECT * FROM _smrt_registry ORDER BY class_name");
1893
- return rows;
1894
- }
1895
- /**
1896
1874
  * Get embedding configuration for a class
1897
1875
  *
1898
1876
  * Returns the class-specific embedding config if embeddings are enabled.