@happyvertical/smrt-core 0.30.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 (631) hide show
  1. package/AGENTS.md +124 -0
  2. package/CLAUDE.md +1 -0
  3. package/LICENSE +7 -0
  4. package/README.md +265 -0
  5. package/bin/smrt-prebuild.js +26 -0
  6. package/dist/__tests__/fixtures/advisor-test-classes.d.ts +28 -0
  7. package/dist/__tests__/fixtures/advisor-test-classes.d.ts.map +1 -0
  8. package/dist/__tests__/fixtures/collection-coverage-fixtures.d.ts +12 -0
  9. package/dist/__tests__/fixtures/collection-coverage-fixtures.d.ts.map +1 -0
  10. package/dist/__tests__/fixtures/inheritance-resolver-fixtures.d.ts +28 -0
  11. package/dist/__tests__/fixtures/inheritance-resolver-fixtures.d.ts.map +1 -0
  12. package/dist/__tests__/fixtures/inheritance-test-classes.d.ts +43 -0
  13. package/dist/__tests__/fixtures/inheritance-test-classes.d.ts.map +1 -0
  14. package/dist/__tests__/fixtures/mcp-integration-test-classes.d.ts +18 -0
  15. package/dist/__tests__/fixtures/mcp-integration-test-classes.d.ts.map +1 -0
  16. package/dist/__tests__/fixtures/object-ai-memory-fixtures.d.ts +15 -0
  17. package/dist/__tests__/fixtures/object-ai-memory-fixtures.d.ts.map +1 -0
  18. package/dist/__tests__/fixtures/object-spec-test-classes.d.ts +13 -0
  19. package/dist/__tests__/fixtures/object-spec-test-classes.d.ts.map +1 -0
  20. package/dist/__tests__/fixtures/registry-test-classes.d.ts +23 -0
  21. package/dist/__tests__/fixtures/registry-test-classes.d.ts.map +1 -0
  22. package/dist/adapters/ai-usage.d.ts +23 -0
  23. package/dist/adapters/ai-usage.d.ts.map +1 -0
  24. package/dist/adapters/ai-usage.js +105 -0
  25. package/dist/adapters/ai-usage.js.map +1 -0
  26. package/dist/adapters/cost-rates.d.ts +20 -0
  27. package/dist/adapters/cost-rates.d.ts.map +1 -0
  28. package/dist/adapters/cost-rates.js +40 -0
  29. package/dist/adapters/cost-rates.js.map +1 -0
  30. package/dist/adapters/index.d.ts +19 -0
  31. package/dist/adapters/index.d.ts.map +1 -0
  32. package/dist/adapters/metrics.d.ts +111 -0
  33. package/dist/adapters/metrics.d.ts.map +1 -0
  34. package/dist/adapters/metrics.js +169 -0
  35. package/dist/adapters/metrics.js.map +1 -0
  36. package/dist/adapters/pubsub.d.ts +124 -0
  37. package/dist/adapters/pubsub.d.ts.map +1 -0
  38. package/dist/adapters/pubsub.js +121 -0
  39. package/dist/adapters/pubsub.js.map +1 -0
  40. package/dist/browser.d.ts +32 -0
  41. package/dist/browser.d.ts.map +1 -0
  42. package/dist/browser.js +68 -0
  43. package/dist/browser.js.map +1 -0
  44. package/dist/child-accessors.d.ts +27 -0
  45. package/dist/child-accessors.d.ts.map +1 -0
  46. package/dist/child-accessors.js +35 -0
  47. package/dist/child-accessors.js.map +1 -0
  48. package/dist/class.d.ts +313 -0
  49. package/dist/class.d.ts.map +1 -0
  50. package/dist/class.js +896 -0
  51. package/dist/class.js.map +1 -0
  52. package/dist/collection-cache.d.ts +110 -0
  53. package/dist/collection-cache.d.ts.map +1 -0
  54. package/dist/collection-cache.js +187 -0
  55. package/dist/collection-cache.js.map +1 -0
  56. package/dist/collection.d.ts +894 -0
  57. package/dist/collection.d.ts.map +1 -0
  58. package/dist/collection.js +1987 -0
  59. package/dist/collection.js.map +1 -0
  60. package/dist/config/global-config.d.ts +3 -0
  61. package/dist/config/global-config.d.ts.map +1 -0
  62. package/dist/config/global-config.js +19 -0
  63. package/dist/config/global-config.js.map +1 -0
  64. package/dist/config.d.ts +145 -0
  65. package/dist/config.d.ts.map +1 -0
  66. package/dist/config.js +57 -0
  67. package/dist/config.js.map +1 -0
  68. package/dist/consumer-plugin/index.d.ts +22 -0
  69. package/dist/consumer-plugin/index.d.ts.map +1 -0
  70. package/dist/consumer-plugin/index.js +452 -0
  71. package/dist/consumer-plugin/index.js.map +1 -0
  72. package/dist/consumer-plugin.d.ts +8 -0
  73. package/dist/consumer-plugin.d.ts.map +1 -0
  74. package/dist/consumer-plugin.js +5 -0
  75. package/dist/consumer-plugin.js.map +1 -0
  76. package/dist/database.d.ts +95 -0
  77. package/dist/database.d.ts.map +1 -0
  78. package/dist/database.js +32 -0
  79. package/dist/database.js.map +1 -0
  80. package/dist/decorators/compatibility.d.ts +14 -0
  81. package/dist/decorators/compatibility.d.ts.map +1 -0
  82. package/dist/decorators/compatibility.js +111 -0
  83. package/dist/decorators/compatibility.js.map +1 -0
  84. package/dist/decorators/index.d.ts +381 -0
  85. package/dist/decorators/index.d.ts.map +1 -0
  86. package/dist/decorators/index.js +104 -0
  87. package/dist/decorators/index.js.map +1 -0
  88. package/dist/dispatch/bus.d.ts +306 -0
  89. package/dist/dispatch/bus.d.ts.map +1 -0
  90. package/dist/dispatch/bus.js +583 -0
  91. package/dist/dispatch/bus.js.map +1 -0
  92. package/dist/dispatch/collections/DispatchSubscriptions.d.ts +79 -0
  93. package/dist/dispatch/collections/DispatchSubscriptions.d.ts.map +1 -0
  94. package/dist/dispatch/collections/DispatchSubscriptions.js +243 -0
  95. package/dist/dispatch/collections/DispatchSubscriptions.js.map +1 -0
  96. package/dist/dispatch/collections/Dispatches.d.ts +98 -0
  97. package/dist/dispatch/collections/Dispatches.d.ts.map +1 -0
  98. package/dist/dispatch/collections/Dispatches.js +358 -0
  99. package/dist/dispatch/collections/Dispatches.js.map +1 -0
  100. package/dist/dispatch/index.d.ts +47 -0
  101. package/dist/dispatch/index.d.ts.map +1 -0
  102. package/dist/dispatch/models/Dispatch.d.ts +101 -0
  103. package/dist/dispatch/models/Dispatch.d.ts.map +1 -0
  104. package/dist/dispatch/models/Dispatch.js +162 -0
  105. package/dist/dispatch/models/Dispatch.js.map +1 -0
  106. package/dist/dispatch/models/DispatchSubscription.d.ts +83 -0
  107. package/dist/dispatch/models/DispatchSubscription.d.ts.map +1 -0
  108. package/dist/dispatch/models/DispatchSubscription.js +112 -0
  109. package/dist/dispatch/models/DispatchSubscription.js.map +1 -0
  110. package/dist/dispatch/tenant-resolver.d.ts +98 -0
  111. package/dist/dispatch/tenant-resolver.d.ts.map +1 -0
  112. package/dist/dispatch/tenant-resolver.js +32 -0
  113. package/dist/dispatch/tenant-resolver.js.map +1 -0
  114. package/dist/dispatch/types.d.ts +149 -0
  115. package/dist/dispatch/types.d.ts.map +1 -0
  116. package/dist/embeddings/hash.d.ts +33 -0
  117. package/dist/embeddings/hash.d.ts.map +1 -0
  118. package/dist/embeddings/hash.js +37 -0
  119. package/dist/embeddings/hash.js.map +1 -0
  120. package/dist/embeddings/index.d.ts +36 -0
  121. package/dist/embeddings/index.d.ts.map +1 -0
  122. package/dist/embeddings/provider.d.ts +75 -0
  123. package/dist/embeddings/provider.d.ts.map +1 -0
  124. package/dist/embeddings/provider.js +170 -0
  125. package/dist/embeddings/provider.js.map +1 -0
  126. package/dist/embeddings/similarity.d.ts +47 -0
  127. package/dist/embeddings/similarity.d.ts.map +1 -0
  128. package/dist/embeddings/similarity.js +64 -0
  129. package/dist/embeddings/similarity.js.map +1 -0
  130. package/dist/embeddings/storage.d.ts +125 -0
  131. package/dist/embeddings/storage.d.ts.map +1 -0
  132. package/dist/embeddings/storage.js +283 -0
  133. package/dist/embeddings/storage.js.map +1 -0
  134. package/dist/embeddings/types.d.ts +250 -0
  135. package/dist/embeddings/types.d.ts.map +1 -0
  136. package/dist/errors.d.ts +363 -0
  137. package/dist/errors.d.ts.map +1 -0
  138. package/dist/errors.js +669 -0
  139. package/dist/errors.js.map +1 -0
  140. package/dist/generators/cli.d.ts +162 -0
  141. package/dist/generators/cli.d.ts.map +1 -0
  142. package/dist/generators/cli.js +462 -0
  143. package/dist/generators/cli.js.map +1 -0
  144. package/dist/generators/index.d.ts +13 -0
  145. package/dist/generators/index.d.ts.map +1 -0
  146. package/dist/generators/mcp-runtime-template.d.ts +60 -0
  147. package/dist/generators/mcp-runtime-template.d.ts.map +1 -0
  148. package/dist/generators/mcp-runtime-template.js +509 -0
  149. package/dist/generators/mcp-runtime-template.js.map +1 -0
  150. package/dist/generators/mcp.d.ts +231 -0
  151. package/dist/generators/mcp.d.ts.map +1 -0
  152. package/dist/generators/mcp.js +1220 -0
  153. package/dist/generators/mcp.js.map +1 -0
  154. package/dist/generators/rest.d.ts +171 -0
  155. package/dist/generators/rest.d.ts.map +1 -0
  156. package/dist/generators/rest.js +591 -0
  157. package/dist/generators/rest.js.map +1 -0
  158. package/dist/generators/swagger.d.ts +21 -0
  159. package/dist/generators/swagger.d.ts.map +1 -0
  160. package/dist/generators/swagger.js +307 -0
  161. package/dist/generators/swagger.js.map +1 -0
  162. package/dist/generators/tenant-gate.d.ts +74 -0
  163. package/dist/generators/tenant-gate.d.ts.map +1 -0
  164. package/dist/generators/tenant-gate.js +15 -0
  165. package/dist/generators/tenant-gate.js.map +1 -0
  166. package/dist/generators.d.ts +8 -0
  167. package/dist/generators.d.ts.map +1 -0
  168. package/dist/generators.js +19 -0
  169. package/dist/generators.js.map +1 -0
  170. package/dist/hierarchical.d.ts +103 -0
  171. package/dist/hierarchical.d.ts.map +1 -0
  172. package/dist/hierarchical.js +184 -0
  173. package/dist/hierarchical.js.map +1 -0
  174. package/dist/index.d.ts +57 -0
  175. package/dist/index.d.ts.map +1 -0
  176. package/dist/index.js +202 -0
  177. package/dist/index.js.map +1 -0
  178. package/dist/interceptors.d.ts +251 -0
  179. package/dist/interceptors.d.ts.map +1 -0
  180. package/dist/interceptors.js +259 -0
  181. package/dist/interceptors.js.map +1 -0
  182. package/dist/junction.d.ts +99 -0
  183. package/dist/junction.d.ts.map +1 -0
  184. package/dist/junction.js +136 -0
  185. package/dist/junction.js.map +1 -0
  186. package/dist/knowledge.d.ts +11 -0
  187. package/dist/knowledge.d.ts.map +1 -0
  188. package/dist/knowledge.js +310 -0
  189. package/dist/knowledge.js.map +1 -0
  190. package/dist/lazy-config.d.ts +160 -0
  191. package/dist/lazy-config.d.ts.map +1 -0
  192. package/dist/lazy-config.js +146 -0
  193. package/dist/lazy-config.js.map +1 -0
  194. package/dist/manifest/discover-base-classes.d.ts +78 -0
  195. package/dist/manifest/discover-base-classes.d.ts.map +1 -0
  196. package/dist/manifest/discover-base-classes.js +85 -0
  197. package/dist/manifest/discover-base-classes.js.map +1 -0
  198. package/dist/manifest/discover-smrt-packages.d.ts +48 -0
  199. package/dist/manifest/discover-smrt-packages.d.ts.map +1 -0
  200. package/dist/manifest/discover-smrt-packages.js +361 -0
  201. package/dist/manifest/discover-smrt-packages.js.map +1 -0
  202. package/dist/manifest/generator.d.ts +93 -0
  203. package/dist/manifest/generator.d.ts.map +1 -0
  204. package/dist/manifest/generator.js +380 -0
  205. package/dist/manifest/generator.js.map +1 -0
  206. package/dist/manifest/index.d.ts +16 -0
  207. package/dist/manifest/index.d.ts.map +1 -0
  208. package/dist/manifest/index.js +51 -0
  209. package/dist/manifest/index.js.map +1 -0
  210. package/dist/manifest/manager.d.ts +51 -0
  211. package/dist/manifest/manager.d.ts.map +1 -0
  212. package/dist/manifest/manager.js +89 -0
  213. package/dist/manifest/manager.js.map +1 -0
  214. package/dist/manifest/manifest-loader.d.ts +187 -0
  215. package/dist/manifest/manifest-loader.d.ts.map +1 -0
  216. package/dist/manifest/manifest-loader.js +847 -0
  217. package/dist/manifest/manifest-loader.js.map +1 -0
  218. package/dist/manifest/sources/composite.d.ts +22 -0
  219. package/dist/manifest/sources/composite.d.ts.map +1 -0
  220. package/dist/manifest/sources/composite.js +60 -0
  221. package/dist/manifest/sources/composite.js.map +1 -0
  222. package/dist/manifest/sources/embedded.d.ts +7 -0
  223. package/dist/manifest/sources/embedded.d.ts.map +1 -0
  224. package/dist/manifest/sources/embedded.js +30 -0
  225. package/dist/manifest/sources/embedded.js.map +1 -0
  226. package/dist/manifest/sources/explicit-paths.d.ts +17 -0
  227. package/dist/manifest/sources/explicit-paths.d.ts.map +1 -0
  228. package/dist/manifest/sources/explicit-paths.js +35 -0
  229. package/dist/manifest/sources/explicit-paths.js.map +1 -0
  230. package/dist/manifest/sources/fallback.d.ts +25 -0
  231. package/dist/manifest/sources/fallback.d.ts.map +1 -0
  232. package/dist/manifest/sources/fallback.js +63 -0
  233. package/dist/manifest/sources/fallback.js.map +1 -0
  234. package/dist/manifest/sources/index.d.ts +17 -0
  235. package/dist/manifest/sources/index.d.ts.map +1 -0
  236. package/dist/manifest/sources/local-test.d.ts +7 -0
  237. package/dist/manifest/sources/local-test.d.ts.map +1 -0
  238. package/dist/manifest/sources/local-test.js +21 -0
  239. package/dist/manifest/sources/local-test.js.map +1 -0
  240. package/dist/manifest/sources/static.d.ts +7 -0
  241. package/dist/manifest/sources/static.d.ts.map +1 -0
  242. package/dist/manifest/sources/static.js +19 -0
  243. package/dist/manifest/sources/static.js.map +1 -0
  244. package/dist/manifest/sources/test.d.ts +7 -0
  245. package/dist/manifest/sources/test.d.ts.map +1 -0
  246. package/dist/manifest/sources/test.js +21 -0
  247. package/dist/manifest/sources/test.js.map +1 -0
  248. package/dist/manifest/sources/types.d.ts +79 -0
  249. package/dist/manifest/sources/types.d.ts.map +1 -0
  250. package/dist/manifest/sources/types.js +61 -0
  251. package/dist/manifest/sources/types.js.map +1 -0
  252. package/dist/manifest/static-manifest.d.ts +4 -0
  253. package/dist/manifest/static-manifest.d.ts.map +1 -0
  254. package/dist/manifest/static-manifest.js +1535 -0
  255. package/dist/manifest/static-manifest.js.map +1 -0
  256. package/dist/manifest/store.d.ts +111 -0
  257. package/dist/manifest/store.d.ts.map +1 -0
  258. package/dist/manifest/store.js +431 -0
  259. package/dist/manifest/store.js.map +1 -0
  260. package/dist/manifest/test-manifest-loader.d.ts +3 -0
  261. package/dist/manifest/test-manifest-loader.d.ts.map +1 -0
  262. package/dist/manifest/test-manifest-stub.d.ts +4 -0
  263. package/dist/manifest/test-manifest-stub.d.ts.map +1 -0
  264. package/dist/manifest/test-manifest-stub.js +80013 -0
  265. package/dist/manifest/test-manifest-stub.js.map +1 -0
  266. package/dist/manifest.d.ts +8 -0
  267. package/dist/manifest.d.ts.map +1 -0
  268. package/dist/manifest.js +20 -0
  269. package/dist/manifest.js.map +1 -0
  270. package/dist/manifest.json +1489 -0
  271. package/dist/mcp-advisor/index.d.ts +499 -0
  272. package/dist/mcp-advisor/index.d.ts.map +1 -0
  273. package/dist/mcp-advisor/tools/add-ai-methods.d.ts +6 -0
  274. package/dist/mcp-advisor/tools/add-ai-methods.d.ts.map +1 -0
  275. package/dist/mcp-advisor/tools/configure-decorators.d.ts +6 -0
  276. package/dist/mcp-advisor/tools/configure-decorators.d.ts.map +1 -0
  277. package/dist/mcp-advisor/tools/generate-collection.d.ts +6 -0
  278. package/dist/mcp-advisor/tools/generate-collection.d.ts.map +1 -0
  279. package/dist/mcp-advisor/tools/generate-field-definitions.d.ts +6 -0
  280. package/dist/mcp-advisor/tools/generate-field-definitions.d.ts.map +1 -0
  281. package/dist/mcp-advisor/tools/generate-smrt-class.d.ts +6 -0
  282. package/dist/mcp-advisor/tools/generate-smrt-class.d.ts.map +1 -0
  283. package/dist/mcp-advisor/tools/get-object-config.d.ts +6 -0
  284. package/dist/mcp-advisor/tools/get-object-config.d.ts.map +1 -0
  285. package/dist/mcp-advisor/tools/get-object-schema.d.ts +10 -0
  286. package/dist/mcp-advisor/tools/get-object-schema.d.ts.map +1 -0
  287. package/dist/mcp-advisor/tools/list-registered-objects.d.ts +9 -0
  288. package/dist/mcp-advisor/tools/list-registered-objects.d.ts.map +1 -0
  289. package/dist/mcp-advisor/tools/preview-api-endpoints.d.ts +9 -0
  290. package/dist/mcp-advisor/tools/preview-api-endpoints.d.ts.map +1 -0
  291. package/dist/mcp-advisor/tools/preview-mcp-tools.d.ts +9 -0
  292. package/dist/mcp-advisor/tools/preview-mcp-tools.d.ts.map +1 -0
  293. package/dist/mcp-advisor/tools/validate-smrt-object.d.ts +6 -0
  294. package/dist/mcp-advisor/tools/validate-smrt-object.d.ts.map +1 -0
  295. package/dist/mcp-advisor/types.d.ts +209 -0
  296. package/dist/mcp-advisor/types.d.ts.map +1 -0
  297. package/dist/migrations/backfill-tracker.d.ts +84 -0
  298. package/dist/migrations/backfill-tracker.d.ts.map +1 -0
  299. package/dist/migrations/backfill-tracker.js +118 -0
  300. package/dist/migrations/backfill-tracker.js.map +1 -0
  301. package/dist/migrations/checksum.d.ts +43 -0
  302. package/dist/migrations/checksum.d.ts.map +1 -0
  303. package/dist/migrations/checksum.js +32 -0
  304. package/dist/migrations/checksum.js.map +1 -0
  305. package/dist/migrations/differ.d.ts +186 -0
  306. package/dist/migrations/differ.d.ts.map +1 -0
  307. package/dist/migrations/differ.js +601 -0
  308. package/dist/migrations/differ.js.map +1 -0
  309. package/dist/migrations/generator.d.ts +133 -0
  310. package/dist/migrations/generator.d.ts.map +1 -0
  311. package/dist/migrations/generator.js +328 -0
  312. package/dist/migrations/generator.js.map +1 -0
  313. package/dist/migrations/index.d.ts +20 -0
  314. package/dist/migrations/index.d.ts.map +1 -0
  315. package/dist/migrations/orchestrate.d.ts +148 -0
  316. package/dist/migrations/orchestrate.d.ts.map +1 -0
  317. package/dist/migrations/orchestrate.js +118 -0
  318. package/dist/migrations/orchestrate.js.map +1 -0
  319. package/dist/migrations/tracker.d.ts +134 -0
  320. package/dist/migrations/tracker.d.ts.map +1 -0
  321. package/dist/migrations/tracker.js +624 -0
  322. package/dist/migrations/tracker.js.map +1 -0
  323. package/dist/migrations/types.d.ts +221 -0
  324. package/dist/migrations/types.d.ts.map +1 -0
  325. package/dist/migrations.d.ts +7 -0
  326. package/dist/migrations.d.ts.map +1 -0
  327. package/dist/migrations.js +26 -0
  328. package/dist/migrations.js.map +1 -0
  329. package/dist/node_modules/.pnpm/balanced-match@4.0.4/node_modules/balanced-match/dist/esm/index.js +56 -0
  330. package/dist/node_modules/.pnpm/balanced-match@4.0.4/node_modules/balanced-match/dist/esm/index.js.map +1 -0
  331. package/dist/node_modules/.pnpm/brace-expansion@5.0.5/node_modules/brace-expansion/dist/esm/index.js +163 -0
  332. package/dist/node_modules/.pnpm/brace-expansion@5.0.5/node_modules/brace-expansion/dist/esm/index.js.map +1 -0
  333. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/assert-valid-pattern.js +13 -0
  334. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map +1 -0
  335. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/ast.js +654 -0
  336. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/ast.js.map +1 -0
  337. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/brace-expressions.js +111 -0
  338. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/brace-expressions.js.map +1 -0
  339. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/escape.js +10 -0
  340. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/escape.js.map +1 -0
  341. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/index.js +824 -0
  342. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/index.js.map +1 -0
  343. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/unescape.js +10 -0
  344. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/unescape.js.map +1 -0
  345. package/dist/object.d.ts +1202 -0
  346. package/dist/object.d.ts.map +1 -0
  347. package/dist/object.js +2731 -0
  348. package/dist/object.js.map +1 -0
  349. package/dist/polymorphic-association.d.ts +69 -0
  350. package/dist/polymorphic-association.d.ts.map +1 -0
  351. package/dist/polymorphic-association.js +96 -0
  352. package/dist/polymorphic-association.js.map +1 -0
  353. package/dist/prebuild/cli.d.ts +7 -0
  354. package/dist/prebuild/cli.d.ts.map +1 -0
  355. package/dist/prebuild/cli.js +29 -0
  356. package/dist/prebuild/cli.js.map +1 -0
  357. package/dist/prebuild/index.d.ts +22 -0
  358. package/dist/prebuild/index.d.ts.map +1 -0
  359. package/dist/prebuild/index.js +239 -0
  360. package/dist/prebuild/index.js.map +1 -0
  361. package/dist/prebuild.d.ts +8 -0
  362. package/dist/prebuild.d.ts.map +1 -0
  363. package/dist/prebuild.js +6 -0
  364. package/dist/prebuild.js.map +1 -0
  365. package/dist/registry/cache-config.d.ts +13 -0
  366. package/dist/registry/cache-config.d.ts.map +1 -0
  367. package/dist/registry/cache-config.js +17 -0
  368. package/dist/registry/cache-config.js.map +1 -0
  369. package/dist/registry/class-registration.d.ts +31 -0
  370. package/dist/registry/class-registration.d.ts.map +1 -0
  371. package/dist/registry/class-registration.js +1074 -0
  372. package/dist/registry/class-registration.js.map +1 -0
  373. package/dist/registry/collection-resolution.d.ts +45 -0
  374. package/dist/registry/collection-resolution.d.ts.map +1 -0
  375. package/dist/registry/collection-resolution.js +121 -0
  376. package/dist/registry/collection-resolution.js.map +1 -0
  377. package/dist/registry/collision-policy.d.ts +179 -0
  378. package/dist/registry/collision-policy.d.ts.map +1 -0
  379. package/dist/registry/collision-policy.js +153 -0
  380. package/dist/registry/collision-policy.js.map +1 -0
  381. package/dist/registry/diagnostics.d.ts +58 -0
  382. package/dist/registry/diagnostics.d.ts.map +1 -0
  383. package/dist/registry/diagnostics.js +54 -0
  384. package/dist/registry/diagnostics.js.map +1 -0
  385. package/dist/registry/embedding-manager.d.ts +23 -0
  386. package/dist/registry/embedding-manager.d.ts.map +1 -0
  387. package/dist/registry/embedding-manager.js +62 -0
  388. package/dist/registry/embedding-manager.js.map +1 -0
  389. package/dist/registry/index.d.ts +13 -0
  390. package/dist/registry/index.d.ts.map +1 -0
  391. package/dist/registry/inheritance-resolver.d.ts +13 -0
  392. package/dist/registry/inheritance-resolver.d.ts.map +1 -0
  393. package/dist/registry/inheritance-resolver.js +244 -0
  394. package/dist/registry/inheritance-resolver.js.map +1 -0
  395. package/dist/registry/manifest-field-merge.d.ts +4 -0
  396. package/dist/registry/manifest-field-merge.d.ts.map +1 -0
  397. package/dist/registry/manifest-field-merge.js +82 -0
  398. package/dist/registry/manifest-field-merge.js.map +1 -0
  399. package/dist/registry/name-resolver.d.ts +102 -0
  400. package/dist/registry/name-resolver.d.ts.map +1 -0
  401. package/dist/registry/name-resolver.js +241 -0
  402. package/dist/registry/name-resolver.js.map +1 -0
  403. package/dist/registry/relationship-graph.d.ts +16 -0
  404. package/dist/registry/relationship-graph.d.ts.map +1 -0
  405. package/dist/registry/relationship-graph.js +79 -0
  406. package/dist/registry/relationship-graph.js.map +1 -0
  407. package/dist/registry/schema-builder.d.ts +113 -0
  408. package/dist/registry/schema-builder.d.ts.map +1 -0
  409. package/dist/registry/schema-builder.js +474 -0
  410. package/dist/registry/schema-builder.js.map +1 -0
  411. package/dist/registry/shared-state.d.ts +62 -0
  412. package/dist/registry/shared-state.d.ts.map +1 -0
  413. package/dist/registry/shared-state.js +135 -0
  414. package/dist/registry/shared-state.js.map +1 -0
  415. package/dist/registry/types.d.ts +667 -0
  416. package/dist/registry/types.d.ts.map +1 -0
  417. package/dist/registry/validator.d.ts +13 -0
  418. package/dist/registry/validator.d.ts.map +1 -0
  419. package/dist/registry/validator.js +138 -0
  420. package/dist/registry/validator.js.map +1 -0
  421. package/dist/registry.d.ts +1358 -0
  422. package/dist/registry.d.ts.map +1 -0
  423. package/dist/registry.js +2301 -0
  424. package/dist/registry.js.map +1 -0
  425. package/dist/runtime/client.d.ts +34 -0
  426. package/dist/runtime/client.d.ts.map +1 -0
  427. package/dist/runtime/client.js +104 -0
  428. package/dist/runtime/client.js.map +1 -0
  429. package/dist/runtime/index.d.ts +10 -0
  430. package/dist/runtime/index.d.ts.map +1 -0
  431. package/dist/runtime/mcp.d.ts +47 -0
  432. package/dist/runtime/mcp.d.ts.map +1 -0
  433. package/dist/runtime/mcp.js +72 -0
  434. package/dist/runtime/mcp.js.map +1 -0
  435. package/dist/runtime/server.d.ts +92 -0
  436. package/dist/runtime/server.d.ts.map +1 -0
  437. package/dist/runtime/server.js +390 -0
  438. package/dist/runtime/server.js.map +1 -0
  439. package/dist/runtime/types.d.ts +58 -0
  440. package/dist/runtime/types.d.ts.map +1 -0
  441. package/dist/runtime.d.ts +8 -0
  442. package/dist/runtime.d.ts.map +1 -0
  443. package/dist/runtime.js +10 -0
  444. package/dist/runtime.js.map +1 -0
  445. package/dist/scanner/import-scanner.d.ts +7 -0
  446. package/dist/scanner/import-scanner.d.ts.map +1 -0
  447. package/dist/scanner/index.d.ts +12 -0
  448. package/dist/scanner/index.d.ts.map +1 -0
  449. package/dist/scanner/manifest-generator.d.ts +304 -0
  450. package/dist/scanner/manifest-generator.d.ts.map +1 -0
  451. package/dist/scanner/manifest-generator.js +1707 -0
  452. package/dist/scanner/manifest-generator.js.map +1 -0
  453. package/dist/scanner/test-file-patterns.d.ts +18 -0
  454. package/dist/scanner/test-file-patterns.d.ts.map +1 -0
  455. package/dist/scanner/test-file-patterns.js +16 -0
  456. package/dist/scanner/test-file-patterns.js.map +1 -0
  457. package/dist/scanner/types.d.ts +313 -0
  458. package/dist/scanner/types.d.ts.map +1 -0
  459. package/dist/scanner/types.js +2 -0
  460. package/dist/scanner/types.js.map +1 -0
  461. package/dist/scanner.d.ts +6 -0
  462. package/dist/scanner.d.ts.map +1 -0
  463. package/dist/scanner.js +6 -0
  464. package/dist/scanner.js.map +1 -0
  465. package/dist/schema/code-generator.d.ts +53 -0
  466. package/dist/schema/code-generator.d.ts.map +1 -0
  467. package/dist/schema/ddl/base-strategy.d.ts +80 -0
  468. package/dist/schema/ddl/base-strategy.d.ts.map +1 -0
  469. package/dist/schema/ddl/base-strategy.js +240 -0
  470. package/dist/schema/ddl/base-strategy.js.map +1 -0
  471. package/dist/schema/ddl/duckdb-strategy.d.ts +33 -0
  472. package/dist/schema/ddl/duckdb-strategy.d.ts.map +1 -0
  473. package/dist/schema/ddl/duckdb-strategy.js +74 -0
  474. package/dist/schema/ddl/duckdb-strategy.js.map +1 -0
  475. package/dist/schema/ddl/index.d.ts +53 -0
  476. package/dist/schema/ddl/index.d.ts.map +1 -0
  477. package/dist/schema/ddl/index.js +80 -0
  478. package/dist/schema/ddl/index.js.map +1 -0
  479. package/dist/schema/ddl/json-duckdb-strategy.d.ts +8 -0
  480. package/dist/schema/ddl/json-duckdb-strategy.d.ts.map +1 -0
  481. package/dist/schema/ddl/json-duckdb-strategy.js +14 -0
  482. package/dist/schema/ddl/json-duckdb-strategy.js.map +1 -0
  483. package/dist/schema/ddl/postgres-strategy.d.ts +29 -0
  484. package/dist/schema/ddl/postgres-strategy.d.ts.map +1 -0
  485. package/dist/schema/ddl/postgres-strategy.js +102 -0
  486. package/dist/schema/ddl/postgres-strategy.js.map +1 -0
  487. package/dist/schema/ddl/sqlite-strategy.d.ts +38 -0
  488. package/dist/schema/ddl/sqlite-strategy.d.ts.map +1 -0
  489. package/dist/schema/ddl/sqlite-strategy.js +74 -0
  490. package/dist/schema/ddl/sqlite-strategy.js.map +1 -0
  491. package/dist/schema/ddl/types.d.ts +114 -0
  492. package/dist/schema/ddl/types.d.ts.map +1 -0
  493. package/dist/schema/generator.d.ts +176 -0
  494. package/dist/schema/generator.d.ts.map +1 -0
  495. package/dist/schema/generator.js +1076 -0
  496. package/dist/schema/generator.js.map +1 -0
  497. package/dist/schema/index-utils.d.ts +19 -0
  498. package/dist/schema/index-utils.d.ts.map +1 -0
  499. package/dist/schema/index-utils.js +32 -0
  500. package/dist/schema/index-utils.js.map +1 -0
  501. package/dist/schema/index.d.ts +13 -0
  502. package/dist/schema/index.d.ts.map +1 -0
  503. package/dist/schema/override-system.d.ts +43 -0
  504. package/dist/schema/override-system.d.ts.map +1 -0
  505. package/dist/schema/schema-aggregator.d.ts +112 -0
  506. package/dist/schema/schema-aggregator.d.ts.map +1 -0
  507. package/dist/schema/schema-manager.d.ts +95 -0
  508. package/dist/schema/schema-manager.d.ts.map +1 -0
  509. package/dist/schema/schema-manager.js +283 -0
  510. package/dist/schema/schema-manager.js.map +1 -0
  511. package/dist/schema/sql-identifiers.d.ts +107 -0
  512. package/dist/schema/sql-identifiers.d.ts.map +1 -0
  513. package/dist/schema/sql-identifiers.js +190 -0
  514. package/dist/schema/sql-identifiers.js.map +1 -0
  515. package/dist/schema/table-verifier.d.ts +10 -0
  516. package/dist/schema/table-verifier.d.ts.map +1 -0
  517. package/dist/schema/table-verifier.js +37 -0
  518. package/dist/schema/table-verifier.js.map +1 -0
  519. package/dist/schema/types.d.ts +241 -0
  520. package/dist/schema/types.d.ts.map +1 -0
  521. package/dist/schema/utils.d.ts +32 -0
  522. package/dist/schema/utils.d.ts.map +1 -0
  523. package/dist/schema/utils.js +134 -0
  524. package/dist/schema/utils.js.map +1 -0
  525. package/dist/scripts/create-wrappers.js +89 -0
  526. package/dist/scripts/generate-manifest.js +155 -0
  527. package/dist/scripts/generate-test-manifest.js +77 -0
  528. package/dist/scripts/migrate-datetime-to-timestamp.ts +310 -0
  529. package/dist/scripts/prepack.js +49 -0
  530. package/dist/signals/bus.d.ts +64 -0
  531. package/dist/signals/bus.d.ts.map +1 -0
  532. package/dist/signals/bus.js +102 -0
  533. package/dist/signals/bus.js.map +1 -0
  534. package/dist/signals/index.d.ts +11 -0
  535. package/dist/signals/index.d.ts.map +1 -0
  536. package/dist/signals/sanitizer.d.ts +54 -0
  537. package/dist/signals/sanitizer.d.ts.map +1 -0
  538. package/dist/signals/sanitizer.js +111 -0
  539. package/dist/signals/sanitizer.js.map +1 -0
  540. package/dist/smrt-knowledge.json +335 -0
  541. package/dist/system/compatibility.d.ts +8 -0
  542. package/dist/system/compatibility.d.ts.map +1 -0
  543. package/dist/system/compatibility.js +409 -0
  544. package/dist/system/compatibility.js.map +1 -0
  545. package/dist/system/index.d.ts +9 -0
  546. package/dist/system/index.d.ts.map +1 -0
  547. package/dist/system/schema.d.ts +69 -0
  548. package/dist/system/schema.d.ts.map +1 -0
  549. package/dist/system/schema.js +271 -0
  550. package/dist/system/schema.js.map +1 -0
  551. package/dist/system/types.d.ts +135 -0
  552. package/dist/system/types.d.ts.map +1 -0
  553. package/dist/system-fields.d.ts +44 -0
  554. package/dist/system-fields.d.ts.map +1 -0
  555. package/dist/system-fields.js +55 -0
  556. package/dist/system-fields.js.map +1 -0
  557. package/dist/table-cache.d.ts +28 -0
  558. package/dist/table-cache.d.ts.map +1 -0
  559. package/dist/table-cache.js +21 -0
  560. package/dist/table-cache.js.map +1 -0
  561. package/dist/test-utils.d.ts +140 -0
  562. package/dist/test-utils.d.ts.map +1 -0
  563. package/dist/testing/database.d.ts +73 -0
  564. package/dist/testing/database.d.ts.map +1 -0
  565. package/dist/testing/database.js +204 -0
  566. package/dist/testing/database.js.map +1 -0
  567. package/dist/testing/index.d.ts +21 -0
  568. package/dist/testing/index.d.ts.map +1 -0
  569. package/dist/testing.d.ts +6 -0
  570. package/dist/testing.d.ts.map +1 -0
  571. package/dist/testing.js +5 -0
  572. package/dist/testing.js.map +1 -0
  573. package/dist/tools/index.d.ts +8 -0
  574. package/dist/tools/index.d.ts.map +1 -0
  575. package/dist/tools/tool-executor.d.ts +101 -0
  576. package/dist/tools/tool-executor.d.ts.map +1 -0
  577. package/dist/tools/tool-executor.js +142 -0
  578. package/dist/tools/tool-executor.js.map +1 -0
  579. package/dist/tools/tool-generator.d.ts +54 -0
  580. package/dist/tools/tool-generator.d.ts.map +1 -0
  581. package/dist/tools/tool-generator.js +121 -0
  582. package/dist/tools/tool-generator.js.map +1 -0
  583. package/dist/utils/chunk.d.ts +32 -0
  584. package/dist/utils/chunk.d.ts.map +1 -0
  585. package/dist/utils/chunk.js +14 -0
  586. package/dist/utils/chunk.js.map +1 -0
  587. package/dist/utils/import-workspace-module.d.ts +8 -0
  588. package/dist/utils/import-workspace-module.d.ts.map +1 -0
  589. package/dist/utils/import-workspace-module.js +81 -0
  590. package/dist/utils/import-workspace-module.js.map +1 -0
  591. package/dist/utils/json.d.ts +102 -0
  592. package/dist/utils/json.d.ts.map +1 -0
  593. package/dist/utils/json.js +43 -0
  594. package/dist/utils/json.js.map +1 -0
  595. package/dist/utils/lru-cache.d.ts +69 -0
  596. package/dist/utils/lru-cache.d.ts.map +1 -0
  597. package/dist/utils/lru-cache.js +100 -0
  598. package/dist/utils/lru-cache.js.map +1 -0
  599. package/dist/utils/naming.d.ts +16 -0
  600. package/dist/utils/naming.d.ts.map +1 -0
  601. package/dist/utils/naming.js +23 -0
  602. package/dist/utils/naming.js.map +1 -0
  603. package/dist/utils/qualified-names.d.ts +122 -0
  604. package/dist/utils/qualified-names.d.ts.map +1 -0
  605. package/dist/utils/qualified-names.js +82 -0
  606. package/dist/utils/qualified-names.js.map +1 -0
  607. package/dist/utils/scanner-module.d.ts +37 -0
  608. package/dist/utils/scanner-module.d.ts.map +1 -0
  609. package/dist/utils.d.ts +177 -0
  610. package/dist/utils.d.ts.map +1 -0
  611. package/dist/utils.js +185 -0
  612. package/dist/utils.js.map +1 -0
  613. package/dist/vite-plugin/import-build-aware.d.ts +68 -0
  614. package/dist/vite-plugin/import-build-aware.d.ts.map +1 -0
  615. package/dist/vite-plugin/import-build-aware.js +72 -0
  616. package/dist/vite-plugin/import-build-aware.js.map +1 -0
  617. package/dist/vite-plugin/index.d.ts +59 -0
  618. package/dist/vite-plugin/index.d.ts.map +1 -0
  619. package/dist/vite-plugin/index.js +1400 -0
  620. package/dist/vite-plugin/index.js.map +1 -0
  621. package/dist/vite-plugin/sveltekit-generator.d.ts +66 -0
  622. package/dist/vite-plugin/sveltekit-generator.d.ts.map +1 -0
  623. package/dist/vite-plugin/sveltekit-generator.js +1375 -0
  624. package/dist/vite-plugin/sveltekit-generator.js.map +1 -0
  625. package/dist/vite-plugin/templates/default-ui.ts +432 -0
  626. package/dist/vite-plugin/templates/default.html +206 -0
  627. package/dist/vite-plugin.d.ts +8 -0
  628. package/dist/vite-plugin.d.ts.map +1 -0
  629. package/dist/vite-plugin.js +11 -0
  630. package/dist/vite-plugin.js.map +1 -0
  631. package/package.json +208 -0
