@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,162 @@
1
+ import { createLogger } from "@happyvertical/logger";
2
+ import { makeId } from "@happyvertical/utils";
3
+ const logger = createLogger({ level: "info" });
4
+ function parseJsonField(raw, field, rowId) {
5
+ try {
6
+ return JSON.parse(raw);
7
+ } catch (error) {
8
+ logger.warn("Skipping corrupted _smrt_dispatch JSON field", {
9
+ dispatchId: rowId,
10
+ field,
11
+ error: error instanceof Error ? error.message : String(error)
12
+ });
13
+ return {};
14
+ }
15
+ }
16
+ class Dispatch {
17
+ /** Table name for this model */
18
+ static tableName = "_smrt_dispatch";
19
+ /** Unique identifier */
20
+ id;
21
+ /** Signal type (e.g., 'campaign.completed') */
22
+ type;
23
+ /** Emitting agent name */
24
+ source;
25
+ /** Emitting agent instance ID */
26
+ sourceId;
27
+ /** Dispatch payload */
28
+ payload;
29
+ /** Current status */
30
+ status;
31
+ /** Number of processing attempts */
32
+ attempts;
33
+ /** Last error message if failed */
34
+ lastError;
35
+ /** When the dispatch was processed */
36
+ processedAt;
37
+ /** Which subscriber processed it */
38
+ processedBy;
39
+ /** Target subscriber for fan-out delivery (null for compete mode) */
40
+ targetSubscriber;
41
+ /** Correlation ID for linking request/response dispatch pairs */
42
+ correlationId;
43
+ /**
44
+ * Tenant the dispatch was emitted in (server-derived, untrusted-input-proof).
45
+ *
46
+ * Stamped from the active tenant context at emit time — never from caller
47
+ * options — so it cannot be spoofed. `null` for global / non-tenant
48
+ * dispatches. Used to isolate reads/claims across tenants (S5 #1398).
49
+ */
50
+ tenantId;
51
+ /** Additional metadata */
52
+ metadata;
53
+ /** Creation timestamp */
54
+ createdAt;
55
+ /** Last update timestamp */
56
+ updatedAt;
57
+ constructor(data = {}) {
58
+ this.id = data.id || makeId();
59
+ this.type = data.type || "";
60
+ this.source = data.source || "";
61
+ this.sourceId = data.source_id || "";
62
+ this.status = data.status || "pending";
63
+ this.attempts = data.attempts || 0;
64
+ this.lastError = data.last_error || "";
65
+ this.processedBy = data.processed_by || "";
66
+ this.targetSubscriber = data.target_subscriber || null;
67
+ this.correlationId = data.correlation_id || "";
68
+ this.tenantId = data.tenant_id ?? null;
69
+ this.createdAt = data.created_at ? new Date(data.created_at) : /* @__PURE__ */ new Date();
70
+ this.updatedAt = data.updated_at ? new Date(data.updated_at) : /* @__PURE__ */ new Date();
71
+ this.processedAt = data.processed_at ? new Date(data.processed_at) : null;
72
+ this.payload = data.payload ? parseJsonField(data.payload, "payload", this.id) : {};
73
+ this.metadata = data.metadata ? parseJsonField(data.metadata, "metadata", this.id) : {};
74
+ }
75
+ /**
76
+ * Create a Dispatch from a database row
77
+ */
78
+ static fromRow(row) {
79
+ return new Dispatch(row);
80
+ }
81
+ /**
82
+ * Convert to database row format
83
+ */
84
+ toRow() {
85
+ return {
86
+ id: this.id,
87
+ type: this.type,
88
+ source: this.source,
89
+ source_id: this.sourceId || null,
90
+ payload: JSON.stringify(this.payload),
91
+ status: this.status,
92
+ attempts: this.attempts,
93
+ last_error: this.lastError || null,
94
+ processed_at: this.processedAt?.toISOString() || null,
95
+ processed_by: this.processedBy || null,
96
+ target_subscriber: this.targetSubscriber || null,
97
+ correlation_id: this.correlationId || null,
98
+ tenant_id: this.tenantId ?? null,
99
+ metadata: JSON.stringify(this.metadata),
100
+ created_at: this.createdAt.toISOString(),
101
+ updated_at: (/* @__PURE__ */ new Date()).toISOString()
102
+ };
103
+ }
104
+ /**
105
+ * Get dispatch metadata for handlers
106
+ */
107
+ getMetadata() {
108
+ return {
109
+ id: this.id,
110
+ type: this.type,
111
+ source: this.source,
112
+ sourceId: this.sourceId,
113
+ correlationId: this.correlationId,
114
+ createdAt: this.createdAt,
115
+ attempts: this.attempts,
116
+ metadata: this.metadata
117
+ };
118
+ }
119
+ /**
120
+ * Mark as processing
121
+ */
122
+ markProcessing() {
123
+ this.status = "processing";
124
+ this.attempts += 1;
125
+ this.updatedAt = /* @__PURE__ */ new Date();
126
+ }
127
+ /**
128
+ * Mark as completed
129
+ */
130
+ markCompleted(processedBy) {
131
+ this.status = "completed";
132
+ this.processedAt = /* @__PURE__ */ new Date();
133
+ this.processedBy = processedBy;
134
+ this.lastError = "";
135
+ this.updatedAt = /* @__PURE__ */ new Date();
136
+ }
137
+ /**
138
+ * Mark as failed
139
+ */
140
+ markFailed(error) {
141
+ this.status = "failed";
142
+ this.lastError = error;
143
+ this.updatedAt = /* @__PURE__ */ new Date();
144
+ }
145
+ /**
146
+ * Reset to pending for retry
147
+ */
148
+ resetForRetry() {
149
+ this.status = "pending";
150
+ this.updatedAt = /* @__PURE__ */ new Date();
151
+ }
152
+ /**
153
+ * Check if this dispatch can be retried
154
+ */
155
+ canRetry(maxAttempts) {
156
+ return this.status === "failed" && this.attempts < maxAttempts;
157
+ }
158
+ }
159
+ export {
160
+ Dispatch
161
+ };
162
+ //# sourceMappingURL=Dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dispatch.js","sources":["../../../src/dispatch/models/Dispatch.ts"],"sourcesContent":["/**\n * Dispatch Model - Persistent dispatch message for inter-agent communication\n *\n * Dispatches are stored in the _smrt_dispatch system table and represent\n * messages sent between agents. They support async processing with retry logic.\n */\n\nimport { createLogger } from '@happyvertical/logger';\nimport { makeId } from '@happyvertical/utils';\nimport type { DispatchMetadata, DispatchStatus } from '../types.js';\n\nconst logger = createLogger({ level: 'info' });\n\n/**\n * Safely parses a JSON column from a `_smrt_dispatch` row.\n *\n * A single corrupted `payload`/`metadata` value must not throw out of the\n * `Dispatch` constructor, since `process()`/`list()` map `fromRow` over a whole\n * batch — one poison row would otherwise stall every dispatch in the batch\n * (#1378). On a parse failure, logs the offending row id + field and falls back\n * to an empty object so the rest of the batch keeps flowing.\n */\nfunction parseJsonField(\n raw: string,\n field: 'payload' | 'metadata',\n rowId: string,\n): Record<string, unknown> {\n try {\n // Only malformed JSON is treated as a poison value; valid JSON parses as\n // before (preserving prior behavior for the well-formed path).\n return JSON.parse(raw) as Record<string, unknown>;\n } catch (error) {\n logger.warn('Skipping corrupted _smrt_dispatch JSON field', {\n dispatchId: rowId,\n field,\n error: error instanceof Error ? error.message : String(error),\n });\n return {};\n }\n}\n\n/**\n * Raw dispatch data as stored in the database\n */\nexport interface DispatchData {\n id: string;\n type: string;\n source: string;\n source_id: string | null;\n payload: string | null;\n status: DispatchStatus;\n attempts: number;\n last_error: string | null;\n processed_at: string | null;\n processed_by: string | null;\n target_subscriber: string | null;\n correlation_id: string | null;\n tenant_id: string | null;\n metadata: string | null;\n created_at: string;\n updated_at: string;\n}\n\n/**\n * Dispatch model for inter-agent communication\n */\nexport class Dispatch {\n /** Table name for this model */\n static readonly tableName = '_smrt_dispatch';\n\n /** Unique identifier */\n id: string;\n\n /** Signal type (e.g., 'campaign.completed') */\n type: string;\n\n /** Emitting agent name */\n source: string;\n\n /** Emitting agent instance ID */\n sourceId: string;\n\n /** Dispatch payload */\n payload: Record<string, unknown>;\n\n /** Current status */\n status: DispatchStatus;\n\n /** Number of processing attempts */\n attempts: number;\n\n /** Last error message if failed */\n lastError: string;\n\n /** When the dispatch was processed */\n processedAt: Date | null;\n\n /** Which subscriber processed it */\n processedBy: string;\n\n /** Target subscriber for fan-out delivery (null for compete mode) */\n targetSubscriber: string | null;\n\n /** Correlation ID for linking request/response dispatch pairs */\n correlationId: string;\n\n /**\n * Tenant the dispatch was emitted in (server-derived, untrusted-input-proof).\n *\n * Stamped from the active tenant context at emit time — never from caller\n * options — so it cannot be spoofed. `null` for global / non-tenant\n * dispatches. Used to isolate reads/claims across tenants (S5 #1398).\n */\n tenantId: string | null;\n\n /** Additional metadata */\n metadata: Record<string, unknown>;\n\n /** Creation timestamp */\n createdAt: Date;\n\n /** Last update timestamp */\n updatedAt: Date;\n\n constructor(data: Partial<DispatchData> = {}) {\n this.id = data.id || makeId();\n this.type = data.type || '';\n this.source = data.source || '';\n this.sourceId = data.source_id || '';\n this.status = (data.status as DispatchStatus) || 'pending';\n this.attempts = data.attempts || 0;\n this.lastError = data.last_error || '';\n this.processedBy = data.processed_by || '';\n this.targetSubscriber = data.target_subscriber || null;\n this.correlationId = data.correlation_id || '';\n this.tenantId = data.tenant_id ?? null;\n this.createdAt = data.created_at ? new Date(data.created_at) : new Date();\n this.updatedAt = data.updated_at ? new Date(data.updated_at) : new Date();\n this.processedAt = data.processed_at ? new Date(data.processed_at) : null;\n\n // Parse JSON fields. Guarded so a single corrupted row cannot stall an\n // entire process()/list() batch (#1378).\n this.payload = data.payload\n ? parseJsonField(data.payload, 'payload', this.id)\n : {};\n this.metadata = data.metadata\n ? parseJsonField(data.metadata, 'metadata', this.id)\n : {};\n }\n\n /**\n * Create a Dispatch from a database row\n */\n static fromRow(row: DispatchData): Dispatch {\n return new Dispatch(row);\n }\n\n /**\n * Convert to database row format\n */\n toRow(): DispatchData {\n return {\n id: this.id,\n type: this.type,\n source: this.source,\n source_id: this.sourceId || null,\n payload: JSON.stringify(this.payload),\n status: this.status,\n attempts: this.attempts,\n last_error: this.lastError || null,\n processed_at: this.processedAt?.toISOString() || null,\n processed_by: this.processedBy || null,\n target_subscriber: this.targetSubscriber || null,\n correlation_id: this.correlationId || null,\n tenant_id: this.tenantId ?? null,\n metadata: JSON.stringify(this.metadata),\n created_at: this.createdAt.toISOString(),\n updated_at: new Date().toISOString(),\n };\n }\n\n /**\n * Get dispatch metadata for handlers\n */\n getMetadata(): DispatchMetadata {\n return {\n id: this.id,\n type: this.type,\n source: this.source,\n sourceId: this.sourceId,\n correlationId: this.correlationId,\n createdAt: this.createdAt,\n attempts: this.attempts,\n metadata: this.metadata,\n };\n }\n\n /**\n * Mark as processing\n */\n markProcessing(): void {\n this.status = 'processing';\n this.attempts += 1;\n this.updatedAt = new Date();\n }\n\n /**\n * Mark as completed\n */\n markCompleted(processedBy: string): void {\n this.status = 'completed';\n this.processedAt = new Date();\n this.processedBy = processedBy;\n this.lastError = '';\n this.updatedAt = new Date();\n }\n\n /**\n * Mark as failed\n */\n markFailed(error: string): void {\n this.status = 'failed';\n this.lastError = error;\n this.updatedAt = new Date();\n }\n\n /**\n * Reset to pending for retry\n */\n resetForRetry(): void {\n this.status = 'pending';\n this.updatedAt = new Date();\n }\n\n /**\n * Check if this dispatch can be retried\n */\n canRetry(maxAttempts: number): boolean {\n return this.status === 'failed' && this.attempts < maxAttempts;\n }\n}\n"],"names":[],"mappings":";;AAWA,MAAM,SAAS,aAAa,EAAE,OAAO,QAAQ;AAW7C,SAAS,eACP,KACA,OACA,OACyB;AACzB,MAAI;AAGF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,SAAS,OAAO;AACd,WAAO,KAAK,gDAAgD;AAAA,MAC1D,YAAY;AAAA,MACZ;AAAA,MACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAAA,CAC7D;AACD,WAAO,CAAA;AAAA,EACT;AACF;AA2BO,MAAM,SAAS;AAAA;AAAA,EAEpB,OAAgB,YAAY;AAAA;AAAA,EAG5B;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA,EAEA,YAAY,OAA8B,IAAI;AAC5C,SAAK,KAAK,KAAK,MAAM,OAAA;AACrB,SAAK,OAAO,KAAK,QAAQ;AACzB,SAAK,SAAS,KAAK,UAAU;AAC7B,SAAK,WAAW,KAAK,aAAa;AAClC,SAAK,SAAU,KAAK,UAA6B;AACjD,SAAK,WAAW,KAAK,YAAY;AACjC,SAAK,YAAY,KAAK,cAAc;AACpC,SAAK,cAAc,KAAK,gBAAgB;AACxC,SAAK,mBAAmB,KAAK,qBAAqB;AAClD,SAAK,gBAAgB,KAAK,kBAAkB;AAC5C,SAAK,WAAW,KAAK,aAAa;AAClC,SAAK,YAAY,KAAK,aAAa,IAAI,KAAK,KAAK,UAAU,IAAI,oBAAI,KAAA;AACnE,SAAK,YAAY,KAAK,aAAa,IAAI,KAAK,KAAK,UAAU,IAAI,oBAAI,KAAA;AACnE,SAAK,cAAc,KAAK,eAAe,IAAI,KAAK,KAAK,YAAY,IAAI;AAIrE,SAAK,UAAU,KAAK,UAChB,eAAe,KAAK,SAAS,WAAW,KAAK,EAAE,IAC/C,CAAA;AACJ,SAAK,WAAW,KAAK,WACjB,eAAe,KAAK,UAAU,YAAY,KAAK,EAAE,IACjD,CAAA;AAAA,EACN;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAQ,KAA6B;AAC1C,WAAO,IAAI,SAAS,GAAG;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAsB;AACpB,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,MAAM,KAAK;AAAA,MACX,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK,YAAY;AAAA,MAC5B,SAAS,KAAK,UAAU,KAAK,OAAO;AAAA,MACpC,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK;AAAA,MACf,YAAY,KAAK,aAAa;AAAA,MAC9B,cAAc,KAAK,aAAa,YAAA,KAAiB;AAAA,MACjD,cAAc,KAAK,eAAe;AAAA,MAClC,mBAAmB,KAAK,oBAAoB;AAAA,MAC5C,gBAAgB,KAAK,iBAAiB;AAAA,MACtC,WAAW,KAAK,YAAY;AAAA,MAC5B,UAAU,KAAK,UAAU,KAAK,QAAQ;AAAA,MACtC,YAAY,KAAK,UAAU,YAAA;AAAA,MAC3B,aAAY,oBAAI,KAAA,GAAO,YAAA;AAAA,IAAY;AAAA,EAEvC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAgC;AAC9B,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,MAAM,KAAK;AAAA,MACX,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK;AAAA,MACf,eAAe,KAAK;AAAA,MACpB,WAAW,KAAK;AAAA,MAChB,UAAU,KAAK;AAAA,MACf,UAAU,KAAK;AAAA,IAAA;AAAA,EAEnB;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAuB;AACrB,SAAK,SAAS;AACd,SAAK,YAAY;AACjB,SAAK,gCAAgB,KAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,aAA2B;AACvC,SAAK,SAAS;AACd,SAAK,kCAAkB,KAAA;AACvB,SAAK,cAAc;AACnB,SAAK,YAAY;AACjB,SAAK,gCAAgB,KAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,OAAqB;AAC9B,SAAK,SAAS;AACd,SAAK,YAAY;AACjB,SAAK,gCAAgB,KAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAsB;AACpB,SAAK,SAAS;AACd,SAAK,gCAAgB,KAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,aAA8B;AACrC,WAAO,KAAK,WAAW,YAAY,KAAK,WAAW;AAAA,EACrD;AACF;"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * DispatchSubscription Model - Persistent subscription for dispatch processing
3
+ *
4
+ * Subscriptions are stored in _smrt_dispatch_subscriptions and define which
5
+ * agents should receive which dispatch types. Supports wildcard patterns.
6
+ */
7
+ /**
8
+ * Raw subscription data as stored in the database
9
+ */
10
+ export interface DispatchSubscriptionData {
11
+ id: string;
12
+ signal_type: string;
13
+ subscriber: string;
14
+ handler: string;
15
+ delivery: string;
16
+ enabled: number;
17
+ tenant_id: string | null;
18
+ created_at: string;
19
+ updated_at: string;
20
+ }
21
+ /**
22
+ * DispatchSubscription model for persistent dispatch routing
23
+ */
24
+ export declare class DispatchSubscription {
25
+ /** Table name for this model */
26
+ static readonly tableName = "_smrt_dispatch_subscriptions";
27
+ /** Unique identifier */
28
+ id: string;
29
+ /** Signal type pattern (supports wildcards like 'campaign.*') */
30
+ signalType: string;
31
+ /** Subscriber name (usually agent name) */
32
+ subscriber: string;
33
+ /** Handler method name */
34
+ handler: string;
35
+ /** Delivery mode: 'compete' (first-to-claim) or 'fanout' (per-subscriber copy) */
36
+ delivery: 'compete' | 'fanout';
37
+ /** Whether subscription is active */
38
+ enabled: boolean;
39
+ /**
40
+ * Tenant the subscription was registered in (server-derived). `null` for
41
+ * global / non-tenant subscriptions. Recorded for auditing and per-tenant
42
+ * subscription separation (S5 #1398).
43
+ */
44
+ tenantId: string | null;
45
+ /** Creation timestamp */
46
+ createdAt: Date;
47
+ /** Last update timestamp */
48
+ updatedAt: Date;
49
+ constructor(data?: Partial<DispatchSubscriptionData>);
50
+ /**
51
+ * Create a DispatchSubscription from a database row
52
+ */
53
+ static fromRow(row: DispatchSubscriptionData): DispatchSubscription;
54
+ /**
55
+ * Convert to database row format
56
+ */
57
+ toRow(): DispatchSubscriptionData;
58
+ /**
59
+ * Check if this subscription matches a given signal type
60
+ *
61
+ * Supports wildcard patterns:
62
+ * - 'campaign.*' matches 'campaign.started', 'campaign.completed'
63
+ * - '*' matches everything
64
+ * - 'campaign.*.completed' matches 'campaign.summer.completed'
65
+ *
66
+ * @param signalType - The signal type to match against
67
+ * @returns True if this subscription matches the signal type
68
+ */
69
+ matches(signalType: string): boolean;
70
+ /**
71
+ * Check if this is a wildcard subscription
72
+ */
73
+ isWildcard(): boolean;
74
+ /**
75
+ * Enable this subscription
76
+ */
77
+ enable(): void;
78
+ /**
79
+ * Disable this subscription
80
+ */
81
+ disable(): void;
82
+ }
83
+ //# sourceMappingURL=DispatchSubscription.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DispatchSubscription.d.ts","sourceRoot":"","sources":["../../../src/dispatch/models/DispatchSubscription.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,gCAAgC;IAChC,MAAM,CAAC,QAAQ,CAAC,SAAS,kCAAkC;IAE3D,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IAEX,iEAAiE;IACjE,UAAU,EAAE,MAAM,CAAC;IAEnB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IAEnB,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAEhB,kFAAkF;IAClF,QAAQ,EAAE,SAAS,GAAG,QAAQ,CAAC;IAE/B,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAC;IAEjB;;;;OAIG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAExB,yBAAyB;IACzB,SAAS,EAAE,IAAI,CAAC;IAEhB,4BAA4B;IAC5B,SAAS,EAAE,IAAI,CAAC;gBAEJ,IAAI,GAAE,OAAO,CAAC,wBAAwB,CAAM;IAYxD;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,wBAAwB,GAAG,oBAAoB;IAInE;;OAEG;IACH,KAAK,IAAI,wBAAwB;IAcjC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAmCpC;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,MAAM,IAAI,IAAI;IAKd;;OAEG;IACH,OAAO,IAAI,IAAI;CAIhB"}
@@ -0,0 +1,112 @@
1
+ import { makeId } from "@happyvertical/utils";
2
+ class DispatchSubscription {
3
+ /** Table name for this model */
4
+ static tableName = "_smrt_dispatch_subscriptions";
5
+ /** Unique identifier */
6
+ id;
7
+ /** Signal type pattern (supports wildcards like 'campaign.*') */
8
+ signalType;
9
+ /** Subscriber name (usually agent name) */
10
+ subscriber;
11
+ /** Handler method name */
12
+ handler;
13
+ /** Delivery mode: 'compete' (first-to-claim) or 'fanout' (per-subscriber copy) */
14
+ delivery;
15
+ /** Whether subscription is active */
16
+ enabled;
17
+ /**
18
+ * Tenant the subscription was registered in (server-derived). `null` for
19
+ * global / non-tenant subscriptions. Recorded for auditing and per-tenant
20
+ * subscription separation (S5 #1398).
21
+ */
22
+ tenantId;
23
+ /** Creation timestamp */
24
+ createdAt;
25
+ /** Last update timestamp */
26
+ updatedAt;
27
+ constructor(data = {}) {
28
+ this.id = data.id || makeId();
29
+ this.signalType = data.signal_type || "";
30
+ this.subscriber = data.subscriber || "";
31
+ this.handler = data.handler || "handleDispatch";
32
+ this.delivery = data.delivery || "compete";
33
+ this.enabled = data.enabled !== void 0 ? Boolean(data.enabled) : true;
34
+ this.tenantId = data.tenant_id ?? null;
35
+ this.createdAt = data.created_at ? new Date(data.created_at) : /* @__PURE__ */ new Date();
36
+ this.updatedAt = data.updated_at ? new Date(data.updated_at) : /* @__PURE__ */ new Date();
37
+ }
38
+ /**
39
+ * Create a DispatchSubscription from a database row
40
+ */
41
+ static fromRow(row) {
42
+ return new DispatchSubscription(row);
43
+ }
44
+ /**
45
+ * Convert to database row format
46
+ */
47
+ toRow() {
48
+ return {
49
+ id: this.id,
50
+ signal_type: this.signalType,
51
+ subscriber: this.subscriber,
52
+ handler: this.handler,
53
+ delivery: this.delivery,
54
+ enabled: this.enabled ? 1 : 0,
55
+ tenant_id: this.tenantId ?? null,
56
+ created_at: this.createdAt.toISOString(),
57
+ updated_at: (/* @__PURE__ */ new Date()).toISOString()
58
+ };
59
+ }
60
+ /**
61
+ * Check if this subscription matches a given signal type
62
+ *
63
+ * Supports wildcard patterns:
64
+ * - 'campaign.*' matches 'campaign.started', 'campaign.completed'
65
+ * - '*' matches everything
66
+ * - 'campaign.*.completed' matches 'campaign.summer.completed'
67
+ *
68
+ * @param signalType - The signal type to match against
69
+ * @returns True if this subscription matches the signal type
70
+ */
71
+ matches(signalType) {
72
+ if (!this.enabled) {
73
+ return false;
74
+ }
75
+ if (this.signalType === signalType) {
76
+ return true;
77
+ }
78
+ if (!this.signalType.includes("*")) {
79
+ return false;
80
+ }
81
+ let pattern = this.signalType;
82
+ pattern = pattern.replace(/[+?^${}()|[\]\\]/g, "\\$&");
83
+ pattern = pattern.replace(/\./g, "\\.");
84
+ pattern = pattern.replace(/\*/g, "[^.]+");
85
+ const regex = new RegExp(`^${pattern}$`);
86
+ return regex.test(signalType);
87
+ }
88
+ /**
89
+ * Check if this is a wildcard subscription
90
+ */
91
+ isWildcard() {
92
+ return this.signalType.includes("*");
93
+ }
94
+ /**
95
+ * Enable this subscription
96
+ */
97
+ enable() {
98
+ this.enabled = true;
99
+ this.updatedAt = /* @__PURE__ */ new Date();
100
+ }
101
+ /**
102
+ * Disable this subscription
103
+ */
104
+ disable() {
105
+ this.enabled = false;
106
+ this.updatedAt = /* @__PURE__ */ new Date();
107
+ }
108
+ }
109
+ export {
110
+ DispatchSubscription
111
+ };
112
+ //# sourceMappingURL=DispatchSubscription.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DispatchSubscription.js","sources":["../../../src/dispatch/models/DispatchSubscription.ts"],"sourcesContent":["/**\n * DispatchSubscription Model - Persistent subscription for dispatch processing\n *\n * Subscriptions are stored in _smrt_dispatch_subscriptions and define which\n * agents should receive which dispatch types. Supports wildcard patterns.\n */\n\nimport { makeId } from '@happyvertical/utils';\n\n/**\n * Raw subscription data as stored in the database\n */\nexport interface DispatchSubscriptionData {\n id: string;\n signal_type: string;\n subscriber: string;\n handler: string;\n delivery: string;\n enabled: number;\n tenant_id: string | null;\n created_at: string;\n updated_at: string;\n}\n\n/**\n * DispatchSubscription model for persistent dispatch routing\n */\nexport class DispatchSubscription {\n /** Table name for this model */\n static readonly tableName = '_smrt_dispatch_subscriptions';\n\n /** Unique identifier */\n id: string;\n\n /** Signal type pattern (supports wildcards like 'campaign.*') */\n signalType: string;\n\n /** Subscriber name (usually agent name) */\n subscriber: string;\n\n /** Handler method name */\n handler: string;\n\n /** Delivery mode: 'compete' (first-to-claim) or 'fanout' (per-subscriber copy) */\n delivery: 'compete' | 'fanout';\n\n /** Whether subscription is active */\n enabled: boolean;\n\n /**\n * Tenant the subscription was registered in (server-derived). `null` for\n * global / non-tenant subscriptions. Recorded for auditing and per-tenant\n * subscription separation (S5 #1398).\n */\n tenantId: string | null;\n\n /** Creation timestamp */\n createdAt: Date;\n\n /** Last update timestamp */\n updatedAt: Date;\n\n constructor(data: Partial<DispatchSubscriptionData> = {}) {\n this.id = data.id || makeId();\n this.signalType = data.signal_type || '';\n this.subscriber = data.subscriber || '';\n this.handler = data.handler || 'handleDispatch';\n this.delivery = (data.delivery as 'compete' | 'fanout') || 'compete';\n this.enabled = data.enabled !== undefined ? Boolean(data.enabled) : true;\n this.tenantId = data.tenant_id ?? null;\n this.createdAt = data.created_at ? new Date(data.created_at) : new Date();\n this.updatedAt = data.updated_at ? new Date(data.updated_at) : new Date();\n }\n\n /**\n * Create a DispatchSubscription from a database row\n */\n static fromRow(row: DispatchSubscriptionData): DispatchSubscription {\n return new DispatchSubscription(row);\n }\n\n /**\n * Convert to database row format\n */\n toRow(): DispatchSubscriptionData {\n return {\n id: this.id,\n signal_type: this.signalType,\n subscriber: this.subscriber,\n handler: this.handler,\n delivery: this.delivery,\n enabled: this.enabled ? 1 : 0,\n tenant_id: this.tenantId ?? null,\n created_at: this.createdAt.toISOString(),\n updated_at: new Date().toISOString(),\n };\n }\n\n /**\n * Check if this subscription matches a given signal type\n *\n * Supports wildcard patterns:\n * - 'campaign.*' matches 'campaign.started', 'campaign.completed'\n * - '*' matches everything\n * - 'campaign.*.completed' matches 'campaign.summer.completed'\n *\n * @param signalType - The signal type to match against\n * @returns True if this subscription matches the signal type\n */\n matches(signalType: string): boolean {\n if (!this.enabled) {\n return false;\n }\n\n // Exact match\n if (this.signalType === signalType) {\n return true;\n }\n\n // If no wildcards, no match\n if (!this.signalType.includes('*')) {\n return false;\n }\n\n // Convert wildcard pattern to regex\n // First escape special regex characters except * and .\n // Then convert . to \\. and * to [^.]+\n let pattern = this.signalType;\n\n // Escape regex special chars except * and .\n pattern = pattern.replace(/[+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n // Escape dots\n pattern = pattern.replace(/\\./g, '\\\\.');\n\n // Convert * to match one segment (anything except .)\n pattern = pattern.replace(/\\*/g, '[^.]+');\n\n // Create regex for full match\n const regex = new RegExp(`^${pattern}$`);\n\n return regex.test(signalType);\n }\n\n /**\n * Check if this is a wildcard subscription\n */\n isWildcard(): boolean {\n return this.signalType.includes('*');\n }\n\n /**\n * Enable this subscription\n */\n enable(): void {\n this.enabled = true;\n this.updatedAt = new Date();\n }\n\n /**\n * Disable this subscription\n */\n disable(): void {\n this.enabled = false;\n this.updatedAt = new Date();\n }\n}\n"],"names":[],"mappings":";AA2BO,MAAM,qBAAqB;AAAA;AAAA,EAEhC,OAAgB,YAAY;AAAA;AAAA,EAG5B;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA,EAEA,YAAY,OAA0C,IAAI;AACxD,SAAK,KAAK,KAAK,MAAM,OAAA;AACrB,SAAK,aAAa,KAAK,eAAe;AACtC,SAAK,aAAa,KAAK,cAAc;AACrC,SAAK,UAAU,KAAK,WAAW;AAC/B,SAAK,WAAY,KAAK,YAAqC;AAC3D,SAAK,UAAU,KAAK,YAAY,SAAY,QAAQ,KAAK,OAAO,IAAI;AACpE,SAAK,WAAW,KAAK,aAAa;AAClC,SAAK,YAAY,KAAK,aAAa,IAAI,KAAK,KAAK,UAAU,IAAI,oBAAI,KAAA;AACnE,SAAK,YAAY,KAAK,aAAa,IAAI,KAAK,KAAK,UAAU,IAAI,oBAAI,KAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAQ,KAAqD;AAClE,WAAO,IAAI,qBAAqB,GAAG;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAkC;AAChC,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK;AAAA,MACjB,SAAS,KAAK;AAAA,MACd,UAAU,KAAK;AAAA,MACf,SAAS,KAAK,UAAU,IAAI;AAAA,MAC5B,WAAW,KAAK,YAAY;AAAA,MAC5B,YAAY,KAAK,UAAU,YAAA;AAAA,MAC3B,aAAY,oBAAI,KAAA,GAAO,YAAA;AAAA,IAAY;AAAA,EAEvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,QAAQ,YAA6B;AACnC,QAAI,CAAC,KAAK,SAAS;AACjB,aAAO;AAAA,IACT;AAGA,QAAI,KAAK,eAAe,YAAY;AAClC,aAAO;AAAA,IACT;AAGA,QAAI,CAAC,KAAK,WAAW,SAAS,GAAG,GAAG;AAClC,aAAO;AAAA,IACT;AAKA,QAAI,UAAU,KAAK;AAGnB,cAAU,QAAQ,QAAQ,qBAAqB,MAAM;AAGrD,cAAU,QAAQ,QAAQ,OAAO,KAAK;AAGtC,cAAU,QAAQ,QAAQ,OAAO,OAAO;AAGxC,UAAM,QAAQ,IAAI,OAAO,IAAI,OAAO,GAAG;AAEvC,WAAO,MAAM,KAAK,UAAU;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,aAAsB;AACpB,WAAO,KAAK,WAAW,SAAS,GAAG;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,SAAe;AACb,SAAK,UAAU;AACf,SAAK,gCAAgB,KAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,SAAK,UAAU;AACf,SAAK,gCAAgB,KAAA;AAAA,EACvB;AACF;"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * DispatchBus tenant resolver — dependency-inversion hook
3
+ *
4
+ * `@happyvertical/smrt-core` cannot depend on `@happyvertical/smrt-tenancy`
5
+ * (tenancy depends on core, not the other way around). To let the DispatchBus
6
+ * stamp and filter dispatches by the active tenant without creating a circular
7
+ * dependency, core exposes an injectable resolver slot that tenancy fills at
8
+ * `enableTenancy()` time — the same inversion pattern used by
9
+ * {@link GlobalInterceptors}.
10
+ *
11
+ * When tenancy is not enabled (non-tenant deployments, existing tests), the
12
+ * resolver defaults to a no-op that returns `undefined`, so the DispatchBus
13
+ * behaves exactly as before: no tenant column is stamped and no tenant filter
14
+ * is applied.
15
+ *
16
+ * Stored on `globalThis` so all module instances share one resolver, which is
17
+ * critical in the monorepo where the same package can be loaded from multiple
18
+ * paths (mirrors {@link ObjectRegistry} / {@link GlobalInterceptors}).
19
+ */
20
+ /**
21
+ * Resolver function that returns the active tenant id for the current async
22
+ * execution scope, or `undefined`/`null` when there is no tenant context
23
+ * (system/global scope).
24
+ */
25
+ export type DispatchTenantResolver = () => string | null | undefined;
26
+ declare global {
27
+ var __smrtDispatchTenantResolver: DispatchTenantResolver | undefined;
28
+ }
29
+ /**
30
+ * Register the tenant resolver the DispatchBus uses to derive the active
31
+ * tenant id on emit/subscribe/process.
32
+ *
33
+ * Called by `@happyvertical/smrt-tenancy`'s `enableTenancy()`; application
34
+ * code never needs to call this directly. Passing `undefined` clears the
35
+ * resolver (restoring the no-op default), which `disableTenancy()` does.
36
+ *
37
+ * @param resolver - Function returning the active tenant id, or `undefined` to
38
+ * clear and fall back to the no-op default.
39
+ */
40
+ export declare function setDispatchTenantResolver(resolver: DispatchTenantResolver | undefined): void;
41
+ /**
42
+ * Resolved tenant scope for a DispatchBus operation.
43
+ *
44
+ * The DispatchBus must distinguish three states, because they have different
45
+ * read/write semantics (S5 #1398):
46
+ *
47
+ * - **Tenancy disabled** (`enforced: false`): no resolver is registered. The bus
48
+ * applies no tenant filter and stamps no tenant id — identical to pre-tenancy
49
+ * behavior. This is the backward-compatibility path for non-tenant
50
+ * deployments and existing tests.
51
+ * - **Tenancy enabled, active tenant** (`enforced: true`, `tenantId: T`): reads
52
+ * are restricted to `(tenant_id = T OR tenant_id IS NULL)` and emits stamp
53
+ * `tenant_id = T`.
54
+ * - **Tenancy enabled, no active tenant** (`enforced: true`, `tenantId: null`):
55
+ * reads are restricted to `tenant_id IS NULL` only (global rows). This is a
56
+ * *fail-closed* state — when tenancy is on but no tenant context is active
57
+ * (e.g. processing outside `withTenant()`), reads MUST NOT leak other
58
+ * tenants' rows. Emits stamp `tenant_id = NULL` (global).
59
+ *
60
+ * Critically, `enforced: true` + `tenantId: null` is NOT collapsed into the
61
+ * disabled state: when tenancy is enabled, a missing tenant context restricts
62
+ * reads to global rows rather than opening up all tenants.
63
+ */
64
+ export interface DispatchTenantScope {
65
+ /**
66
+ * Whether tenant enforcement is active (a resolver is registered). When
67
+ * `false`, the bus applies no tenant filter at all (pre-tenancy behavior).
68
+ */
69
+ enforced: boolean;
70
+ /**
71
+ * The active tenant id, or `null` when there is no active tenant context.
72
+ * Only meaningful when `enforced` is `true`.
73
+ */
74
+ tenantId: string | null;
75
+ }
76
+ /**
77
+ * Resolve the active tenant scope for the current async execution scope.
78
+ *
79
+ * This is the trust anchor for DispatchBus tenant isolation. It distinguishes
80
+ * "tenancy disabled" (no resolver registered → no filtering) from "tenancy
81
+ * enabled but no active tenant" (resolver registered, returns null/undefined →
82
+ * fail-closed to global-only reads). See {@link DispatchTenantScope}.
83
+ *
84
+ * @returns The resolved tenant scope.
85
+ */
86
+ export declare function resolveDispatchTenantScope(): DispatchTenantScope;
87
+ /**
88
+ * Resolve only the active tenant id for the current async execution scope.
89
+ *
90
+ * Returns `undefined` when no resolver is registered (tenancy disabled) or when
91
+ * the resolver reports no active tenant. Prefer {@link resolveDispatchTenantScope}
92
+ * for read-filtering decisions, which need to distinguish those two cases.
93
+ *
94
+ * @returns The active tenant id, or `undefined`/`null` when there is no tenant
95
+ * scope.
96
+ */
97
+ export declare function resolveDispatchTenantId(): string | null | undefined;
98
+ //# sourceMappingURL=tenant-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-resolver.d.ts","sourceRoot":"","sources":["../../src/dispatch/tenant-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;AAErE,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,4BAA4B,EAAE,sBAAsB,GAAG,SAAS,CAAC;CACtE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,sBAAsB,GAAG,SAAS,GAC3C,IAAI,CAEN;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,IAAI,mBAAmB,CAehE;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,GAAG,IAAI,GAAG,SAAS,CAYnE"}
@@ -0,0 +1,32 @@
1
+ function setDispatchTenantResolver(resolver) {
2
+ globalThis.__smrtDispatchTenantResolver = resolver;
3
+ }
4
+ function resolveDispatchTenantScope() {
5
+ const resolver = globalThis.__smrtDispatchTenantResolver;
6
+ if (!resolver) {
7
+ return { enforced: false, tenantId: null };
8
+ }
9
+ try {
10
+ const resolved = resolver();
11
+ return { enforced: true, tenantId: resolved ?? null };
12
+ } catch {
13
+ return { enforced: true, tenantId: null };
14
+ }
15
+ }
16
+ function resolveDispatchTenantId() {
17
+ const resolver = globalThis.__smrtDispatchTenantResolver;
18
+ if (!resolver) {
19
+ return void 0;
20
+ }
21
+ try {
22
+ return resolver();
23
+ } catch {
24
+ return void 0;
25
+ }
26
+ }
27
+ export {
28
+ resolveDispatchTenantId,
29
+ resolveDispatchTenantScope,
30
+ setDispatchTenantResolver
31
+ };
32
+ //# sourceMappingURL=tenant-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-resolver.js","sources":["../../src/dispatch/tenant-resolver.ts"],"sourcesContent":["/**\n * DispatchBus tenant resolver — dependency-inversion hook\n *\n * `@happyvertical/smrt-core` cannot depend on `@happyvertical/smrt-tenancy`\n * (tenancy depends on core, not the other way around). To let the DispatchBus\n * stamp and filter dispatches by the active tenant without creating a circular\n * dependency, core exposes an injectable resolver slot that tenancy fills at\n * `enableTenancy()` time — the same inversion pattern used by\n * {@link GlobalInterceptors}.\n *\n * When tenancy is not enabled (non-tenant deployments, existing tests), the\n * resolver defaults to a no-op that returns `undefined`, so the DispatchBus\n * behaves exactly as before: no tenant column is stamped and no tenant filter\n * is applied.\n *\n * Stored on `globalThis` so all module instances share one resolver, which is\n * critical in the monorepo where the same package can be loaded from multiple\n * paths (mirrors {@link ObjectRegistry} / {@link GlobalInterceptors}).\n */\n\n/**\n * Resolver function that returns the active tenant id for the current async\n * execution scope, or `undefined`/`null` when there is no tenant context\n * (system/global scope).\n */\nexport type DispatchTenantResolver = () => string | null | undefined;\n\ndeclare global {\n // eslint-disable-next-line no-var\n var __smrtDispatchTenantResolver: DispatchTenantResolver | undefined;\n}\n\n/**\n * Register the tenant resolver the DispatchBus uses to derive the active\n * tenant id on emit/subscribe/process.\n *\n * Called by `@happyvertical/smrt-tenancy`'s `enableTenancy()`; application\n * code never needs to call this directly. Passing `undefined` clears the\n * resolver (restoring the no-op default), which `disableTenancy()` does.\n *\n * @param resolver - Function returning the active tenant id, or `undefined` to\n * clear and fall back to the no-op default.\n */\nexport function setDispatchTenantResolver(\n resolver: DispatchTenantResolver | undefined,\n): void {\n globalThis.__smrtDispatchTenantResolver = resolver;\n}\n\n/**\n * Resolved tenant scope for a DispatchBus operation.\n *\n * The DispatchBus must distinguish three states, because they have different\n * read/write semantics (S5 #1398):\n *\n * - **Tenancy disabled** (`enforced: false`): no resolver is registered. The bus\n * applies no tenant filter and stamps no tenant id — identical to pre-tenancy\n * behavior. This is the backward-compatibility path for non-tenant\n * deployments and existing tests.\n * - **Tenancy enabled, active tenant** (`enforced: true`, `tenantId: T`): reads\n * are restricted to `(tenant_id = T OR tenant_id IS NULL)` and emits stamp\n * `tenant_id = T`.\n * - **Tenancy enabled, no active tenant** (`enforced: true`, `tenantId: null`):\n * reads are restricted to `tenant_id IS NULL` only (global rows). This is a\n * *fail-closed* state — when tenancy is on but no tenant context is active\n * (e.g. processing outside `withTenant()`), reads MUST NOT leak other\n * tenants' rows. Emits stamp `tenant_id = NULL` (global).\n *\n * Critically, `enforced: true` + `tenantId: null` is NOT collapsed into the\n * disabled state: when tenancy is enabled, a missing tenant context restricts\n * reads to global rows rather than opening up all tenants.\n */\nexport interface DispatchTenantScope {\n /**\n * Whether tenant enforcement is active (a resolver is registered). When\n * `false`, the bus applies no tenant filter at all (pre-tenancy behavior).\n */\n enforced: boolean;\n /**\n * The active tenant id, or `null` when there is no active tenant context.\n * Only meaningful when `enforced` is `true`.\n */\n tenantId: string | null;\n}\n\n/**\n * Resolve the active tenant scope for the current async execution scope.\n *\n * This is the trust anchor for DispatchBus tenant isolation. It distinguishes\n * \"tenancy disabled\" (no resolver registered → no filtering) from \"tenancy\n * enabled but no active tenant\" (resolver registered, returns null/undefined →\n * fail-closed to global-only reads). See {@link DispatchTenantScope}.\n *\n * @returns The resolved tenant scope.\n */\nexport function resolveDispatchTenantScope(): DispatchTenantScope {\n const resolver = globalThis.__smrtDispatchTenantResolver;\n if (!resolver) {\n // No resolver registered → tenancy is off. No filtering, no stamping.\n return { enforced: false, tenantId: null };\n }\n try {\n const resolved = resolver();\n return { enforced: true, tenantId: resolved ?? null };\n } catch {\n // A misbehaving resolver must never break dispatch processing. Tenancy is\n // still considered enforced (a resolver IS registered), so fail closed to\n // global-only reads rather than leaking all tenants.\n return { enforced: true, tenantId: null };\n }\n}\n\n/**\n * Resolve only the active tenant id for the current async execution scope.\n *\n * Returns `undefined` when no resolver is registered (tenancy disabled) or when\n * the resolver reports no active tenant. Prefer {@link resolveDispatchTenantScope}\n * for read-filtering decisions, which need to distinguish those two cases.\n *\n * @returns The active tenant id, or `undefined`/`null` when there is no tenant\n * scope.\n */\nexport function resolveDispatchTenantId(): string | null | undefined {\n const resolver = globalThis.__smrtDispatchTenantResolver;\n if (!resolver) {\n return undefined;\n }\n try {\n return resolver();\n } catch {\n // A misbehaving resolver must never break dispatch emission; treat a\n // throwing resolver as \"no tenant context\".\n return undefined;\n }\n}\n"],"names":[],"mappings":"AA2CO,SAAS,0BACd,UACM;AACN,aAAW,+BAA+B;AAC5C;AAgDO,SAAS,6BAAkD;AAChE,QAAM,WAAW,WAAW;AAC5B,MAAI,CAAC,UAAU;AAEb,WAAO,EAAE,UAAU,OAAO,UAAU,KAAA;AAAA,EACtC;AACA,MAAI;AACF,UAAM,WAAW,SAAA;AACjB,WAAO,EAAE,UAAU,MAAM,UAAU,YAAY,KAAA;AAAA,EACjD,QAAQ;AAIN,WAAO,EAAE,UAAU,MAAM,UAAU,KAAA;AAAA,EACrC;AACF;AAYO,SAAS,0BAAqD;AACnE,QAAM,WAAW,WAAW;AAC5B,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,SAAA;AAAA,EACT,QAAQ;AAGN,WAAO;AAAA,EACT;AACF;"}