@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,21 @@
1
+ /**
2
+ * OpenAPI documentation generation for smrt APIs
3
+ *
4
+ * Lightweight implementation with optional Swagger UI
5
+ */
6
+ export interface OpenAPIConfig {
7
+ title?: string;
8
+ version?: string;
9
+ description?: string;
10
+ basePath?: string;
11
+ serverUrl?: string;
12
+ }
13
+ /**
14
+ * Generate OpenAPI specification (tree-shakeable)
15
+ */
16
+ export declare function generateOpenAPISpec(config?: OpenAPIConfig): any;
17
+ /**
18
+ * Setup Swagger UI (optional peer dependency)
19
+ */
20
+ export declare function setupSwaggerUI(app: any, spec: any, path?: string): void;
21
+ //# sourceMappingURL=swagger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swagger.d.ts","sourceRoot":"","sources":["../../src/generators/swagger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,aAAkB,GAAG,GAAG,CAuDnE;AAsRD;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,SAAU,QAoBjE"}
@@ -0,0 +1,307 @@
1
+ import { ObjectRegistry } from "../registry.js";
2
+ function generateOpenAPISpec(config = {}) {
3
+ const {
4
+ title = "smrt API",
5
+ version = "1.0.0",
6
+ description = "Auto-generated API from smrt objects",
7
+ basePath = "/api/v1",
8
+ serverUrl = "http://localhost:3000"
9
+ } = config;
10
+ const spec = {
11
+ openapi: "3.0.3",
12
+ info: { title, version, description },
13
+ servers: [{ url: serverUrl }],
14
+ security: [{ bearerAuth: [] }],
15
+ components: {
16
+ securitySchemes: {
17
+ bearerAuth: {
18
+ type: "http",
19
+ scheme: "bearer",
20
+ bearerFormat: "JWT"
21
+ }
22
+ },
23
+ schemas: generateSchemas(),
24
+ responses: {
25
+ ValidationError: {
26
+ description: "Validation error",
27
+ content: {
28
+ "application/json": {
29
+ schema: {
30
+ type: "object",
31
+ properties: {
32
+ error: { type: "string" },
33
+ details: { type: "string" }
34
+ }
35
+ }
36
+ }
37
+ }
38
+ },
39
+ NotFound: {
40
+ description: "Resource not found",
41
+ content: {
42
+ "application/json": {
43
+ schema: {
44
+ type: "object",
45
+ properties: { error: { type: "string" } }
46
+ }
47
+ }
48
+ }
49
+ }
50
+ }
51
+ },
52
+ paths: generatePaths(basePath)
53
+ };
54
+ return spec;
55
+ }
56
+ function generateSchemas() {
57
+ const schemas = {};
58
+ const registeredClasses = ObjectRegistry.getAllClasses();
59
+ for (const [key, classInfo] of registeredClasses) {
60
+ const name = classInfo.name || key;
61
+ if (ObjectRegistry.getConfig(name).api === false) {
62
+ continue;
63
+ }
64
+ schemas[name] = generateObjectSchema(name);
65
+ schemas[`${name}List`] = {
66
+ type: "object",
67
+ properties: {
68
+ data: {
69
+ type: "array",
70
+ items: { $ref: `#/components/schemas/${name}` }
71
+ },
72
+ meta: {
73
+ type: "object",
74
+ properties: {
75
+ total: { type: "integer" },
76
+ limit: { type: "integer" },
77
+ offset: { type: "integer" },
78
+ count: { type: "integer" }
79
+ }
80
+ }
81
+ }
82
+ };
83
+ }
84
+ return schemas;
85
+ }
86
+ function generateObjectSchema(objectName) {
87
+ const fields = ObjectRegistry.getFields(objectName);
88
+ const properties = {
89
+ id: { type: "string", format: "uuid" },
90
+ slug: { type: "string" },
91
+ created_at: { type: "string", format: "date-time" },
92
+ updated_at: { type: "string", format: "date-time" }
93
+ };
94
+ const required = ["id"];
95
+ for (const [fieldName, field] of fields) {
96
+ properties[fieldName] = fieldToOpenAPISchema(field);
97
+ if (field._meta?.required) {
98
+ required.push(fieldName);
99
+ }
100
+ }
101
+ return { type: "object", properties, required };
102
+ }
103
+ function fieldToOpenAPISchema(field) {
104
+ const schema = {
105
+ description: field._meta?.description || ""
106
+ };
107
+ switch (field.type) {
108
+ case "text":
109
+ schema.type = "string";
110
+ if (field._meta?.maxLength) schema.maxLength = field._meta.maxLength;
111
+ if (field._meta?.minLength) schema.minLength = field._meta.minLength;
112
+ break;
113
+ case "integer":
114
+ schema.type = "integer";
115
+ if (field._meta?.min !== void 0) schema.minimum = field._meta.min;
116
+ if (field._meta?.max !== void 0) schema.maximum = field._meta.max;
117
+ break;
118
+ case "decimal":
119
+ schema.type = "number";
120
+ schema.format = "float";
121
+ if (field._meta?.min !== void 0) schema.minimum = field._meta.min;
122
+ if (field._meta?.max !== void 0) schema.maximum = field._meta.max;
123
+ break;
124
+ case "boolean":
125
+ schema.type = "boolean";
126
+ break;
127
+ case "datetime":
128
+ schema.type = "string";
129
+ schema.format = "date-time";
130
+ break;
131
+ case "json":
132
+ schema.type = "object";
133
+ schema.additionalProperties = true;
134
+ break;
135
+ case "foreignKey":
136
+ schema.type = "string";
137
+ schema.format = "uuid";
138
+ break;
139
+ default:
140
+ schema.type = "string";
141
+ }
142
+ if (field._meta?.default !== void 0) {
143
+ schema.default = field._meta.default;
144
+ }
145
+ return schema;
146
+ }
147
+ function generatePaths(basePath) {
148
+ const paths = {};
149
+ const registeredClasses = ObjectRegistry.getAllClasses();
150
+ for (const [key, classInfo] of registeredClasses) {
151
+ const name = classInfo.name || key;
152
+ const pluralName = pluralize(name.toLowerCase());
153
+ const objectPath = `${basePath}/${pluralName}`;
154
+ const config = ObjectRegistry.getConfig(name);
155
+ const apiConfig = config.api;
156
+ if (apiConfig === false) {
157
+ continue;
158
+ }
159
+ const excluded = typeof apiConfig === "object" && apiConfig?.exclude ? apiConfig.exclude : [];
160
+ const included = typeof apiConfig === "object" ? apiConfig?.include : void 0;
161
+ const shouldInclude = (endpoint) => {
162
+ if (included && !included.includes(endpoint)) return false;
163
+ if (excluded.includes(endpoint)) return false;
164
+ return true;
165
+ };
166
+ paths[objectPath] = {};
167
+ if (shouldInclude("list")) {
168
+ paths[objectPath].get = {
169
+ summary: `List ${name} objects`,
170
+ tags: [name],
171
+ parameters: [
172
+ {
173
+ name: "limit",
174
+ in: "query",
175
+ schema: { type: "integer", default: 50 }
176
+ },
177
+ {
178
+ name: "offset",
179
+ in: "query",
180
+ schema: { type: "integer", default: 0 }
181
+ }
182
+ ],
183
+ responses: {
184
+ "200": {
185
+ description: "Success",
186
+ content: {
187
+ "application/json": {
188
+ schema: { $ref: `#/components/schemas/${name}List` }
189
+ }
190
+ }
191
+ }
192
+ }
193
+ };
194
+ }
195
+ if (shouldInclude("create")) {
196
+ paths[objectPath].post = {
197
+ summary: `Create ${name}`,
198
+ tags: [name],
199
+ requestBody: {
200
+ required: true,
201
+ content: {
202
+ "application/json": {
203
+ schema: { $ref: `#/components/schemas/${name}` }
204
+ }
205
+ }
206
+ },
207
+ responses: {
208
+ "201": { description: "Created" },
209
+ "400": { $ref: "#/components/responses/ValidationError" }
210
+ }
211
+ };
212
+ }
213
+ paths[`${objectPath}/{id}`] = {};
214
+ if (shouldInclude("get")) {
215
+ paths[`${objectPath}/{id}`].get = {
216
+ summary: `Get ${name} by ID`,
217
+ tags: [name],
218
+ parameters: [
219
+ {
220
+ name: "id",
221
+ in: "path",
222
+ required: true,
223
+ schema: { type: "string" }
224
+ }
225
+ ],
226
+ responses: {
227
+ "200": { description: "Success" },
228
+ "404": { $ref: "#/components/responses/NotFound" }
229
+ }
230
+ };
231
+ }
232
+ if (shouldInclude("update")) {
233
+ paths[`${objectPath}/{id}`].put = {
234
+ summary: `Update ${name}`,
235
+ tags: [name],
236
+ parameters: [
237
+ {
238
+ name: "id",
239
+ in: "path",
240
+ required: true,
241
+ schema: { type: "string" }
242
+ }
243
+ ],
244
+ requestBody: {
245
+ required: true,
246
+ content: {
247
+ "application/json": {
248
+ schema: { $ref: `#/components/schemas/${name}` }
249
+ }
250
+ }
251
+ },
252
+ responses: {
253
+ "200": { description: "Updated" },
254
+ "404": { $ref: "#/components/responses/NotFound" }
255
+ }
256
+ };
257
+ }
258
+ if (shouldInclude("delete")) {
259
+ paths[`${objectPath}/{id}`].delete = {
260
+ summary: `Delete ${name}`,
261
+ tags: [name],
262
+ parameters: [
263
+ {
264
+ name: "id",
265
+ in: "path",
266
+ required: true,
267
+ schema: { type: "string" }
268
+ }
269
+ ],
270
+ responses: {
271
+ "204": { description: "Deleted" },
272
+ "404": { $ref: "#/components/responses/NotFound" }
273
+ }
274
+ };
275
+ }
276
+ }
277
+ return paths;
278
+ }
279
+ function setupSwaggerUI(app, spec, path = "/docs") {
280
+ try {
281
+ const swaggerUi = require("swagger-ui-express");
282
+ app.use(path, swaggerUi.serve);
283
+ app.get(
284
+ path,
285
+ swaggerUi.setup(spec, {
286
+ customCss: ".swagger-ui .topbar { display: none }"
287
+ })
288
+ );
289
+ app.get(`${path}/openapi.json`, (_req, res) => {
290
+ res.json(spec);
291
+ });
292
+ console.log(`📚 Swagger UI available at ${path}`);
293
+ } catch (_error) {
294
+ console.warn("Swagger UI not available (install swagger-ui-express)");
295
+ }
296
+ }
297
+ function pluralize(word) {
298
+ if (word.endsWith("y")) return `${word.slice(0, -1)}ies`;
299
+ if (word.endsWith("s") || word.endsWith("x") || word.endsWith("z") || word.endsWith("ch") || word.endsWith("sh"))
300
+ return `${word}es`;
301
+ return `${word}s`;
302
+ }
303
+ export {
304
+ generateOpenAPISpec,
305
+ setupSwaggerUI
306
+ };
307
+ //# sourceMappingURL=swagger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swagger.js","sources":["../../src/generators/swagger.ts"],"sourcesContent":["/**\n * OpenAPI documentation generation for smrt APIs\n *\n * Lightweight implementation with optional Swagger UI\n */\n\nimport { ObjectRegistry } from '../registry';\n\nexport interface OpenAPIConfig {\n title?: string;\n version?: string;\n description?: string;\n basePath?: string;\n serverUrl?: string;\n}\n\n/**\n * Generate OpenAPI specification (tree-shakeable)\n */\nexport function generateOpenAPISpec(config: OpenAPIConfig = {}): any {\n const {\n title = 'smrt API',\n version = '1.0.0',\n description = 'Auto-generated API from smrt objects',\n basePath = '/api/v1',\n serverUrl = 'http://localhost:3000',\n } = config;\n\n const spec = {\n openapi: '3.0.3',\n info: { title, version, description },\n servers: [{ url: serverUrl }],\n security: [{ bearerAuth: [] }],\n components: {\n securitySchemes: {\n bearerAuth: {\n type: 'http',\n scheme: 'bearer',\n bearerFormat: 'JWT',\n },\n },\n schemas: generateSchemas(),\n responses: {\n ValidationError: {\n description: 'Validation error',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n error: { type: 'string' },\n details: { type: 'string' },\n },\n },\n },\n },\n },\n NotFound: {\n description: 'Resource not found',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: { error: { type: 'string' } },\n },\n },\n },\n },\n },\n },\n paths: generatePaths(basePath),\n };\n\n return spec;\n}\n\n/**\n * Generate schemas for all registered objects\n */\nfunction generateSchemas(): Record<string, any> {\n const schemas: Record<string, any> = {};\n const registeredClasses = ObjectRegistry.getAllClasses();\n\n for (const [key, classInfo] of registeredClasses) {\n // Issue #951: Use simple name for schema keys, not the qualified map key\n const name = classInfo.name || key;\n // `api: false` disables REST generation (see rest.ts) and is already\n // skipped in generatePaths(); mirror that here so component schemas don't\n // leak the field shape of a surface with no working handlers. Skip ONLY\n // when api is explicitly false — default (undefined) and\n // `{ include: [...] }` configs still publish their schema (#1540).\n if (ObjectRegistry.getConfig(name).api === false) {\n continue;\n }\n schemas[name] = generateObjectSchema(name);\n schemas[`${name}List`] = {\n type: 'object',\n properties: {\n data: {\n type: 'array',\n items: { $ref: `#/components/schemas/${name}` },\n },\n meta: {\n type: 'object',\n properties: {\n total: { type: 'integer' },\n limit: { type: 'integer' },\n offset: { type: 'integer' },\n count: { type: 'integer' },\n },\n },\n },\n };\n }\n\n return schemas;\n}\n\n/**\n * Generate schema for a specific object\n */\nfunction generateObjectSchema(objectName: string): any {\n const fields = ObjectRegistry.getFields(objectName);\n const properties: Record<string, any> = {\n id: { type: 'string', format: 'uuid' },\n slug: { type: 'string' },\n created_at: { type: 'string', format: 'date-time' },\n updated_at: { type: 'string', format: 'date-time' },\n };\n\n const required = ['id'];\n\n for (const [fieldName, field] of fields) {\n properties[fieldName] = fieldToOpenAPISchema(field);\n if (field._meta?.required) {\n required.push(fieldName);\n }\n }\n\n return { type: 'object', properties, required };\n}\n\n/**\n * Convert field to OpenAPI schema\n */\nfunction fieldToOpenAPISchema(field: any): any {\n const schema: any = {\n description: field._meta?.description || '',\n };\n\n switch (field.type) {\n case 'text':\n schema.type = 'string';\n if (field._meta?.maxLength) schema.maxLength = field._meta.maxLength;\n if (field._meta?.minLength) schema.minLength = field._meta.minLength;\n break;\n case 'integer':\n schema.type = 'integer';\n if (field._meta?.min !== undefined) schema.minimum = field._meta.min;\n if (field._meta?.max !== undefined) schema.maximum = field._meta.max;\n break;\n case 'decimal':\n schema.type = 'number';\n schema.format = 'float';\n if (field._meta?.min !== undefined) schema.minimum = field._meta.min;\n if (field._meta?.max !== undefined) schema.maximum = field._meta.max;\n break;\n case 'boolean':\n schema.type = 'boolean';\n break;\n case 'datetime':\n schema.type = 'string';\n schema.format = 'date-time';\n break;\n case 'json':\n schema.type = 'object';\n schema.additionalProperties = true;\n break;\n case 'foreignKey':\n schema.type = 'string';\n schema.format = 'uuid';\n break;\n default:\n schema.type = 'string';\n }\n\n if (field._meta?.default !== undefined) {\n schema.default = field._meta.default;\n }\n\n return schema;\n}\n\n/**\n * Generate API paths\n */\nfunction generatePaths(basePath: string): Record<string, any> {\n const paths: Record<string, any> = {};\n const registeredClasses = ObjectRegistry.getAllClasses();\n\n for (const [key, classInfo] of registeredClasses) {\n // Issue #951: Use simple name, not the qualified map key\n const name = classInfo.name || key;\n const pluralName = pluralize(name.toLowerCase());\n const objectPath = `${basePath}/${pluralName}`;\n\n const config = ObjectRegistry.getConfig(name);\n const apiConfig = config.api;\n // `api: false` disables REST generation (see rest.ts); don't advertise its\n // paths in the OpenAPI spec either, or the spec leaks the shape of a\n // surface that has no working handlers (#1540).\n if (apiConfig === false) {\n continue;\n }\n const excluded: string[] =\n typeof apiConfig === 'object' && apiConfig?.exclude\n ? apiConfig.exclude\n : [];\n const included: string[] | undefined =\n typeof apiConfig === 'object' ? apiConfig?.include : undefined;\n\n const shouldInclude = (\n endpoint: 'list' | 'get' | 'create' | 'update' | 'delete',\n ) => {\n if (included && !included.includes(endpoint)) return false;\n if (excluded.includes(endpoint)) return false;\n return true;\n };\n\n // Collection endpoints\n paths[objectPath] = {};\n\n if (shouldInclude('list')) {\n paths[objectPath].get = {\n summary: `List ${name} objects`,\n tags: [name],\n parameters: [\n {\n name: 'limit',\n in: 'query',\n schema: { type: 'integer', default: 50 },\n },\n {\n name: 'offset',\n in: 'query',\n schema: { type: 'integer', default: 0 },\n },\n ],\n responses: {\n '200': {\n description: 'Success',\n content: {\n 'application/json': {\n schema: { $ref: `#/components/schemas/${name}List` },\n },\n },\n },\n },\n };\n }\n\n if (shouldInclude('create')) {\n paths[objectPath].post = {\n summary: `Create ${name}`,\n tags: [name],\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema: { $ref: `#/components/schemas/${name}` },\n },\n },\n },\n responses: {\n '201': { description: 'Created' },\n '400': { $ref: '#/components/responses/ValidationError' },\n },\n };\n }\n\n // Item endpoints\n paths[`${objectPath}/{id}`] = {};\n\n if (shouldInclude('get')) {\n paths[`${objectPath}/{id}`].get = {\n summary: `Get ${name} by ID`,\n tags: [name],\n parameters: [\n {\n name: 'id',\n in: 'path',\n required: true,\n schema: { type: 'string' },\n },\n ],\n responses: {\n '200': { description: 'Success' },\n '404': { $ref: '#/components/responses/NotFound' },\n },\n };\n }\n\n if (shouldInclude('update')) {\n paths[`${objectPath}/{id}`].put = {\n summary: `Update ${name}`,\n tags: [name],\n parameters: [\n {\n name: 'id',\n in: 'path',\n required: true,\n schema: { type: 'string' },\n },\n ],\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema: { $ref: `#/components/schemas/${name}` },\n },\n },\n },\n responses: {\n '200': { description: 'Updated' },\n '404': { $ref: '#/components/responses/NotFound' },\n },\n };\n }\n\n if (shouldInclude('delete')) {\n paths[`${objectPath}/{id}`].delete = {\n summary: `Delete ${name}`,\n tags: [name],\n parameters: [\n {\n name: 'id',\n in: 'path',\n required: true,\n schema: { type: 'string' },\n },\n ],\n responses: {\n '204': { description: 'Deleted' },\n '404': { $ref: '#/components/responses/NotFound' },\n },\n };\n }\n }\n\n return paths;\n}\n\n/**\n * Setup Swagger UI (optional peer dependency)\n */\nexport function setupSwaggerUI(app: any, spec: any, path = '/docs') {\n try {\n const swaggerUi = require('swagger-ui-express');\n\n app.use(path, swaggerUi.serve);\n app.get(\n path,\n swaggerUi.setup(spec, {\n customCss: '.swagger-ui .topbar { display: none }',\n }),\n );\n\n app.get(`${path}/openapi.json`, (_req: any, res: any) => {\n res.json(spec);\n });\n\n console.log(`📚 Swagger UI available at ${path}`);\n } catch (_error) {\n console.warn('Swagger UI not available (install swagger-ui-express)');\n }\n}\n\nfunction pluralize(word: string): string {\n if (word.endsWith('y')) return `${word.slice(0, -1)}ies`;\n if (\n word.endsWith('s') ||\n word.endsWith('x') ||\n word.endsWith('z') ||\n word.endsWith('ch') ||\n word.endsWith('sh')\n )\n return `${word}es`;\n return `${word}s`;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Tenant entry-point gate — dependency-inversion hook for generated CLI/MCP
3
+ * execution (#1554).
4
+ *
5
+ * `@happyvertical/smrt-core` cannot depend on `@happyvertical/smrt-tenancy`
6
+ * (tenancy depends on core, not the other way around). The generated SvelteKit
7
+ * routes establish tenant context from the request principal, but the in-process
8
+ * CLI/MCP generators have no principal — without a gate a tenant-scoped read
9
+ * with no active context would fall through the interceptor's optional-mode
10
+ * pass-through and return rows across **all** tenants.
11
+ *
12
+ * Core exposes an injectable runner slot that tenancy fills at `enableTenancy()`
13
+ * time (the same inversion pattern as the DispatchBus tenant resolver and
14
+ * `GlobalInterceptors`). When tenancy is not enabled (non-tenant deployments,
15
+ * existing tests), the slot is empty and {@link runWithTenantGate} simply runs
16
+ * the body — identical to pre-#1554 behavior.
17
+ *
18
+ * Stored on `globalThis` so all module instances share one runner, which
19
+ * matters in the monorepo where the same package can be loaded from multiple
20
+ * paths.
21
+ */
22
+ /** Options forwarded to the registered tenancy runner. */
23
+ export interface TenantGateOptions {
24
+ /**
25
+ * Class name of the target model. Tenant-scoping is resolved authoritatively
26
+ * inside tenancy (`isTenantScopedClass`) — the same source the interceptor
27
+ * uses, so it covers both `@TenantScoped` and `@smrt({ tenantScoped })`.
28
+ */
29
+ className?: string;
30
+ /** Explicit tenant-scoping decision; overrides `className` resolution. */
31
+ tenantScoped?: boolean;
32
+ /** Explicit operator-provided tenant selector (`--tenant` / `context.tenantId`). */
33
+ tenantId?: string | null;
34
+ /** Explicit operator opt-in to cross-tenant/system access (`--all-tenants`). */
35
+ allowCrossTenant?: boolean;
36
+ /** Surface name for the fail-closed error message, e.g. `'CLI'` / `'MCP'`. */
37
+ surface?: string;
38
+ }
39
+ /**
40
+ * Runner that establishes (or fail-closes) tenant context around `fn` for a
41
+ * tenant-scoped model. Registered by tenancy; see
42
+ * `runTenantScopedEntryPoint` in `@happyvertical/smrt-tenancy`.
43
+ */
44
+ export type TenantEntryPointRunner = <T>(options: TenantGateOptions, fn: () => Promise<T>) => Promise<T>;
45
+ declare global {
46
+ var __smrtTenantEntryPointRunner: TenantEntryPointRunner | undefined;
47
+ }
48
+ /**
49
+ * Register the tenant entry-point runner used by generated CLI/MCP execution.
50
+ *
51
+ * Called by `@happyvertical/smrt-tenancy`'s `enableTenancy()`; application code
52
+ * never calls this directly. Passing `undefined` clears the runner (restoring
53
+ * the no-op default), which `disableTenancy()` does.
54
+ *
55
+ * @param runner - The tenancy runner, or `undefined` to clear it.
56
+ */
57
+ export declare function setTenantEntryPointRunner(runner: TenantEntryPointRunner | undefined): void;
58
+ /**
59
+ * Run `fn` through the registered tenant entry-point runner (when tenancy is
60
+ * enabled), or directly when no runner is registered.
61
+ *
62
+ * For tenant-scoped models the runner establishes tenant context from
63
+ * `options.tenantId` / `options.allowCrossTenant`, or fails closed (throws) when
64
+ * neither is available — never silently reading across tenants. Non-scoped
65
+ * models and tenancy-off deployments pass straight through.
66
+ *
67
+ * @param options - {@link TenantGateOptions}.
68
+ * @param fn - The command/tool body to execute.
69
+ * @returns The resolved value of `fn`.
70
+ * @throws Propagates the tenancy runner's `TenantContextError` on the
71
+ * fail-closed branch.
72
+ */
73
+ export declare function runWithTenantGate<T>(options: TenantGateOptions, fn: () => Promise<T>): Promise<T>;
74
+ //# sourceMappingURL=tenant-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-gate.d.ts","sourceRoot":"","sources":["../../src/generators/tenant-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,0DAA0D;AAC1D,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,EACrC,OAAO,EAAE,iBAAiB,EAC1B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KACjB,OAAO,CAAC,CAAC,CAAC,CAAC;AAEhB,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,4BAA4B,EAAE,sBAAsB,GAAG,SAAS,CAAC;CACtE;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,sBAAsB,GAAG,SAAS,GACzC,IAAI,CAEN;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,OAAO,EAAE,iBAAiB,EAC1B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAOZ"}
@@ -0,0 +1,15 @@
1
+ function setTenantEntryPointRunner(runner) {
2
+ globalThis.__smrtTenantEntryPointRunner = runner;
3
+ }
4
+ async function runWithTenantGate(options, fn) {
5
+ const runner = globalThis.__smrtTenantEntryPointRunner;
6
+ if (!runner) {
7
+ return fn();
8
+ }
9
+ return runner(options, fn);
10
+ }
11
+ export {
12
+ runWithTenantGate,
13
+ setTenantEntryPointRunner
14
+ };
15
+ //# sourceMappingURL=tenant-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-gate.js","sources":["../../src/generators/tenant-gate.ts"],"sourcesContent":["/**\n * Tenant entry-point gate — dependency-inversion hook for generated CLI/MCP\n * execution (#1554).\n *\n * `@happyvertical/smrt-core` cannot depend on `@happyvertical/smrt-tenancy`\n * (tenancy depends on core, not the other way around). The generated SvelteKit\n * routes establish tenant context from the request principal, but the in-process\n * CLI/MCP generators have no principal — without a gate a tenant-scoped read\n * with no active context would fall through the interceptor's optional-mode\n * pass-through and return rows across **all** tenants.\n *\n * Core exposes an injectable runner slot that tenancy fills at `enableTenancy()`\n * time (the same inversion pattern as the DispatchBus tenant resolver and\n * `GlobalInterceptors`). When tenancy is not enabled (non-tenant deployments,\n * existing tests), the slot is empty and {@link runWithTenantGate} simply runs\n * the body — identical to pre-#1554 behavior.\n *\n * Stored on `globalThis` so all module instances share one runner, which\n * matters in the monorepo where the same package can be loaded from multiple\n * paths.\n */\n\n/** Options forwarded to the registered tenancy runner. */\nexport interface TenantGateOptions {\n /**\n * Class name of the target model. Tenant-scoping is resolved authoritatively\n * inside tenancy (`isTenantScopedClass`) — the same source the interceptor\n * uses, so it covers both `@TenantScoped` and `@smrt({ tenantScoped })`.\n */\n className?: string;\n /** Explicit tenant-scoping decision; overrides `className` resolution. */\n tenantScoped?: boolean;\n /** Explicit operator-provided tenant selector (`--tenant` / `context.tenantId`). */\n tenantId?: string | null;\n /** Explicit operator opt-in to cross-tenant/system access (`--all-tenants`). */\n allowCrossTenant?: boolean;\n /** Surface name for the fail-closed error message, e.g. `'CLI'` / `'MCP'`. */\n surface?: string;\n}\n\n/**\n * Runner that establishes (or fail-closes) tenant context around `fn` for a\n * tenant-scoped model. Registered by tenancy; see\n * `runTenantScopedEntryPoint` in `@happyvertical/smrt-tenancy`.\n */\nexport type TenantEntryPointRunner = <T>(\n options: TenantGateOptions,\n fn: () => Promise<T>,\n) => Promise<T>;\n\ndeclare global {\n // eslint-disable-next-line no-var\n var __smrtTenantEntryPointRunner: TenantEntryPointRunner | undefined;\n}\n\n/**\n * Register the tenant entry-point runner used by generated CLI/MCP execution.\n *\n * Called by `@happyvertical/smrt-tenancy`'s `enableTenancy()`; application code\n * never calls this directly. Passing `undefined` clears the runner (restoring\n * the no-op default), which `disableTenancy()` does.\n *\n * @param runner - The tenancy runner, or `undefined` to clear it.\n */\nexport function setTenantEntryPointRunner(\n runner: TenantEntryPointRunner | undefined,\n): void {\n globalThis.__smrtTenantEntryPointRunner = runner;\n}\n\n/**\n * Run `fn` through the registered tenant entry-point runner (when tenancy is\n * enabled), or directly when no runner is registered.\n *\n * For tenant-scoped models the runner establishes tenant context from\n * `options.tenantId` / `options.allowCrossTenant`, or fails closed (throws) when\n * neither is available — never silently reading across tenants. Non-scoped\n * models and tenancy-off deployments pass straight through.\n *\n * @param options - {@link TenantGateOptions}.\n * @param fn - The command/tool body to execute.\n * @returns The resolved value of `fn`.\n * @throws Propagates the tenancy runner's `TenantContextError` on the\n * fail-closed branch.\n */\nexport async function runWithTenantGate<T>(\n options: TenantGateOptions,\n fn: () => Promise<T>,\n): Promise<T> {\n const runner = globalThis.__smrtTenantEntryPointRunner;\n if (!runner) {\n // Tenancy not enabled → single-/no-tenant deployment, pass through.\n return fn();\n }\n return runner(options, fn);\n}\n"],"names":[],"mappings":"AAgEO,SAAS,0BACd,QACM;AACN,aAAW,+BAA+B;AAC5C;AAiBA,eAAsB,kBACpB,SACA,IACY;AACZ,QAAM,SAAS,WAAW;AAC1B,MAAI,CAAC,QAAQ;AAEX,WAAO,GAAA;AAAA,EACT;AACA,SAAO,OAAO,SAAS,EAAE;AAC3B;"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Code generators for SMRT objects
3
+ *
4
+ * Re-exports all generators from the generators/ directory.
5
+ * This file serves as the entry point for @smrt/core/generators exports.
6
+ */
7
+ export * from './generators/index.js';
8
+ //# sourceMappingURL=generators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generators.d.ts","sourceRoot":"","sources":["../src/generators.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { CLIGenerator, getCLIHandler, setupCLI } from "./generators/cli.js";
2
+ import { MCPGenerator } from "./generators/mcp.js";
3
+ import { APIGenerator, createRestServer, startRestServer } from "./generators/rest.js";
4
+ import { generateOpenAPISpec, setupSwaggerUI } from "./generators/swagger.js";
5
+ import { runWithTenantGate, setTenantEntryPointRunner } from "./generators/tenant-gate.js";
6
+ export {
7
+ APIGenerator,
8
+ CLIGenerator,
9
+ MCPGenerator,
10
+ createRestServer,
11
+ generateOpenAPISpec,
12
+ getCLIHandler,
13
+ runWithTenantGate,
14
+ setTenantEntryPointRunner,
15
+ setupCLI,
16
+ setupSwaggerUI,
17
+ startRestServer
18
+ };
19
+ //# sourceMappingURL=generators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generators.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
@@ -0,0 +1,103 @@
1
+ import { SmrtCollection } from './collection';
2
+ import { SmrtObject } from './object';
3
+ /**
4
+ * Aggregate hierarchy view: ancestors (root-first), self, and all descendants
5
+ * (BFS order). Generic on the concrete subclass so `getHierarchy()` preserves
6
+ * the caller's type — `place.getHierarchy()` yields `HierarchyView<Place>`.
7
+ */
8
+ export interface HierarchyView<T extends SmrtHierarchical> {
9
+ ancestors: T[];
10
+ current: T;
11
+ descendants: T[];
12
+ }
13
+ export declare class SmrtHierarchical extends SmrtObject {
14
+ /**
15
+ * Internal marker so the scanner can recognize this framework abstract base
16
+ * even when consumers haven't built its package. Mirrors
17
+ * `SmrtJunction._isJunctionBase`. Don't rename without also updating the
18
+ * scanner's `FRAMEWORK_BASE_CLASSES` set in
19
+ * `packages/scanner/src/inheritance-resolver.ts`.
20
+ */
21
+ static readonly _isHierarchicalBase: true;
22
+ /** Self-referencing parent. `null` means top-level (no parent). */
23
+ parentId: string | null;
24
+ /**
25
+ * Resolve the collection used to load siblings/ancestors/descendants.
26
+ *
27
+ * Goes through `ObjectRegistry.getCollection` so subclasses don't have to
28
+ * hard-code a dynamic import of their own collection module. Also acts as
29
+ * the abstract-base guard — `new SmrtHierarchical()` followed by any
30
+ * traversal method throws a clear error rather than producing garbage.
31
+ *
32
+ * For STI subclasses, queries are issued against the STI base collection
33
+ * so the table/discriminator are correct.
34
+ *
35
+ * Lookup uses the constructor's qualified name when available — set by
36
+ * the registry on every registered class as `_smrtQualifiedName` (R5-
37
+ * canon prep). Then `ObjectRegistry.getSTIBase(...)` returns the
38
+ * qualified name of the STI base directly (R5-canon main), so the
39
+ * `getCollection` lookup never collapses to a simple-name ambiguity
40
+ * even when two packages ship a hierarchical class with the same
41
+ * simple name. Falls back through `getClassByConstructor` → simple
42
+ * `this.constructor.name` when the static / WeakMap aren't populated
43
+ * (rare; `getCollection` then surfaces the existing "not found in
44
+ * ObjectRegistry" error).
45
+ *
46
+ * The constructor prototype-chain walk that lived here from PR #1269
47
+ * is gone — the registry now returns qualified names directly so the
48
+ * walk became dead code.
49
+ */
50
+ protected _hierarchyCollection(): Promise<SmrtCollection<this>>;
51
+ /**
52
+ * The parent row, or `null` when this row is top-level.
53
+ *
54
+ * Single query. Returns the hydrated row (STI dispatch applies, so an
55
+ * Article-extends-Document subclass comes back as `Article`).
56
+ */
57
+ getParent(): Promise<this | null>;
58
+ /**
59
+ * Immediate children. Single query: `WHERE parent_id = this.id`.
60
+ */
61
+ getChildren(): Promise<this[]>;
62
+ /**
63
+ * All ancestors, root-first (immediate parent last). Does not include self.
64
+ *
65
+ * Intrinsically O(depth) queries — each step needs the previous level's
66
+ * `parentId` before it can fetch the next. Includes cycle protection: if
67
+ * a row's ancestor chain loops back on itself (data corruption), the walk
68
+ * stops cleanly instead of looping forever.
69
+ */
70
+ getAncestors(): Promise<this[]>;
71
+ /**
72
+ * All descendants in BFS order. One query per level of depth using `IN`
73
+ * on the previous level's IDs — eliminates the recursive-per-child N+1
74
+ * pattern the duplicated implementations used.
75
+ *
76
+ * Each level's frontier is chunked at `IN_LIST_CHUNK_SIZE` before being
77
+ * expanded into a `parent_id IN (?, ?, …)` clause: the generic
78
+ * `collection.list()` does NOT chunk array-valued WHERE clauses, so a level
79
+ * wider than the backend's `SQLITE_MAX_VARIABLE_NUMBER` (999 on legacy
80
+ * SQLite, 32766 on modern builds) would otherwise throw before traversal
81
+ * completes. Mirrors the chunking the relationship/junction loaders in
82
+ * `collection.ts` already do.
83
+ *
84
+ * Cycle-safe via a visited Set keyed on row id.
85
+ */
86
+ getDescendants(): Promise<this[]>;
87
+ /**
88
+ * Full hierarchy view: ancestors, self, descendants. Issued concurrently.
89
+ */
90
+ getHierarchy(): Promise<HierarchyView<this>>;
91
+ /**
92
+ * Reparent this row. Pass `null` to make it a root, an id string, or the
93
+ * target row itself. Refuses to:
94
+ *
95
+ * - move a row to itself (self-loop)
96
+ * - move a row under one of its own descendants (would create a cycle)
97
+ *
98
+ * Persists via `save()`. Caller is responsible for any out-of-band
99
+ * denormalization (e.g. depth caches on subclasses like Tag.level).
100
+ */
101
+ moveTo(newParent: this | string | null): Promise<void>;
102
+ }
103
+ //# sourceMappingURL=hierarchical.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hierarchical.d.ts","sourceRoot":"","sources":["../src/hierarchical.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAItC;;;;GAIG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,gBAAgB;IACvD,SAAS,EAAE,CAAC,EAAE,CAAC;IACf,OAAO,EAAE,CAAC,CAAC;IACX,WAAW,EAAE,CAAC,EAAE,CAAC;CAClB;AAED,qBAAa,gBAAiB,SAAQ,UAAU;IAC9C;;;;;;OAMG;IACH,MAAM,CAAC,QAAQ,CAAC,mBAAmB,EAAG,IAAI,CAAU;IAEpD,mEAAmE;IACnE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/B;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;cACa,oBAAoB,IAAI,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAgCrE;;;;;OAKG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAOvC;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IASpC;;;;;;;OAOG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAmBrC;;;;;;;;;;;;;;OAcG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAgCvC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAQlD;;;;;;;;;OASG;IACG,MAAM,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CA0B7D"}