@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,136 @@
1
+ import { SmrtCollection } from "./collection.js";
2
+ function camelToSnake(name) {
3
+ return name.replace(/[A-Z]/g, (m) => `_${m.toLowerCase()}`);
4
+ }
5
+ class SmrtJunction extends SmrtCollection {
6
+ /**
7
+ * Internal marker used by `SmrtCollection.create` to detect that this
8
+ * subclass is a junction and apply a registration-presence guard. Static
9
+ * property is inherited by all subclasses via the constructor chain.
10
+ * Don't rename or remove without also updating the guard.
11
+ */
12
+ static _isJunctionBase = true;
13
+ /**
14
+ * Field name (camelCase) used to ORDER BY when calling `byLeft` / `byRight`.
15
+ * Defaults to `'sortOrder'`. Set to `null` to omit ORDER BY entirely.
16
+ *
17
+ * Independent from `positionField` — `sortField` is a *query* concern
18
+ * (how rows are ordered when read), while `positionField` is a *write*
19
+ * concern (what column `setLinks` auto-assigns to). Tables that order
20
+ * by a non-position field (e.g. `'createdAt'`) should set `sortField`
21
+ * accordingly and leave `positionField` set to `null` or its dedicated
22
+ * position column name.
23
+ */
24
+ sortField = "sortOrder";
25
+ /**
26
+ * Field name (camelCase) that `setLinks` auto-assigns the array index
27
+ * to when the caller doesn't supply a value. Defaults to `'sortOrder'`.
28
+ * Set to `null` for tables without a dedicated position column (e.g.
29
+ * pure-key junctions, or tables ordered by timestamps).
30
+ *
31
+ * Writing the array index into a non-position field — like `createdAt`
32
+ * or `placement` — would corrupt data. Subclasses without a numeric
33
+ * position column MUST set this to `null`.
34
+ */
35
+ positionField = "sortOrder";
36
+ /**
37
+ * Return junction rows where the left FK matches `leftId`, narrowed by
38
+ * optional additional WHERE filters. Ordered ASC by `sortField` if set.
39
+ */
40
+ async byLeft(leftId, opts = {}) {
41
+ return await this.list({
42
+ // Spread opts FIRST so the fixed key always wins — prevents a
43
+ // caller-supplied `{ [leftField]: otherId }` from retargeting the
44
+ // query when opts is forwarded from untrusted input.
45
+ where: { ...opts, [this.leftField]: leftId },
46
+ ...this.sortField ? { orderBy: `${camelToSnake(this.sortField)} ASC` } : {}
47
+ });
48
+ }
49
+ /**
50
+ * Return junction rows where the right FK matches `rightId`, narrowed by
51
+ * optional additional WHERE filters. Ordered ASC by `sortField` if set.
52
+ */
53
+ async byRight(rightId, opts = {}) {
54
+ return await this.list({
55
+ where: { ...opts, [this.rightField]: rightId },
56
+ ...this.sortField ? { orderBy: `${camelToSnake(this.sortField)} ASC` } : {}
57
+ });
58
+ }
59
+ /**
60
+ * Create a new junction row linking `leftId` ↔ `rightId`.
61
+ *
62
+ * Goes through `SmrtCollection.create` which performs an upsert keyed on
63
+ * the model's `@smrt({ conflictColumns })`. Duplicates on the conflict key
64
+ * resolve to an UPDATE that rewrites every column — including the row's
65
+ * `id` and any timestamp columns — to the new instance's values. For most
66
+ * junctions that's fine: callers identify rows by (left, right, discriminator),
67
+ * not by junction-row-id, so id rewrites are invisible.
68
+ *
69
+ * If your junction table is externally addressable by id (e.g. its rows
70
+ * are exposed under `/api/v1/<table>/[id]`), override this method with a
71
+ * find-or-create check to preserve id stability across duplicate calls.
72
+ * See `ContentReferences.attach` for an example.
73
+ *
74
+ * @param opts - Extra fields to write into the row (e.g. `{ relationship, sortOrder, tenantId }`)
75
+ */
76
+ async attach(leftId, rightId, opts = {}) {
77
+ return await this.create({
78
+ // Spread opts FIRST so the fixed key fields always win — prevents
79
+ // a caller-supplied `{ [leftField]: otherId }` from retargeting
80
+ // the write when opts is forwarded from untrusted input.
81
+ ...opts,
82
+ [this.leftField]: leftId,
83
+ [this.rightField]: rightId
84
+ });
85
+ }
86
+ /**
87
+ * Delete all junction rows matching `leftId` + `rightId` (+ optional filter `opts`).
88
+ *
89
+ * @param opts - Additional WHERE filters (e.g. `{ relationship: 'thumbnail' }`)
90
+ */
91
+ async detach(leftId, rightId, opts = {}) {
92
+ const links = await this.list({
93
+ where: {
94
+ ...opts,
95
+ [this.leftField]: leftId,
96
+ [this.rightField]: rightId
97
+ }
98
+ });
99
+ for (const link of links) {
100
+ await link.delete();
101
+ }
102
+ }
103
+ /**
104
+ * Replace the full set of right-side rows for a `leftId`, scoped by `opts`.
105
+ *
106
+ * Behavior:
107
+ * 1. Snapshots and deletes existing rows matching `{ leftField: leftId, ...opts }`.
108
+ * 2. Creates a new row for each `rightId`, spreading `opts` into the row data.
109
+ * 3. If `positionField` is set and `opts` doesn't specify it, assigns the array index.
110
+ *
111
+ * Not transactional — partial failure leaves the table in a mixed state.
112
+ * For atomic replaces, wrap the call in your own DB transaction.
113
+ */
114
+ async setLinks(leftId, rightIds, opts = {}) {
115
+ const snapshotOpts = { ...opts };
116
+ delete snapshotOpts[this.rightField];
117
+ const existing = await this.list({
118
+ where: { ...snapshotOpts, [this.leftField]: leftId }
119
+ });
120
+ for (const link of existing) {
121
+ await link.delete();
122
+ }
123
+ const positionKey = this.positionField;
124
+ for (let i = 0; i < rightIds.length; i++) {
125
+ const rowOpts = { ...opts };
126
+ if (positionKey && rowOpts[positionKey] === void 0) {
127
+ rowOpts[positionKey] = i;
128
+ }
129
+ await this.attach(leftId, rightIds[i], rowOpts);
130
+ }
131
+ }
132
+ }
133
+ export {
134
+ SmrtJunction
135
+ };
136
+ //# sourceMappingURL=junction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"junction.js","sources":["../src/junction.ts"],"sourcesContent":["/**\n * SmrtJunction — base class for two-sided junction (many-to-many) collections.\n *\n * A junction collection manages rows that link a \"left\" entity to a \"right\" entity,\n * typically with discriminator fields (relationship/role) and an optional sortOrder.\n * Examples in the monorepo:\n *\n * | Subclass | Left field | Right field | Discriminator |\n * |--------------------------------|---------------|-------------|-----------------|\n * | ContentAssetCollection | contentId | assetId | relationship |\n * | PerformerOwnedAssetCollection | performerId | assetId | role |\n * | PlaceAssetCollection | placeId | assetId | relationship |\n * | EventParticipantCollection | eventId | profileId | role |\n * | FactContentCollection | factId | contentId | relationship |\n *\n * Each subclass declares `leftField` / `rightField` (camelCase) and optionally\n * overrides `sortField` (defaults to `'sortOrder'`; set `null` to disable ORDER BY).\n *\n * Polymorphic subclasses (where \"left\" or \"right\" is a composite key like\n * `metaType + metaId`) may override `byLeft` / `byRight` / `attach` / `detach`\n * with diverging signatures — see `AssetAssociationCollection` for a reference.\n *\n * @typeParam TItem - The junction row class (extends `SmrtObject`)\n */\n\nimport { SmrtCollection } from './collection';\nimport type { SmrtObject } from './object';\n\n/**\n * Options passed to `attach` / `setLinks` — written into the created junction row.\n *\n * Common keys: `relationship`, `role`, `sortOrder`, `tenantId`.\n * Subclass-specific keys (e.g. `placement`, `groupId` on EventParticipant) pass through.\n * Keys must match actual camelCase column names on the junction model; unknown\n * keys are rejected by `SmrtCollection.create`'s WHERE/field validation.\n */\nexport type JunctionAttachOptions = Record<string, unknown>;\n\n/**\n * Options passed to `byLeft` / `byRight` / `detach` — additional WHERE filters\n * narrowing the operation. Keys must match camelCase column names.\n */\nexport type JunctionFilterOptions = Record<string, unknown>;\n\nfunction camelToSnake(name: string): string {\n return name.replace(/[A-Z]/g, (m) => `_${m.toLowerCase()}`);\n}\n\nexport abstract class SmrtJunction<\n TItem extends SmrtObject,\n> extends SmrtCollection<TItem> {\n /**\n * Internal marker used by `SmrtCollection.create` to detect that this\n * subclass is a junction and apply a registration-presence guard. Static\n * property is inherited by all subclasses via the constructor chain.\n * Don't rename or remove without also updating the guard.\n */\n static readonly _isJunctionBase = true as const;\n\n /** Field name (camelCase) holding the \"left\" foreign key, e.g. `'contentId'`. */\n protected abstract leftField: string;\n\n /** Field name (camelCase) holding the \"right\" foreign key, e.g. `'assetId'`. */\n protected abstract rightField: string;\n\n /**\n * Field name (camelCase) used to ORDER BY when calling `byLeft` / `byRight`.\n * Defaults to `'sortOrder'`. Set to `null` to omit ORDER BY entirely.\n *\n * Independent from `positionField` — `sortField` is a *query* concern\n * (how rows are ordered when read), while `positionField` is a *write*\n * concern (what column `setLinks` auto-assigns to). Tables that order\n * by a non-position field (e.g. `'createdAt'`) should set `sortField`\n * accordingly and leave `positionField` set to `null` or its dedicated\n * position column name.\n */\n protected sortField: string | null = 'sortOrder';\n\n /**\n * Field name (camelCase) that `setLinks` auto-assigns the array index\n * to when the caller doesn't supply a value. Defaults to `'sortOrder'`.\n * Set to `null` for tables without a dedicated position column (e.g.\n * pure-key junctions, or tables ordered by timestamps).\n *\n * Writing the array index into a non-position field — like `createdAt`\n * or `placement` — would corrupt data. Subclasses without a numeric\n * position column MUST set this to `null`.\n */\n protected positionField: string | null = 'sortOrder';\n\n /**\n * Return junction rows where the left FK matches `leftId`, narrowed by\n * optional additional WHERE filters. Ordered ASC by `sortField` if set.\n */\n async byLeft(\n leftId: string,\n opts: JunctionFilterOptions = {},\n ): Promise<TItem[]> {\n return (await this.list({\n // Spread opts FIRST so the fixed key always wins — prevents a\n // caller-supplied `{ [leftField]: otherId }` from retargeting the\n // query when opts is forwarded from untrusted input.\n where: { ...opts, [this.leftField]: leftId },\n ...(this.sortField\n ? { orderBy: `${camelToSnake(this.sortField)} ASC` }\n : {}),\n })) as TItem[];\n }\n\n /**\n * Return junction rows where the right FK matches `rightId`, narrowed by\n * optional additional WHERE filters. Ordered ASC by `sortField` if set.\n */\n async byRight(\n rightId: string,\n opts: JunctionFilterOptions = {},\n ): Promise<TItem[]> {\n return (await this.list({\n where: { ...opts, [this.rightField]: rightId },\n ...(this.sortField\n ? { orderBy: `${camelToSnake(this.sortField)} ASC` }\n : {}),\n })) as TItem[];\n }\n\n /**\n * Create a new junction row linking `leftId` ↔ `rightId`.\n *\n * Goes through `SmrtCollection.create` which performs an upsert keyed on\n * the model's `@smrt({ conflictColumns })`. Duplicates on the conflict key\n * resolve to an UPDATE that rewrites every column — including the row's\n * `id` and any timestamp columns — to the new instance's values. For most\n * junctions that's fine: callers identify rows by (left, right, discriminator),\n * not by junction-row-id, so id rewrites are invisible.\n *\n * If your junction table is externally addressable by id (e.g. its rows\n * are exposed under `/api/v1/<table>/[id]`), override this method with a\n * find-or-create check to preserve id stability across duplicate calls.\n * See `ContentReferences.attach` for an example.\n *\n * @param opts - Extra fields to write into the row (e.g. `{ relationship, sortOrder, tenantId }`)\n */\n async attach(\n leftId: string,\n rightId: string,\n opts: JunctionAttachOptions = {},\n ): Promise<TItem> {\n return (await this.create({\n // Spread opts FIRST so the fixed key fields always win — prevents\n // a caller-supplied `{ [leftField]: otherId }` from retargeting\n // the write when opts is forwarded from untrusted input.\n ...opts,\n [this.leftField]: leftId,\n [this.rightField]: rightId,\n } as any)) as TItem;\n }\n\n /**\n * Delete all junction rows matching `leftId` + `rightId` (+ optional filter `opts`).\n *\n * @param opts - Additional WHERE filters (e.g. `{ relationship: 'thumbnail' }`)\n */\n async detach(\n leftId: string,\n rightId: string,\n opts: JunctionFilterOptions = {},\n ): Promise<void> {\n const links = (await this.list({\n where: {\n ...opts,\n [this.leftField]: leftId,\n [this.rightField]: rightId,\n },\n })) as TItem[];\n for (const link of links) {\n await (link as unknown as { delete(): Promise<void> }).delete();\n }\n }\n\n /**\n * Replace the full set of right-side rows for a `leftId`, scoped by `opts`.\n *\n * Behavior:\n * 1. Snapshots and deletes existing rows matching `{ leftField: leftId, ...opts }`.\n * 2. Creates a new row for each `rightId`, spreading `opts` into the row data.\n * 3. If `positionField` is set and `opts` doesn't specify it, assigns the array index.\n *\n * Not transactional — partial failure leaves the table in a mixed state.\n * For atomic replaces, wrap the call in your own DB transaction.\n */\n async setLinks(\n leftId: string,\n rightIds: string[],\n opts: JunctionAttachOptions = {},\n ): Promise<void> {\n // Strip the right-side key from snapshot opts — leaving it in would\n // narrow the delete to one specific right id, but `setLinks` is\n // contractually \"replace the full set of right rows for leftId\n // within the opts scope\". A rightField filter contradicts that.\n const snapshotOpts: JunctionAttachOptions = { ...opts };\n delete snapshotOpts[this.rightField];\n\n const existing = (await this.list({\n where: { ...snapshotOpts, [this.leftField]: leftId },\n })) as TItem[];\n for (const link of existing) {\n await (link as unknown as { delete(): Promise<void> }).delete();\n }\n\n const positionKey = this.positionField;\n for (let i = 0; i < rightIds.length; i++) {\n const rowOpts: JunctionAttachOptions = { ...opts };\n if (positionKey && rowOpts[positionKey] === undefined) {\n rowOpts[positionKey] = i;\n }\n await this.attach(leftId, rightIds[i], rowOpts);\n }\n }\n}\n"],"names":[],"mappings":";AA4CA,SAAS,aAAa,MAAsB;AAC1C,SAAO,KAAK,QAAQ,UAAU,CAAC,MAAM,IAAI,EAAE,YAAA,CAAa,EAAE;AAC5D;AAEO,MAAe,qBAEZ,eAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO9B,OAAgB,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBxB,YAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAY3B,gBAA+B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzC,MAAM,OACJ,QACA,OAA8B,IACZ;AAClB,WAAQ,MAAM,KAAK,KAAK;AAAA;AAAA;AAAA;AAAA,MAItB,OAAO,EAAE,GAAG,MAAM,CAAC,KAAK,SAAS,GAAG,OAAA;AAAA,MACpC,GAAI,KAAK,YACL,EAAE,SAAS,GAAG,aAAa,KAAK,SAAS,CAAC,WAC1C,CAAA;AAAA,IAAC,CACN;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QACJ,SACA,OAA8B,IACZ;AAClB,WAAQ,MAAM,KAAK,KAAK;AAAA,MACtB,OAAO,EAAE,GAAG,MAAM,CAAC,KAAK,UAAU,GAAG,QAAA;AAAA,MACrC,GAAI,KAAK,YACL,EAAE,SAAS,GAAG,aAAa,KAAK,SAAS,CAAC,WAC1C,CAAA;AAAA,IAAC,CACN;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,OACJ,QACA,SACA,OAA8B,CAAA,GACd;AAChB,WAAQ,MAAM,KAAK,OAAO;AAAA;AAAA;AAAA;AAAA,MAIxB,GAAG;AAAA,MACH,CAAC,KAAK,SAAS,GAAG;AAAA,MAClB,CAAC,KAAK,UAAU,GAAG;AAAA,IAAA,CACb;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OACJ,QACA,SACA,OAA8B,CAAA,GACf;AACf,UAAM,QAAS,MAAM,KAAK,KAAK;AAAA,MAC7B,OAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,KAAK,SAAS,GAAG;AAAA,QAClB,CAAC,KAAK,UAAU,GAAG;AAAA,MAAA;AAAA,IACrB,CACD;AACD,eAAW,QAAQ,OAAO;AACxB,YAAO,KAAgD,OAAA;AAAA,IACzD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,SACJ,QACA,UACA,OAA8B,CAAA,GACf;AAKf,UAAM,eAAsC,EAAE,GAAG,KAAA;AACjD,WAAO,aAAa,KAAK,UAAU;AAEnC,UAAM,WAAY,MAAM,KAAK,KAAK;AAAA,MAChC,OAAO,EAAE,GAAG,cAAc,CAAC,KAAK,SAAS,GAAG,OAAA;AAAA,IAAO,CACpD;AACD,eAAW,QAAQ,UAAU;AAC3B,YAAO,KAAgD,OAAA;AAAA,IACzD;AAEA,UAAM,cAAc,KAAK;AACzB,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,YAAM,UAAiC,EAAE,GAAG,KAAA;AAC5C,UAAI,eAAe,QAAQ,WAAW,MAAM,QAAW;AACrD,gBAAQ,WAAW,IAAI;AAAA,MACzB;AACA,YAAM,KAAK,OAAO,QAAQ,SAAS,CAAC,GAAG,OAAO;AAAA,IAChD;AAAA,EACF;AACF;"}
@@ -0,0 +1,11 @@
1
+ import { DomainKnowledgeConfig, DomainKnowledgeManifest } from '@happyvertical/smrt-types';
2
+ import { SmartObjectManifest } from './scanner/types.js';
3
+ export interface BuildDomainKnowledgeOptions {
4
+ manifest: SmartObjectManifest;
5
+ rootDir: string;
6
+ packageJson?: Record<string, any>;
7
+ manifestPath?: string;
8
+ config?: DomainKnowledgeConfig;
9
+ }
10
+ export declare function buildDomainKnowledgeManifest(options: BuildDomainKnowledgeOptions): DomainKnowledgeManifest;
11
+ //# sourceMappingURL=knowledge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../src/knowledge.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,qBAAqB,EACrB,uBAAuB,EAGxB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAEV,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AAkCD,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,2BAA2B,GACnC,uBAAuB,CAsDzB"}
@@ -0,0 +1,310 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFileSync, existsSync, readdirSync } from "node:fs";
3
+ import { relative, join } from "node:path";
4
+ const SDK_PACKAGE_NAMES = /* @__PURE__ */ new Set([
5
+ "@happyvertical/ai",
6
+ "@happyvertical/cache",
7
+ "@happyvertical/documents",
8
+ "@happyvertical/email",
9
+ "@happyvertical/encryption",
10
+ "@happyvertical/files",
11
+ "@happyvertical/geo",
12
+ "@happyvertical/images",
13
+ "@happyvertical/jobs",
14
+ "@happyvertical/json",
15
+ "@happyvertical/logger",
16
+ "@happyvertical/messages",
17
+ "@happyvertical/ocr",
18
+ "@happyvertical/pdf",
19
+ "@happyvertical/projects",
20
+ "@happyvertical/repos",
21
+ "@happyvertical/secrets",
22
+ "@happyvertical/spider",
23
+ "@happyvertical/sql",
24
+ "@happyvertical/utils"
25
+ ]);
26
+ const RELATIONSHIP_FIELD_TYPES = /* @__PURE__ */ new Set([
27
+ "foreignKey",
28
+ "crossPackageRef",
29
+ "oneToMany",
30
+ "manyToMany"
31
+ ]);
32
+ const STANDARD_OPERATIONS = ["list", "get", "create", "update", "delete"];
33
+ function buildDomainKnowledgeManifest(options) {
34
+ const rootDir = options.rootDir;
35
+ const packageJson = options.packageJson ?? readPackageJson(rootDir) ?? {};
36
+ const packageName = options.manifest.packageName ?? packageJson.name;
37
+ const packageVersion = options.manifest.packageVersion ?? packageJson.version;
38
+ const agentDocPath = existingPath(rootDir, "AGENTS.md");
39
+ const agentDoc = options.config?.includeDocs === false || !agentDocPath ? void 0 : readFileSync(agentDocPath, "utf8");
40
+ const allDependencies = {
41
+ ...record(packageJson.dependencies),
42
+ ...record(packageJson.devDependencies),
43
+ ...record(packageJson.peerDependencies)
44
+ };
45
+ const manifestObjects = Object.values(options.manifest.objects).filter(
46
+ (object) => object.decoratorConfig?.knowledge !== false
47
+ );
48
+ const objects = manifestObjects.map((object) => buildKnowledgeObject(object));
49
+ const surfaces = objects.flatMap((object) => object.surfaces);
50
+ const manifestJson = stableJson(normalizeManifestForHash(options.manifest));
51
+ return {
52
+ schemaVersion: 1,
53
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
54
+ packageName,
55
+ packageVersion,
56
+ sourceManifestPath: options.manifestPath ? relative(rootDir, options.manifestPath) : void 0,
57
+ agentDocPath: agentDocPath ? relative(rootDir, agentDocPath) : void 0,
58
+ sourceHashes: sourceHashes({
59
+ manifest: { content: manifestJson },
60
+ packageJson: fileHashSource(existingPath(rootDir, "package.json")),
61
+ agents: fileHashSource(agentDocPath)
62
+ }),
63
+ exports: exportKeys(packageJson.exports),
64
+ dependencies: allDependencies,
65
+ smrtDependencies: Object.keys(allDependencies).filter((dep) => dep.startsWith("@happyvertical/smrt-")).sort(),
66
+ sdkDependencies: Object.keys(allDependencies).filter((dep) => SDK_PACKAGE_NAMES.has(dep)).sort(),
67
+ tags: options.config?.tags ?? [],
68
+ summary: options.config?.summary,
69
+ risks: options.config?.risks ?? [],
70
+ objects,
71
+ surfaces,
72
+ prompts: options.config?.includePrompts === false ? [] : readPrompts(rootDir),
73
+ relationshipsV2: summarizeRelationships(objects, manifestObjects),
74
+ agentDoc
75
+ };
76
+ }
77
+ function buildKnowledgeObject(object) {
78
+ const knowledge = typeof object.decoratorConfig?.knowledge === "object" ? object.decoratorConfig.knowledge : {};
79
+ const fields = Object.entries(object.fields).map(([name, field]) => ({
80
+ name,
81
+ type: field.type,
82
+ required: field.required,
83
+ related: field.related,
84
+ columnType: columnType(object, name)
85
+ }));
86
+ const relationships = fields.filter((field) => RELATIONSHIP_FIELD_TYPES.has(field.type)).map((field) => ({
87
+ name: field.name,
88
+ type: field.type,
89
+ required: field.required,
90
+ related: field.related,
91
+ columnType: field.columnType
92
+ }));
93
+ return {
94
+ name: object.className,
95
+ qualifiedName: object.qualifiedName,
96
+ collection: object.collection,
97
+ tableName: object.schema?.tableName,
98
+ packageName: object.packageName,
99
+ extends: object.extends,
100
+ visibility: object.visibility,
101
+ fields,
102
+ relationships,
103
+ methods: Object.keys(object.methods).sort(),
104
+ surfaces: objectSurfaces(object),
105
+ relationshipFeatures: relationshipFeatures(object),
106
+ tags: knowledge.tags ?? [],
107
+ summary: knowledge.summary,
108
+ risks: knowledge.risks ?? []
109
+ };
110
+ }
111
+ function objectSurfaces(object) {
112
+ return [
113
+ ...configuredSurfaces("api", object),
114
+ ...configuredSurfaces("cli", object),
115
+ ...configuredSurfaces("mcp", object),
116
+ ...aiSurfaces(object)
117
+ ];
118
+ }
119
+ function configuredSurfaces(kind, object) {
120
+ const config = object.decoratorConfig?.[kind];
121
+ if (!config) return [];
122
+ const operations = configuredOperations(config);
123
+ return operations.map((operation) => ({
124
+ kind,
125
+ name: kind === "api" ? `${object.collection}.${operation}` : `${object.className.toLowerCase()}_${operation}`,
126
+ operation,
127
+ objectName: object.qualifiedName ?? object.className,
128
+ path: kind === "api" ? apiPath(object, operation) : void 0,
129
+ method: kind === "api" ? apiMethod(operation) : void 0
130
+ }));
131
+ }
132
+ function configuredOperations(config) {
133
+ if (config === true) return [...STANDARD_OPERATIONS];
134
+ if (!config || typeof config !== "object" || Array.isArray(config)) {
135
+ return [];
136
+ }
137
+ const recordConfig = config;
138
+ const base = Array.isArray(recordConfig.include) ? recordConfig.include : STANDARD_OPERATIONS;
139
+ const excluded = new Set(recordConfig.exclude ?? []);
140
+ return [...new Set(base.filter((operation) => !excluded.has(operation)))];
141
+ }
142
+ function aiSurfaces(object) {
143
+ return (object.tools ?? []).map((tool) => ({
144
+ kind: "ai",
145
+ name: tool.function.name,
146
+ operation: tool.function.name,
147
+ description: tool.function.description,
148
+ objectName: object.qualifiedName ?? object.className
149
+ }));
150
+ }
151
+ function apiPath(object, operation) {
152
+ const collection = object.decoratorConfig?.api;
153
+ const configuredPath = typeof collection === "object" && typeof collection.path === "string" ? collection.path : object.collection.replaceAll("_", "-");
154
+ if (operation === "list" || operation === "create") {
155
+ return `/${configuredPath}`;
156
+ }
157
+ if (STANDARD_OPERATIONS.includes(operation)) {
158
+ return `/${configuredPath}/[id]`;
159
+ }
160
+ return `/${configuredPath}/${operation}`;
161
+ }
162
+ function apiMethod(operation) {
163
+ switch (operation) {
164
+ case "list":
165
+ case "get":
166
+ return "GET";
167
+ case "create":
168
+ return "POST";
169
+ case "update":
170
+ return "PATCH";
171
+ case "delete":
172
+ return "DELETE";
173
+ default:
174
+ return "POST";
175
+ }
176
+ }
177
+ function relationshipFeatures(object) {
178
+ const features = /* @__PURE__ */ new Set();
179
+ for (const field of Object.values(object.fields)) {
180
+ if (field.type === "foreignKey") features.add("foreignKey");
181
+ if (field.type === "crossPackageRef") features.add("crossPackageRef");
182
+ if (field.type === "oneToMany") features.add("oneToMany");
183
+ if (field.type === "manyToMany") features.add("manyToMany");
184
+ }
185
+ if (object.extends === "SmrtJunction") features.add("SmrtJunction");
186
+ if (object.extends === "SmrtHierarchical") features.add("SmrtHierarchical");
187
+ if (object.extends === "SmrtPolymorphicAssociation" || object.fields.metaType || object.fields.metaId) {
188
+ features.add("SmrtPolymorphicAssociation");
189
+ }
190
+ if (Object.keys(object.schema?.columns ?? {}).some(
191
+ (name) => object.schema?.columns[name]?.type === "UUID"
192
+ )) {
193
+ features.add("uuidColumns");
194
+ }
195
+ return [...features].sort();
196
+ }
197
+ function summarizeRelationships(objects, manifestObjects) {
198
+ const fields = objects.flatMap((object) => object.fields);
199
+ return {
200
+ foreignKeyFields: fields.filter((field) => field.type === "foreignKey").length,
201
+ crossPackageRefFields: fields.filter(
202
+ (field) => field.type === "crossPackageRef"
203
+ ).length,
204
+ junctionCollections: objects.filter(
205
+ (object) => object.relationshipFeatures.includes("SmrtJunction")
206
+ ).length,
207
+ hierarchicalObjects: objects.filter(
208
+ (object) => object.relationshipFeatures.includes("SmrtHierarchical")
209
+ ).length,
210
+ polymorphicAssociations: objects.filter(
211
+ (object) => object.relationshipFeatures.includes("SmrtPolymorphicAssociation")
212
+ ).length,
213
+ uuidColumns: manifestObjects.reduce(
214
+ (count, object) => count + Object.values(object.schema?.columns ?? {}).filter(
215
+ (column) => column.type === "UUID"
216
+ ).length,
217
+ 0
218
+ )
219
+ };
220
+ }
221
+ function columnType(object, fieldName) {
222
+ const columnName = camelToSnake(fieldName);
223
+ return object.schema?.columns[columnName]?.type;
224
+ }
225
+ function readPrompts(rootDir) {
226
+ const srcDir = join(rootDir, "src");
227
+ if (!existsSync(srcDir)) return [];
228
+ const prompts = [];
229
+ for (const filePath of walkFiles(srcDir)) {
230
+ if (!filePath.endsWith(".ts")) continue;
231
+ const content = readFileSync(filePath, "utf8");
232
+ if (!content.includes("definePrompt")) continue;
233
+ const keyMatch = content.match(/definePrompt\s*\(\s*['"`]([^'"`]+)['"`]/);
234
+ prompts.push({
235
+ filePath: relative(rootDir, filePath),
236
+ key: keyMatch?.[1]
237
+ });
238
+ }
239
+ return prompts;
240
+ }
241
+ function walkFiles(dir) {
242
+ const files = [];
243
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
244
+ if (entry.name === "node_modules" || entry.name === "dist" || entry.name === ".svelte-kit") {
245
+ continue;
246
+ }
247
+ const fullPath = join(dir, entry.name);
248
+ if (entry.isDirectory()) {
249
+ files.push(...walkFiles(fullPath));
250
+ } else if (entry.isFile()) {
251
+ files.push(fullPath);
252
+ }
253
+ }
254
+ return files;
255
+ }
256
+ function sourceHashes(sources) {
257
+ const hashes = {};
258
+ for (const [name, source] of Object.entries(sources)) {
259
+ if (!source) continue;
260
+ const content = "content" in source ? source.content : readFileSync(source.path, "utf8");
261
+ hashes[name] = createHash("sha256").update(content).digest("hex");
262
+ }
263
+ return hashes;
264
+ }
265
+ function fileHashSource(path) {
266
+ return path ? { path } : void 0;
267
+ }
268
+ function existingPath(rootDir, path) {
269
+ const fullPath = join(rootDir, path);
270
+ return existsSync(fullPath) ? fullPath : void 0;
271
+ }
272
+ function readPackageJson(rootDir) {
273
+ const path = join(rootDir, "package.json");
274
+ if (!existsSync(path)) return null;
275
+ return JSON.parse(readFileSync(path, "utf8"));
276
+ }
277
+ function record(value) {
278
+ return typeof value === "object" && value !== null && !Array.isArray(value) ? value : {};
279
+ }
280
+ function exportKeys(exportsField) {
281
+ if (typeof exportsField === "string") return ["."];
282
+ if (typeof exportsField !== "object" || exportsField === null || Array.isArray(exportsField)) {
283
+ return [];
284
+ }
285
+ return Object.keys(exportsField).sort();
286
+ }
287
+ function camelToSnake(value) {
288
+ return value.replace(/([a-z0-9])([A-Z])/g, "$1_$2").replace(/[-\s]+/g, "_").toLowerCase();
289
+ }
290
+ function normalizeManifestForHash(manifest) {
291
+ const normalized = JSON.parse(JSON.stringify(manifest));
292
+ delete normalized.timestamp;
293
+ return normalized;
294
+ }
295
+ function stableJson(value) {
296
+ return JSON.stringify(sortJson(value), null, 2);
297
+ }
298
+ function sortJson(value) {
299
+ if (Array.isArray(value)) return value.map(sortJson);
300
+ if (value && typeof value === "object") {
301
+ return Object.fromEntries(
302
+ Object.entries(value).sort(([a], [b]) => a.localeCompare(b)).map(([key, entry]) => [key, sortJson(entry)])
303
+ );
304
+ }
305
+ return value;
306
+ }
307
+ export {
308
+ buildDomainKnowledgeManifest
309
+ };
310
+ //# sourceMappingURL=knowledge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge.js","sources":["../src/knowledge.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join, relative } from 'node:path';\nimport type {\n DomainKnowledgeConfig,\n DomainKnowledgeManifest,\n DomainKnowledgeObject,\n DomainKnowledgeSurface,\n} from '@happyvertical/smrt-types';\nimport type {\n SmartObjectDefinition,\n SmartObjectManifest,\n} from './scanner/types.js';\n\nexport interface BuildDomainKnowledgeOptions {\n manifest: SmartObjectManifest;\n rootDir: string;\n packageJson?: Record<string, any>;\n manifestPath?: string;\n config?: DomainKnowledgeConfig;\n}\n\nconst SDK_PACKAGE_NAMES = new Set([\n '@happyvertical/ai',\n '@happyvertical/cache',\n '@happyvertical/documents',\n '@happyvertical/email',\n '@happyvertical/encryption',\n '@happyvertical/files',\n '@happyvertical/geo',\n '@happyvertical/images',\n '@happyvertical/jobs',\n '@happyvertical/json',\n '@happyvertical/logger',\n '@happyvertical/messages',\n '@happyvertical/ocr',\n '@happyvertical/pdf',\n '@happyvertical/projects',\n '@happyvertical/repos',\n '@happyvertical/secrets',\n '@happyvertical/spider',\n '@happyvertical/sql',\n '@happyvertical/utils',\n]);\n\nconst RELATIONSHIP_FIELD_TYPES = new Set([\n 'foreignKey',\n 'crossPackageRef',\n 'oneToMany',\n 'manyToMany',\n]);\n\nconst STANDARD_OPERATIONS = ['list', 'get', 'create', 'update', 'delete'];\n\nexport function buildDomainKnowledgeManifest(\n options: BuildDomainKnowledgeOptions,\n): DomainKnowledgeManifest {\n const rootDir = options.rootDir;\n const packageJson = options.packageJson ?? readPackageJson(rootDir) ?? {};\n const packageName = options.manifest.packageName ?? packageJson.name;\n const packageVersion = options.manifest.packageVersion ?? packageJson.version;\n const agentDocPath = existingPath(rootDir, 'AGENTS.md');\n const agentDoc =\n options.config?.includeDocs === false || !agentDocPath\n ? undefined\n : readFileSync(agentDocPath, 'utf8');\n const allDependencies = {\n ...record(packageJson.dependencies),\n ...record(packageJson.devDependencies),\n ...record(packageJson.peerDependencies),\n };\n const manifestObjects = Object.values(options.manifest.objects).filter(\n (object) => object.decoratorConfig?.knowledge !== false,\n );\n const objects = manifestObjects.map((object) => buildKnowledgeObject(object));\n const surfaces = objects.flatMap((object) => object.surfaces);\n const manifestJson = stableJson(normalizeManifestForHash(options.manifest));\n\n return {\n schemaVersion: 1,\n generatedAt: new Date().toISOString(),\n packageName,\n packageVersion,\n sourceManifestPath: options.manifestPath\n ? relative(rootDir, options.manifestPath)\n : undefined,\n agentDocPath: agentDocPath ? relative(rootDir, agentDocPath) : undefined,\n sourceHashes: sourceHashes({\n manifest: { content: manifestJson },\n packageJson: fileHashSource(existingPath(rootDir, 'package.json')),\n agents: fileHashSource(agentDocPath),\n }),\n exports: exportKeys(packageJson.exports),\n dependencies: allDependencies,\n smrtDependencies: Object.keys(allDependencies)\n .filter((dep) => dep.startsWith('@happyvertical/smrt-'))\n .sort(),\n sdkDependencies: Object.keys(allDependencies)\n .filter((dep) => SDK_PACKAGE_NAMES.has(dep))\n .sort(),\n tags: options.config?.tags ?? [],\n summary: options.config?.summary,\n risks: options.config?.risks ?? [],\n objects,\n surfaces,\n prompts:\n options.config?.includePrompts === false ? [] : readPrompts(rootDir),\n relationshipsV2: summarizeRelationships(objects, manifestObjects),\n agentDoc,\n };\n}\n\nfunction buildKnowledgeObject(\n object: SmartObjectDefinition,\n): DomainKnowledgeObject {\n const knowledge =\n typeof object.decoratorConfig?.knowledge === 'object'\n ? object.decoratorConfig.knowledge\n : {};\n const fields = Object.entries(object.fields).map(([name, field]) => ({\n name,\n type: field.type,\n required: field.required,\n related: field.related,\n columnType: columnType(object, name),\n }));\n const relationships = fields\n .filter((field) => RELATIONSHIP_FIELD_TYPES.has(field.type))\n .map((field) => ({\n name: field.name,\n type: field.type,\n required: field.required,\n related: field.related,\n columnType: field.columnType,\n }));\n\n return {\n name: object.className,\n qualifiedName: object.qualifiedName,\n collection: object.collection,\n tableName: object.schema?.tableName,\n packageName: object.packageName,\n extends: object.extends,\n visibility: object.visibility,\n fields,\n relationships,\n methods: Object.keys(object.methods).sort(),\n surfaces: objectSurfaces(object),\n relationshipFeatures: relationshipFeatures(object),\n tags: knowledge.tags ?? [],\n summary: knowledge.summary,\n risks: knowledge.risks ?? [],\n };\n}\n\nfunction objectSurfaces(\n object: SmartObjectDefinition,\n): DomainKnowledgeSurface[] {\n return [\n ...configuredSurfaces('api', object),\n ...configuredSurfaces('cli', object),\n ...configuredSurfaces('mcp', object),\n ...aiSurfaces(object),\n ];\n}\n\nfunction configuredSurfaces(\n kind: 'api' | 'cli' | 'mcp',\n object: SmartObjectDefinition,\n): DomainKnowledgeSurface[] {\n const config = object.decoratorConfig?.[kind];\n if (!config) return [];\n const operations = configuredOperations(config);\n return operations.map((operation) => ({\n kind,\n name:\n kind === 'api'\n ? `${object.collection}.${operation}`\n : `${object.className.toLowerCase()}_${operation}`,\n operation,\n objectName: object.qualifiedName ?? object.className,\n path: kind === 'api' ? apiPath(object, operation) : undefined,\n method: kind === 'api' ? apiMethod(operation) : undefined,\n }));\n}\n\nfunction configuredOperations(config: unknown): string[] {\n if (config === true) return [...STANDARD_OPERATIONS];\n if (!config || typeof config !== 'object' || Array.isArray(config)) {\n return [];\n }\n const recordConfig = config as { include?: string[]; exclude?: string[] };\n const base = Array.isArray(recordConfig.include)\n ? recordConfig.include\n : STANDARD_OPERATIONS;\n const excluded = new Set(recordConfig.exclude ?? []);\n return [...new Set(base.filter((operation) => !excluded.has(operation)))];\n}\n\nfunction aiSurfaces(object: SmartObjectDefinition): DomainKnowledgeSurface[] {\n return (object.tools ?? []).map((tool) => ({\n kind: 'ai',\n name: tool.function.name,\n operation: tool.function.name,\n description: tool.function.description,\n objectName: object.qualifiedName ?? object.className,\n }));\n}\n\nfunction apiPath(object: SmartObjectDefinition, operation: string): string {\n const collection = object.decoratorConfig?.api;\n const configuredPath =\n typeof collection === 'object' && typeof collection.path === 'string'\n ? collection.path\n : object.collection.replaceAll('_', '-');\n if (operation === 'list' || operation === 'create') {\n return `/${configuredPath}`;\n }\n if (STANDARD_OPERATIONS.includes(operation)) {\n return `/${configuredPath}/[id]`;\n }\n return `/${configuredPath}/${operation}`;\n}\n\nfunction apiMethod(operation: string): string {\n switch (operation) {\n case 'list':\n case 'get':\n return 'GET';\n case 'create':\n return 'POST';\n case 'update':\n return 'PATCH';\n case 'delete':\n return 'DELETE';\n default:\n return 'POST';\n }\n}\n\nfunction relationshipFeatures(object: SmartObjectDefinition): string[] {\n const features = new Set<string>();\n for (const field of Object.values(object.fields)) {\n if (field.type === 'foreignKey') features.add('foreignKey');\n if (field.type === 'crossPackageRef') features.add('crossPackageRef');\n if (field.type === 'oneToMany') features.add('oneToMany');\n if (field.type === 'manyToMany') features.add('manyToMany');\n }\n if (object.extends === 'SmrtJunction') features.add('SmrtJunction');\n if (object.extends === 'SmrtHierarchical') features.add('SmrtHierarchical');\n if (\n object.extends === 'SmrtPolymorphicAssociation' ||\n object.fields.metaType ||\n object.fields.metaId\n ) {\n features.add('SmrtPolymorphicAssociation');\n }\n if (\n Object.keys(object.schema?.columns ?? {}).some(\n (name) => object.schema?.columns[name]?.type === 'UUID',\n )\n ) {\n features.add('uuidColumns');\n }\n return [...features].sort();\n}\n\nfunction summarizeRelationships(\n objects: DomainKnowledgeObject[],\n manifestObjects: SmartObjectDefinition[],\n) {\n const fields = objects.flatMap((object) => object.fields);\n return {\n foreignKeyFields: fields.filter((field) => field.type === 'foreignKey')\n .length,\n crossPackageRefFields: fields.filter(\n (field) => field.type === 'crossPackageRef',\n ).length,\n junctionCollections: objects.filter((object) =>\n object.relationshipFeatures.includes('SmrtJunction'),\n ).length,\n hierarchicalObjects: objects.filter((object) =>\n object.relationshipFeatures.includes('SmrtHierarchical'),\n ).length,\n polymorphicAssociations: objects.filter((object) =>\n object.relationshipFeatures.includes('SmrtPolymorphicAssociation'),\n ).length,\n uuidColumns: manifestObjects.reduce(\n (count, object) =>\n count +\n Object.values(object.schema?.columns ?? {}).filter(\n (column) => column.type === 'UUID',\n ).length,\n 0,\n ),\n };\n}\n\nfunction columnType(\n object: SmartObjectDefinition,\n fieldName: string,\n): string | undefined {\n const columnName = camelToSnake(fieldName);\n return object.schema?.columns[columnName]?.type;\n}\n\nfunction readPrompts(\n rootDir: string,\n): Array<{ filePath: string; key?: string }> {\n const srcDir = join(rootDir, 'src');\n if (!existsSync(srcDir)) return [];\n const prompts: Array<{ filePath: string; key?: string }> = [];\n for (const filePath of walkFiles(srcDir)) {\n if (!filePath.endsWith('.ts')) continue;\n const content = readFileSync(filePath, 'utf8');\n if (!content.includes('definePrompt')) continue;\n const keyMatch = content.match(/definePrompt\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/);\n prompts.push({\n filePath: relative(rootDir, filePath),\n key: keyMatch?.[1],\n });\n }\n return prompts;\n}\n\nfunction walkFiles(dir: string): string[] {\n const files: string[] = [];\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (\n entry.name === 'node_modules' ||\n entry.name === 'dist' ||\n entry.name === '.svelte-kit'\n ) {\n continue;\n }\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...walkFiles(fullPath));\n } else if (entry.isFile()) {\n files.push(fullPath);\n }\n }\n return files;\n}\n\nfunction sourceHashes(sources: Record<string, HashSource | undefined>) {\n const hashes: Record<string, string> = {};\n for (const [name, source] of Object.entries(sources)) {\n if (!source) continue;\n const content =\n 'content' in source ? source.content : readFileSync(source.path, 'utf8');\n hashes[name] = createHash('sha256').update(content).digest('hex');\n }\n return hashes;\n}\n\ntype HashSource = { content: string } | { path: string };\n\nfunction fileHashSource(path: string | undefined): HashSource | undefined {\n return path ? { path } : undefined;\n}\n\nfunction existingPath(rootDir: string, path: string): string | undefined {\n const fullPath = join(rootDir, path);\n return existsSync(fullPath) ? fullPath : undefined;\n}\n\nfunction readPackageJson(rootDir: string): Record<string, any> | null {\n const path = join(rootDir, 'package.json');\n if (!existsSync(path)) return null;\n return JSON.parse(readFileSync(path, 'utf8'));\n}\n\nfunction record(value: unknown): Record<string, string> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, string>)\n : {};\n}\n\nfunction exportKeys(exportsField: unknown): string[] {\n if (typeof exportsField === 'string') return ['.'];\n if (\n typeof exportsField !== 'object' ||\n exportsField === null ||\n Array.isArray(exportsField)\n ) {\n return [];\n }\n return Object.keys(exportsField).sort();\n}\n\nfunction camelToSnake(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/[-\\s]+/g, '_')\n .toLowerCase();\n}\n\nfunction normalizeManifestForHash(manifest: SmartObjectManifest): unknown {\n const normalized = JSON.parse(JSON.stringify(manifest)) as Record<\n string,\n unknown\n >;\n delete normalized.timestamp;\n return normalized;\n}\n\nfunction stableJson(value: unknown): string {\n return JSON.stringify(sortJson(value), null, 2);\n}\n\nfunction sortJson(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortJson);\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, entry]) => [key, sortJson(entry)]),\n );\n }\n return value;\n}\n"],"names":[],"mappings":"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"}