@pattern-stack/codegen 0.15.1 → 0.15.3

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 (527) hide show
  1. package/CHANGELOG.md +85 -0
  2. package/dist/chunk-27ETSJ2X.js +84 -0
  3. package/dist/chunk-27ETSJ2X.js.map +1 -0
  4. package/dist/chunk-2E224ZSN.js +20 -0
  5. package/dist/chunk-2E224ZSN.js.map +1 -0
  6. package/dist/chunk-2FTZLDBP.js +179 -0
  7. package/dist/chunk-2FTZLDBP.js.map +1 -0
  8. package/dist/chunk-2N4UG4VD.js +20 -0
  9. package/dist/chunk-2N4UG4VD.js.map +1 -0
  10. package/dist/chunk-2TVVBC53.js +92 -0
  11. package/dist/chunk-2TVVBC53.js.map +1 -0
  12. package/dist/chunk-2VHZ7EKC.js +37 -0
  13. package/dist/chunk-2VHZ7EKC.js.map +1 -0
  14. package/dist/chunk-32BMMV4H.js +109 -0
  15. package/dist/chunk-32BMMV4H.js.map +1 -0
  16. package/dist/chunk-32DOFN3T.js +4042 -0
  17. package/dist/chunk-32DOFN3T.js.map +1 -0
  18. package/dist/chunk-36U5UGIO.js +107 -0
  19. package/dist/chunk-36U5UGIO.js.map +1 -0
  20. package/dist/chunk-3CJFPU6Q.js +14 -0
  21. package/dist/chunk-3CJFPU6Q.js.map +1 -0
  22. package/dist/chunk-3NMCDN7L.js +90 -0
  23. package/dist/chunk-3NMCDN7L.js.map +1 -0
  24. package/dist/chunk-3SZFUTXE.js +62 -0
  25. package/dist/chunk-3SZFUTXE.js.map +1 -0
  26. package/dist/chunk-4DOJBQTP.js +117 -0
  27. package/dist/chunk-4DOJBQTP.js.map +1 -0
  28. package/dist/chunk-4H3PETLM.js +290 -0
  29. package/dist/chunk-4H3PETLM.js.map +1 -0
  30. package/dist/chunk-4JLJYWJC.js +308 -0
  31. package/dist/chunk-4JLJYWJC.js.map +1 -0
  32. package/dist/chunk-4KNXX6TI.js +29 -0
  33. package/dist/chunk-4KNXX6TI.js.map +1 -0
  34. package/dist/chunk-4LH67P4U.js +17 -0
  35. package/dist/chunk-4LH67P4U.js.map +1 -0
  36. package/dist/chunk-4MF3HKJA.js +94 -0
  37. package/dist/chunk-4MF3HKJA.js.map +1 -0
  38. package/dist/chunk-4MVGAMUA.js +40 -0
  39. package/dist/chunk-4MVGAMUA.js.map +1 -0
  40. package/dist/chunk-4RFHUZXU.js +635 -0
  41. package/dist/chunk-4RFHUZXU.js.map +1 -0
  42. package/dist/chunk-5A432NZJ.js +7 -0
  43. package/dist/chunk-5A432NZJ.js.map +1 -0
  44. package/dist/chunk-5Y7W3XR6.js +356 -0
  45. package/dist/chunk-5Y7W3XR6.js.map +1 -0
  46. package/dist/chunk-6DWFJNIK.js +15 -0
  47. package/dist/chunk-6DWFJNIK.js.map +1 -0
  48. package/dist/chunk-6I7ULIN6.js +15 -0
  49. package/dist/chunk-6I7ULIN6.js.map +1 -0
  50. package/dist/chunk-6XY6ZMMD.js +25 -0
  51. package/dist/chunk-6XY6ZMMD.js.map +1 -0
  52. package/dist/chunk-7B3RYX45.js +63 -0
  53. package/dist/chunk-7B3RYX45.js.map +1 -0
  54. package/dist/chunk-7C3FOSDI.js +1 -0
  55. package/dist/chunk-7C3FOSDI.js.map +1 -0
  56. package/dist/chunk-7KOW6PU6.js +59 -0
  57. package/dist/chunk-7KOW6PU6.js.map +1 -0
  58. package/dist/chunk-7RELQJIN.js +22 -0
  59. package/dist/chunk-7RELQJIN.js.map +1 -0
  60. package/dist/chunk-7YGORYZD.js +112 -0
  61. package/dist/chunk-7YGORYZD.js.map +1 -0
  62. package/dist/chunk-AHV4GDYM.js +63 -0
  63. package/dist/chunk-AHV4GDYM.js.map +1 -0
  64. package/dist/chunk-AQFQ4BYM.js +81 -0
  65. package/dist/chunk-AQFQ4BYM.js.map +1 -0
  66. package/dist/chunk-AS3NAZB6.js +14 -0
  67. package/dist/chunk-AS3NAZB6.js.map +1 -0
  68. package/dist/chunk-BGULBWKJ.js +88 -0
  69. package/dist/chunk-BGULBWKJ.js.map +1 -0
  70. package/dist/chunk-BIO6F7YI.js +17 -0
  71. package/dist/chunk-BIO6F7YI.js.map +1 -0
  72. package/dist/chunk-BOPZWRJK.js +36 -0
  73. package/dist/chunk-BOPZWRJK.js.map +1 -0
  74. package/dist/chunk-BPARRK6F.js +14 -0
  75. package/dist/chunk-BPARRK6F.js.map +1 -0
  76. package/dist/chunk-CO6LUM72.js +59 -0
  77. package/dist/chunk-CO6LUM72.js.map +1 -0
  78. package/dist/chunk-DCCZB4UC.js +100 -0
  79. package/dist/chunk-DCCZB4UC.js.map +1 -0
  80. package/dist/chunk-DV4RV2DC.js +59 -0
  81. package/dist/chunk-DV4RV2DC.js.map +1 -0
  82. package/dist/chunk-EDKJU5BO.js +11 -0
  83. package/dist/chunk-EDKJU5BO.js.map +1 -0
  84. package/dist/chunk-EO2QPOKH.js +116 -0
  85. package/dist/chunk-EO2QPOKH.js.map +1 -0
  86. package/dist/chunk-EOLLMEAH.js +155 -0
  87. package/dist/chunk-EOLLMEAH.js.map +1 -0
  88. package/dist/chunk-EWYCWP4H.js +14 -0
  89. package/dist/chunk-EWYCWP4H.js.map +1 -0
  90. package/dist/chunk-EXVDJMIY.js +33 -0
  91. package/dist/chunk-EXVDJMIY.js.map +1 -0
  92. package/dist/chunk-FASRXRX5.js +19 -0
  93. package/dist/chunk-FASRXRX5.js.map +1 -0
  94. package/dist/chunk-FBGHYQIZ.js +201 -0
  95. package/dist/chunk-FBGHYQIZ.js.map +1 -0
  96. package/dist/chunk-FI34KYZ5.js +1 -0
  97. package/dist/chunk-FI34KYZ5.js.map +1 -0
  98. package/dist/chunk-FN2PYDPP.js +1 -0
  99. package/dist/chunk-FN2PYDPP.js.map +1 -0
  100. package/dist/chunk-GCYKMF22.js +81 -0
  101. package/dist/chunk-GCYKMF22.js.map +1 -0
  102. package/dist/chunk-GM3RMJIJ.js +92 -0
  103. package/dist/chunk-GM3RMJIJ.js.map +1 -0
  104. package/dist/chunk-GYGNEQSC.js +9 -0
  105. package/dist/chunk-GYGNEQSC.js.map +1 -0
  106. package/dist/chunk-H5NH7KPE.js +21 -0
  107. package/dist/chunk-H5NH7KPE.js.map +1 -0
  108. package/dist/chunk-HNWZFNKP.js +168 -0
  109. package/dist/chunk-HNWZFNKP.js.map +1 -0
  110. package/dist/chunk-HUH73XGI.js +1 -0
  111. package/dist/chunk-HUH73XGI.js.map +1 -0
  112. package/dist/chunk-I6MVCB5A.js +39 -0
  113. package/dist/chunk-I6MVCB5A.js.map +1 -0
  114. package/dist/chunk-IBGER4YK.js +12 -0
  115. package/dist/chunk-IBGER4YK.js.map +1 -0
  116. package/dist/chunk-IF5I3DAA.js +92 -0
  117. package/dist/chunk-IF5I3DAA.js.map +1 -0
  118. package/dist/chunk-IP4OO26U.js +54 -0
  119. package/dist/chunk-IP4OO26U.js.map +1 -0
  120. package/dist/chunk-IWAOY6KC.js +1 -0
  121. package/dist/chunk-IWAOY6KC.js.map +1 -0
  122. package/dist/chunk-IYNSRIGR.js +122 -0
  123. package/dist/chunk-IYNSRIGR.js.map +1 -0
  124. package/dist/chunk-J37YWU7Y.js +19 -0
  125. package/dist/chunk-J37YWU7Y.js.map +1 -0
  126. package/dist/chunk-J6KZS54B.js +269 -0
  127. package/dist/chunk-J6KZS54B.js.map +1 -0
  128. package/dist/chunk-J6MN42LG.js +19 -0
  129. package/dist/chunk-J6MN42LG.js.map +1 -0
  130. package/dist/chunk-J7JMVS2B.js +53 -0
  131. package/dist/chunk-J7JMVS2B.js.map +1 -0
  132. package/dist/chunk-JRQO2IOF.js +65 -0
  133. package/dist/chunk-JRQO2IOF.js.map +1 -0
  134. package/dist/chunk-JWNHNUYL.js +96 -0
  135. package/dist/chunk-JWNHNUYL.js.map +1 -0
  136. package/dist/chunk-K2I6XIK5.js +122 -0
  137. package/dist/chunk-K2I6XIK5.js.map +1 -0
  138. package/dist/chunk-KVOWSC5S.js +1 -0
  139. package/dist/chunk-KVOWSC5S.js.map +1 -0
  140. package/dist/chunk-KYR3B3OW.js +79 -0
  141. package/dist/chunk-KYR3B3OW.js.map +1 -0
  142. package/dist/chunk-L3LZWWSX.js +61 -0
  143. package/dist/chunk-L3LZWWSX.js.map +1 -0
  144. package/dist/chunk-L4SDDEEU.js +1 -0
  145. package/dist/chunk-L4SDDEEU.js.map +1 -0
  146. package/dist/chunk-L6FTY45T.js +13 -0
  147. package/dist/chunk-L6FTY45T.js.map +1 -0
  148. package/dist/chunk-L7BNNRGI.js +134 -0
  149. package/dist/chunk-L7BNNRGI.js.map +1 -0
  150. package/dist/chunk-LG57S2SC.js +150 -0
  151. package/dist/chunk-LG57S2SC.js.map +1 -0
  152. package/dist/chunk-M6QLSLPO.js +97 -0
  153. package/dist/chunk-M6QLSLPO.js.map +1 -0
  154. package/dist/chunk-MZ6GV4YF.js +21 -0
  155. package/dist/chunk-MZ6GV4YF.js.map +1 -0
  156. package/dist/chunk-N5OTOWTP.js +55 -0
  157. package/dist/chunk-N5OTOWTP.js.map +1 -0
  158. package/dist/chunk-NN7XZEGF.js +14 -0
  159. package/dist/chunk-NN7XZEGF.js.map +1 -0
  160. package/dist/chunk-NPFPZ2HO.js +13 -0
  161. package/dist/chunk-NPFPZ2HO.js.map +1 -0
  162. package/dist/chunk-NXXDZ6ZF.js +42 -0
  163. package/dist/chunk-NXXDZ6ZF.js.map +1 -0
  164. package/dist/chunk-NYBCQZC7.js +11 -0
  165. package/dist/chunk-NYBCQZC7.js.map +1 -0
  166. package/dist/chunk-O37C3YE6.js +111 -0
  167. package/dist/chunk-O37C3YE6.js.map +1 -0
  168. package/dist/chunk-OFRRBC7M.js +78 -0
  169. package/dist/chunk-OFRRBC7M.js.map +1 -0
  170. package/dist/chunk-OGIZXGPY.js +222 -0
  171. package/dist/chunk-OGIZXGPY.js.map +1 -0
  172. package/dist/chunk-OKXZ63IA.js +168 -0
  173. package/dist/chunk-OKXZ63IA.js.map +1 -0
  174. package/dist/chunk-OSQRXVG2.js +58 -0
  175. package/dist/chunk-OSQRXVG2.js.map +1 -0
  176. package/dist/chunk-OTDN3OUQ.js +215 -0
  177. package/dist/chunk-OTDN3OUQ.js.map +1 -0
  178. package/dist/chunk-PNZSGAB2.js +114 -0
  179. package/dist/chunk-PNZSGAB2.js.map +1 -0
  180. package/dist/chunk-PRWIX6UW.js +21 -0
  181. package/dist/chunk-PRWIX6UW.js.map +1 -0
  182. package/dist/chunk-PSXUNOVU.js +7 -0
  183. package/dist/chunk-PSXUNOVU.js.map +1 -0
  184. package/dist/chunk-QLTJSCE6.js +44 -0
  185. package/dist/chunk-QLTJSCE6.js.map +1 -0
  186. package/dist/chunk-RC23QROE.js +447 -0
  187. package/dist/chunk-RC23QROE.js.map +1 -0
  188. package/dist/chunk-RDVTWIYY.js +212 -0
  189. package/dist/chunk-RDVTWIYY.js.map +1 -0
  190. package/dist/chunk-RFH7N6EP.js +36 -0
  191. package/dist/chunk-RFH7N6EP.js.map +1 -0
  192. package/dist/chunk-RHVN6NA7.js +134 -0
  193. package/dist/chunk-RHVN6NA7.js.map +1 -0
  194. package/dist/chunk-S7C6TIIF.js +21 -0
  195. package/dist/chunk-S7C6TIIF.js.map +1 -0
  196. package/dist/chunk-SNQ3TOWP.js +20 -0
  197. package/dist/chunk-SNQ3TOWP.js.map +1 -0
  198. package/dist/chunk-SOVM2VEK.js +14 -0
  199. package/dist/chunk-SOVM2VEK.js.map +1 -0
  200. package/dist/chunk-SQDOBLBP.js +13 -0
  201. package/dist/chunk-SQDOBLBP.js.map +1 -0
  202. package/dist/chunk-SR7F3TJY.js +130 -0
  203. package/dist/chunk-SR7F3TJY.js.map +1 -0
  204. package/dist/chunk-SZVPIHWE.js +129 -0
  205. package/dist/chunk-SZVPIHWE.js.map +1 -0
  206. package/dist/chunk-T4BIIU5E.js +89 -0
  207. package/dist/chunk-T4BIIU5E.js.map +1 -0
  208. package/dist/chunk-T6SCOJF4.js +92 -0
  209. package/dist/chunk-T6SCOJF4.js.map +1 -0
  210. package/dist/chunk-TNXH7BJS.js +48 -0
  211. package/dist/chunk-TNXH7BJS.js.map +1 -0
  212. package/dist/chunk-U64T4YZE.js +9 -0
  213. package/dist/chunk-U64T4YZE.js.map +1 -0
  214. package/dist/chunk-UQ5EHOH2.js +39 -0
  215. package/dist/chunk-UQ5EHOH2.js.map +1 -0
  216. package/dist/chunk-UTN4GBPQ.js +1 -0
  217. package/dist/chunk-UTN4GBPQ.js.map +1 -0
  218. package/dist/chunk-V4AF6DI4.js +16 -0
  219. package/dist/chunk-V4AF6DI4.js.map +1 -0
  220. package/dist/chunk-W72PRNJY.js +126 -0
  221. package/dist/chunk-W72PRNJY.js.map +1 -0
  222. package/dist/chunk-WL67FZGF.js +21 -0
  223. package/dist/chunk-WL67FZGF.js.map +1 -0
  224. package/dist/chunk-WWGYCIJX.js +29 -0
  225. package/dist/chunk-WWGYCIJX.js.map +1 -0
  226. package/dist/chunk-X2GMTYPA.js +50 -0
  227. package/dist/chunk-X2GMTYPA.js.map +1 -0
  228. package/dist/chunk-XCEI7NUH.js +41 -0
  229. package/dist/chunk-XCEI7NUH.js.map +1 -0
  230. package/dist/chunk-Y7GDG744.js +88 -0
  231. package/dist/chunk-Y7GDG744.js.map +1 -0
  232. package/dist/chunk-Y7RRSEOC.js +9 -0
  233. package/dist/chunk-Y7RRSEOC.js.map +1 -0
  234. package/dist/chunk-YLPAPPLW.js +75 -0
  235. package/dist/chunk-YLPAPPLW.js.map +1 -0
  236. package/dist/chunk-YPWODKD5.js +184 -0
  237. package/dist/chunk-YPWODKD5.js.map +1 -0
  238. package/dist/chunk-YSLTTQLC.js +25 -0
  239. package/dist/chunk-YSLTTQLC.js.map +1 -0
  240. package/dist/chunk-YTN6BKWA.js +121 -0
  241. package/dist/chunk-YTN6BKWA.js.map +1 -0
  242. package/dist/chunk-Z7PQCAVK.js +200 -0
  243. package/dist/chunk-Z7PQCAVK.js.map +1 -0
  244. package/dist/chunk-ZUKFQL6E.js +47 -0
  245. package/dist/chunk-ZUKFQL6E.js.map +1 -0
  246. package/dist/chunk-ZUMULSEQ.js +1 -0
  247. package/dist/chunk-ZUMULSEQ.js.map +1 -0
  248. package/dist/runtime/analytics/index.js +8 -41
  249. package/dist/runtime/analytics/index.js.map +1 -1
  250. package/dist/runtime/analytics/types.js +8 -41
  251. package/dist/runtime/analytics/types.js.map +1 -1
  252. package/dist/runtime/base-classes/activity-entity-repository.js +6 -312
  253. package/dist/runtime/base-classes/activity-entity-repository.js.map +1 -1
  254. package/dist/runtime/base-classes/activity-entity-service.js +6 -212
  255. package/dist/runtime/base-classes/activity-entity-service.js.map +1 -1
  256. package/dist/runtime/base-classes/base-read-use-cases.js +5 -27
  257. package/dist/runtime/base-classes/base-read-use-cases.js.map +1 -1
  258. package/dist/runtime/base-classes/base-repository.js +5 -277
  259. package/dist/runtime/base-classes/base-repository.js.map +1 -1
  260. package/dist/runtime/base-classes/base-service.js +5 -184
  261. package/dist/runtime/base-classes/base-service.js.map +1 -1
  262. package/dist/runtime/base-classes/index.js +59 -1076
  263. package/dist/runtime/base-classes/index.js.map +1 -1
  264. package/dist/runtime/base-classes/integrated-entity-repository.js +6 -486
  265. package/dist/runtime/base-classes/integrated-entity-repository.js.map +1 -1
  266. package/dist/runtime/base-classes/integrated-entity-service.js +6 -213
  267. package/dist/runtime/base-classes/integrated-entity-service.js.map +1 -1
  268. package/dist/runtime/base-classes/junction-integration-repository.js +8 -448
  269. package/dist/runtime/base-classes/junction-integration-repository.js.map +1 -1
  270. package/dist/runtime/base-classes/knowledge-entity-repository.js +6 -283
  271. package/dist/runtime/base-classes/knowledge-entity-repository.js.map +1 -1
  272. package/dist/runtime/base-classes/knowledge-entity-service.js +6 -190
  273. package/dist/runtime/base-classes/knowledge-entity-service.js.map +1 -1
  274. package/dist/runtime/base-classes/lifecycle-events.js +8 -70
  275. package/dist/runtime/base-classes/lifecycle-events.js.map +1 -1
  276. package/dist/runtime/base-classes/metadata-entity-repository.js +6 -330
  277. package/dist/runtime/base-classes/metadata-entity-repository.js.map +1 -1
  278. package/dist/runtime/base-classes/metadata-entity-service.js +6 -212
  279. package/dist/runtime/base-classes/metadata-entity-service.js.map +1 -1
  280. package/dist/runtime/base-classes/tenant-context.js +10 -36
  281. package/dist/runtime/base-classes/tenant-context.js.map +1 -1
  282. package/dist/runtime/base-classes/with-analytics.js +4 -7
  283. package/dist/runtime/base-classes/with-analytics.js.map +1 -1
  284. package/dist/runtime/constants/tokens.js +5 -3
  285. package/dist/runtime/constants/tokens.js.map +1 -1
  286. package/dist/runtime/eav-helpers.js +2 -0
  287. package/dist/runtime/eav-helpers.js.map +1 -1
  288. package/dist/runtime/pipes/zod-validation.pipe.js +3 -10
  289. package/dist/runtime/pipes/zod-validation.pipe.js.map +1 -1
  290. package/dist/runtime/shared/openapi/error-response.dto.js +5 -8
  291. package/dist/runtime/shared/openapi/error-response.dto.js.map +1 -1
  292. package/dist/runtime/shared/openapi/errors.js +5 -19
  293. package/dist/runtime/shared/openapi/errors.js.map +1 -1
  294. package/dist/runtime/shared/openapi/index.js +15 -106
  295. package/dist/runtime/shared/openapi/index.js.map +1 -1
  296. package/dist/runtime/shared/openapi/registry.js +6 -103
  297. package/dist/runtime/shared/openapi/registry.js.map +1 -1
  298. package/dist/runtime/shared/openapi/registry.tokens.js +4 -2
  299. package/dist/runtime/shared/openapi/registry.tokens.js.map +1 -1
  300. package/dist/runtime/subsystems/analytics/analytics.module.js +8 -117
  301. package/dist/runtime/subsystems/analytics/analytics.module.js.map +1 -1
  302. package/dist/runtime/subsystems/analytics/analytics.tokens.js +7 -8
  303. package/dist/runtime/subsystems/analytics/analytics.tokens.js.map +1 -1
  304. package/dist/runtime/subsystems/analytics/cube-backend.js +6 -71
  305. package/dist/runtime/subsystems/analytics/cube-backend.js.map +1 -1
  306. package/dist/runtime/subsystems/analytics/index.js +16 -117
  307. package/dist/runtime/subsystems/analytics/index.js.map +1 -1
  308. package/dist/runtime/subsystems/analytics/noop-backend.js +4 -21
  309. package/dist/runtime/subsystems/analytics/noop-backend.js.map +1 -1
  310. package/dist/runtime/subsystems/auth/auth-oauth-state.schema.js +4 -8
  311. package/dist/runtime/subsystems/auth/auth-oauth-state.schema.js.map +1 -1
  312. package/dist/runtime/subsystems/auth/auth.module.js +12 -359
  313. package/dist/runtime/subsystems/auth/auth.module.js.map +1 -1
  314. package/dist/runtime/subsystems/auth/auth.tokens.js +12 -13
  315. package/dist/runtime/subsystems/auth/auth.tokens.js.map +1 -1
  316. package/dist/runtime/subsystems/auth/backends/encryption-key/env.js +4 -49
  317. package/dist/runtime/subsystems/auth/backends/encryption-key/env.js.map +1 -1
  318. package/dist/runtime/subsystems/auth/backends/state-store.drizzle-backend.js +6 -64
  319. package/dist/runtime/subsystems/auth/backends/state-store.drizzle-backend.js.map +1 -1
  320. package/dist/runtime/subsystems/auth/backends/state-store.memory-backend.js +5 -47
  321. package/dist/runtime/subsystems/auth/backends/state-store.memory-backend.js.map +1 -1
  322. package/dist/runtime/subsystems/auth/controllers/auth.controller.js +5 -139
  323. package/dist/runtime/subsystems/auth/controllers/auth.controller.js.map +1 -1
  324. package/dist/runtime/subsystems/auth/index.js +53 -542
  325. package/dist/runtime/subsystems/auth/index.js.map +1 -1
  326. package/dist/runtime/subsystems/auth/middleware/requester-context.js +9 -65
  327. package/dist/runtime/subsystems/auth/middleware/requester-context.js.map +1 -1
  328. package/dist/runtime/subsystems/auth/protocols/oauth-state-store.js +4 -9
  329. package/dist/runtime/subsystems/auth/protocols/oauth-state-store.js.map +1 -1
  330. package/dist/runtime/subsystems/auth/runtime/connection-broken.error.js +4 -15
  331. package/dist/runtime/subsystems/auth/runtime/connection-broken.error.js.map +1 -1
  332. package/dist/runtime/subsystems/auth/runtime/oauth2-refresh.strategy.js +5 -104
  333. package/dist/runtime/subsystems/auth/runtime/oauth2-refresh.strategy.js.map +1 -1
  334. package/dist/runtime/subsystems/auth/runtime/session-expired.error.js +5 -16
  335. package/dist/runtime/subsystems/auth/runtime/session-expired.error.js.map +1 -1
  336. package/dist/runtime/subsystems/auth/runtime/with-auth-retry.js +5 -29
  337. package/dist/runtime/subsystems/auth/runtime/with-auth-retry.js.map +1 -1
  338. package/dist/runtime/subsystems/bridge/assert-tenant-id.js +5 -18
  339. package/dist/runtime/subsystems/bridge/assert-tenant-id.js.map +1 -1
  340. package/dist/runtime/subsystems/bridge/bridge-delivery-handler.js +12 -184
  341. package/dist/runtime/subsystems/bridge/bridge-delivery-handler.js.map +1 -1
  342. package/dist/runtime/subsystems/bridge/bridge-delivery.drizzle-backend.js +10 -448
  343. package/dist/runtime/subsystems/bridge/bridge-delivery.drizzle-backend.js.map +1 -1
  344. package/dist/runtime/subsystems/bridge/bridge-delivery.memory-backend.js +5 -126
  345. package/dist/runtime/subsystems/bridge/bridge-delivery.memory-backend.js.map +1 -1
  346. package/dist/runtime/subsystems/bridge/bridge-delivery.schema.js +6 -308
  347. package/dist/runtime/subsystems/bridge/bridge-delivery.schema.js.map +1 -1
  348. package/dist/runtime/subsystems/bridge/bridge-errors.js +6 -35
  349. package/dist/runtime/subsystems/bridge/bridge-errors.js.map +1 -1
  350. package/dist/runtime/subsystems/bridge/bridge-outbox-drain-hook.js +14 -606
  351. package/dist/runtime/subsystems/bridge/bridge-outbox-drain-hook.js.map +1 -1
  352. package/dist/runtime/subsystems/bridge/bridge.module.js +35 -3476
  353. package/dist/runtime/subsystems/bridge/bridge.module.js.map +1 -1
  354. package/dist/runtime/subsystems/bridge/bridge.tokens.js +9 -7
  355. package/dist/runtime/subsystems/bridge/bridge.tokens.js.map +1 -1
  356. package/dist/runtime/subsystems/bridge/event-flow.service.js +11 -137
  357. package/dist/runtime/subsystems/bridge/event-flow.service.js.map +1 -1
  358. package/dist/runtime/subsystems/bridge/generated/registry.js +4 -2
  359. package/dist/runtime/subsystems/bridge/generated/registry.js.map +1 -1
  360. package/dist/runtime/subsystems/bridge/index.js +60 -3470
  361. package/dist/runtime/subsystems/bridge/index.js.map +1 -1
  362. package/dist/runtime/subsystems/bridge/reserved-pools.js +4 -6
  363. package/dist/runtime/subsystems/bridge/reserved-pools.js.map +1 -1
  364. package/dist/runtime/subsystems/cache/cache.drizzle-backend.js +10 -133
  365. package/dist/runtime/subsystems/cache/cache.drizzle-backend.js.map +1 -1
  366. package/dist/runtime/subsystems/cache/cache.memory-backend.js +6 -101
  367. package/dist/runtime/subsystems/cache/cache.memory-backend.js.map +1 -1
  368. package/dist/runtime/subsystems/cache/cache.module.js +10 -278
  369. package/dist/runtime/subsystems/cache/cache.module.js.map +1 -1
  370. package/dist/runtime/subsystems/cache/cache.schema.js +4 -14
  371. package/dist/runtime/subsystems/cache/cache.schema.js.map +1 -1
  372. package/dist/runtime/subsystems/cache/cache.tokens.js +6 -7
  373. package/dist/runtime/subsystems/cache/cache.tokens.js.map +1 -1
  374. package/dist/runtime/subsystems/cache/index.js +20 -278
  375. package/dist/runtime/subsystems/cache/index.js.map +1 -1
  376. package/dist/runtime/subsystems/events/domain-events.schema.js +3 -72
  377. package/dist/runtime/subsystems/events/domain-events.schema.js.map +1 -1
  378. package/dist/runtime/subsystems/events/event-bus.drizzle-backend.js +9 -413
  379. package/dist/runtime/subsystems/events/event-bus.drizzle-backend.js.map +1 -1
  380. package/dist/runtime/subsystems/events/event-bus.memory-backend.js +7 -235
  381. package/dist/runtime/subsystems/events/event-bus.memory-backend.js.map +1 -1
  382. package/dist/runtime/subsystems/events/event-bus.redis-backend.js +8 -20
  383. package/dist/runtime/subsystems/events/event-bus.redis-backend.js.map +1 -1
  384. package/dist/runtime/subsystems/events/event-keyset-cursor.js +8 -30
  385. package/dist/runtime/subsystems/events/event-keyset-cursor.js.map +1 -1
  386. package/dist/runtime/subsystems/events/event-read.protocol.js +2 -0
  387. package/dist/runtime/subsystems/events/event-read.protocol.js.map +1 -1
  388. package/dist/runtime/subsystems/events/events-errors.js +4 -11
  389. package/dist/runtime/subsystems/events/events-errors.js.map +1 -1
  390. package/dist/runtime/subsystems/events/events.module.js +15 -949
  391. package/dist/runtime/subsystems/events/events.module.js.map +1 -1
  392. package/dist/runtime/subsystems/events/events.tokens.js +10 -11
  393. package/dist/runtime/subsystems/events/events.tokens.js.map +1 -1
  394. package/dist/runtime/subsystems/events/generated/bus.js +9 -240
  395. package/dist/runtime/subsystems/events/generated/bus.js.map +1 -1
  396. package/dist/runtime/subsystems/events/generated/index.js +23 -240
  397. package/dist/runtime/subsystems/events/generated/index.js.map +1 -1
  398. package/dist/runtime/subsystems/events/generated/registry.js +5 -82
  399. package/dist/runtime/subsystems/events/generated/registry.js.map +1 -1
  400. package/dist/runtime/subsystems/events/generated/schemas.js +12 -52
  401. package/dist/runtime/subsystems/events/generated/schemas.js.map +1 -1
  402. package/dist/runtime/subsystems/events/generated/types.js +1 -0
  403. package/dist/runtime/subsystems/events/index.js +32 -949
  404. package/dist/runtime/subsystems/events/index.js.map +1 -1
  405. package/dist/runtime/subsystems/index.d.ts +5 -1
  406. package/dist/runtime/subsystems/index.js +182 -5912
  407. package/dist/runtime/subsystems/index.js.map +1 -1
  408. package/dist/runtime/subsystems/integration/build-change-source.js +6 -178
  409. package/dist/runtime/subsystems/integration/build-change-source.js.map +1 -1
  410. package/dist/runtime/subsystems/integration/deep-equal.differ.js +4 -109
  411. package/dist/runtime/subsystems/integration/deep-equal.differ.js.map +1 -1
  412. package/dist/runtime/subsystems/integration/detection-config.schema.js +11 -78
  413. package/dist/runtime/subsystems/integration/detection-config.schema.js.map +1 -1
  414. package/dist/runtime/subsystems/integration/entity-change-source-registry.memory.js +5 -30
  415. package/dist/runtime/subsystems/integration/entity-change-source-registry.memory.js.map +1 -1
  416. package/dist/runtime/subsystems/integration/entity-change-source-registry.protocol.js +4 -9
  417. package/dist/runtime/subsystems/integration/entity-change-source-registry.protocol.js.map +1 -1
  418. package/dist/runtime/subsystems/integration/execute-integration.use-case.js +6 -239
  419. package/dist/runtime/subsystems/integration/execute-integration.use-case.js.map +1 -1
  420. package/dist/runtime/subsystems/integration/incremental-read.js +5 -144
  421. package/dist/runtime/subsystems/integration/incremental-read.js.map +1 -1
  422. package/dist/runtime/subsystems/integration/index.js +83 -1352
  423. package/dist/runtime/subsystems/integration/index.js.map +1 -1
  424. package/dist/runtime/subsystems/integration/integration-audit.schema.js +10 -155
  425. package/dist/runtime/subsystems/integration/integration-audit.schema.js.map +1 -1
  426. package/dist/runtime/subsystems/integration/integration-cursor-store.drizzle-backend.js +7 -270
  427. package/dist/runtime/subsystems/integration/integration-cursor-store.drizzle-backend.js.map +1 -1
  428. package/dist/runtime/subsystems/integration/integration-cursor-store.memory-backend.js +4 -65
  429. package/dist/runtime/subsystems/integration/integration-cursor-store.memory-backend.js.map +1 -1
  430. package/dist/runtime/subsystems/integration/integration-errors.js +5 -15
  431. package/dist/runtime/subsystems/integration/integration-errors.js.map +1 -1
  432. package/dist/runtime/subsystems/integration/integration-field-diff.protocol.js +5 -7
  433. package/dist/runtime/subsystems/integration/integration-field-diff.protocol.js.map +1 -1
  434. package/dist/runtime/subsystems/integration/integration-run-recorder.drizzle-backend.js +8 -303
  435. package/dist/runtime/subsystems/integration/integration-run-recorder.drizzle-backend.js.map +1 -1
  436. package/dist/runtime/subsystems/integration/integration-run-recorder.memory-backend.js +5 -125
  437. package/dist/runtime/subsystems/integration/integration-run-recorder.memory-backend.js.map +1 -1
  438. package/dist/runtime/subsystems/integration/integration.module.js +13 -700
  439. package/dist/runtime/subsystems/integration/integration.module.js.map +1 -1
  440. package/dist/runtime/subsystems/integration/integration.tokens.js +11 -9
  441. package/dist/runtime/subsystems/integration/integration.tokens.js.map +1 -1
  442. package/dist/runtime/subsystems/integration/loopback.middleware.js +4 -16
  443. package/dist/runtime/subsystems/integration/loopback.middleware.js.map +1 -1
  444. package/dist/runtime/subsystems/integration/poll-change-source.d.ts +1 -1
  445. package/dist/runtime/subsystems/integration/poll-change-source.js +4 -89
  446. package/dist/runtime/subsystems/integration/poll-change-source.js.map +1 -1
  447. package/dist/runtime/subsystems/integration/webhook-change-source.d.ts +4 -3
  448. package/dist/runtime/subsystems/integration/webhook-change-source.js +4 -70
  449. package/dist/runtime/subsystems/integration/webhook-change-source.js.map +1 -1
  450. package/dist/runtime/subsystems/jobs/bullmq.config.js +9 -140
  451. package/dist/runtime/subsystems/jobs/bullmq.config.js.map +1 -1
  452. package/dist/runtime/subsystems/jobs/index.js +88 -2691
  453. package/dist/runtime/subsystems/jobs/index.js.map +1 -1
  454. package/dist/runtime/subsystems/jobs/job-handler.base.js +10 -49
  455. package/dist/runtime/subsystems/jobs/job-handler.base.js.map +1 -1
  456. package/dist/runtime/subsystems/jobs/job-orchestration.schema.js +13 -152
  457. package/dist/runtime/subsystems/jobs/job-orchestration.schema.js.map +1 -1
  458. package/dist/runtime/subsystems/jobs/job-orchestrator.bullmq-backend.js +36 -699
  459. package/dist/runtime/subsystems/jobs/job-orchestrator.bullmq-backend.js.map +1 -1
  460. package/dist/runtime/subsystems/jobs/job-orchestrator.drizzle-backend.js +10 -564
  461. package/dist/runtime/subsystems/jobs/job-orchestrator.drizzle-backend.js.map +1 -1
  462. package/dist/runtime/subsystems/jobs/job-orchestrator.memory-backend.js +10 -824
  463. package/dist/runtime/subsystems/jobs/job-orchestrator.memory-backend.js.map +1 -1
  464. package/dist/runtime/subsystems/jobs/job-run-keyset-cursor.js +9 -51
  465. package/dist/runtime/subsystems/jobs/job-run-keyset-cursor.js.map +1 -1
  466. package/dist/runtime/subsystems/jobs/job-run-service.drizzle-backend.js +9 -416
  467. package/dist/runtime/subsystems/jobs/job-run-service.drizzle-backend.js.map +1 -1
  468. package/dist/runtime/subsystems/jobs/job-run-service.memory-backend.js +9 -290
  469. package/dist/runtime/subsystems/jobs/job-run-service.memory-backend.js.map +1 -1
  470. package/dist/runtime/subsystems/jobs/job-step-service.drizzle-backend.js +5 -213
  471. package/dist/runtime/subsystems/jobs/job-step-service.drizzle-backend.js.map +1 -1
  472. package/dist/runtime/subsystems/jobs/job-step-service.memory-backend.js +5 -131
  473. package/dist/runtime/subsystems/jobs/job-step-service.memory-backend.js.map +1 -1
  474. package/dist/runtime/subsystems/jobs/job-worker.bullmq-backend.js +9 -175
  475. package/dist/runtime/subsystems/jobs/job-worker.bullmq-backend.js.map +1 -1
  476. package/dist/runtime/subsystems/jobs/job-worker.js +14 -613
  477. package/dist/runtime/subsystems/jobs/job-worker.js.map +1 -1
  478. package/dist/runtime/subsystems/jobs/job-worker.module.js +23 -2647
  479. package/dist/runtime/subsystems/jobs/job-worker.module.js.map +1 -1
  480. package/dist/runtime/subsystems/jobs/jobs-domain.module.js +19 -1897
  481. package/dist/runtime/subsystems/jobs/jobs-domain.module.js.map +1 -1
  482. package/dist/runtime/subsystems/jobs/jobs-domain.tokens.js +8 -9
  483. package/dist/runtime/subsystems/jobs/jobs-domain.tokens.js.map +1 -1
  484. package/dist/runtime/subsystems/jobs/jobs-errors.js +10 -78
  485. package/dist/runtime/subsystems/jobs/jobs-errors.js.map +1 -1
  486. package/dist/runtime/subsystems/jobs/memory-job-store.js +4 -15
  487. package/dist/runtime/subsystems/jobs/memory-job-store.js.map +1 -1
  488. package/dist/runtime/subsystems/jobs/pool-config.loader.js +9 -124
  489. package/dist/runtime/subsystems/jobs/pool-config.loader.js.map +1 -1
  490. package/dist/runtime/subsystems/observability/index.js +21 -310
  491. package/dist/runtime/subsystems/observability/index.js.map +1 -1
  492. package/dist/runtime/subsystems/observability/observability-errors.js +4 -9
  493. package/dist/runtime/subsystems/observability/observability-errors.js.map +1 -1
  494. package/dist/runtime/subsystems/observability/observability.module.js +11 -300
  495. package/dist/runtime/subsystems/observability/observability.module.js.map +1 -1
  496. package/dist/runtime/subsystems/observability/observability.service.js +9 -197
  497. package/dist/runtime/subsystems/observability/observability.service.js.map +1 -1
  498. package/dist/runtime/subsystems/observability/observability.tokens.js +5 -3
  499. package/dist/runtime/subsystems/observability/observability.tokens.js.map +1 -1
  500. package/dist/runtime/subsystems/observability/reporters/bridge-metrics.reporter.js +4 -84
  501. package/dist/runtime/subsystems/observability/reporters/bridge-metrics.reporter.js.map +1 -1
  502. package/dist/runtime/subsystems/observability/reporters/index.js +5 -84
  503. package/dist/runtime/subsystems/observability/reporters/index.js.map +1 -1
  504. package/dist/runtime/subsystems/storage/index.js +15 -200
  505. package/dist/runtime/subsystems/storage/index.js.map +1 -1
  506. package/dist/runtime/subsystems/storage/storage.local-backend.js +4 -103
  507. package/dist/runtime/subsystems/storage/storage.local-backend.js.map +1 -1
  508. package/dist/runtime/subsystems/storage/storage.memory-backend.js +5 -68
  509. package/dist/runtime/subsystems/storage/storage.memory-backend.js.map +1 -1
  510. package/dist/runtime/subsystems/storage/storage.module.js +8 -200
  511. package/dist/runtime/subsystems/storage/storage.module.js.map +1 -1
  512. package/dist/runtime/subsystems/storage/storage.tokens.js +5 -6
  513. package/dist/runtime/subsystems/storage/storage.tokens.js.map +1 -1
  514. package/dist/runtime/subsystems/storage/storage.utils.js +4 -14
  515. package/dist/runtime/subsystems/storage/storage.utils.js.map +1 -1
  516. package/dist/runtime/subsystems/token-key.js +5 -3
  517. package/dist/runtime/subsystems/token-key.js.map +1 -1
  518. package/dist/src/cli/index.js +637 -5454
  519. package/dist/src/cli/index.js.map +1 -1
  520. package/dist/src/index.js +68 -4170
  521. package/dist/src/index.js.map +1 -1
  522. package/package.json +1 -1
  523. package/runtime/subsystems/bridge/bridge-outbox-drain-hook.ts +44 -21
  524. package/runtime/subsystems/index.ts +27 -0
  525. package/runtime/subsystems/integration/poll-change-source.ts +10 -7
  526. package/runtime/subsystems/integration/webhook-change-source.ts +12 -8
  527. package/runtime/subsystems/jobs/job-worker.ts +17 -11