@@ -0,0 +1,1074 @@
1
+ import { ConfigurationError } from "../errors.js";
2
+ import { getPackageName, lookupInManifest, discoverManifestSync, discoverSTISiblingsSync } from "../manifest/manifest-loader.js";
3
+ import { cloneManifestSchemaColumns } from "../manifest/store.js";
4
+ import { SmrtObject } from "../object.js";
5
+ import { tableNameFromClass } from "../utils.js";
6
+ import { createQualifiedName, isQualifiedName } from "../utils/qualified-names.js";
7
+ import { decideCollisionPolicy } from "./collision-policy.js";
8
+ import { buildInheritanceChain } from "./inheritance-resolver.js";
9
+ import { createFieldFromManifest, mergeManifestField } from "./manifest-field-merge.js";
10
+ import { findClass, hasClassCaseInsensitive, getCanonicalClassName, qualifyExtendsName } from "./name-resolver.js";
11
+ import { getSourceFileFromStack, getClasses, verboseLog, getFieldDecorators, getConstructorIndex, getStiSiblingsLoaded, getCollections, getInheritanceCache } from "./shared-state.js";
12
+ import { compileValidators } from "./validator.js";
13
+ import { toSnakeCase } from "../utils/naming.js";
14
+ function pluralizeCollection(className) {
15
+ const lower = className.toLowerCase();
16
+ if (lower.endsWith("y")) return `${lower.slice(0, -1)}ies`;
17
+ if (lower.endsWith("s") || lower.endsWith("x") || lower.endsWith("z")) {
18
+ return `${lower}es`;
19
+ }
20
+ if (lower.endsWith("ch") || lower.endsWith("sh")) return `${lower}es`;
21
+ return `${lower}s`;
22
+ }
23
+ function isBundledOutputPath(sourceFile) {
24
+ if (!sourceFile) return false;
25
+ return sourceFile.includes(".svelte-kit/output/") || sourceFile.includes("/dist/") || sourceFile.includes("/build/") || sourceFile.includes(".next/") || sourceFile.includes(".nuxt/");
26
+ }
27
+ function buildDecoratorCollisionInputs(args) {
28
+ const {
29
+ ctor,
30
+ name,
31
+ newPackageName,
32
+ newSourceFile,
33
+ newInBundledContext,
34
+ existing,
35
+ existingKey,
36
+ matchKind
37
+ } = args;
38
+ let newExtendsExisting = false;
39
+ let existingExtendsNew = false;
40
+ try {
41
+ newExtendsExisting = ctor.prototype instanceof existing.constructor;
42
+ existingExtendsNew = existing.constructor.prototype instanceof ctor;
43
+ } catch {
44
+ }
45
+ const bothSourceFilesKnown = !!(newSourceFile && existing.sourceFilePath);
46
+ const sameSourceFile = bothSourceFilesKnown && newSourceFile === existing.sourceFilePath;
47
+ const existingIsPackageQualified = !!existing.packageName?.startsWith("@");
48
+ const samePackage = !!newPackageName && !!existing.packageName && newPackageName === existing.packageName;
49
+ const hasNewQualifiedKey = !!newPackageName;
50
+ const existingKeyIsQualified = isQualifiedName(existingKey);
51
+ return {
52
+ origin: "decorator",
53
+ matchKind,
54
+ sameConstructor: existing.constructor === ctor,
55
+ sameSourceFile,
56
+ bothSourceFilesKnown,
57
+ existingIsManifestStub: existing.constructor._isManifestStub === true,
58
+ newInBundledContext,
59
+ newExtendsExisting,
60
+ existingExtendsNew,
61
+ samePackage,
62
+ existingIsPackageQualified,
63
+ sameName: name === existing.name,
64
+ hasNewQualifiedKey,
65
+ existingKeyIsQualified,
66
+ existingHasAnyPackage: !!existing.packageName,
67
+ // Manifest-only fields; filled with safe defaults for decorator origin.
68
+ hasManifestContent: false,
69
+ registrationKeyDiffersFromExistingKey: false,
70
+ existingHasNoPackage: !existing.packageName
71
+ };
72
+ }
73
+ function applyRegisterCollisionPolicy(args) {
74
+ const inputs = buildDecoratorCollisionInputs(args);
75
+ const decision = decideCollisionPolicy(inputs);
76
+ switch (decision.policy) {
77
+ case "accept":
78
+ case "replace": {
79
+ const newKey = args.upsertExistingEntry(args.existingKey, args.existing);
80
+ if (decision.scenario === "sti-child-wins" || decision.scenario === "manifest-stub-replacement") {
81
+ verboseLog(
82
+ `[registry] ${decision.scenario}: '${args.name}' → key='${newKey}' (${decision.reason})`
83
+ );
84
+ }
85
+ return true;
86
+ }
87
+ case "skip":
88
+ verboseLog(
89
+ `[registry] ${decision.scenario}: skipping '${args.name}' (${decision.reason})`
90
+ );
91
+ return true;
92
+ case "throw": {
93
+ const matchSuffix = args.matchKind === "case-insensitive" ? ` (case-insensitive match with "${args.existingKey}")` : "";
94
+ throw new Error(
95
+ `SMRT Class Name Collision: "${args.name}"${matchSuffix}
96
+
97
+ A class with this name is already registered, but with a different constructor.
98
+ This usually happens when:
99
+ 1. Multiple test files define classes with the same name
100
+ 2. Different packages export classes with the same name
101
+
102
+ The collision will cause the wrong field definitions to be used,
103
+ leading to properties not being initialized correctly.
104
+
105
+ To fix:
106
+ - Use unique class names (e.g., ${args.name}_UniqueId)
107
+ - Or use @smrt({ name: 'unique_name' }) to override the registration name`
108
+ );
109
+ }
110
+ case "merge-manifest":
111
+ case "coexist-qualified":
112
+ throw new Error(
113
+ `decideCollisionPolicy returned '${decision.policy}' for decorator origin (scenario: ${decision.scenario}). This is a bug.`
114
+ );
115
+ }
116
+ }
117
+ function buildManifestCollisionInputs(args) {
118
+ const {
119
+ name,
120
+ objectDef,
121
+ packageName,
122
+ existing,
123
+ existingKey,
124
+ registrationKey,
125
+ matchKind
126
+ } = args;
127
+ const newClassName = objectDef.className || name;
128
+ const newExtends = objectDef.extends;
129
+ const newExtendsExisting = !!(newExtends && (newExtends === existing.name || newExtends === existingKey || newExtends.toLowerCase() === existing.name.toLowerCase()));
130
+ const existingExtendsNew = !!(existing.extends && (existing.extends === newClassName || existing.extends === name || existing.extends === registrationKey || existing.extends.toLowerCase() === newClassName.toLowerCase()));
131
+ const newSourceFile = objectDef.filePath;
132
+ const bothSourceFilesKnown = !!(newSourceFile && existing.sourceFilePath);
133
+ const sameSourceFile = bothSourceFilesKnown && newSourceFile === existing.sourceFilePath;
134
+ const existingIsPackageQualified = !!existing.packageName?.startsWith("@");
135
+ const samePackage = !!packageName && !!existing.packageName && packageName === existing.packageName;
136
+ return {
137
+ origin: "manifest",
138
+ matchKind,
139
+ sameConstructor: false,
140
+ sameSourceFile,
141
+ bothSourceFilesKnown,
142
+ existingIsManifestStub: existing.constructor._isManifestStub === true,
143
+ newInBundledContext: false,
144
+ newExtendsExisting,
145
+ existingExtendsNew,
146
+ samePackage,
147
+ existingIsPackageQualified,
148
+ sameName: newClassName === existing.name,
149
+ hasNewQualifiedKey: isQualifiedName(registrationKey),
150
+ existingKeyIsQualified: isQualifiedName(existingKey),
151
+ existingHasAnyPackage: !!existing.packageName,
152
+ hasManifestContent: !!(objectDef.fields || objectDef.methods || objectDef.schema || objectDef.decoratorConfig),
153
+ registrationKeyDiffersFromExistingKey: registrationKey !== existingKey,
154
+ existingHasNoPackage: !existing.packageName
155
+ };
156
+ }
157
+ function applyManifestCollisionPolicy(args) {
158
+ const inputs = buildManifestCollisionInputs(args);
159
+ const decision = decideCollisionPolicy(inputs);
160
+ switch (decision.policy) {
161
+ case "skip":
162
+ verboseLog(
163
+ `[registry] ${decision.scenario}: skipping manifest '${args.name}' (${decision.reason})`
164
+ );
165
+ return "return";
166
+ case "replace":
167
+ getClasses().delete(args.existingKey);
168
+ verboseLog(
169
+ `[registry] ${decision.scenario}: '${args.name}' replaces '${args.existingKey}' (${decision.reason})`
170
+ );
171
+ return "continue";
172
+ case "merge-manifest": {
173
+ mergeManifestIntoExistingRegistration(
174
+ args.existing,
175
+ args.objectDef,
176
+ args.packageName
177
+ );
178
+ if (args.registrationKey !== args.existingKey) {
179
+ const classes = getClasses();
180
+ classes.set(args.registrationKey, args.existing);
181
+ getConstructorIndex().set(
182
+ args.existing.constructor,
183
+ args.registrationKey
184
+ );
185
+ }
186
+ return "return";
187
+ }
188
+ case "coexist-qualified":
189
+ return "continue";
190
+ case "accept":
191
+ return "return";
192
+ case "throw":
193
+ throw new Error(
194
+ `decideCollisionPolicy returned 'throw' for manifest origin (scenario: ${decision.scenario}). This is a bug.`
195
+ );
196
+ }
197
+ }
198
+ function resolveTableName(ctor, name, config) {
199
+ const manifestEntry = config._manifest ? lookupInManifest(config._manifest, name) : discoverManifestSync(name);
200
+ return manifestEntry?.schema?.tableName || manifestEntry?.decoratorConfig?.tableName || config.tableName || tableNameFromClass(ctor);
201
+ }
202
+ function setSmrtTableName(ctor, tableName) {
203
+ const existing = Object.getOwnPropertyDescriptor(ctor, "SMRT_TABLE_NAME");
204
+ if (existing?.value === tableName) {
205
+ return;
206
+ }
207
+ Object.defineProperty(ctor, "SMRT_TABLE_NAME", {
208
+ value: tableName,
209
+ writable: false,
210
+ enumerable: false,
211
+ configurable: true
212
+ });
213
+ }
214
+ function setSmrtQualifiedName(ctor, qualifiedName) {
215
+ if (!qualifiedName) return;
216
+ const existing = Object.getOwnPropertyDescriptor(ctor, "_smrtQualifiedName");
217
+ if (existing?.value === qualifiedName) {
218
+ return;
219
+ }
220
+ Object.defineProperty(ctor, "_smrtQualifiedName", {
221
+ value: qualifiedName,
222
+ writable: false,
223
+ enumerable: false,
224
+ configurable: true
225
+ });
226
+ }
227
+ function register(ctor, config = {}) {
228
+ const name = config.name || ctor.name;
229
+ const explicitPackageName = config.packageName;
230
+ function upsertExistingEntry(existingKey, existing) {
231
+ const nextPackageName = explicitPackageName || existing.packageName;
232
+ const nextKey = nextPackageName ? createQualifiedName(nextPackageName, name) : name;
233
+ const previousIdentity = {
234
+ name: existing.name,
235
+ qualifiedName: existing.qualifiedName
236
+ };
237
+ existing.name = name;
238
+ existing.packageName = nextPackageName;
239
+ existing.qualifiedName = nextPackageName ? createQualifiedName(nextPackageName, name) : void 0;
240
+ const nextTableName = resolveTableName(ctor, name, {
241
+ ...existing.config,
242
+ ...config
243
+ });
244
+ existing.config = {
245
+ ...existing.config,
246
+ ...config,
247
+ tableName: nextTableName
248
+ };
249
+ if (!existing.schema) {
250
+ existing.schema = {
251
+ ddl: "",
252
+ indexes: [],
253
+ triggers: [],
254
+ tableName: nextTableName,
255
+ columns: {},
256
+ foreignKeys: [],
257
+ dependencies: [],
258
+ version: ""
259
+ };
260
+ }
261
+ existing.schema.tableName = nextTableName;
262
+ existing.constructor = ctor;
263
+ setSmrtTableName(ctor, nextTableName);
264
+ setSmrtQualifiedName(ctor, existing.qualifiedName);
265
+ if (existingKey !== nextKey) {
266
+ const classes = getClasses();
267
+ const existingAtNextKey = classes.get(nextKey);
268
+ if (existingAtNextKey && existingAtNextKey !== existing) {
269
+ throw new ConfigurationError(
270
+ `Class registry collision while promoting "${existingKey}" to "${nextKey}". A different class is already registered under the target key.`,
271
+ "CONFIG_REGISTRY_PROMOTION_COLLISION",
272
+ {
273
+ existingKey,
274
+ nextKey,
275
+ className: name
276
+ }
277
+ );
278
+ }
279
+ classes.delete(existingKey);
280
+ classes.set(nextKey, existing);
281
+ }
282
+ getConstructorIndex().set(ctor, nextKey);
283
+ invalidateInheritanceEntries(existing, previousIdentity);
284
+ return nextKey;
285
+ }
286
+ const newSourceFile = getSourceFileFromStack();
287
+ const newPackageName = explicitPackageName || getPackageName(ctor, true) || void 0;
288
+ const newInBundledContext = isBundledOutputPath(newSourceFile);
289
+ if (getClasses().has(name)) {
290
+ const existing = getClasses().get(name);
291
+ if (!existing) {
292
+ throw new Error(
293
+ `Registry inconsistency: ${name} exists in classes Map but get() returned undefined`
294
+ );
295
+ }
296
+ const handled = applyRegisterCollisionPolicy({
297
+ ctor,
298
+ name,
299
+ newPackageName,
300
+ newSourceFile,
301
+ newInBundledContext,
302
+ existing,
303
+ existingKey: name,
304
+ matchKind: "exact-key",
305
+ upsertExistingEntry
306
+ });
307
+ if (handled) return;
308
+ }
309
+ const lowerName = name.toLowerCase();
310
+ for (const [existingKey, existing] of getClasses().entries()) {
311
+ const keyMatches = existingKey.toLowerCase() === lowerName;
312
+ const nameMatches = existing.name?.toLowerCase() === lowerName;
313
+ if (!(keyMatches || nameMatches) || existingKey === name) continue;
314
+ const handled = applyRegisterCollisionPolicy({
315
+ ctor,
316
+ name,
317
+ newPackageName,
318
+ newSourceFile,
319
+ newInBundledContext,
320
+ existing,
321
+ existingKey,
322
+ matchKind: "case-insensitive",
323
+ upsertExistingEntry
324
+ });
325
+ if (handled) return;
326
+ }
327
+ const packageNameFromStack = explicitPackageName || getPackageName(ctor, true) || void 0;
328
+ const sourceFilePath = getSourceFileFromStack();
329
+ let manifestEntry;
330
+ if (config._manifest) {
331
+ manifestEntry = lookupInManifest(config._manifest, name);
332
+ }
333
+ if (!manifestEntry) {
334
+ manifestEntry = discoverManifestSync(name);
335
+ }
336
+ const fields = /* @__PURE__ */ new Map();
337
+ const methods = /* @__PURE__ */ new Map();
338
+ let packageName;
339
+ verboseLog(
340
+ `[registry] Registering ${name}: manifestEntry =`,
341
+ manifestEntry ? "found" : "not found"
342
+ );
343
+ if (manifestEntry?.fields) {
344
+ verboseLog(
345
+ `[registry] Manifest has ${Object.keys(manifestEntry.fields).length} fields:`,
346
+ Object.keys(manifestEntry.fields)
347
+ );
348
+ }
349
+ if (manifestEntry?.fields) {
350
+ for (const [fieldName, fieldDef] of Object.entries(
351
+ manifestEntry.fields
352
+ )) {
353
+ const options = { ...fieldDef._meta };
354
+ if (fieldDef.required !== void 0) options.required = fieldDef.required;
355
+ if (fieldDef.default !== void 0) options.default = fieldDef.default;
356
+ if (fieldDef.description !== void 0)
357
+ options.description = fieldDef.description;
358
+ if (fieldDef.transient !== void 0)
359
+ options.transient = fieldDef.transient;
360
+ const field = {
361
+ type: fieldDef.type
362
+ };
363
+ if (Object.keys(options).length > 0) {
364
+ field._meta = options;
365
+ }
366
+ if (fieldDef.transient !== void 0) {
367
+ field.transient = fieldDef.transient;
368
+ }
369
+ if (fieldDef.required !== void 0) {
370
+ field.required = fieldDef.required;
371
+ }
372
+ if (fieldDef.related !== void 0) {
373
+ field.related = fieldDef.related;
374
+ } else if (options.related !== void 0) {
375
+ field.related = options.related;
376
+ delete field._meta?.related;
377
+ }
378
+ fields.set(fieldName, field);
379
+ }
380
+ verboseLog(
381
+ `[registry] ✅ Loaded ${fields.size} fields for ${name} from manifest`
382
+ );
383
+ packageName = explicitPackageName || config._manifest?.packageName || manifestEntry.packageName || packageNameFromStack;
384
+ } else {
385
+ verboseLog(
386
+ `[registry] ⚠️ No manifest entry for ${name} - fields will be loaded later`
387
+ );
388
+ packageName = packageNameFromStack;
389
+ }
390
+ const decorators = getFieldDecorators().get(name);
391
+ if (decorators && decorators.size > 0) {
392
+ verboseLog(
393
+ `[registry] Applying ${decorators.size} field decorators for ${name}`
394
+ );
395
+ for (const [fieldName, decoratorOptions] of decorators) {
396
+ const existingField = fields.get(fieldName);
397
+ if (existingField) {
398
+ const mergedField = {
399
+ type: decoratorOptions.type || existingField.type,
400
+ _meta: {
401
+ ...existingField._meta,
402
+ ...decoratorOptions
403
+ }
404
+ };
405
+ if (mergedField._meta.type) {
406
+ delete mergedField._meta.type;
407
+ }
408
+ if (decoratorOptions.transient !== void 0) {
409
+ mergedField.transient = decoratorOptions.transient;
410
+ } else if (existingField.transient !== void 0) {
411
+ mergedField.transient = existingField.transient;
412
+ }
413
+ if (decoratorOptions.nullable === true) {
414
+ mergedField.required = false;
415
+ mergedField._meta.required = false;
416
+ } else if (decoratorOptions.required !== void 0) {
417
+ mergedField.required = decoratorOptions.required;
418
+ } else if (existingField.required !== void 0) {
419
+ mergedField.required = existingField.required;
420
+ }
421
+ if (decoratorOptions.related !== void 0) {
422
+ mergedField.related = decoratorOptions.related;
423
+ delete mergedField._meta?.related;
424
+ } else if (existingField.related !== void 0) {
425
+ mergedField.related = existingField.related;
426
+ }
427
+ fields.set(fieldName, mergedField);
428
+ verboseLog(
429
+ `[registry] ✅ Merged decorator for ${fieldName}: type=${mergedField.type}`
430
+ );
431
+ } else {
432
+ const newField = {
433
+ type: decoratorOptions.type || "text",
434
+ _meta: decoratorOptions
435
+ };
436
+ if (decoratorOptions.transient !== void 0) {
437
+ newField.transient = decoratorOptions.transient;
438
+ }
439
+ if (decoratorOptions.nullable === true) {
440
+ newField.required = false;
441
+ newField._meta.required = false;
442
+ } else if (decoratorOptions.required !== void 0) {
443
+ newField.required = decoratorOptions.required;
444
+ }
445
+ if (decoratorOptions.related !== void 0) {
446
+ newField.related = decoratorOptions.related;
447
+ delete newField._meta?.related;
448
+ }
449
+ fields.set(fieldName, newField);
450
+ verboseLog(
451
+ `[registry] ✅ Added field ${fieldName} from decorator: type=${decoratorOptions.type || "text"}`
452
+ );
453
+ }
454
+ }
455
+ }
456
+ let tenantScopedConfig;
457
+ const effectiveTenantScoped = config.tenantScoped ?? manifestEntry?.decoratorConfig?.tenantScoped;
458
+ if (effectiveTenantScoped) {
459
+ const tenantOpts = typeof effectiveTenantScoped === "boolean" ? {} : effectiveTenantScoped;
460
+ tenantScopedConfig = {
461
+ mode: tenantOpts.mode ?? "required",
462
+ field: tenantOpts.field ?? "tenantId",
463
+ autoFilter: tenantOpts.autoFilter ?? true,
464
+ autoPopulate: tenantOpts.autoPopulate ?? true,
465
+ allowSuperAdminBypass: tenantOpts.allowSuperAdminBypass ?? false
466
+ };
467
+ const fieldName = tenantScopedConfig.field;
468
+ const hadTenantField = fields.has(fieldName);
469
+ ensureTenantScopedField(fields, tenantScopedConfig);
470
+ if (!hadTenantField) {
471
+ verboseLog(
472
+ `[registry] ✅ Injected ${fieldName} field for tenant-scoped class ${name}`
473
+ );
474
+ }
475
+ }
476
+ if (manifestEntry?.methods) {
477
+ for (const [methodName, methodDef] of Object.entries(
478
+ manifestEntry.methods
479
+ )) {
480
+ methods.set(methodName, methodDef);
481
+ }
482
+ }
483
+ if (config._manifestMethods) {
484
+ for (const [methodName, methodDef] of Object.entries(
485
+ config._manifestMethods
486
+ )) {
487
+ methods.set(methodName, methodDef);
488
+ }
489
+ verboseLog(
490
+ `[registry] Loaded ${methods.size} methods for ${name} from _manifestMethods`
491
+ );
492
+ }
493
+ const inheritanceChain = buildInheritanceChain(ctor);
494
+ if (inheritanceChain.length > 1) {
495
+ const parentName = inheritanceChain[inheritanceChain.length - 2];
496
+ const parentEntry = findClass(parentName);
497
+ if (parentEntry) {
498
+ const parentStrategy = parentEntry.config?.tableStrategy || "default";
499
+ const childStrategy = config.tableStrategy;
500
+ if (childStrategy !== void 0 && parentStrategy !== childStrategy) {
501
+ throw ConfigurationError.incompatibleStrategy(
502
+ name,
503
+ childStrategy,
504
+ parentName,
505
+ parentStrategy
506
+ );
507
+ }
508
+ }
509
+ }
510
+ const tableName = resolveTableName(ctor, name, config);
511
+ setSmrtTableName(ctor, tableName);
512
+ let schema;
513
+ if (manifestEntry?.schema) {
514
+ schema = {
515
+ ddl: manifestEntry.schema.ddl,
516
+ indexes: manifestEntry.schema.indexes?.map((idx) => ({
517
+ name: idx.name,
518
+ columns: idx.columns || [],
519
+ unique: idx.unique || false,
520
+ where: idx.where,
521
+ description: idx.description,
522
+ jsonPath: idx.jsonPath
523
+ })) || [],
524
+ triggers: [],
525
+ tableName: manifestEntry.schema.tableName || tableName,
526
+ // Cast manifest columns to ColumnDefinition (same shape, TypeScript just needs help)
527
+ columns: cloneManifestSchemaColumns(manifestEntry.schema.columns),
528
+ foreignKeys: [],
529
+ dependencies: [],
530
+ version: manifestEntry.schema.version || "",
531
+ packageName: manifestEntry.packageName
532
+ };
533
+ verboseLog(
534
+ `[registry] Loaded pre-generated schema for ${name} (${Object.keys(manifestEntry.schema.columns || {}).length} columns)`
535
+ );
536
+ } else {
537
+ schema = {
538
+ ddl: "",
539
+ // Generated lazily
540
+ indexes: [],
541
+ // Parsed from DDL lazily
542
+ triggers: [],
543
+ // No longer using database triggers - timestamps managed by application
544
+ tableName,
545
+ columns: {},
546
+ foreignKeys: [],
547
+ dependencies: [],
548
+ version: "",
549
+ packageName: void 0
550
+ };
551
+ }
552
+ if (schema.columns) {
553
+ applySqlTypeOverrides(schema.columns, fields.entries());
554
+ if (decorators && decorators.size > 0) {
555
+ applySqlTypeOverrides(schema.columns, decorators.entries());
556
+ }
557
+ }
558
+ const validationRules = manifestEntry?.validationRules;
559
+ let validators;
560
+ if (!validationRules || validationRules.length === 0) {
561
+ validators = compileValidators(name, fields);
562
+ } else {
563
+ verboseLog(
564
+ `[registry] Using ${validationRules.length} pre-computed validation rules for ${name}`
565
+ );
566
+ }
567
+ let extendsClass = manifestEntry?.extends;
568
+ if (!extendsClass) {
569
+ const proto = Object.getPrototypeOf(ctor);
570
+ if (proto?.name && proto.name !== "SmrtObject" && proto.name !== "Object") {
571
+ extendsClass = proto.name;
572
+ }
573
+ }
574
+ const mergedConfig = {
575
+ ...manifestEntry?.decoratorConfig,
576
+ ...config,
577
+ tableName
578
+ // Override with correctly computed tableName
579
+ };
580
+ const qualifiedName = packageName ? createQualifiedName(packageName, name) : void 0;
581
+ const visibility = config.visibility || manifestEntry?.visibility || "public";
582
+ const registrationKey = qualifiedName || name;
583
+ getClasses().set(registrationKey, {
584
+ name,
585
+ qualifiedName,
586
+ // Qualified name for cross-package identification
587
+ constructor: ctor,
588
+ config: mergedConfig,
589
+ fields,
590
+ methods,
591
+ schema,
592
+ validators,
593
+ validationRules,
594
+ // Pre-computed rules from manifest (Issue #782)
595
+ tools: manifestEntry?.tools,
596
+ // AI-callable tool schemas (CLI param schemas)
597
+ // Pluralized endpoint name. Prefer the manifest's computed value (handles
598
+ // STI inheritance + any future inflection changes); fall back to the same
599
+ // simple pluralization the scanner uses for inline/test classes that have
600
+ // no manifest entry. (smrt#1311.)
601
+ collection: manifestEntry?.collection ?? pluralizeCollection(name),
602
+ packageName,
603
+ // Store package name from manifest for getPackageName() lookup
604
+ sourceFilePath,
605
+ // Store source file for collision detection (Issue #555)
606
+ extends: extendsClass,
607
+ // Capture parent class name from manifest OR prototype chain
608
+ extendsTypeArg: manifestEntry?.extendsTypeArg,
609
+ // SmrtCollection<T> generic arg
610
+ tenantScopedConfig,
611
+ // Multi-tenancy config (Issue #688)
612
+ visibility
613
+ // Visibility control for manifest filtering
614
+ // NOTE: Don't pre-compute inheritanceChain here - let getInheritanceChain() compute
615
+ // it lazily using the `extends` field. This ensures correct chain for both
616
+ // decorator-registered and manifest-loaded classes.
617
+ });
618
+ getConstructorIndex().set(ctor, registrationKey);
619
+ setSmrtQualifiedName(ctor, qualifiedName);
620
+ verboseLog(
621
+ `🎯 Registered smrt object: ${name} (key: ${registrationKey}) with schema for ${schema.tableName} and ${(validators?.length || 0) + (validationRules?.length || 0)} validators/rules`
622
+ );
623
+ const collection = manifestEntry?.collection;
624
+ if (collection && !getStiSiblingsLoaded().has(collection)) {
625
+ getStiSiblingsLoaded().add(collection);
626
+ verboseLog(
627
+ `[registry] Checking for STI siblings for collection: ${collection}`
628
+ );
629
+ const siblings = discoverSTISiblingsSync(collection);
630
+ for (const sibling of siblings) {
631
+ if (!hasClassCaseInsensitive(sibling.className)) {
632
+ if (sibling.packageName && packageName && sibling.packageName === packageName) {
633
+ verboseLog(
634
+ `[registry] Skipping STI sibling ${sibling.className} from same package: ${packageName}`
635
+ );
636
+ continue;
637
+ }
638
+ verboseLog(
639
+ `[registry] Auto-loading STI sibling: ${sibling.className} for collection: ${collection}`
640
+ );
641
+ registerFromManifest(
642
+ sibling.className,
643
+ sibling.entry,
644
+ sibling.packageName
645
+ );
646
+ }
647
+ }
648
+ }
649
+ }
650
+ function registerCollection(objectName, collectionConstructor) {
651
+ const registered = findClass(objectName);
652
+ if (registered) {
653
+ registered.collectionConstructor = collectionConstructor;
654
+ }
655
+ getCollections().set(objectName, collectionConstructor);
656
+ }
657
+ function normalizeTenantScopedConfig(tenantScoped) {
658
+ if (!tenantScoped) {
659
+ return void 0;
660
+ }
661
+ const tenantOpts = typeof tenantScoped === "boolean" ? {} : tenantScoped;
662
+ return {
663
+ mode: tenantOpts.mode ?? "required",
664
+ field: tenantOpts.field ?? "tenantId",
665
+ autoFilter: tenantOpts.autoFilter ?? true,
666
+ autoPopulate: tenantOpts.autoPopulate ?? true,
667
+ allowSuperAdminBypass: tenantOpts.allowSuperAdminBypass ?? false
668
+ };
669
+ }
670
+ function ensureTenantScopedField(fields, tenantScopedConfig) {
671
+ if (!tenantScopedConfig) {
672
+ return;
673
+ }
674
+ const fieldName = tenantScopedConfig.field;
675
+ const existingField = fields.get(fieldName);
676
+ if (existingField) {
677
+ fields.set(fieldName, {
678
+ ...existingField,
679
+ required: existingField.required ?? tenantScopedConfig.mode === "required",
680
+ _meta: {
681
+ ...existingField._meta,
682
+ reference: existingField._meta?.reference ?? "Tenant",
683
+ sqlType: "UUID",
684
+ __tenancy: {
685
+ ...existingField._meta?.__tenancy,
686
+ isTenantIdField: true,
687
+ ...tenantScopedConfig
688
+ }
689
+ }
690
+ });
691
+ return;
692
+ }
693
+ fields.set(fieldName, {
694
+ type: "foreignKey",
695
+ related: "Tenant",
696
+ required: tenantScopedConfig.mode === "required",
697
+ _meta: {
698
+ reference: "Tenant",
699
+ sqlType: "UUID",
700
+ __tenancy: {
701
+ isTenantIdField: true,
702
+ ...tenantScopedConfig
703
+ }
704
+ }
705
+ });
706
+ }
707
+ function mergeIndexDefinitions(existingIndexes, manifestIndexes) {
708
+ const merged = [...existingIndexes || []];
709
+ const seen = new Set(merged.map((index) => index?.name).filter(Boolean));
710
+ for (const index of manifestIndexes || []) {
711
+ if (!index?.name || seen.has(index.name)) {
712
+ continue;
713
+ }
714
+ merged.push(index);
715
+ seen.add(index.name);
716
+ }
717
+ return merged;
718
+ }
719
+ function getReferenceKindFromFieldOptions(fieldOptions) {
720
+ if (fieldOptions?.__tenancy?.isTenantIdField || fieldOptions?._meta?.__tenancy?.isTenantIdField) {
721
+ return "tenantId";
722
+ }
723
+ if (fieldOptions?.type === "foreignKey") {
724
+ return "foreignKey";
725
+ }
726
+ if (fieldOptions?.type === "crossPackageRef") {
727
+ return "crossPackageRef";
728
+ }
729
+ return void 0;
730
+ }
731
+ function applySqlTypeOverrides(columns, fieldEntries) {
732
+ if (!fieldEntries) {
733
+ return;
734
+ }
735
+ for (const [fieldName, fieldOptions] of fieldEntries) {
736
+ const sqlType = fieldOptions?.sqlType ?? fieldOptions?._meta?.sqlType;
737
+ const referenceKind = getReferenceKindFromFieldOptions(fieldOptions);
738
+ if (!sqlType && !referenceKind) {
739
+ continue;
740
+ }
741
+ const columnName = toSnakeCase(fieldName);
742
+ const existingColumn = columns[columnName];
743
+ if (!existingColumn) {
744
+ continue;
745
+ }
746
+ columns[columnName] = {
747
+ ...existingColumn,
748
+ ...sqlType ? { type: String(sqlType).toUpperCase() } : {},
749
+ ...referenceKind ? { referenceKind } : {}
750
+ };
751
+ }
752
+ }
753
+ function invalidateInheritanceEntries(existing, previousIdentity) {
754
+ const cache = getInheritanceCache();
755
+ const affectedNames = /* @__PURE__ */ new Set();
756
+ const remember = (name) => {
757
+ if (name) {
758
+ affectedNames.add(name);
759
+ }
760
+ };
761
+ const matchNames = /* @__PURE__ */ new Set();
762
+ const rememberMatch = (name) => {
763
+ if (name) matchNames.add(name);
764
+ };
765
+ rememberMatch(existing.name);
766
+ rememberMatch(existing.qualifiedName);
767
+ rememberMatch(previousIdentity?.name);
768
+ rememberMatch(previousIdentity?.qualifiedName);
769
+ for (const name of matchNames) {
770
+ remember(name);
771
+ }
772
+ for (const [key, candidate] of getClasses()) {
773
+ const extendsMatches = !!candidate.extends && matchNames.has(candidate.extends);
774
+ const chainMatches = !!candidate.inheritanceChain && candidate.inheritanceChain.some((n) => matchNames.has(n));
775
+ if (candidate === existing || extendsMatches || chainMatches) {
776
+ candidate.inheritanceChain = void 0;
777
+ candidate.inheritedFields = void 0;
778
+ candidate.inheritedMethods = void 0;
779
+ remember(key);
780
+ remember(candidate.name);
781
+ remember(candidate.qualifiedName);
782
+ }
783
+ }
784
+ for (const name of affectedNames) {
785
+ cache.delete(name);
786
+ }
787
+ }
788
+ function mergeManifestIntoExistingRegistration(existing, objectDef, packageName) {
789
+ const manifestConfig = objectDef.decoratorConfig || {};
790
+ const manifestTableName = objectDef.schema?.tableName || manifestConfig.tableName || existing.schema?.tableName || existing.config.tableName || tableNameFromClass(existing.constructor);
791
+ existing.config = {
792
+ ...manifestConfig,
793
+ ...existing.config,
794
+ tableName: manifestTableName
795
+ };
796
+ if (objectDef.fields) {
797
+ for (const [fieldName, fieldDef] of Object.entries(
798
+ objectDef.fields
799
+ )) {
800
+ const fd = fieldDef;
801
+ if (!existing.fields.has(fieldName)) {
802
+ existing.fields.set(fieldName, createFieldFromManifest(fd));
803
+ continue;
804
+ }
805
+ const existingField = existing.fields.get(fieldName);
806
+ if (!existingField) {
807
+ continue;
808
+ }
809
+ existing.fields.set(fieldName, mergeManifestField(existingField, fd));
810
+ }
811
+ }
812
+ const tenantScopedConfig = normalizeTenantScopedConfig(
813
+ existing.config.tenantScoped
814
+ );
815
+ if (tenantScopedConfig) {
816
+ existing.tenantScopedConfig = tenantScopedConfig;
817
+ ensureTenantScopedField(existing.fields, tenantScopedConfig);
818
+ }
819
+ if (objectDef.methods) {
820
+ for (const [methodName, methodDef] of Object.entries(
821
+ objectDef.methods
822
+ )) {
823
+ existing.methods.set(methodName, methodDef);
824
+ }
825
+ }
826
+ if (objectDef.schema) {
827
+ const manifestSchema = {
828
+ ddl: objectDef.schema.ddl || "",
829
+ indexes: objectDef.schema.indexes?.map((idx) => ({
830
+ name: idx.name,
831
+ columns: idx.columns || [],
832
+ unique: idx.unique || false,
833
+ where: idx.where,
834
+ description: idx.description,
835
+ jsonPath: idx.jsonPath
836
+ })) || [],
837
+ triggers: [],
838
+ tableName: objectDef.schema.tableName || manifestTableName,
839
+ columns: cloneManifestSchemaColumns(objectDef.schema.columns),
840
+ foreignKeys: [],
841
+ dependencies: [],
842
+ version: objectDef.schema.version || "",
843
+ packageName
844
+ };
845
+ applySqlTypeOverrides(manifestSchema.columns, existing.fields.entries());
846
+ existing.schema = {
847
+ ...existing.schema || {},
848
+ ...manifestSchema,
849
+ tableName: manifestSchema.tableName,
850
+ ddl: manifestSchema.ddl || existing.schema?.ddl || "",
851
+ columns: {
852
+ ...existing.schema?.columns || {},
853
+ ...manifestSchema.columns || {}
854
+ },
855
+ indexes: mergeIndexDefinitions(
856
+ existing.schema?.indexes,
857
+ manifestSchema.indexes
858
+ ),
859
+ packageName: packageName || existing.schema?.packageName
860
+ };
861
+ } else if (!existing.schema) {
862
+ existing.schema = {
863
+ ddl: "",
864
+ indexes: [],
865
+ triggers: [],
866
+ tableName: manifestTableName,
867
+ columns: {},
868
+ foreignKeys: [],
869
+ dependencies: [],
870
+ version: "",
871
+ packageName
872
+ };
873
+ } else {
874
+ existing.schema.tableName = manifestTableName;
875
+ existing.schema.packageName = packageName || existing.schema.packageName;
876
+ }
877
+ if (objectDef.validationRules !== void 0) {
878
+ existing.validationRules = objectDef.validationRules;
879
+ existing.validators = void 0;
880
+ } else if (!existing.validationRules && !existing.validators) {
881
+ existing.validators = compileValidators(existing.name, existing.fields);
882
+ }
883
+ if (packageName) {
884
+ existing.packageName = packageName;
885
+ existing.qualifiedName = createQualifiedName(
886
+ packageName,
887
+ existing.name
888
+ );
889
+ } else if (!existing.packageName && objectDef.packageName) {
890
+ existing.packageName = objectDef.packageName;
891
+ }
892
+ if (objectDef.extends) {
893
+ existing.extends = packageName ? qualifyExtendsName(objectDef.extends, packageName) : objectDef.extends;
894
+ }
895
+ if (!existing.sourceFilePath && objectDef.filePath) {
896
+ existing.sourceFilePath = objectDef.filePath;
897
+ }
898
+ existing.visibility = objectDef.visibility || manifestConfig.visibility || existing.visibility;
899
+ invalidateInheritanceEntries(existing);
900
+ }
901
+ function registerFromManifest(name, objectDef, packageName) {
902
+ const simpleClassName = objectDef.className || name;
903
+ const qualifiedNameEarly = packageName ? createQualifiedName(packageName, simpleClassName) : objectDef.qualifiedName;
904
+ const registrationKey = qualifiedNameEarly || name;
905
+ const existingCanonical = getCanonicalClassName(simpleClassName);
906
+ if (existingCanonical) {
907
+ const existing = getClasses().get(existingCanonical);
908
+ if (existing) {
909
+ const outcome = applyManifestCollisionPolicy({
910
+ name,
911
+ objectDef,
912
+ packageName,
913
+ existing,
914
+ existingKey: existingCanonical,
915
+ registrationKey,
916
+ matchKind: "canonical-name"
917
+ });
918
+ if (outcome === "return") return;
919
+ }
920
+ }
921
+ if (getClasses().has(registrationKey)) {
922
+ const existing = getClasses().get(registrationKey);
923
+ if (!existing) return;
924
+ const outcome = applyManifestCollisionPolicy({
925
+ name,
926
+ objectDef,
927
+ packageName,
928
+ existing,
929
+ existingKey: registrationKey,
930
+ registrationKey,
931
+ matchKind: "exact-key"
932
+ });
933
+ if (outcome === "return") return;
934
+ }
935
+ const qualifiedExtends = objectDef.extends && packageName ? qualifyExtendsName(objectDef.extends, packageName) : objectDef.extends;
936
+ const stubConstructor = class extends SmrtObject {
937
+ static _isManifestStub = true;
938
+ };
939
+ Object.defineProperty(stubConstructor, "name", { value: simpleClassName });
940
+ const fields = /* @__PURE__ */ new Map();
941
+ const decorators = getFieldDecorators().get(simpleClassName);
942
+ if (objectDef.fields) {
943
+ for (const [fieldName, fieldDef] of Object.entries(
944
+ objectDef.fields
945
+ )) {
946
+ const fd = fieldDef;
947
+ fields.set(fieldName, createFieldFromManifest(fd));
948
+ }
949
+ }
950
+ const methods = /* @__PURE__ */ new Map();
951
+ if (objectDef.methods) {
952
+ for (const [methodName, methodDef] of Object.entries(objectDef.methods)) {
953
+ methods.set(methodName, methodDef);
954
+ }
955
+ }
956
+ const config = objectDef.decoratorConfig || {};
957
+ const tableName = config.tableName || tableNameFromClass(stubConstructor);
958
+ let schema;
959
+ if (objectDef.schema) {
960
+ schema = {
961
+ ddl: objectDef.schema.ddl,
962
+ indexes: objectDef.schema.indexes?.map((idx) => ({
963
+ name: idx.name,
964
+ columns: idx.columns || [],
965
+ unique: idx.unique || false,
966
+ where: idx.where,
967
+ description: idx.description,
968
+ jsonPath: idx.jsonPath
969
+ })) || [],
970
+ triggers: [],
971
+ tableName: objectDef.schema.tableName,
972
+ columns: cloneManifestSchemaColumns(objectDef.schema.columns),
973
+ foreignKeys: [],
974
+ dependencies: [],
975
+ version: objectDef.schema.version || "",
976
+ packageName
977
+ };
978
+ applySqlTypeOverrides(schema.columns, fields.entries());
979
+ applySqlTypeOverrides(schema.columns, decorators?.entries());
980
+ verboseLog(
981
+ `[registry] Loaded pre-generated schema for ${name} (${Object.keys(objectDef.schema.columns || {}).length} columns)`
982
+ );
983
+ } else {
984
+ schema = {
985
+ ddl: "",
986
+ indexes: [],
987
+ triggers: [],
988
+ tableName,
989
+ columns: {},
990
+ foreignKeys: [],
991
+ dependencies: [],
992
+ version: "",
993
+ packageName
994
+ };
995
+ }
996
+ const validationRules = objectDef.validationRules;
997
+ let validators;
998
+ if (!validationRules || validationRules.length === 0) {
999
+ validators = compileValidators(name, fields);
1000
+ verboseLog(
1001
+ `[registry] No pre-computed rules for ${name}, compiled ${validators.length} validators`
1002
+ );
1003
+ } else {
1004
+ verboseLog(
1005
+ `[registry] Using ${validationRules.length} pre-computed validation rules for ${name}`
1006
+ );
1007
+ }
1008
+ const qualifiedName = qualifiedNameEarly;
1009
+ const visibility = objectDef.visibility || config.visibility || "public";
1010
+ getClasses().set(registrationKey, {
1011
+ name: simpleClassName,
1012
+ qualifiedName,
1013
+ // Qualified name for cross-package identification
1014
+ constructor: stubConstructor,
1015
+ config,
1016
+ fields,
1017
+ methods,
1018
+ schema,
1019
+ validators,
1020
+ validationRules,
1021
+ // Pre-computed rules from manifest (Issue #782)
1022
+ tools: objectDef.tools,
1023
+ // AI-callable tool schemas (used for CLI param schemas)
1024
+ // Pluralized endpoint name; fall back to simple pluralization if a
1025
+ // (legacy) manifest lacks it. (smrt#1311.)
1026
+ collection: objectDef.collection ?? pluralizeCollection(simpleClassName),
1027
+ packageName,
1028
+ sourceFilePath: objectDef.filePath,
1029
+ // Store source file for collision detection (Issue #555)
1030
+ extends: qualifiedExtends,
1031
+ // Issue #1004: Pre-computed qualified parent
1032
+ extendsTypeArg: objectDef.extendsTypeArg,
1033
+ // SmrtCollection<T> generic arg
1034
+ visibility
1035
+ // New: Visibility control for manifest filtering
1036
+ });
1037
+ setSmrtQualifiedName(stubConstructor, qualifiedName);
1038
+ verboseLog(
1039
+ `📦 Registered ${simpleClassName} from manifest (key: ${registrationKey}, ${fields.size} fields, ${methods.size} methods)`
1040
+ );
1041
+ const collection = objectDef.collection;
1042
+ if (collection && !getStiSiblingsLoaded().has(collection)) {
1043
+ getStiSiblingsLoaded().add(collection);
1044
+ verboseLog(
1045
+ `[registry] Checking for STI siblings for collection: ${collection}`
1046
+ );
1047
+ const siblings = discoverSTISiblingsSync(collection);
1048
+ for (const sibling of siblings) {
1049
+ if (!hasClassCaseInsensitive(sibling.className)) {
1050
+ if (sibling.packageName && packageName && sibling.packageName === packageName) {
1051
+ verboseLog(
1052
+ `[registry] Skipping STI sibling ${sibling.className} from same package: ${packageName}`
1053
+ );
1054
+ continue;
1055
+ }
1056
+ verboseLog(
1057
+ `[registry] Auto-loading STI sibling: ${sibling.className} for collection: ${collection}`
1058
+ );
1059
+ registerFromManifest(
1060
+ sibling.className,
1061
+ sibling.entry,
1062
+ sibling.packageName
1063
+ );
1064
+ }
1065
+ }
1066
+ }
1067
+ }
1068
+ export {
1069
+ invalidateInheritanceEntries,
1070
+ register,
1071
+ registerCollection,
1072
+ registerFromManifest
1073
+ };
1074
+ //# sourceMappingURL=class-registration.js.map