@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,79 @@
1
+ import { DatabaseInterface } from '@happyvertical/sql';
2
+ import { DispatchSubscription } from '../models/DispatchSubscription.js';
3
+ import { DispatchTenantScope } from '../tenant-resolver.js';
4
+ /**
5
+ * Storage operations for subscriptions in _smrt_dispatch_subscriptions table
6
+ */
7
+ export declare class DispatchSubscriptionCollection {
8
+ /**
9
+ * Insert or update a subscription.
10
+ *
11
+ * Identity is tenant-scoped (S5 #1398): the conflict key is
12
+ * `(tenant_id, signal_type, subscriber)` so the same (signal_type, subscriber)
13
+ * pair can exist independently per tenant and one tenant cannot overwrite
14
+ * another's subscription. Global (NULL tenant_id) subscriptions are deduped by
15
+ * the NULL-aware upsert path in @happyvertical/sql.
16
+ */
17
+ static upsert(db: DatabaseInterface, subscription: DispatchSubscription): Promise<void>;
18
+ /**
19
+ * Get a subscription by ID
20
+ */
21
+ static get(db: DatabaseInterface, id: string): Promise<DispatchSubscription | null>;
22
+ /**
23
+ * Find subscription by signal type and subscriber
24
+ */
25
+ static find(db: DatabaseInterface, signalType: string, subscriber: string): Promise<DispatchSubscription | null>;
26
+ /**
27
+ * Get all subscriptions for a subscriber, scoped to the active tenant (S5 #1398).
28
+ */
29
+ static findBySubscriber(db: DatabaseInterface, subscriber: string, enabledOnly?: boolean, tenantScope?: DispatchTenantScope): Promise<DispatchSubscription[]>;
30
+ /**
31
+ * Get all subscriptions that match a signal type
32
+ *
33
+ * Uses SQL-level filtering for exact matches. Wildcard subscriptions
34
+ * (containing '*') are fetched separately and filtered in memory since
35
+ * pattern matching requires application-side regex evaluation.
36
+ */
37
+ static findMatchingSubscribers(db: DatabaseInterface, signalType: string, tenantScope?: DispatchTenantScope): Promise<DispatchSubscription[]>;
38
+ /**
39
+ * Find all enabled subscriptions matching a signal type
40
+ *
41
+ * Alias for findMatchingSubscribers — used by emit() to determine
42
+ * fan-out targets. Scoped to the active tenant (S5 #1398).
43
+ */
44
+ static findBySignalType(db: DatabaseInterface, signalType: string, tenantScope?: DispatchTenantScope): Promise<DispatchSubscription[]>;
45
+ /**
46
+ * Get all unique signal types that a subscriber is subscribed to
47
+ */
48
+ static getSignalTypes(db: DatabaseInterface, subscriber: string): Promise<string[]>;
49
+ /**
50
+ * List all subscriptions, scoped to the active tenant (S5 #1398).
51
+ */
52
+ static list(db: DatabaseInterface, enabledOnly?: boolean, tenantScope?: DispatchTenantScope): Promise<DispatchSubscription[]>;
53
+ /**
54
+ * Delete a subscription
55
+ */
56
+ static delete(db: DatabaseInterface, id: string): Promise<void>;
57
+ /**
58
+ * Delete subscription by signal type and subscriber, scoped to the active
59
+ * tenant (S5 #1398) so tenant B cannot delete tenant A's subscription.
60
+ */
61
+ static deleteByKey(db: DatabaseInterface, signalType: string, subscriber: string, tenantScope?: DispatchTenantScope): Promise<void>;
62
+ /**
63
+ * Delete all subscriptions for a subscriber
64
+ */
65
+ static deleteBySubscriber(db: DatabaseInterface, subscriber: string): Promise<void>;
66
+ /**
67
+ * Enable a subscription, scoped to the active tenant (S5 #1398).
68
+ */
69
+ static enable(db: DatabaseInterface, signalType: string, subscriber: string, tenantScope?: DispatchTenantScope): Promise<void>;
70
+ /**
71
+ * Disable a subscription, scoped to the active tenant (S5 #1398).
72
+ */
73
+ static disable(db: DatabaseInterface, signalType: string, subscriber: string, tenantScope?: DispatchTenantScope): Promise<void>;
74
+ /**
75
+ * Check if subscriptions table exists
76
+ */
77
+ static tableExists(db: DatabaseInterface): Promise<boolean>;
78
+ }
79
+ //# sourceMappingURL=DispatchSubscriptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DispatchSubscriptions.d.ts","sourceRoot":"","sources":["../../../src/dispatch/collections/DispatchSubscriptions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EACL,oBAAoB,EAErB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAkCjE;;GAEG;AACH,qBAAa,8BAA8B;IACzC;;;;;;;;OAQG;WACU,MAAM,CACjB,EAAE,EAAE,iBAAiB,EACrB,YAAY,EAAE,oBAAoB,GACjC,OAAO,CAAC,IAAI,CAAC;IAmBhB;;OAEG;WACU,GAAG,CACd,EAAE,EAAE,iBAAiB,EACrB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IASvC;;OAEG;WACU,IAAI,CACf,EAAE,EAAE,iBAAiB,EACrB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAUvC;;OAEG;WACU,gBAAgB,CAC3B,EAAE,EAAE,iBAAiB,EACrB,UAAU,EAAE,MAAM,EAClB,WAAW,GAAE,OAAc,EAC3B,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAqBlC;;;;;;OAMG;WACU,uBAAuB,CAClC,EAAE,EAAE,iBAAiB,EACrB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,oBAAoB,EAAE,CAAC;IA8ClC;;;;;OAKG;WACU,gBAAgB,CAC3B,EAAE,EAAE,iBAAiB,EACrB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAIlC;;OAEG;WACU,cAAc,CACzB,EAAE,EAAE,iBAAiB,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC;IAYpB;;OAEG;WACU,IAAI,CACf,EAAE,EAAE,iBAAiB,EACrB,WAAW,GAAE,OAAe,EAC5B,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAuBlC;;OAEG;WACU,MAAM,CAAC,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE;;;OAGG;WACU,WAAW,CACtB,EAAE,EAAE,iBAAiB,EACrB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,IAAI,CAAC;IAUhB;;OAEG;WACU,kBAAkB,CAC7B,EAAE,EAAE,iBAAiB,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IAOhB;;OAEG;WACU,MAAM,CACjB,EAAE,EAAE,iBAAiB,EACrB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,IAAI,CAAC;IAchB;;OAEG;WACU,OAAO,CAClB,EAAE,EAAE,iBAAiB,EACrB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,IAAI,CAAC;IAchB;;OAEG;WACU,WAAW,CAAC,EAAE,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;CAQlE"}
@@ -0,0 +1,243 @@
1
+ import { DispatchSubscription } from "../models/DispatchSubscription.js";
2
+ function subscriptionTenantClause(scope, params) {
3
+ if (!scope?.enforced) {
4
+ return null;
5
+ }
6
+ if (scope.tenantId !== null) {
7
+ params.push(scope.tenantId);
8
+ return "tenant_id = ?";
9
+ }
10
+ return "tenant_id IS NULL";
11
+ }
12
+ class DispatchSubscriptionCollection {
13
+ /**
14
+ * Insert or update a subscription.
15
+ *
16
+ * Identity is tenant-scoped (S5 #1398): the conflict key is
17
+ * `(tenant_id, signal_type, subscriber)` so the same (signal_type, subscriber)
18
+ * pair can exist independently per tenant and one tenant cannot overwrite
19
+ * another's subscription. Global (NULL tenant_id) subscriptions are deduped by
20
+ * the NULL-aware upsert path in @happyvertical/sql.
21
+ */
22
+ static async upsert(db, subscription) {
23
+ const row = subscription.toRow();
24
+ await db.upsert(
25
+ "_smrt_dispatch_subscriptions",
26
+ ["tenant_id", "signal_type", "subscriber"],
27
+ {
28
+ id: row.id,
29
+ signal_type: row.signal_type,
30
+ subscriber: row.subscriber,
31
+ handler: row.handler,
32
+ delivery: row.delivery,
33
+ enabled: row.enabled,
34
+ tenant_id: row.tenant_id,
35
+ created_at: row.created_at,
36
+ updated_at: row.updated_at
37
+ }
38
+ );
39
+ }
40
+ /**
41
+ * Get a subscription by ID
42
+ */
43
+ static async get(db, id) {
44
+ const result = await db.single`
45
+ SELECT * FROM _smrt_dispatch_subscriptions WHERE id = ${id}
46
+ `;
47
+ if (!result) return null;
48
+ return DispatchSubscription.fromRow(result);
49
+ }
50
+ /**
51
+ * Find subscription by signal type and subscriber
52
+ */
53
+ static async find(db, signalType, subscriber) {
54
+ const result = await db.single`
55
+ SELECT * FROM _smrt_dispatch_subscriptions
56
+ WHERE signal_type = ${signalType} AND subscriber = ${subscriber}
57
+ `;
58
+ if (!result) return null;
59
+ return DispatchSubscription.fromRow(result);
60
+ }
61
+ /**
62
+ * Get all subscriptions for a subscriber, scoped to the active tenant (S5 #1398).
63
+ */
64
+ static async findBySubscriber(db, subscriber, enabledOnly = true, tenantScope) {
65
+ let sql = `SELECT * FROM _smrt_dispatch_subscriptions WHERE subscriber = ?`;
66
+ const params = [subscriber];
67
+ if (enabledOnly) {
68
+ sql += " AND enabled = 1";
69
+ }
70
+ const tenantClause = subscriptionTenantClause(tenantScope, params);
71
+ if (tenantClause) {
72
+ sql += ` AND ${tenantClause}`;
73
+ }
74
+ sql += " ORDER BY signal_type ASC";
75
+ const { rows } = await db.query(sql, ...params);
76
+ return rows.map(
77
+ (row) => DispatchSubscription.fromRow(row)
78
+ );
79
+ }
80
+ /**
81
+ * Get all subscriptions that match a signal type
82
+ *
83
+ * Uses SQL-level filtering for exact matches. Wildcard subscriptions
84
+ * (containing '*') are fetched separately and filtered in memory since
85
+ * pattern matching requires application-side regex evaluation.
86
+ */
87
+ static async findMatchingSubscribers(db, signalType, tenantScope) {
88
+ const exactParams = [signalType];
89
+ let exactSql = `SELECT * FROM _smrt_dispatch_subscriptions
90
+ WHERE enabled = 1 AND signal_type = ?`;
91
+ const exactTenantClause = subscriptionTenantClause(
92
+ tenantScope,
93
+ exactParams
94
+ );
95
+ if (exactTenantClause) {
96
+ exactSql += ` AND ${exactTenantClause}`;
97
+ }
98
+ const { rows: exactRows } = await db.query(exactSql, ...exactParams);
99
+ const exactSubs = exactRows.map(
100
+ (row) => DispatchSubscription.fromRow(row)
101
+ );
102
+ const wildcardParams = [];
103
+ let wildcardSql = `SELECT * FROM _smrt_dispatch_subscriptions
104
+ WHERE enabled = 1 AND signal_type LIKE '%*%'`;
105
+ const wildcardTenantClause = subscriptionTenantClause(
106
+ tenantScope,
107
+ wildcardParams
108
+ );
109
+ if (wildcardTenantClause) {
110
+ wildcardSql += ` AND ${wildcardTenantClause}`;
111
+ }
112
+ const { rows: wildcardRows } = await db.query(
113
+ wildcardSql,
114
+ ...wildcardParams
115
+ );
116
+ const wildcardSubs = wildcardRows.map(
117
+ (row) => DispatchSubscription.fromRow(
118
+ row
119
+ )
120
+ ).filter((sub) => sub.matches(signalType));
121
+ return [...exactSubs, ...wildcardSubs];
122
+ }
123
+ /**
124
+ * Find all enabled subscriptions matching a signal type
125
+ *
126
+ * Alias for findMatchingSubscribers — used by emit() to determine
127
+ * fan-out targets. Scoped to the active tenant (S5 #1398).
128
+ */
129
+ static async findBySignalType(db, signalType, tenantScope) {
130
+ return this.findMatchingSubscribers(db, signalType, tenantScope);
131
+ }
132
+ /**
133
+ * Get all unique signal types that a subscriber is subscribed to
134
+ */
135
+ static async getSignalTypes(db, subscriber) {
136
+ const { rows } = await db.query(
137
+ `SELECT DISTINCT signal_type FROM _smrt_dispatch_subscriptions
138
+ WHERE subscriber = ? AND enabled = 1`,
139
+ subscriber
140
+ );
141
+ return rows.map(
142
+ (row) => row.signal_type
143
+ );
144
+ }
145
+ /**
146
+ * List all subscriptions, scoped to the active tenant (S5 #1398).
147
+ */
148
+ static async list(db, enabledOnly = false, tenantScope) {
149
+ const conditions = [];
150
+ const params = [];
151
+ if (enabledOnly) {
152
+ conditions.push("enabled = 1");
153
+ }
154
+ const tenantClause = subscriptionTenantClause(tenantScope, params);
155
+ if (tenantClause) {
156
+ conditions.push(tenantClause);
157
+ }
158
+ let sql = "SELECT * FROM _smrt_dispatch_subscriptions";
159
+ if (conditions.length > 0) {
160
+ sql += ` WHERE ${conditions.join(" AND ")}`;
161
+ }
162
+ sql += " ORDER BY subscriber ASC, signal_type ASC";
163
+ const { rows } = await db.query(sql, ...params);
164
+ return rows.map(
165
+ (row) => DispatchSubscription.fromRow(row)
166
+ );
167
+ }
168
+ /**
169
+ * Delete a subscription
170
+ */
171
+ static async delete(db, id) {
172
+ await db.query(`DELETE FROM _smrt_dispatch_subscriptions WHERE id = ?`, id);
173
+ }
174
+ /**
175
+ * Delete subscription by signal type and subscriber, scoped to the active
176
+ * tenant (S5 #1398) so tenant B cannot delete tenant A's subscription.
177
+ */
178
+ static async deleteByKey(db, signalType, subscriber, tenantScope) {
179
+ const params = [signalType, subscriber];
180
+ let sql = `DELETE FROM _smrt_dispatch_subscriptions WHERE signal_type = ? AND subscriber = ?`;
181
+ const tenantClause = subscriptionTenantClause(tenantScope, params);
182
+ if (tenantClause) {
183
+ sql += ` AND ${tenantClause}`;
184
+ }
185
+ await db.query(sql, ...params);
186
+ }
187
+ /**
188
+ * Delete all subscriptions for a subscriber
189
+ */
190
+ static async deleteBySubscriber(db, subscriber) {
191
+ await db.query(
192
+ `DELETE FROM _smrt_dispatch_subscriptions WHERE subscriber = ?`,
193
+ subscriber
194
+ );
195
+ }
196
+ /**
197
+ * Enable a subscription, scoped to the active tenant (S5 #1398).
198
+ */
199
+ static async enable(db, signalType, subscriber, tenantScope) {
200
+ const params = [
201
+ (/* @__PURE__ */ new Date()).toISOString(),
202
+ signalType,
203
+ subscriber
204
+ ];
205
+ let sql = `UPDATE _smrt_dispatch_subscriptions SET enabled = 1, updated_at = ? WHERE signal_type = ? AND subscriber = ?`;
206
+ const tenantClause = subscriptionTenantClause(tenantScope, params);
207
+ if (tenantClause) {
208
+ sql += ` AND ${tenantClause}`;
209
+ }
210
+ await db.query(sql, ...params);
211
+ }
212
+ /**
213
+ * Disable a subscription, scoped to the active tenant (S5 #1398).
214
+ */
215
+ static async disable(db, signalType, subscriber, tenantScope) {
216
+ const params = [
217
+ (/* @__PURE__ */ new Date()).toISOString(),
218
+ signalType,
219
+ subscriber
220
+ ];
221
+ let sql = `UPDATE _smrt_dispatch_subscriptions SET enabled = 0, updated_at = ? WHERE signal_type = ? AND subscriber = ?`;
222
+ const tenantClause = subscriptionTenantClause(tenantScope, params);
223
+ if (tenantClause) {
224
+ sql += ` AND ${tenantClause}`;
225
+ }
226
+ await db.query(sql, ...params);
227
+ }
228
+ /**
229
+ * Check if subscriptions table exists
230
+ */
231
+ static async tableExists(db) {
232
+ try {
233
+ await db.query(`SELECT 1 FROM _smrt_dispatch_subscriptions LIMIT 1`);
234
+ return true;
235
+ } catch {
236
+ return false;
237
+ }
238
+ }
239
+ }
240
+ export {
241
+ DispatchSubscriptionCollection
242
+ };
243
+ //# sourceMappingURL=DispatchSubscriptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DispatchSubscriptions.js","sources":["../../../src/dispatch/collections/DispatchSubscriptions.ts"],"sourcesContent":["/**\n * DispatchSubscriptionCollection - Storage operations for dispatch subscriptions\n *\n * CRUD operations for the _smrt_dispatch_subscriptions system table.\n */\n\nimport type { DatabaseInterface } from '@happyvertical/sql';\nimport {\n DispatchSubscription,\n type DispatchSubscriptionData,\n} from '../models/DispatchSubscription.js';\nimport type { DispatchTenantScope } from '../tenant-resolver.js';\n\n/**\n * Build a SQL tenant predicate fragment for subscription queries (S5 #1398).\n *\n * Mirrors the dispatch-row scoping, but subscription identity is *per tenant* —\n * a subscription belongs to exactly one scope, so an active tenant sees only its\n * own subscriptions (not also globals), preventing tenant B from finding/\n * mutating tenant A's (or a shared global) subscription row. Semantics:\n *\n * - tenancy off / no scope → no predicate.\n * - active tenant T → `tenant_id = ?`.\n * - tenancy on, no active tenant → `tenant_id IS NULL` (global subs only).\n *\n * Uses `?` positional placeholders (these collection queries bind via the\n * sqlite-style `?` convention used elsewhere in this file).\n *\n * @returns The SQL fragment (without a leading `AND`), or `null` when no\n * predicate applies. When a value is bound it is pushed onto `params`.\n */\nfunction subscriptionTenantClause(\n scope: DispatchTenantScope | undefined,\n params: unknown[],\n): string | null {\n if (!scope?.enforced) {\n return null;\n }\n if (scope.tenantId !== null) {\n params.push(scope.tenantId);\n return 'tenant_id = ?';\n }\n return 'tenant_id IS NULL';\n}\n\n/**\n * Storage operations for subscriptions in _smrt_dispatch_subscriptions table\n */\nexport class DispatchSubscriptionCollection {\n /**\n * Insert or update a subscription.\n *\n * Identity is tenant-scoped (S5 #1398): the conflict key is\n * `(tenant_id, signal_type, subscriber)` so the same (signal_type, subscriber)\n * pair can exist independently per tenant and one tenant cannot overwrite\n * another's subscription. Global (NULL tenant_id) subscriptions are deduped by\n * the NULL-aware upsert path in @happyvertical/sql.\n */\n static async upsert(\n db: DatabaseInterface,\n subscription: DispatchSubscription,\n ): Promise<void> {\n const row = subscription.toRow();\n await db.upsert(\n '_smrt_dispatch_subscriptions',\n ['tenant_id', 'signal_type', 'subscriber'],\n {\n id: row.id,\n signal_type: row.signal_type,\n subscriber: row.subscriber,\n handler: row.handler,\n delivery: row.delivery,\n enabled: row.enabled,\n tenant_id: row.tenant_id,\n created_at: row.created_at,\n updated_at: row.updated_at,\n },\n );\n }\n\n /**\n * Get a subscription by ID\n */\n static async get(\n db: DatabaseInterface,\n id: string,\n ): Promise<DispatchSubscription | null> {\n const result = await db.single`\n SELECT * FROM _smrt_dispatch_subscriptions WHERE id = ${id}\n `;\n\n if (!result) return null;\n return DispatchSubscription.fromRow(result as DispatchSubscriptionData);\n }\n\n /**\n * Find subscription by signal type and subscriber\n */\n static async find(\n db: DatabaseInterface,\n signalType: string,\n subscriber: string,\n ): Promise<DispatchSubscription | null> {\n const result = await db.single`\n SELECT * FROM _smrt_dispatch_subscriptions\n WHERE signal_type = ${signalType} AND subscriber = ${subscriber}\n `;\n\n if (!result) return null;\n return DispatchSubscription.fromRow(result as DispatchSubscriptionData);\n }\n\n /**\n * Get all subscriptions for a subscriber, scoped to the active tenant (S5 #1398).\n */\n static async findBySubscriber(\n db: DatabaseInterface,\n subscriber: string,\n enabledOnly: boolean = true,\n tenantScope?: DispatchTenantScope,\n ): Promise<DispatchSubscription[]> {\n let sql = `SELECT * FROM _smrt_dispatch_subscriptions WHERE subscriber = ?`;\n const params: unknown[] = [subscriber];\n\n if (enabledOnly) {\n sql += ' AND enabled = 1';\n }\n\n const tenantClause = subscriptionTenantClause(tenantScope, params);\n if (tenantClause) {\n sql += ` AND ${tenantClause}`;\n }\n\n sql += ' ORDER BY signal_type ASC';\n\n const { rows } = await db.query(sql, ...params);\n return rows.map((row: Record<string, unknown>) =>\n DispatchSubscription.fromRow(row as unknown as DispatchSubscriptionData),\n );\n }\n\n /**\n * Get all subscriptions that match a signal type\n *\n * Uses SQL-level filtering for exact matches. Wildcard subscriptions\n * (containing '*') are fetched separately and filtered in memory since\n * pattern matching requires application-side regex evaluation.\n */\n static async findMatchingSubscribers(\n db: DatabaseInterface,\n signalType: string,\n tenantScope?: DispatchTenantScope,\n ): Promise<DispatchSubscription[]> {\n // SQL-level: exact match subscriptions (scoped to the active tenant).\n const exactParams: unknown[] = [signalType];\n let exactSql = `SELECT * FROM _smrt_dispatch_subscriptions\n WHERE enabled = 1 AND signal_type = ?`;\n const exactTenantClause = subscriptionTenantClause(\n tenantScope,\n exactParams,\n );\n if (exactTenantClause) {\n exactSql += ` AND ${exactTenantClause}`;\n }\n const { rows: exactRows } = await db.query(exactSql, ...exactParams);\n\n const exactSubs = exactRows.map((row: Record<string, unknown>) =>\n DispatchSubscription.fromRow(row as unknown as DispatchSubscriptionData),\n );\n\n // SQL-level: wildcard subscriptions (contain '*'), scoped to the tenant.\n // Must be filtered in memory for pattern matching.\n const wildcardParams: unknown[] = [];\n let wildcardSql = `SELECT * FROM _smrt_dispatch_subscriptions\n WHERE enabled = 1 AND signal_type LIKE '%*%'`;\n const wildcardTenantClause = subscriptionTenantClause(\n tenantScope,\n wildcardParams,\n );\n if (wildcardTenantClause) {\n wildcardSql += ` AND ${wildcardTenantClause}`;\n }\n const { rows: wildcardRows } = await db.query(\n wildcardSql,\n ...wildcardParams,\n );\n\n const wildcardSubs = wildcardRows\n .map((row: Record<string, unknown>) =>\n DispatchSubscription.fromRow(\n row as unknown as DispatchSubscriptionData,\n ),\n )\n .filter((sub) => sub.matches(signalType));\n\n return [...exactSubs, ...wildcardSubs];\n }\n\n /**\n * Find all enabled subscriptions matching a signal type\n *\n * Alias for findMatchingSubscribers — used by emit() to determine\n * fan-out targets. Scoped to the active tenant (S5 #1398).\n */\n static async findBySignalType(\n db: DatabaseInterface,\n signalType: string,\n tenantScope?: DispatchTenantScope,\n ): Promise<DispatchSubscription[]> {\n return this.findMatchingSubscribers(db, signalType, tenantScope);\n }\n\n /**\n * Get all unique signal types that a subscriber is subscribed to\n */\n static async getSignalTypes(\n db: DatabaseInterface,\n subscriber: string,\n ): Promise<string[]> {\n const { rows } = await db.query(\n `SELECT DISTINCT signal_type FROM _smrt_dispatch_subscriptions\n WHERE subscriber = ? AND enabled = 1`,\n subscriber,\n );\n\n return rows.map(\n (row: Record<string, unknown>) => row.signal_type as string,\n );\n }\n\n /**\n * List all subscriptions, scoped to the active tenant (S5 #1398).\n */\n static async list(\n db: DatabaseInterface,\n enabledOnly: boolean = false,\n tenantScope?: DispatchTenantScope,\n ): Promise<DispatchSubscription[]> {\n const conditions: string[] = [];\n const params: unknown[] = [];\n if (enabledOnly) {\n conditions.push('enabled = 1');\n }\n const tenantClause = subscriptionTenantClause(tenantScope, params);\n if (tenantClause) {\n conditions.push(tenantClause);\n }\n\n let sql = 'SELECT * FROM _smrt_dispatch_subscriptions';\n if (conditions.length > 0) {\n sql += ` WHERE ${conditions.join(' AND ')}`;\n }\n sql += ' ORDER BY subscriber ASC, signal_type ASC';\n\n const { rows } = await db.query(sql, ...params);\n return rows.map((row: Record<string, unknown>) =>\n DispatchSubscription.fromRow(row as unknown as DispatchSubscriptionData),\n );\n }\n\n /**\n * Delete a subscription\n */\n static async delete(db: DatabaseInterface, id: string): Promise<void> {\n await db.query(`DELETE FROM _smrt_dispatch_subscriptions WHERE id = ?`, id);\n }\n\n /**\n * Delete subscription by signal type and subscriber, scoped to the active\n * tenant (S5 #1398) so tenant B cannot delete tenant A's subscription.\n */\n static async deleteByKey(\n db: DatabaseInterface,\n signalType: string,\n subscriber: string,\n tenantScope?: DispatchTenantScope,\n ): Promise<void> {\n const params: unknown[] = [signalType, subscriber];\n let sql = `DELETE FROM _smrt_dispatch_subscriptions WHERE signal_type = ? AND subscriber = ?`;\n const tenantClause = subscriptionTenantClause(tenantScope, params);\n if (tenantClause) {\n sql += ` AND ${tenantClause}`;\n }\n await db.query(sql, ...params);\n }\n\n /**\n * Delete all subscriptions for a subscriber\n */\n static async deleteBySubscriber(\n db: DatabaseInterface,\n subscriber: string,\n ): Promise<void> {\n await db.query(\n `DELETE FROM _smrt_dispatch_subscriptions WHERE subscriber = ?`,\n subscriber,\n );\n }\n\n /**\n * Enable a subscription, scoped to the active tenant (S5 #1398).\n */\n static async enable(\n db: DatabaseInterface,\n signalType: string,\n subscriber: string,\n tenantScope?: DispatchTenantScope,\n ): Promise<void> {\n const params: unknown[] = [\n new Date().toISOString(),\n signalType,\n subscriber,\n ];\n let sql = `UPDATE _smrt_dispatch_subscriptions SET enabled = 1, updated_at = ? WHERE signal_type = ? AND subscriber = ?`;\n const tenantClause = subscriptionTenantClause(tenantScope, params);\n if (tenantClause) {\n sql += ` AND ${tenantClause}`;\n }\n await db.query(sql, ...params);\n }\n\n /**\n * Disable a subscription, scoped to the active tenant (S5 #1398).\n */\n static async disable(\n db: DatabaseInterface,\n signalType: string,\n subscriber: string,\n tenantScope?: DispatchTenantScope,\n ): Promise<void> {\n const params: unknown[] = [\n new Date().toISOString(),\n signalType,\n subscriber,\n ];\n let sql = `UPDATE _smrt_dispatch_subscriptions SET enabled = 0, updated_at = ? WHERE signal_type = ? AND subscriber = ?`;\n const tenantClause = subscriptionTenantClause(tenantScope, params);\n if (tenantClause) {\n sql += ` AND ${tenantClause}`;\n }\n await db.query(sql, ...params);\n }\n\n /**\n * Check if subscriptions table exists\n */\n static async tableExists(db: DatabaseInterface): Promise<boolean> {\n try {\n await db.query(`SELECT 1 FROM _smrt_dispatch_subscriptions LIMIT 1`);\n return true;\n } catch {\n return false;\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ import { DatabaseInterface } from '@happyvertical/sql';
2
+ import { Dispatch } from '../models/Dispatch.js';
3
+ import { DispatchTenantScope } from '../tenant-resolver.js';
4
+ import { DispatchCleanupOptions, DispatchCleanupResult, DispatchListOptions, DispatchRetryOptions, DispatchStatus } from '../types.js';
5
+ /**
6
+ * Storage operations for dispatches in _smrt_dispatch table
7
+ */
8
+ export declare class DispatchCollection {
9
+ /**
10
+ * Insert a new dispatch
11
+ */
12
+ static insert(db: DatabaseInterface, dispatch: Dispatch): Promise<void>;
13
+ /**
14
+ * Update an existing dispatch
15
+ */
16
+ static update(db: DatabaseInterface, dispatch: Dispatch): Promise<void>;
17
+ /**
18
+ * Get a dispatch by ID (unscoped).
19
+ *
20
+ * Internal/system use only — applies no tenant filter. Public reads go
21
+ * through the DispatchBus, which uses {@link getScoped} so a caller cannot
22
+ * fetch another tenant's dispatch by id (S5 #1398).
23
+ */
24
+ static get(db: DatabaseInterface, id: string): Promise<Dispatch | null>;
25
+ /**
26
+ * Get a dispatch by ID, enforcing the active tenant scope (S5 #1398).
27
+ *
28
+ * Applies the same tenant predicate as {@link list}/{@link findPending}, so a
29
+ * cross-tenant or out-of-scope id lookup returns `null` rather than leaking
30
+ * the row. The scope is derived server-side by the DispatchBus.
31
+ */
32
+ static getScoped(db: DatabaseInterface, id: string, tenantScope?: DispatchTenantScope): Promise<Dispatch | null>;
33
+ /**
34
+ * List dispatches with filtering
35
+ */
36
+ static list(db: DatabaseInterface, options?: DispatchListOptions): Promise<Dispatch[]>;
37
+ /**
38
+ * Find pending dispatches for a set of signal types
39
+ *
40
+ * @param subscriber - When provided, filters to dispatches with no target
41
+ * or targeted specifically at this subscriber (for fan-out delivery)
42
+ * @param tenantScope - Active tenant scope (S5 #1398). Derived server-side by
43
+ * the bus; restricts results so a subscriber in one tenant cannot see
44
+ * another tenant's dispatch. See {@link pushTenantPredicate} for the exact
45
+ * semantics (off → no filter; active tenant → that tenant + global; on but
46
+ * no tenant → global only).
47
+ */
48
+ static findPending(db: DatabaseInterface, signalTypes: string[], limit?: number, subscriber?: string, tenantScope?: DispatchTenantScope): Promise<Dispatch[]>;
49
+ /**
50
+ * Atomically claim a pending dispatch for processing (S5 #1398).
51
+ *
52
+ * Performs a conditional `UPDATE ... WHERE id = ? AND status = 'pending'`
53
+ * (plus the tenant predicate for the active scope) and reports whether the
54
+ * row was claimed by THIS call. Only the caller whose update affected a row
55
+ * may run the handler, which closes the claim TOCTOU window where a `process`
56
+ * filter-then-update could let two workers (or a tenant-scoped and a
57
+ * system-scoped processor) both pick up the same compete/global dispatch.
58
+ *
59
+ * On a successful claim the dispatch's status/attempts/updated_at are
60
+ * advanced in the DB; the in-memory `dispatch` instance is updated to match
61
+ * so the caller can proceed to `update()` it to completed/failed.
62
+ *
63
+ * @returns `true` if this call claimed the dispatch, `false` if another
64
+ * worker already moved it out of `pending` (or it is not visible in scope).
65
+ */
66
+ static claim(db: DatabaseInterface, dispatch: Dispatch, tenantScope?: DispatchTenantScope): Promise<boolean>;
67
+ /**
68
+ * Find failed dispatches eligible for retry.
69
+ *
70
+ * @param tenantScope - Active tenant scope (S5 #1398). Derived server-side by
71
+ * the bus; restricts retryable rows to the active tenant (plus global) so a
72
+ * tenant's `retry()` cannot reset another tenant's failed dispatches. See
73
+ * {@link pushTenantPredicate} for the exact semantics.
74
+ */
75
+ static findRetryable(db: DatabaseInterface, options?: DispatchRetryOptions, tenantScope?: DispatchTenantScope): Promise<Dispatch[]>;
76
+ /**
77
+ * Count dispatches by status
78
+ */
79
+ static countByStatus(db: DatabaseInterface, status: DispatchStatus): Promise<number>;
80
+ /**
81
+ * Delete a dispatch
82
+ */
83
+ static delete(db: DatabaseInterface, id: string): Promise<void>;
84
+ /**
85
+ * Cleanup old dispatches.
86
+ *
87
+ * @param tenantScope - Active tenant scope (S5 #1398). Derived server-side by
88
+ * the bus; restricts deletions to the active tenant (plus global) so a
89
+ * tenant's `cleanup()` cannot delete another tenant's dispatches. See
90
+ * {@link pushTenantPredicate} for the exact semantics.
91
+ */
92
+ static cleanup(db: DatabaseInterface, options?: DispatchCleanupOptions, tenantScope?: DispatchTenantScope): Promise<DispatchCleanupResult>;
93
+ /**
94
+ * Check if dispatch table exists
95
+ */
96
+ static tableExists(db: DatabaseInterface): Promise<boolean>;
97
+ }
98
+ //# sourceMappingURL=Dispatches.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dispatches.d.ts","sourceRoot":"","sources":["../../../src/dispatch/collections/Dispatches.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAqB,MAAM,uBAAuB,CAAC;AACpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACf,MAAM,aAAa,CAAC;AAmCrB;;GAEG;AACH,qBAAa,kBAAkB;IAC7B;;OAEG;WACU,MAAM,CACjB,EAAE,EAAE,iBAAiB,EACrB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,IAAI,CAAC;IA0BhB;;OAEG;WACU,MAAM,CACjB,EAAE,EAAE,iBAAiB,EACrB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,IAAI,CAAC;IAyBhB;;;;;;OAMG;WACU,GAAG,CACd,EAAE,EAAE,iBAAiB,EACrB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAS3B;;;;;;OAMG;WACU,SAAS,CACpB,EAAE,EAAE,iBAAiB,EACrB,EAAE,EAAE,MAAM,EACV,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAe3B;;OAEG;WACU,IAAI,CACf,EAAE,EAAE,iBAAiB,EACrB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAuFtB;;;;;;;;;;OAUG;WACU,WAAW,CACtB,EAAE,EAAE,iBAAiB,EACrB,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,GAAE,MAAY,EACnB,UAAU,CAAC,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAsCtB;;;;;;;;;;;;;;;;OAgBG;WACU,KAAK,CAChB,EAAE,EAAE,iBAAiB,EACrB,QAAQ,EAAE,QAAQ,EAClB,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,OAAO,CAAC;IA6BnB;;;;;;;OAOG;WACU,aAAa,CACxB,EAAE,EAAE,iBAAiB,EACrB,OAAO,GAAE,oBAAyB,EAClC,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAuCtB;;OAEG;WACU,aAAa,CACxB,EAAE,EAAE,iBAAiB,EACrB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,MAAM,CAAC;IAOlB;;OAEG;WACU,MAAM,CAAC,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE;;;;;;;OAOG;WACU,OAAO,CAClB,EAAE,EAAE,iBAAiB,EACrB,OAAO,GAAE,sBAA2B,EACpC,WAAW,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,qBAAqB,CAAC;IA0CjC;;OAEG;WACU,WAAW,CAAC,EAAE,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;CAQlE"}