@@ -0,0 +1,184 @@
1
+ import {
2
+ JOB_RUN_SERVICE
3
+ } from "./chunk-BIO6F7YI.js";
4
+ import {
5
+ EVENT_READ_PORT
6
+ } from "./chunk-H5NH7KPE.js";
7
+ import {
8
+ BRIDGE_DELIVERY_REPO
9
+ } from "./chunk-4LH67P4U.js";
10
+ import {
11
+ INTEGRATION_CURSOR_STORE,
12
+ INTEGRATION_RUN_RECORDER
13
+ } from "./chunk-S7C6TIIF.js";
14
+ import {
15
+ __decorateClass,
16
+ __decorateParam,
17
+ __publicField
18
+ } from "./chunk-2E224ZSN.js";
19
+
20
+ // runtime/subsystems/observability/observability.service.ts
21
+ import { Inject, Injectable, Optional } from "@nestjs/common";
22
+ var MAX_TIMELINE_PAGES = 50;
23
+ var ObservabilityService = class {
24
+ constructor(jobRuns, bridge, integrationRuns, cursors, events) {
25
+ this.jobRuns = jobRuns;
26
+ this.bridge = bridge;
27
+ this.integrationRuns = integrationRuns;
28
+ this.cursors = cursors;
29
+ this.events = events;
30
+ }
31
+ jobRuns;
32
+ bridge;
33
+ integrationRuns;
34
+ cursors;
35
+ events;
36
+ async getPoolDepths(tenantId) {
37
+ if (!this.jobRuns) return [];
38
+ return this.jobRuns.countByPoolAndStatus(tenantId);
39
+ }
40
+ async getRecentFailedJobs(limit, tenantId) {
41
+ if (!this.jobRuns) return [];
42
+ return this.jobRuns.listRecentFailed(limit, tenantId);
43
+ }
44
+ async getBridgeDeliveryHistogram(windowHours, tenantId) {
45
+ if (!this.bridge) return { ...ObservabilityService.EMPTY_HISTOGRAM };
46
+ return this.bridge.getStatusHistogram(windowHours, tenantId);
47
+ }
48
+ async getRecentIntegrationRuns(limit, subscriptionId, tenantId) {
49
+ if (!this.integrationRuns) return [];
50
+ return this.integrationRuns.listRecent(limit, subscriptionId, tenantId);
51
+ }
52
+ async getCursors(tenantId) {
53
+ if (!this.cursors) return [];
54
+ return this.cursors.listAll(tenantId);
55
+ }
56
+ async listJobRuns(query) {
57
+ if (!this.jobRuns) {
58
+ return { ...ObservabilityService.EMPTY_JOB_RUN_PAGE };
59
+ }
60
+ return this.jobRuns.listJobRuns(query);
61
+ }
62
+ async listEvents(query) {
63
+ if (!this.events) {
64
+ return { ...ObservabilityService.EMPTY_EVENT_PAGE };
65
+ }
66
+ return this.events.listEvents(query);
67
+ }
68
+ async getCorrelationTimeline(rootRunId, tenantId) {
69
+ const runs = await this.collectRuns(rootRunId, tenantId);
70
+ const events = await this.collectEvents(rootRunId, tenantId);
71
+ const entries = [
72
+ ...runs.map(
73
+ (run) => ({
74
+ kind: "job_run",
75
+ at: run.createdAt,
76
+ run
77
+ })
78
+ ),
79
+ ...events.map(
80
+ (event) => ({
81
+ kind: "event",
82
+ at: event.occurredAt,
83
+ event
84
+ })
85
+ )
86
+ ];
87
+ entries.sort((a, b) => {
88
+ const dt = a.at.getTime() - b.at.getTime();
89
+ if (dt !== 0) return dt;
90
+ if (a.kind === b.kind) return 0;
91
+ return a.kind === "job_run" ? -1 : 1;
92
+ });
93
+ const startedAt = entries.length > 0 ? entries[0].at : null;
94
+ const lastActivityAt = entries.length > 0 ? entries[entries.length - 1].at : null;
95
+ return {
96
+ rootRunId,
97
+ entries,
98
+ summary: {
99
+ runCount: runs.length,
100
+ eventCount: events.length,
101
+ startedAt,
102
+ lastActivityAt
103
+ }
104
+ };
105
+ }
106
+ /**
107
+ * Drain every `job_run` sharing `rootRunId` by walking the keyset cursor.
108
+ * Empty when the jobs subsystem is absent.
109
+ */
110
+ async collectRuns(rootRunId, tenantId) {
111
+ if (!this.jobRuns) return [];
112
+ const out = [];
113
+ let cursor;
114
+ for (let page = 0; page < MAX_TIMELINE_PAGES; page += 1) {
115
+ const result = await this.jobRuns.listJobRuns({
116
+ rootRunId,
117
+ tenantId,
118
+ cursor
119
+ });
120
+ out.push(...result.items);
121
+ if (!result.nextCursor) break;
122
+ cursor = result.nextCursor;
123
+ }
124
+ return out;
125
+ }
126
+ /**
127
+ * Drain every `domain_event` whose `metadata.rootRunId` matches by walking
128
+ * the keyset cursor. Empty when the events read port is absent.
129
+ */
130
+ async collectEvents(rootRunId, tenantId) {
131
+ if (!this.events) return [];
132
+ const out = [];
133
+ let cursor;
134
+ for (let page = 0; page < MAX_TIMELINE_PAGES; page += 1) {
135
+ const result = await this.events.listEvents({
136
+ rootRunId,
137
+ tenantId,
138
+ cursor
139
+ });
140
+ out.push(...result.items);
141
+ if (!result.nextCursor) break;
142
+ cursor = result.nextCursor;
143
+ }
144
+ return out;
145
+ }
146
+ };
147
+ /**
148
+ * All-zero histogram used when the bridge subsystem is absent. Matches
149
+ * the bridge protocol's "fixed keys, zero-filled" contract so consumers
150
+ * never branch on presence.
151
+ */
152
+ __publicField(ObservabilityService, "EMPTY_HISTOGRAM", {
153
+ pending: 0,
154
+ delivered: 0,
155
+ skipped: 0,
156
+ failed: 0
157
+ });
158
+ /** Empty page used when a sibling read port is absent. */
159
+ __publicField(ObservabilityService, "EMPTY_JOB_RUN_PAGE", {
160
+ items: [],
161
+ nextCursor: null
162
+ });
163
+ __publicField(ObservabilityService, "EMPTY_EVENT_PAGE", {
164
+ items: [],
165
+ nextCursor: null
166
+ });
167
+ ObservabilityService = __decorateClass([
168
+ Injectable(),
169
+ __decorateParam(0, Optional()),
170
+ __decorateParam(0, Inject(JOB_RUN_SERVICE)),
171
+ __decorateParam(1, Optional()),
172
+ __decorateParam(1, Inject(BRIDGE_DELIVERY_REPO)),
173
+ __decorateParam(2, Optional()),
174
+ __decorateParam(2, Inject(INTEGRATION_RUN_RECORDER)),
175
+ __decorateParam(3, Optional()),
176
+ __decorateParam(3, Inject(INTEGRATION_CURSOR_STORE)),
177
+ __decorateParam(4, Optional()),
178
+ __decorateParam(4, Inject(EVENT_READ_PORT))
179
+ ], ObservabilityService);
180
+
181
+ export {
182
+ ObservabilityService
183
+ };
184
+ //# sourceMappingURL=chunk-YPWODKD5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../runtime/subsystems/observability/observability.service.ts"],"sourcesContent":["/**\n * ObservabilityService — `IObservability` combiner implementation\n * (ADR-025, OBS-5).\n *\n * Composes read methods across the jobs, bridge, and integration subsystems via\n * DI. Owns no state, no schema, no SQL. Every method is a one-line\n * delegation to the sibling port that already encodes the semantics.\n *\n * # Missing-port degradation\n *\n * Every sibling is injected with `@Optional()`. When the consumer's app\n * has not wired a given subsystem, the corresponding field is `undefined`\n * and the delegating method returns an empty shape:\n * - array methods return `[]`\n * - `getBridgeDeliveryHistogram` returns `{ pending: 0, delivered: 0,\n * skipped: 0, failed: 0 }` (matches the bridge protocol's fixed-keys\n * contract so consumers can render a 4-row chart unconditionally).\n *\n * Graceful absence is the whole point of the combiner pattern (ADR-025\n * §Shape, constraint 3) — a consumer that only installed the jobs\n * subsystem can still inject `OBSERVABILITY` and get useful job reads\n * without wiring the rest.\n *\n * # Multi-tenancy\n *\n * `tenantId` passes VERBATIM from the public method to the owning port.\n * `ObservabilityService` never re-implements tenant filtering. See\n * `.claude/skills/observability/SKILL.md` §3 and ADR-025.\n */\nimport { Inject, Injectable, Optional } from '@nestjs/common';\n\nimport { JOB_RUN_SERVICE } from '../jobs/jobs-domain.tokens';\nimport type {\n IJobRunService,\n JobRunFailure,\n JobRunPage,\n JobRunSummary,\n ListJobRunsQuery,\n PoolStatusCount,\n} from '../jobs/job-run-service.protocol';\n\nimport { EVENT_READ_PORT } from '../events/events.tokens';\nimport type {\n EventPage,\n EventSummary,\n IEventReadPort,\n ListEventsQuery,\n} from '../events/event-read.protocol';\n\nimport { BRIDGE_DELIVERY_REPO } from '../bridge/bridge.tokens';\nimport type { IJobBridge, StatusHistogram } from '../bridge/bridge.protocol';\n\nimport { INTEGRATION_CURSOR_STORE, INTEGRATION_RUN_RECORDER } from '../integration/integration.tokens';\nimport type {\n IIntegrationRunRecorder,\n IntegrationRunSummary,\n} from '../integration/integration-run-recorder.protocol';\nimport type {\n CursorSnapshot,\n ICursorStore,\n} from '../integration/integration-cursor-store.protocol';\n\nimport type {\n CorrelationTimeline,\n CorrelationTimelineEntry,\n IObservability,\n} from './observability.protocol';\n\n/**\n * Safety bound on how many pages the correlation timeline will walk when\n * draining a sibling port. A single run tree producing more than\n * 50 pages × default page size of correlated rows is pathological; cap to\n * keep the stitch bounded rather than unbounded-loop on bad data.\n */\nconst MAX_TIMELINE_PAGES = 50;\n\n@Injectable()\nexport class ObservabilityService implements IObservability {\n /**\n * All-zero histogram used when the bridge subsystem is absent. Matches\n * the bridge protocol's \"fixed keys, zero-filled\" contract so consumers\n * never branch on presence.\n */\n private static readonly EMPTY_HISTOGRAM: StatusHistogram = {\n pending: 0,\n delivered: 0,\n skipped: 0,\n failed: 0,\n };\n\n /** Empty page used when a sibling read port is absent. */\n private static readonly EMPTY_JOB_RUN_PAGE: JobRunPage = {\n items: [],\n nextCursor: null,\n };\n private static readonly EMPTY_EVENT_PAGE: EventPage = {\n items: [],\n nextCursor: null,\n };\n\n constructor(\n @Optional()\n @Inject(JOB_RUN_SERVICE)\n private readonly jobRuns?: IJobRunService,\n @Optional()\n @Inject(BRIDGE_DELIVERY_REPO)\n private readonly bridge?: IJobBridge,\n @Optional()\n @Inject(INTEGRATION_RUN_RECORDER)\n private readonly integrationRuns?: IIntegrationRunRecorder,\n @Optional()\n @Inject(INTEGRATION_CURSOR_STORE)\n private readonly cursors?: ICursorStore,\n @Optional()\n @Inject(EVENT_READ_PORT)\n private readonly events?: IEventReadPort | null,\n ) {}\n\n async getPoolDepths(tenantId?: string | null): Promise<PoolStatusCount[]> {\n if (!this.jobRuns) return [];\n return this.jobRuns.countByPoolAndStatus(tenantId);\n }\n\n async getRecentFailedJobs(\n limit: number,\n tenantId?: string | null,\n ): Promise<JobRunFailure[]> {\n if (!this.jobRuns) return [];\n return this.jobRuns.listRecentFailed(limit, tenantId);\n }\n\n async getBridgeDeliveryHistogram(\n windowHours: number,\n tenantId?: string | null,\n ): Promise<StatusHistogram> {\n if (!this.bridge) return { ...ObservabilityService.EMPTY_HISTOGRAM };\n return this.bridge.getStatusHistogram(windowHours, tenantId);\n }\n\n async getRecentIntegrationRuns(\n limit: number,\n subscriptionId?: string,\n tenantId?: string | null,\n ): Promise<IntegrationRunSummary[]> {\n if (!this.integrationRuns) return [];\n return this.integrationRuns.listRecent(limit, subscriptionId, tenantId);\n }\n\n async getCursors(tenantId?: string | null): Promise<CursorSnapshot[]> {\n if (!this.cursors) return [];\n return this.cursors.listAll(tenantId);\n }\n\n async listJobRuns(query?: ListJobRunsQuery): Promise<JobRunPage> {\n if (!this.jobRuns) {\n return { ...ObservabilityService.EMPTY_JOB_RUN_PAGE };\n }\n return this.jobRuns.listJobRuns(query);\n }\n\n async listEvents(query?: ListEventsQuery): Promise<EventPage> {\n if (!this.events) {\n return { ...ObservabilityService.EMPTY_EVENT_PAGE };\n }\n return this.events.listEvents(query);\n }\n\n async getCorrelationTimeline(\n rootRunId: string,\n tenantId?: string | null,\n ): Promise<CorrelationTimeline> {\n const runs = await this.collectRuns(rootRunId, tenantId);\n const events = await this.collectEvents(rootRunId, tenantId);\n\n const entries: CorrelationTimelineEntry[] = [\n ...runs.map(\n (run): CorrelationTimelineEntry => ({\n kind: 'job_run',\n at: run.createdAt,\n run,\n }),\n ),\n ...events.map(\n (event): CorrelationTimelineEntry => ({\n kind: 'event',\n at: event.occurredAt,\n event,\n }),\n ),\n ];\n\n // Ascending chronological order. Stable tie-break: job runs before\n // events at the same instant (the run that emits an event precedes it).\n entries.sort((a, b) => {\n const dt = a.at.getTime() - b.at.getTime();\n if (dt !== 0) return dt;\n if (a.kind === b.kind) return 0;\n return a.kind === 'job_run' ? -1 : 1;\n });\n\n const startedAt = entries.length > 0 ? entries[0]!.at : null;\n const lastActivityAt =\n entries.length > 0 ? entries[entries.length - 1]!.at : null;\n\n return {\n rootRunId,\n entries,\n summary: {\n runCount: runs.length,\n eventCount: events.length,\n startedAt,\n lastActivityAt,\n },\n };\n }\n\n /**\n * Drain every `job_run` sharing `rootRunId` by walking the keyset cursor.\n * Empty when the jobs subsystem is absent.\n */\n private async collectRuns(\n rootRunId: string,\n tenantId?: string | null,\n ): Promise<JobRunSummary[]> {\n if (!this.jobRuns) return [];\n const out: JobRunSummary[] = [];\n let cursor: string | undefined;\n for (let page = 0; page < MAX_TIMELINE_PAGES; page += 1) {\n const result = await this.jobRuns.listJobRuns({\n rootRunId,\n tenantId,\n cursor,\n });\n out.push(...result.items);\n if (!result.nextCursor) break;\n cursor = result.nextCursor;\n }\n return out;\n }\n\n /**\n * Drain every `domain_event` whose `metadata.rootRunId` matches by walking\n * the keyset cursor. Empty when the events read port is absent.\n */\n private async collectEvents(\n rootRunId: string,\n tenantId?: string | null,\n ): Promise<EventSummary[]> {\n if (!this.events) return [];\n const out: EventSummary[] = [];\n let cursor: string | undefined;\n for (let page = 0; page < MAX_TIMELINE_PAGES; page += 1) {\n const result = await this.events.listEvents({\n rootRunId,\n tenantId,\n cursor,\n });\n out.push(...result.items);\n if (!result.nextCursor) break;\n cursor = result.nextCursor;\n }\n return out;\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,25 @@
1
+ // runtime/shared/openapi/errors.ts
2
+ var OpenApiPeerDepMissingError = class extends Error {
3
+ name = "OpenApiPeerDepMissingError";
4
+ constructor(message) {
5
+ super(
6
+ message ?? "OpenApiRegistry requires @anatine/zod-openapi. Install it: bun add @anatine/zod-openapi"
7
+ );
8
+ }
9
+ };
10
+ var DuplicateSchemaError = class extends Error {
11
+ constructor(schemaName) {
12
+ super(
13
+ `DuplicateSchemaError: schema '${schemaName}' is already registered. Each schema name must be unique within the OpenApiRegistry.`
14
+ );
15
+ this.schemaName = schemaName;
16
+ }
17
+ schemaName;
18
+ name = "DuplicateSchemaError";
19
+ };
20
+
21
+ export {
22
+ OpenApiPeerDepMissingError,
23
+ DuplicateSchemaError
24
+ };
25
+ //# sourceMappingURL=chunk-YSLTTQLC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../runtime/shared/openapi/errors.ts"],"sourcesContent":["/**\n * Typed errors for the OpenAPI registry (OPENAPI-1).\n *\n * Same shape as `runtime/subsystems/bridge/bridge-errors.ts` so consumers\n * can catch them with the same exception-filter pattern used elsewhere.\n */\n\n/**\n * Thrown by `OpenApiRegistry.build()` when `@anatine/zod-openapi` is not\n * resolvable. The peer is declared optional (`peerDependenciesMeta`) so\n * consumer apps that don't care about OpenAPI still boot; the cost is a\n * deferred failure here on first `build()`.\n */\nexport class OpenApiPeerDepMissingError extends Error {\n override readonly name = 'OpenApiPeerDepMissingError';\n constructor(message?: string) {\n super(\n message ??\n 'OpenApiRegistry requires @anatine/zod-openapi. Install it: bun add @anatine/zod-openapi',\n );\n }\n}\n\n/**\n * Thrown by `OpenApiRegistry.registerSchema(name, ...)` when `name` is\n * already registered. Silent overwrite would make debugging\n * double-registration bugs (e.g. two entity pipelines both emitting a\n * `User` DTO) painful; loud failure lets the mismatch surface at module\n * init where the stack trace is clear.\n */\nexport class DuplicateSchemaError extends Error {\n override readonly name = 'DuplicateSchemaError';\n constructor(public readonly schemaName: string) {\n super(\n `DuplicateSchemaError: schema '${schemaName}' is already registered. ` +\n `Each schema name must be unique within the OpenApiRegistry.`,\n );\n }\n}\n"],"mappings":";AAaO,IAAM,6BAAN,cAAyC,MAAM;AAAA,EAClC,OAAO;AAAA,EACzB,YAAY,SAAkB;AAC5B;AAAA,MACE,WACE;AAAA,IACJ;AAAA,EACF;AACF;AASO,IAAM,uBAAN,cAAmC,MAAM;AAAA,EAE9C,YAA4B,YAAoB;AAC9C;AAAA,MACE,iCAAiC,UAAU;AAAA,IAE7C;AAJ0B;AAAA,EAK5B;AAAA,EAL4B;AAAA,EADV,OAAO;AAO3B;","names":[]}
@@ -0,0 +1,121 @@
1
+ import {
2
+ assertTenantId
3
+ } from "./chunk-6DWFJNIK.js";
4
+ import {
5
+ JobHandler,
6
+ JobHandlerBase
7
+ } from "./chunk-CO6LUM72.js";
8
+ import {
9
+ JOB_ORCHESTRATOR
10
+ } from "./chunk-BIO6F7YI.js";
11
+ import {
12
+ EVENT_BUS
13
+ } from "./chunk-H5NH7KPE.js";
14
+ import {
15
+ BRIDGE_DELIVERY_REPO,
16
+ BRIDGE_MULTI_TENANT,
17
+ BRIDGE_REGISTRY
18
+ } from "./chunk-4LH67P4U.js";
19
+ import {
20
+ __decorateClass,
21
+ __decorateParam
22
+ } from "./chunk-2E224ZSN.js";
23
+
24
+ // runtime/subsystems/bridge/bridge-delivery-handler.ts
25
+ import { Inject, Injectable, Logger, Optional } from "@nestjs/common";
26
+ var BRIDGE_DELIVERY_JOB_TYPE = "@framework/bridge_delivery";
27
+ var SPAWN_USER_RUN_STEP = "spawn_user_run";
28
+ var BridgeDeliveryHandler = class extends JobHandlerBase {
29
+ constructor(repo, orchestrator, events, registry, multiTenant = false) {
30
+ super();
31
+ this.repo = repo;
32
+ this.orchestrator = orchestrator;
33
+ this.events = events;
34
+ this.registry = registry;
35
+ this.multiTenant = multiTenant;
36
+ }
37
+ repo;
38
+ orchestrator;
39
+ events;
40
+ registry;
41
+ multiTenant;
42
+ classLogger = new Logger(BridgeDeliveryHandler.name);
43
+ async run(ctx) {
44
+ const { deliveryId } = ctx.input;
45
+ const delivery = await this.repo.findDeliveryById(deliveryId);
46
+ if (!delivery) {
47
+ this.classLogger.warn(
48
+ `bridge_delivery row '${deliveryId}' not found; wrapper completes without spawning a user job.`
49
+ );
50
+ return { skipped: true, reason: "delivery_row_missing" };
51
+ }
52
+ assertTenantId(
53
+ "BridgeDeliveryHandler.run",
54
+ this.multiTenant,
55
+ delivery.tenantId
56
+ );
57
+ const event = await this.events.findById(delivery.eventId);
58
+ if (!event) {
59
+ this.classLogger.warn(
60
+ `domain_events row '${delivery.eventId}' missing for delivery '${deliveryId}'; marking skipped.`
61
+ );
62
+ await this.repo.markSkipped(delivery.id, "event_row_missing");
63
+ return { skipped: true, reason: "event_row_missing" };
64
+ }
65
+ const entry = this.findRegistryEntry(event.type, delivery.triggerId);
66
+ if (!entry) {
67
+ await this.repo.markSkipped(delivery.id, "trigger_unregistered");
68
+ return { skipped: true, reason: "trigger_unregistered" };
69
+ }
70
+ if (entry.when && !entry.when(event)) {
71
+ await this.repo.markSkipped(delivery.id, "predicate_false");
72
+ return { skipped: true, reason: "predicate_false" };
73
+ }
74
+ const input = entry.map(event);
75
+ const { runId } = await ctx.step(
76
+ SPAWN_USER_RUN_STEP,
77
+ async () => {
78
+ const run = await this.orchestrator.start(entry.jobType, input, {
79
+ parentRunId: ctx.run.id,
80
+ triggerSource: "event",
81
+ triggerRef: delivery.eventId,
82
+ tenantId: delivery.tenantId
83
+ });
84
+ return { runId: run.id };
85
+ }
86
+ );
87
+ await this.repo.markDelivered(delivery.id, runId);
88
+ return { runId };
89
+ }
90
+ /**
91
+ * Locate the registry entry for `(eventType, triggerId)`. Linear scan
92
+ * over the per-event-type array — N is the number of triggers declared
93
+ * for one event, typically 1–5; the table is not big enough to warrant
94
+ * a secondary index.
95
+ */
96
+ findRegistryEntry(eventType, triggerId) {
97
+ const candidates = this.registry[eventType] ?? void 0;
98
+ if (!candidates) return void 0;
99
+ return candidates.find((c) => c.triggerId === triggerId);
100
+ }
101
+ };
102
+ BridgeDeliveryHandler = __decorateClass([
103
+ Injectable(),
104
+ JobHandler(BRIDGE_DELIVERY_JOB_TYPE, {
105
+ pool: "events_change",
106
+ retry: { attempts: 3, backoff: "exponential", baseMs: 250 },
107
+ replayFrom: "last_step"
108
+ }),
109
+ __decorateParam(0, Inject(BRIDGE_DELIVERY_REPO)),
110
+ __decorateParam(1, Inject(JOB_ORCHESTRATOR)),
111
+ __decorateParam(2, Inject(EVENT_BUS)),
112
+ __decorateParam(3, Inject(BRIDGE_REGISTRY)),
113
+ __decorateParam(4, Optional()),
114
+ __decorateParam(4, Inject(BRIDGE_MULTI_TENANT))
115
+ ], BridgeDeliveryHandler);
116
+
117
+ export {
118
+ BRIDGE_DELIVERY_JOB_TYPE,
119
+ BridgeDeliveryHandler
120
+ };
121
+ //# sourceMappingURL=chunk-YTN6BKWA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../runtime/subsystems/bridge/bridge-delivery-handler.ts"],"sourcesContent":["/**\n * BridgeDeliveryHandler — the framework `@JobHandler` that runs every\n * bridge-fanout wrapper on the reserved `events_*` pools (BRIDGE-5,\n * ADR-023 §Decision 2 flow diagram).\n *\n * Role: when the outbox drain (BRIDGE-4) inserts a `bridge_delivery + wrapper\n * job_run` pair, the worker that polls the wrapper's pool claims that\n * wrapper and dispatches it to this handler. The handler:\n *\n * 1. Loads the `bridge_delivery` row by `ctx.input.deliveryId`.\n * 2. Looks up the trigger entry in the codegen-emitted `bridgeRegistry`\n * (`runtime/subsystems/bridge/generated/registry.ts`, BRIDGE-6).\n * A missing entry means the trigger was renamed or removed since the\n * delivery row was written; mark `skipped` with\n * `skip_reason='trigger_unregistered'` per ADR-023 §Trigger rename\n * or removal.\n * 3. Re-fetches the authoritative `domain_events` row (`IEventBus.findById`)\n * so `when:` / `map:` callbacks see the committed payload — never a\n * copy that drifted between drain and claim time.\n * 4. Evaluates `entry.when?.(event)`. False ⇒ mark `skipped` with\n * `skip_reason='predicate_false'`.\n * 5. Calls `IJobOrchestrator.start(entry.jobType, entry.map(event), …)`\n * INSIDE `ctx.step('spawn_user_run', …)`. The step memoization is\n * what makes wrapper retries (BRIDGE-1 ledger says no auto-retry past\n * the wrapper's own retry policy, but Phase 1 wrappers DO retry per\n * JOB-3) idempotent — a successful spawn followed by a transient\n * ledger-update failure would otherwise re-spawn on the next attempt.\n * 6. Marks `delivered` with the spawned `runId`.\n *\n * Pool registration: BRIDGE-5 ships ONE `@JobHandler` registration with\n * `pool: 'events_change'` (the default). The wrapper rows the drain\n * inserts carry `pool: events_<direction>` per row, so workers polling\n * `events_inbound` / `events_outbound` claim and dispatch to this same\n * handler class regardless of the metadata pool — the worker filter is on\n * `job_run.pool`, not on `@JobHandler.meta.pool`. BRIDGE-8 confirms the\n * three pools are active and registered at module init. The\n * `@framework/*` job-type prefix exempts this registration from the\n * reserved-pool validator (BRIDGE-5 added that exemption to\n * `job-worker.module.ts`).\n *\n * Tenant threading: when `BRIDGE_MULTI_TENANT=true`, the handler asserts\n * `delivery.tenantId !== undefined` before the spawn (the column is\n * nullable, so explicit `null` is allowed for cross-tenant work — same\n * contract as JOB-8). BRIDGE-8 wires the assertion via the\n * `BRIDGE_MULTI_TENANT` token.\n *\n * Failure path: any throw inside the handler propagates up; the worker's\n * normal retry policy (declared on the `@JobHandler` here as `attempts:\n * 3, backoff: exponential, baseMs: 250`) absorbs transient infra blips.\n * After exhaustion, the wrapper transitions to `failed`; the outer error\n * handler catches and calls `repo.markFailed(...)` so the delivery row\n * reflects the final state. Operators see `bridge_delivery.status='failed'`\n * surface via the `idx_bridge_delivery_status` partial index (BRIDGE-1).\n */\nimport { Inject, Injectable, Logger, Optional } from '@nestjs/common';\n\nimport { JOB_ORCHESTRATOR } from '../jobs/jobs-domain.tokens';\nimport type { IJobOrchestrator } from '../jobs/job-orchestrator.protocol';\nimport {\n JobHandler,\n JobHandlerBase,\n type JobContext,\n} from '../jobs/job-handler.base';\n\nimport { EVENT_BUS } from '../events/events.tokens';\nimport type { IEventBus, DomainEvent } from '../events/event-bus.protocol';\nimport type { EventTypeName } from '../events/event-registry';\n\nimport {\n BRIDGE_DELIVERY_REPO,\n BRIDGE_MULTI_TENANT,\n BRIDGE_REGISTRY,\n} from './bridge.tokens';\nimport type {\n BridgeRegistry,\n BridgeTriggerEntry,\n IJobBridge,\n} from './bridge.protocol';\nimport { assertTenantId } from './assert-tenant-id';\n\n/** Stable canonical job type — referenced by BRIDGE-4 wrapper inserts. */\nexport const BRIDGE_DELIVERY_JOB_TYPE = '@framework/bridge_delivery' as const;\n\n/** Stable canonical step id — referenced for memoization across attempts. */\nconst SPAWN_USER_RUN_STEP = 'spawn_user_run' as const;\n\nexport interface BridgeDeliveryInput {\n /** PK of the `bridge_delivery` row this wrapper services. */\n deliveryId: string;\n}\n\n@Injectable()\n@JobHandler<BridgeDeliveryInput>(BRIDGE_DELIVERY_JOB_TYPE, {\n pool: 'events_change',\n retry: { attempts: 3, backoff: 'exponential', baseMs: 250 },\n replayFrom: 'last_step',\n})\nexport class BridgeDeliveryHandler extends JobHandlerBase<\n BridgeDeliveryInput,\n { runId: string } | { skipped: true; reason: string }\n> {\n private readonly classLogger = new Logger(BridgeDeliveryHandler.name);\n\n constructor(\n @Inject(BRIDGE_DELIVERY_REPO) private readonly repo: IJobBridge,\n @Inject(JOB_ORCHESTRATOR) private readonly orchestrator: IJobOrchestrator,\n @Inject(EVENT_BUS) private readonly events: IEventBus,\n @Inject(BRIDGE_REGISTRY) private readonly registry: BridgeRegistry,\n @Optional()\n @Inject(BRIDGE_MULTI_TENANT)\n private readonly multiTenant: boolean = false,\n ) {\n super();\n }\n\n async run(\n ctx: JobContext<BridgeDeliveryInput>,\n ): Promise<{ runId: string } | { skipped: true; reason: string }> {\n const { deliveryId } = ctx.input;\n\n // Step 1 — locate the delivery row by primary key.\n const delivery = await this.repo.findDeliveryById(deliveryId);\n if (!delivery) {\n // The drain wrote a wrapper job_run but the delivery row is gone\n // (manual ops cleanup, or delete-cascade from the parent event).\n // No row → no work; return without throwing so the wrapper marks\n // completed cleanly.\n this.classLogger.warn(\n `bridge_delivery row '${deliveryId}' not found; wrapper completes ` +\n `without spawning a user job.`,\n );\n return { skipped: true, reason: 'delivery_row_missing' };\n }\n\n // Step 2 — multi-tenancy gate. Site (b) of the three ADR-023\n // §Multi-tenancy enforcement sites; shared helper from BRIDGE-8.\n // The DB always returns string|null, never undefined; this branch\n // exists for the in-memory backend's older test fixtures and to\n // pin the contract in shape-typed tests.\n assertTenantId(\n 'BridgeDeliveryHandler.run',\n this.multiTenant,\n delivery.tenantId,\n );\n\n // Step 3 — load the typed event row.\n const event = await this.events.findById(delivery.eventId);\n if (!event) {\n // FK from bridge_delivery.event_id → domain_events.id should make\n // this impossible at the DB layer, but defensive: if the row is\n // missing we mark skipped, not failed (no work the bridge can do).\n this.classLogger.warn(\n `domain_events row '${delivery.eventId}' missing for delivery ` +\n `'${deliveryId}'; marking skipped.`,\n );\n await this.repo.markSkipped(delivery.id, 'event_row_missing');\n return { skipped: true, reason: 'event_row_missing' };\n }\n\n // Step 4 — registry lookup. Handles trigger rename/removal cleanly.\n const entry = this.findRegistryEntry(event.type, delivery.triggerId);\n if (!entry) {\n await this.repo.markSkipped(delivery.id, 'trigger_unregistered');\n return { skipped: true, reason: 'trigger_unregistered' };\n }\n\n // Step 5 — `when:` predicate.\n if (entry.when && !entry.when(event as never)) {\n await this.repo.markSkipped(delivery.id, 'predicate_false');\n return { skipped: true, reason: 'predicate_false' };\n }\n\n // Step 6 — memoized spawn. `ctx.step` records the result in\n // `job_step` and on retry returns the cached `{ runId }` so a\n // transient failure between `orchestrator.start` and `markDelivered`\n // doesn't double-spawn the user job.\n const input = entry.map(event as never);\n const { runId } = await ctx.step<{ runId: string }>(\n SPAWN_USER_RUN_STEP,\n async () => {\n const run = await this.orchestrator.start(entry.jobType, input, {\n parentRunId: ctx.run.id,\n triggerSource: 'event',\n triggerRef: delivery.eventId,\n tenantId: delivery.tenantId,\n });\n return { runId: run.id };\n },\n );\n\n // Step 7 — ledger transition.\n await this.repo.markDelivered(delivery.id, runId);\n return { runId };\n }\n\n /**\n * Locate the registry entry for `(eventType, triggerId)`. Linear scan\n * over the per-event-type array — N is the number of triggers declared\n * for one event, typically 1–5; the table is not big enough to warrant\n * a secondary index.\n */\n private findRegistryEntry(\n eventType: string,\n triggerId: string,\n ): BridgeTriggerEntry | undefined {\n const candidates =\n this.registry[eventType as EventTypeName] ?? undefined;\n if (!candidates) return undefined;\n return candidates.find((c) => c.triggerId === triggerId) as\n | BridgeTriggerEntry\n | undefined;\n }\n}\n\n/**\n * Re-export for BRIDGE-7 facade Case B and BRIDGE-4 wrapper insert.\n * Single source of truth for the canonical type string keeps refactors\n * in one place.\n */\nexport { BRIDGE_DELIVERY_JOB_TYPE as BridgeDeliveryJobType };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAsDA,SAAS,QAAQ,YAAY,QAAQ,gBAAgB;AA2B9C,IAAM,2BAA2B;AAGxC,IAAM,sBAAsB;AAarB,IAAM,wBAAN,cAAoC,eAGzC;AAAA,EAGA,YACiD,MACJ,cACP,QACM,UAGzB,cAAuB,OACxC;AACA,UAAM;AARyC;AACJ;AACP;AACM;AAGzB;AAAA,EAGnB;AAAA,EATiD;AAAA,EACJ;AAAA,EACP;AAAA,EACM;AAAA,EAGzB;AAAA,EATF,cAAc,IAAI,OAAO,sBAAsB,IAAI;AAAA,EAcpE,MAAM,IACJ,KACgE;AAChE,UAAM,EAAE,WAAW,IAAI,IAAI;AAG3B,UAAM,WAAW,MAAM,KAAK,KAAK,iBAAiB,UAAU;AAC5D,QAAI,CAAC,UAAU;AAKb,WAAK,YAAY;AAAA,QACf,wBAAwB,UAAU;AAAA,MAEpC;AACA,aAAO,EAAE,SAAS,MAAM,QAAQ,uBAAuB;AAAA,IACzD;AAOA;AAAA,MACE;AAAA,MACA,KAAK;AAAA,MACL,SAAS;AAAA,IACX;AAGA,UAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,SAAS,OAAO;AACzD,QAAI,CAAC,OAAO;AAIV,WAAK,YAAY;AAAA,QACf,sBAAsB,SAAS,OAAO,2BAChC,UAAU;AAAA,MAClB;AACA,YAAM,KAAK,KAAK,YAAY,SAAS,IAAI,mBAAmB;AAC5D,aAAO,EAAE,SAAS,MAAM,QAAQ,oBAAoB;AAAA,IACtD;AAGA,UAAM,QAAQ,KAAK,kBAAkB,MAAM,MAAM,SAAS,SAAS;AACnE,QAAI,CAAC,OAAO;AACV,YAAM,KAAK,KAAK,YAAY,SAAS,IAAI,sBAAsB;AAC/D,aAAO,EAAE,SAAS,MAAM,QAAQ,uBAAuB;AAAA,IACzD;AAGA,QAAI,MAAM,QAAQ,CAAC,MAAM,KAAK,KAAc,GAAG;AAC7C,YAAM,KAAK,KAAK,YAAY,SAAS,IAAI,iBAAiB;AAC1D,aAAO,EAAE,SAAS,MAAM,QAAQ,kBAAkB;AAAA,IACpD;AAMA,UAAM,QAAQ,MAAM,IAAI,KAAc;AACtC,UAAM,EAAE,MAAM,IAAI,MAAM,IAAI;AAAA,MAC1B;AAAA,MACA,YAAY;AACV,cAAM,MAAM,MAAM,KAAK,aAAa,MAAM,MAAM,SAAS,OAAO;AAAA,UAC9D,aAAa,IAAI,IAAI;AAAA,UACrB,eAAe;AAAA,UACf,YAAY,SAAS;AAAA,UACrB,UAAU,SAAS;AAAA,QACrB,CAAC;AACD,eAAO,EAAE,OAAO,IAAI,GAAG;AAAA,MACzB;AAAA,IACF;AAGA,UAAM,KAAK,KAAK,cAAc,SAAS,IAAI,KAAK;AAChD,WAAO,EAAE,MAAM;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,kBACN,WACA,WACgC;AAChC,UAAM,aACJ,KAAK,SAAS,SAA0B,KAAK;AAC/C,QAAI,CAAC,WAAY,QAAO;AACxB,WAAO,WAAW,KAAK,CAAC,MAAM,EAAE,cAAc,SAAS;AAAA,EAGzD;AACF;AAnHa,wBAAN;AAAA,EANN,WAAW;AAAA,EACX,WAAgC,0BAA0B;AAAA,IACzD,MAAM;AAAA,IACN,OAAO,EAAE,UAAU,GAAG,SAAS,eAAe,QAAQ,IAAI;AAAA,IAC1D,YAAY;AAAA,EACd,CAAC;AAAA,EAQI,0BAAO,oBAAoB;AAAA,EAC3B,0BAAO,gBAAgB;AAAA,EACvB,0BAAO,SAAS;AAAA,EAChB,0BAAO,eAAe;AAAA,EACtB,4BAAS;AAAA,EACT,0BAAO,mBAAmB;AAAA,GAZlB;","names":[]}
@@ -0,0 +1,200 @@
1
+ import {
2
+ clampEventLimit,
3
+ decodeEventCursor,
4
+ encodeEventCursor
5
+ } from "./chunk-UQ5EHOH2.js";
6
+ import {
7
+ EVENTS_MODULE_OPTIONS
8
+ } from "./chunk-H5NH7KPE.js";
9
+ import {
10
+ __decorateClass,
11
+ __decorateParam
12
+ } from "./chunk-2E224ZSN.js";
13
+
14
+ // runtime/subsystems/events/event-bus.memory-backend.ts
15
+ import { Inject, Injectable, Logger, Optional } from "@nestjs/common";
16
+ function toEventSummary(event) {
17
+ const metadata = event.metadata;
18
+ const str = (key) => {
19
+ const v = metadata?.[key];
20
+ return typeof v === "string" ? v : null;
21
+ };
22
+ return {
23
+ id: event.id,
24
+ type: event.type,
25
+ aggregateId: event.aggregateId,
26
+ aggregateType: event.aggregateType,
27
+ status: "processed",
28
+ pool: str("pool"),
29
+ direction: str("direction"),
30
+ tier: str("tier") ?? "domain",
31
+ rootRunId: str("rootRunId"),
32
+ tenantId: str("tenantId"),
33
+ occurredAt: event.occurredAt,
34
+ processedAt: event.occurredAt
35
+ };
36
+ }
37
+ var MemoryEventBus = class {
38
+ logger = new Logger(MemoryEventBus.name);
39
+ /** All events published since construction (or last clear). */
40
+ publishedEvents = [];
41
+ handlers = /* @__PURE__ */ new Map();
42
+ opts;
43
+ constructor(opts) {
44
+ this.opts = opts ?? { backend: "memory" };
45
+ }
46
+ async publish(event) {
47
+ this.assertTierRouting(event);
48
+ this.publishedEvents.push(event);
49
+ if (this.shouldDispatch(event)) {
50
+ await this.dispatch(event);
51
+ }
52
+ }
53
+ async publishMany(events) {
54
+ for (const event of events) {
55
+ await this.publish(event);
56
+ }
57
+ }
58
+ async findById(eventId) {
59
+ return this.publishedEvents.find((e) => e.id === eventId) ?? null;
60
+ }
61
+ subscribe(eventType, handler) {
62
+ if (!this.handlers.has(eventType)) {
63
+ this.handlers.set(eventType, /* @__PURE__ */ new Set());
64
+ }
65
+ const set = this.handlers.get(eventType);
66
+ const h = handler;
67
+ set.add(h);
68
+ return () => {
69
+ set.delete(h);
70
+ };
71
+ }
72
+ // ============================================================================
73
+ // IEventReadPort (OBS-LIST-1)
74
+ // ============================================================================
75
+ async listEvents(query = {}) {
76
+ const limit = clampEventLimit(query.limit);
77
+ const keyset = query.cursor ? decodeEventCursor(query.cursor) : null;
78
+ const str = (e, key) => {
79
+ const v = e.metadata?.[key];
80
+ return typeof v === "string" ? v : null;
81
+ };
82
+ const matched = this.publishedEvents.filter((e) => {
83
+ if (query.poolId && str(e, "pool") !== query.poolId) return false;
84
+ if (query.direction && str(e, "direction") !== query.direction)
85
+ return false;
86
+ if (query.rootRunId && str(e, "rootRunId") !== query.rootRunId)
87
+ return false;
88
+ if (query.since && e.occurredAt.getTime() < query.since.getTime())
89
+ return false;
90
+ if (query.tenantId !== void 0) {
91
+ const t = str(e, "tenantId");
92
+ if (query.tenantId === null) {
93
+ if (t !== null) return false;
94
+ } else if (t !== query.tenantId) {
95
+ return false;
96
+ }
97
+ }
98
+ return true;
99
+ });
100
+ matched.sort((a, b) => {
101
+ const dt = b.occurredAt.getTime() - a.occurredAt.getTime();
102
+ if (dt !== 0) return dt;
103
+ return a.id < b.id ? 1 : a.id > b.id ? -1 : 0;
104
+ });
105
+ const seeked = keyset ? matched.filter((e) => {
106
+ const ct = e.occurredAt.getTime();
107
+ const kt = keyset.occurredAt.getTime();
108
+ if (ct < kt) return true;
109
+ if (ct > kt) return false;
110
+ return e.id < keyset.id;
111
+ }) : matched;
112
+ const hasMore = seeked.length > limit;
113
+ const page = hasMore ? seeked.slice(0, limit) : seeked;
114
+ const items = page.map(toEventSummary);
115
+ const last = page[page.length - 1];
116
+ const nextCursor = hasMore && last ? encodeEventCursor({ occurredAt: last.occurredAt, id: last.id }) : null;
117
+ return { items, nextCursor };
118
+ }
119
+ /** Remove all published events and subscriptions. Useful in beforeEach. */
120
+ clear() {
121
+ this.publishedEvents.length = 0;
122
+ this.handlers.clear();
123
+ }
124
+ /** Filter published events by `metadata.pool`. */
125
+ publishedEventsForPool(pool) {
126
+ return this.publishedEvents.filter((e) => e.metadata?.["pool"] === pool);
127
+ }
128
+ /** Filter published events by `metadata.direction`. */
129
+ publishedEventsForDirection(direction) {
130
+ return this.publishedEvents.filter((e) => e.metadata?.["direction"] === direction);
131
+ }
132
+ /**
133
+ * Decide whether `event` should be dispatched to handlers given the
134
+ * current pool filter.
135
+ *
136
+ * Semantics (mirroring `DrizzleEventBus.processBatch`):
137
+ * - `opts.pools` undefined → dispatch everything (no filter).
138
+ * - `opts.pools` empty array → treated as "no filter" to match the
139
+ * Drizzle backend, where `pools && pools.length > 0` is the gate on
140
+ * the `inArray` WHERE clause. Empty arrays dispatch everything.
141
+ * - `opts.pools` non-empty → dispatch only when `event.metadata.pool`
142
+ * is in the list. Events without `metadata.pool` do NOT match — they
143
+ * are out of all configured pools by definition.
144
+ */
145
+ shouldDispatch(event) {
146
+ const pools = this.opts.pools;
147
+ if (!pools || pools.length === 0) return true;
148
+ const eventPool = event.metadata?.["pool"];
149
+ return typeof eventPool === "string" && pools.includes(eventPool);
150
+ }
151
+ /**
152
+ * Mirror the `domain_events_tier_routing_check` DB CHECK at the memory
153
+ * backend (AUDIT-1). Audit-tier events MUST have null/undefined
154
+ * `pool` and `direction` in metadata; the bridge dispatcher relies on
155
+ * this invariant.
156
+ */
157
+ assertTierRouting(event) {
158
+ const tier = event.metadata?.["tier"];
159
+ if (tier !== "audit") return;
160
+ const pool = event.metadata?.["pool"];
161
+ const direction = event.metadata?.["direction"];
162
+ const poolIsNull = pool === null || pool === void 0;
163
+ const directionIsNull = direction === null || direction === void 0;
164
+ if (!poolIsNull || !directionIsNull) {
165
+ throw new Error(
166
+ `MemoryEventBus: tier='audit' events must have null pool and direction (got pool=${String(pool)}, direction=${String(direction)}). This mirrors the domain_events CHECK constraint.`
167
+ );
168
+ }
169
+ }
170
+ async dispatch(event) {
171
+ const set = this.handlers.get(event.type);
172
+ if (!set) return;
173
+ let firstError;
174
+ for (const handler of set) {
175
+ try {
176
+ await handler(event);
177
+ } catch (err) {
178
+ this.logger.error(
179
+ `Handler error for event type "${event.type}" (id: ${event.id}): ${err}`
180
+ );
181
+ if (firstError === void 0) {
182
+ firstError = err;
183
+ }
184
+ }
185
+ }
186
+ if (firstError !== void 0) {
187
+ throw firstError;
188
+ }
189
+ }
190
+ };
191
+ MemoryEventBus = __decorateClass([
192
+ Injectable(),
193
+ __decorateParam(0, Optional()),
194
+ __decorateParam(0, Inject(EVENTS_MODULE_OPTIONS))
195
+ ], MemoryEventBus);
196
+
197
+ export {
198
+ MemoryEventBus
199
+ };
200
+ //# sourceMappingURL=chunk-Z7PQCAVK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../runtime/subsystems/events/event-bus.memory-backend.ts"],"sourcesContent":["/**\n * MemoryEventBus — in-memory backend for the event bus.\n *\n * Dispatches events synchronously to registered subscribers. The `tx`\n * parameter is ignored — all events are dispatched immediately.\n *\n * Use this backend in tests to assert event publication without a database.\n * Swap via EventsModule.forRoot({ backend: 'memory' }).\n *\n * Pool awareness (EVT-5):\n * - Mirrors the `DrizzleEventBus` per-process restriction (EVT-4). When\n * `opts.pools` is set, `publish`/`publishMany` still push the event into\n * `publishedEvents` (so test code can assert the full set of emitted\n * events regardless of pool filter), but handlers are NOT invoked for\n * events whose `metadata.pool` is outside the configured pools.\n * - `publishedEventsForPool(pool)` and `publishedEventsForDirection(dir)`\n * helpers are provided for targeted assertions.\n * - Shares the `EventsModuleOptions` shape (same token as Drizzle) rather\n * than introducing a memory-only options type — the surface is the same\n * and keeping them unified avoids drift between backends.\n */\nimport { Inject, Injectable, Logger, Optional } from '@nestjs/common';\nimport type { DomainEvent, IEventBus } from './event-bus.protocol';\nimport type {\n EventPage,\n EventSummary,\n IEventReadPort,\n ListEventsQuery,\n} from './event-read.protocol';\nimport {\n clampEventLimit,\n decodeEventCursor,\n encodeEventCursor,\n} from './event-keyset-cursor';\nimport { EVENTS_MODULE_OPTIONS } from './events.tokens';\nimport type { EventsModuleOptions } from './events.module';\n\n/**\n * Project an in-memory `DomainEvent` into the narrow `EventSummary` shape.\n * The memory backend has no first-class columns, so `pool` / `direction` /\n * `tier` / `tenantId` / `rootRunId` are read from `metadata` (mirroring how\n * the Drizzle backend stamps them onto columns at publish time). `status`\n * is reported as `'processed'` — the memory bus dispatches synchronously,\n * so once an event is in `publishedEvents` it has been handled.\n */\nfunction toEventSummary(event: DomainEvent): EventSummary {\n const metadata = event.metadata;\n const str = (key: string): string | null => {\n const v = metadata?.[key];\n return typeof v === 'string' ? v : null;\n };\n return {\n id: event.id,\n type: event.type,\n aggregateId: event.aggregateId,\n aggregateType: event.aggregateType,\n status: 'processed',\n pool: str('pool'),\n direction: str('direction'),\n tier: str('tier') ?? 'domain',\n rootRunId: str('rootRunId'),\n tenantId: str('tenantId'),\n occurredAt: event.occurredAt,\n processedAt: event.occurredAt,\n };\n}\n\n@Injectable()\nexport class MemoryEventBus implements IEventBus, IEventReadPort {\n private readonly logger = new Logger(MemoryEventBus.name);\n\n /** All events published since construction (or last clear). */\n readonly publishedEvents: DomainEvent[] = [];\n\n private readonly handlers = new Map<string, Set<(event: DomainEvent) => Promise<void>>>();\n private readonly opts: EventsModuleOptions;\n\n constructor(\n @Optional() @Inject(EVENTS_MODULE_OPTIONS) opts?: EventsModuleOptions,\n ) {\n // Default so direct construction (e.g. `new MemoryEventBus()` from a\n // unit test outside NestJS DI) keeps working without an explicit\n // options object.\n this.opts = opts ?? { backend: 'memory' };\n }\n\n async publish(event: DomainEvent): Promise<void> {\n // Mirror the `domain_events_tier_routing_check` DB constraint at the\n // memory backend boundary so misuse fails the same way regardless of\n // backend (AUDIT-1).\n this.assertTierRouting(event);\n\n // Always record the event — even if this process is configured with a\n // pool filter that excludes it. Test code relies on `publishedEvents`\n // being a complete log of what was published, not a filtered view.\n this.publishedEvents.push(event);\n\n if (this.shouldDispatch(event)) {\n await this.dispatch(event);\n }\n }\n\n async publishMany(events: DomainEvent[]): Promise<void> {\n for (const event of events) {\n await this.publish(event);\n }\n }\n\n async findById(eventId: string): Promise<DomainEvent | null> {\n return this.publishedEvents.find((e) => e.id === eventId) ?? null;\n }\n\n subscribe<T extends DomainEvent = DomainEvent>(\n eventType: string,\n handler: (event: T) => Promise<void>,\n ): () => void {\n if (!this.handlers.has(eventType)) {\n this.handlers.set(eventType, new Set());\n }\n // Cast is safe — callers pass a typed handler; we store as the base type\n const set = this.handlers.get(eventType)!;\n const h = handler as (event: DomainEvent) => Promise<void>;\n set.add(h);\n\n return () => {\n set.delete(h);\n };\n }\n\n // ============================================================================\n // IEventReadPort (OBS-LIST-1)\n // ============================================================================\n\n async listEvents(query: ListEventsQuery = {}): Promise<EventPage> {\n const limit = clampEventLimit(query.limit);\n const keyset = query.cursor ? decodeEventCursor(query.cursor) : null;\n\n const str = (e: DomainEvent, key: string): string | null => {\n const v = e.metadata?.[key];\n return typeof v === 'string' ? v : null;\n };\n\n const matched = this.publishedEvents.filter((e) => {\n if (query.poolId && str(e, 'pool') !== query.poolId) return false;\n if (query.direction && str(e, 'direction') !== query.direction)\n return false;\n if (query.rootRunId && str(e, 'rootRunId') !== query.rootRunId)\n return false;\n if (query.since && e.occurredAt.getTime() < query.since.getTime())\n return false;\n if (query.tenantId !== undefined) {\n const t = str(e, 'tenantId');\n if (query.tenantId === null) {\n if (t !== null) return false;\n } else if (t !== query.tenantId) {\n return false;\n }\n }\n return true;\n });\n\n // Order occurred_at DESC, id DESC to match the Drizzle backend keyset.\n matched.sort((a, b) => {\n const dt = b.occurredAt.getTime() - a.occurredAt.getTime();\n if (dt !== 0) return dt;\n return a.id < b.id ? 1 : a.id > b.id ? -1 : 0;\n });\n\n const seeked = keyset\n ? matched.filter((e) => {\n const ct = e.occurredAt.getTime();\n const kt = keyset.occurredAt.getTime();\n if (ct < kt) return true;\n if (ct > kt) return false;\n return e.id < keyset.id;\n })\n : matched;\n\n const hasMore = seeked.length > limit;\n const page = hasMore ? seeked.slice(0, limit) : seeked;\n const items = page.map(toEventSummary);\n const last = page[page.length - 1];\n const nextCursor =\n hasMore && last\n ? encodeEventCursor({ occurredAt: last.occurredAt, id: last.id })\n : null;\n\n return { items, nextCursor };\n }\n\n /** Remove all published events and subscriptions. Useful in beforeEach. */\n clear(): void {\n this.publishedEvents.length = 0;\n this.handlers.clear();\n }\n\n /** Filter published events by `metadata.pool`. */\n publishedEventsForPool(pool: string): DomainEvent[] {\n return this.publishedEvents.filter((e) => e.metadata?.['pool'] === pool);\n }\n\n /** Filter published events by `metadata.direction`. */\n publishedEventsForDirection(direction: string): DomainEvent[] {\n return this.publishedEvents.filter((e) => e.metadata?.['direction'] === direction);\n }\n\n /**\n * Decide whether `event` should be dispatched to handlers given the\n * current pool filter.\n *\n * Semantics (mirroring `DrizzleEventBus.processBatch`):\n * - `opts.pools` undefined → dispatch everything (no filter).\n * - `opts.pools` empty array → treated as \"no filter\" to match the\n * Drizzle backend, where `pools && pools.length > 0` is the gate on\n * the `inArray` WHERE clause. Empty arrays dispatch everything.\n * - `opts.pools` non-empty → dispatch only when `event.metadata.pool`\n * is in the list. Events without `metadata.pool` do NOT match — they\n * are out of all configured pools by definition.\n */\n private shouldDispatch(event: DomainEvent): boolean {\n const pools = this.opts.pools;\n if (!pools || pools.length === 0) return true;\n const eventPool = event.metadata?.['pool'];\n return typeof eventPool === 'string' && pools.includes(eventPool);\n }\n\n /**\n * Mirror the `domain_events_tier_routing_check` DB CHECK at the memory\n * backend (AUDIT-1). Audit-tier events MUST have null/undefined\n * `pool` and `direction` in metadata; the bridge dispatcher relies on\n * this invariant.\n */\n private assertTierRouting(event: DomainEvent): void {\n const tier = event.metadata?.['tier'];\n if (tier !== 'audit') return;\n const pool = event.metadata?.['pool'];\n const direction = event.metadata?.['direction'];\n const poolIsNull = pool === null || pool === undefined;\n const directionIsNull = direction === null || direction === undefined;\n if (!poolIsNull || !directionIsNull) {\n throw new Error(\n `MemoryEventBus: tier='audit' events must have null pool and direction ` +\n `(got pool=${String(pool)}, direction=${String(direction)}). ` +\n `This mirrors the domain_events CHECK constraint.`,\n );\n }\n }\n\n private async dispatch(event: DomainEvent): Promise<void> {\n const set = this.handlers.get(event.type);\n if (!set) return;\n\n let firstError: unknown;\n for (const handler of set) {\n try {\n await handler(event);\n } catch (err) {\n this.logger.error(\n `Handler error for event type \"${event.type}\" (id: ${event.id}): ${err}`,\n );\n if (firstError === undefined) {\n firstError = err;\n }\n }\n }\n\n if (firstError !== undefined) {\n throw firstError;\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,47 @@
1
+ // runtime/base-classes/tenant-context.ts
2
+ import { AsyncLocalStorage } from "async_hooks";
3
+ var als = new AsyncLocalStorage();
4
+ function withRequester(ctx, fn) {
5
+ return als.run(ctx, fn);
6
+ }
7
+ function requireRequester() {
8
+ const ctx = als.getStore();
9
+ if (!ctx) {
10
+ throw new Error(
11
+ "No requester context active. Wrap the entry point in withRequester({ userId, organizationId }, fn). See tenant-context.ts."
12
+ );
13
+ }
14
+ return ctx;
15
+ }
16
+ function tryGetRequester() {
17
+ return als.getStore();
18
+ }
19
+ function requireRequesterScope() {
20
+ return requireRequester().scope ?? "user";
21
+ }
22
+ function withUserScope(userId, organizationId, fn) {
23
+ return withRequester({ userId, organizationId, scope: "user" }, fn);
24
+ }
25
+ function withOrgScope(userId, organizationId, orgUserIds, fn) {
26
+ return withRequester(
27
+ { userId, organizationId, scope: "org", orgUserIds },
28
+ fn
29
+ );
30
+ }
31
+ function withSuperuserScope(userId, fn) {
32
+ return withRequester(
33
+ { userId, organizationId: null, scope: "superuser" },
34
+ fn
35
+ );
36
+ }
37
+
38
+ export {
39
+ withRequester,
40
+ requireRequester,
41
+ tryGetRequester,
42
+ requireRequesterScope,
43
+ withUserScope,
44
+ withOrgScope,
45
+ withSuperuserScope
46
+ };
47
+ //# sourceMappingURL=chunk-ZUKFQL6E.js.map