@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.
- package/CHANGELOG.md +85 -0
- package/dist/chunk-27ETSJ2X.js +84 -0
- package/dist/chunk-27ETSJ2X.js.map +1 -0
- package/dist/chunk-2E224ZSN.js +20 -0
- package/dist/chunk-2E224ZSN.js.map +1 -0
- package/dist/chunk-2FTZLDBP.js +179 -0
- package/dist/chunk-2FTZLDBP.js.map +1 -0
- package/dist/chunk-2N4UG4VD.js +20 -0
- package/dist/chunk-2N4UG4VD.js.map +1 -0
- package/dist/chunk-2TVVBC53.js +92 -0
- package/dist/chunk-2TVVBC53.js.map +1 -0
- package/dist/chunk-2VHZ7EKC.js +37 -0
- package/dist/chunk-2VHZ7EKC.js.map +1 -0
- package/dist/chunk-32BMMV4H.js +109 -0
- package/dist/chunk-32BMMV4H.js.map +1 -0
- package/dist/chunk-32DOFN3T.js +4042 -0
- package/dist/chunk-32DOFN3T.js.map +1 -0
- package/dist/chunk-36U5UGIO.js +107 -0
- package/dist/chunk-36U5UGIO.js.map +1 -0
- package/dist/chunk-3CJFPU6Q.js +14 -0
- package/dist/chunk-3CJFPU6Q.js.map +1 -0
- package/dist/chunk-3NMCDN7L.js +90 -0
- package/dist/chunk-3NMCDN7L.js.map +1 -0
- package/dist/chunk-3SZFUTXE.js +62 -0
- package/dist/chunk-3SZFUTXE.js.map +1 -0
- package/dist/chunk-4DOJBQTP.js +117 -0
- package/dist/chunk-4DOJBQTP.js.map +1 -0
- package/dist/chunk-4H3PETLM.js +290 -0
- package/dist/chunk-4H3PETLM.js.map +1 -0
- package/dist/chunk-4JLJYWJC.js +308 -0
- package/dist/chunk-4JLJYWJC.js.map +1 -0
- package/dist/chunk-4KNXX6TI.js +29 -0
- package/dist/chunk-4KNXX6TI.js.map +1 -0
- package/dist/chunk-4LH67P4U.js +17 -0
- package/dist/chunk-4LH67P4U.js.map +1 -0
- package/dist/chunk-4MF3HKJA.js +94 -0
- package/dist/chunk-4MF3HKJA.js.map +1 -0
- package/dist/chunk-4MVGAMUA.js +40 -0
- package/dist/chunk-4MVGAMUA.js.map +1 -0
- package/dist/chunk-4RFHUZXU.js +635 -0
- package/dist/chunk-4RFHUZXU.js.map +1 -0
- package/dist/chunk-5A432NZJ.js +7 -0
- package/dist/chunk-5A432NZJ.js.map +1 -0
- package/dist/chunk-5Y7W3XR6.js +356 -0
- package/dist/chunk-5Y7W3XR6.js.map +1 -0
- package/dist/chunk-6DWFJNIK.js +15 -0
- package/dist/chunk-6DWFJNIK.js.map +1 -0
- package/dist/chunk-6I7ULIN6.js +15 -0
- package/dist/chunk-6I7ULIN6.js.map +1 -0
- package/dist/chunk-6XY6ZMMD.js +25 -0
- package/dist/chunk-6XY6ZMMD.js.map +1 -0
- package/dist/chunk-7B3RYX45.js +63 -0
- package/dist/chunk-7B3RYX45.js.map +1 -0
- package/dist/chunk-7C3FOSDI.js +1 -0
- package/dist/chunk-7C3FOSDI.js.map +1 -0
- package/dist/chunk-7KOW6PU6.js +59 -0
- package/dist/chunk-7KOW6PU6.js.map +1 -0
- package/dist/chunk-7RELQJIN.js +22 -0
- package/dist/chunk-7RELQJIN.js.map +1 -0
- package/dist/chunk-7YGORYZD.js +112 -0
- package/dist/chunk-7YGORYZD.js.map +1 -0
- package/dist/chunk-AHV4GDYM.js +63 -0
- package/dist/chunk-AHV4GDYM.js.map +1 -0
- package/dist/chunk-AQFQ4BYM.js +81 -0
- package/dist/chunk-AQFQ4BYM.js.map +1 -0
- package/dist/chunk-AS3NAZB6.js +14 -0
- package/dist/chunk-AS3NAZB6.js.map +1 -0
- package/dist/chunk-BGULBWKJ.js +88 -0
- package/dist/chunk-BGULBWKJ.js.map +1 -0
- package/dist/chunk-BIO6F7YI.js +17 -0
- package/dist/chunk-BIO6F7YI.js.map +1 -0
- package/dist/chunk-BOPZWRJK.js +36 -0
- package/dist/chunk-BOPZWRJK.js.map +1 -0
- package/dist/chunk-BPARRK6F.js +14 -0
- package/dist/chunk-BPARRK6F.js.map +1 -0
- package/dist/chunk-CO6LUM72.js +59 -0
- package/dist/chunk-CO6LUM72.js.map +1 -0
- package/dist/chunk-DCCZB4UC.js +100 -0
- package/dist/chunk-DCCZB4UC.js.map +1 -0
- package/dist/chunk-DV4RV2DC.js +59 -0
- package/dist/chunk-DV4RV2DC.js.map +1 -0
- package/dist/chunk-EDKJU5BO.js +11 -0
- package/dist/chunk-EDKJU5BO.js.map +1 -0
- package/dist/chunk-EO2QPOKH.js +116 -0
- package/dist/chunk-EO2QPOKH.js.map +1 -0
- package/dist/chunk-EOLLMEAH.js +155 -0
- package/dist/chunk-EOLLMEAH.js.map +1 -0
- package/dist/chunk-EWYCWP4H.js +14 -0
- package/dist/chunk-EWYCWP4H.js.map +1 -0
- package/dist/chunk-EXVDJMIY.js +33 -0
- package/dist/chunk-EXVDJMIY.js.map +1 -0
- package/dist/chunk-FASRXRX5.js +19 -0
- package/dist/chunk-FASRXRX5.js.map +1 -0
- package/dist/chunk-FBGHYQIZ.js +201 -0
- package/dist/chunk-FBGHYQIZ.js.map +1 -0
- package/dist/chunk-FI34KYZ5.js +1 -0
- package/dist/chunk-FI34KYZ5.js.map +1 -0
- package/dist/chunk-FN2PYDPP.js +1 -0
- package/dist/chunk-FN2PYDPP.js.map +1 -0
- package/dist/chunk-GCYKMF22.js +81 -0
- package/dist/chunk-GCYKMF22.js.map +1 -0
- package/dist/chunk-GM3RMJIJ.js +92 -0
- package/dist/chunk-GM3RMJIJ.js.map +1 -0
- package/dist/chunk-GYGNEQSC.js +9 -0
- package/dist/chunk-GYGNEQSC.js.map +1 -0
- package/dist/chunk-H5NH7KPE.js +21 -0
- package/dist/chunk-H5NH7KPE.js.map +1 -0
- package/dist/chunk-HNWZFNKP.js +168 -0
- package/dist/chunk-HNWZFNKP.js.map +1 -0
- package/dist/chunk-HUH73XGI.js +1 -0
- package/dist/chunk-HUH73XGI.js.map +1 -0
- package/dist/chunk-I6MVCB5A.js +39 -0
- package/dist/chunk-I6MVCB5A.js.map +1 -0
- package/dist/chunk-IBGER4YK.js +12 -0
- package/dist/chunk-IBGER4YK.js.map +1 -0
- package/dist/chunk-IF5I3DAA.js +92 -0
- package/dist/chunk-IF5I3DAA.js.map +1 -0
- package/dist/chunk-IP4OO26U.js +54 -0
- package/dist/chunk-IP4OO26U.js.map +1 -0
- package/dist/chunk-IWAOY6KC.js +1 -0
- package/dist/chunk-IWAOY6KC.js.map +1 -0
- package/dist/chunk-IYNSRIGR.js +122 -0
- package/dist/chunk-IYNSRIGR.js.map +1 -0
- package/dist/chunk-J37YWU7Y.js +19 -0
- package/dist/chunk-J37YWU7Y.js.map +1 -0
- package/dist/chunk-J6KZS54B.js +269 -0
- package/dist/chunk-J6KZS54B.js.map +1 -0
- package/dist/chunk-J6MN42LG.js +19 -0
- package/dist/chunk-J6MN42LG.js.map +1 -0
- package/dist/chunk-J7JMVS2B.js +53 -0
- package/dist/chunk-J7JMVS2B.js.map +1 -0
- package/dist/chunk-JRQO2IOF.js +65 -0
- package/dist/chunk-JRQO2IOF.js.map +1 -0
- package/dist/chunk-JWNHNUYL.js +96 -0
- package/dist/chunk-JWNHNUYL.js.map +1 -0
- package/dist/chunk-K2I6XIK5.js +122 -0
- package/dist/chunk-K2I6XIK5.js.map +1 -0
- package/dist/chunk-KVOWSC5S.js +1 -0
- package/dist/chunk-KVOWSC5S.js.map +1 -0
- package/dist/chunk-KYR3B3OW.js +79 -0
- package/dist/chunk-KYR3B3OW.js.map +1 -0
- package/dist/chunk-L3LZWWSX.js +61 -0
- package/dist/chunk-L3LZWWSX.js.map +1 -0
- package/dist/chunk-L4SDDEEU.js +1 -0
- package/dist/chunk-L4SDDEEU.js.map +1 -0
- package/dist/chunk-L6FTY45T.js +13 -0
- package/dist/chunk-L6FTY45T.js.map +1 -0
- package/dist/chunk-L7BNNRGI.js +134 -0
- package/dist/chunk-L7BNNRGI.js.map +1 -0
- package/dist/chunk-LG57S2SC.js +150 -0
- package/dist/chunk-LG57S2SC.js.map +1 -0
- package/dist/chunk-M6QLSLPO.js +97 -0
- package/dist/chunk-M6QLSLPO.js.map +1 -0
- package/dist/chunk-MZ6GV4YF.js +21 -0
- package/dist/chunk-MZ6GV4YF.js.map +1 -0
- package/dist/chunk-N5OTOWTP.js +55 -0
- package/dist/chunk-N5OTOWTP.js.map +1 -0
- package/dist/chunk-NN7XZEGF.js +14 -0
- package/dist/chunk-NN7XZEGF.js.map +1 -0
- package/dist/chunk-NPFPZ2HO.js +13 -0
- package/dist/chunk-NPFPZ2HO.js.map +1 -0
- package/dist/chunk-NXXDZ6ZF.js +42 -0
- package/dist/chunk-NXXDZ6ZF.js.map +1 -0
- package/dist/chunk-NYBCQZC7.js +11 -0
- package/dist/chunk-NYBCQZC7.js.map +1 -0
- package/dist/chunk-O37C3YE6.js +111 -0
- package/dist/chunk-O37C3YE6.js.map +1 -0
- package/dist/chunk-OFRRBC7M.js +78 -0
- package/dist/chunk-OFRRBC7M.js.map +1 -0
- package/dist/chunk-OGIZXGPY.js +222 -0
- package/dist/chunk-OGIZXGPY.js.map +1 -0
- package/dist/chunk-OKXZ63IA.js +168 -0
- package/dist/chunk-OKXZ63IA.js.map +1 -0
- package/dist/chunk-OSQRXVG2.js +58 -0
- package/dist/chunk-OSQRXVG2.js.map +1 -0
- package/dist/chunk-OTDN3OUQ.js +215 -0
- package/dist/chunk-OTDN3OUQ.js.map +1 -0
- package/dist/chunk-PNZSGAB2.js +114 -0
- package/dist/chunk-PNZSGAB2.js.map +1 -0
- package/dist/chunk-PRWIX6UW.js +21 -0
- package/dist/chunk-PRWIX6UW.js.map +1 -0
- package/dist/chunk-PSXUNOVU.js +7 -0
- package/dist/chunk-PSXUNOVU.js.map +1 -0
- package/dist/chunk-QLTJSCE6.js +44 -0
- package/dist/chunk-QLTJSCE6.js.map +1 -0
- package/dist/chunk-RC23QROE.js +447 -0
- package/dist/chunk-RC23QROE.js.map +1 -0
- package/dist/chunk-RDVTWIYY.js +212 -0
- package/dist/chunk-RDVTWIYY.js.map +1 -0
- package/dist/chunk-RFH7N6EP.js +36 -0
- package/dist/chunk-RFH7N6EP.js.map +1 -0
- package/dist/chunk-RHVN6NA7.js +134 -0
- package/dist/chunk-RHVN6NA7.js.map +1 -0
- package/dist/chunk-S7C6TIIF.js +21 -0
- package/dist/chunk-S7C6TIIF.js.map +1 -0
- package/dist/chunk-SNQ3TOWP.js +20 -0
- package/dist/chunk-SNQ3TOWP.js.map +1 -0
- package/dist/chunk-SOVM2VEK.js +14 -0
- package/dist/chunk-SOVM2VEK.js.map +1 -0
- package/dist/chunk-SQDOBLBP.js +13 -0
- package/dist/chunk-SQDOBLBP.js.map +1 -0
- package/dist/chunk-SR7F3TJY.js +130 -0
- package/dist/chunk-SR7F3TJY.js.map +1 -0
- package/dist/chunk-SZVPIHWE.js +129 -0
- package/dist/chunk-SZVPIHWE.js.map +1 -0
- package/dist/chunk-T4BIIU5E.js +89 -0
- package/dist/chunk-T4BIIU5E.js.map +1 -0
- package/dist/chunk-T6SCOJF4.js +92 -0
- package/dist/chunk-T6SCOJF4.js.map +1 -0
- package/dist/chunk-TNXH7BJS.js +48 -0
- package/dist/chunk-TNXH7BJS.js.map +1 -0
- package/dist/chunk-U64T4YZE.js +9 -0
- package/dist/chunk-U64T4YZE.js.map +1 -0
- package/dist/chunk-UQ5EHOH2.js +39 -0
- package/dist/chunk-UQ5EHOH2.js.map +1 -0
- package/dist/chunk-UTN4GBPQ.js +1 -0
- package/dist/chunk-UTN4GBPQ.js.map +1 -0
- package/dist/chunk-V4AF6DI4.js +16 -0
- package/dist/chunk-V4AF6DI4.js.map +1 -0
- package/dist/chunk-W72PRNJY.js +126 -0
- package/dist/chunk-W72PRNJY.js.map +1 -0
- package/dist/chunk-WL67FZGF.js +21 -0
- package/dist/chunk-WL67FZGF.js.map +1 -0
- package/dist/chunk-WWGYCIJX.js +29 -0
- package/dist/chunk-WWGYCIJX.js.map +1 -0
- package/dist/chunk-X2GMTYPA.js +50 -0
- package/dist/chunk-X2GMTYPA.js.map +1 -0
- package/dist/chunk-XCEI7NUH.js +41 -0
- package/dist/chunk-XCEI7NUH.js.map +1 -0
- package/dist/chunk-Y7GDG744.js +88 -0
- package/dist/chunk-Y7GDG744.js.map +1 -0
- package/dist/chunk-Y7RRSEOC.js +9 -0
- package/dist/chunk-Y7RRSEOC.js.map +1 -0
- package/dist/chunk-YLPAPPLW.js +75 -0
- package/dist/chunk-YLPAPPLW.js.map +1 -0
- package/dist/chunk-YPWODKD5.js +184 -0
- package/dist/chunk-YPWODKD5.js.map +1 -0
- package/dist/chunk-YSLTTQLC.js +25 -0
- package/dist/chunk-YSLTTQLC.js.map +1 -0
- package/dist/chunk-YTN6BKWA.js +121 -0
- package/dist/chunk-YTN6BKWA.js.map +1 -0
- package/dist/chunk-Z7PQCAVK.js +200 -0
- package/dist/chunk-Z7PQCAVK.js.map +1 -0
- package/dist/chunk-ZUKFQL6E.js +47 -0
- package/dist/chunk-ZUKFQL6E.js.map +1 -0
- package/dist/chunk-ZUMULSEQ.js +1 -0
- package/dist/chunk-ZUMULSEQ.js.map +1 -0
- package/dist/runtime/analytics/index.js +8 -41
- package/dist/runtime/analytics/index.js.map +1 -1
- package/dist/runtime/analytics/types.js +8 -41
- package/dist/runtime/analytics/types.js.map +1 -1
- package/dist/runtime/base-classes/activity-entity-repository.js +6 -312
- package/dist/runtime/base-classes/activity-entity-repository.js.map +1 -1
- package/dist/runtime/base-classes/activity-entity-service.js +6 -212
- package/dist/runtime/base-classes/activity-entity-service.js.map +1 -1
- package/dist/runtime/base-classes/base-read-use-cases.js +5 -27
- package/dist/runtime/base-classes/base-read-use-cases.js.map +1 -1
- package/dist/runtime/base-classes/base-repository.js +5 -277
- package/dist/runtime/base-classes/base-repository.js.map +1 -1
- package/dist/runtime/base-classes/base-service.js +5 -184
- package/dist/runtime/base-classes/base-service.js.map +1 -1
- package/dist/runtime/base-classes/index.js +59 -1076
- package/dist/runtime/base-classes/index.js.map +1 -1
- package/dist/runtime/base-classes/integrated-entity-repository.js +6 -486
- package/dist/runtime/base-classes/integrated-entity-repository.js.map +1 -1
- package/dist/runtime/base-classes/integrated-entity-service.js +6 -213
- package/dist/runtime/base-classes/integrated-entity-service.js.map +1 -1
- package/dist/runtime/base-classes/junction-integration-repository.js +8 -448
- package/dist/runtime/base-classes/junction-integration-repository.js.map +1 -1
- package/dist/runtime/base-classes/knowledge-entity-repository.js +6 -283
- package/dist/runtime/base-classes/knowledge-entity-repository.js.map +1 -1
- package/dist/runtime/base-classes/knowledge-entity-service.js +6 -190
- package/dist/runtime/base-classes/knowledge-entity-service.js.map +1 -1
- package/dist/runtime/base-classes/lifecycle-events.js +8 -70
- package/dist/runtime/base-classes/lifecycle-events.js.map +1 -1
- package/dist/runtime/base-classes/metadata-entity-repository.js +6 -330
- package/dist/runtime/base-classes/metadata-entity-repository.js.map +1 -1
- package/dist/runtime/base-classes/metadata-entity-service.js +6 -212
- package/dist/runtime/base-classes/metadata-entity-service.js.map +1 -1
- package/dist/runtime/base-classes/tenant-context.js +10 -36
- package/dist/runtime/base-classes/tenant-context.js.map +1 -1
- package/dist/runtime/base-classes/with-analytics.js +4 -7
- package/dist/runtime/base-classes/with-analytics.js.map +1 -1
- package/dist/runtime/constants/tokens.js +5 -3
- package/dist/runtime/constants/tokens.js.map +1 -1
- package/dist/runtime/eav-helpers.js +2 -0
- package/dist/runtime/eav-helpers.js.map +1 -1
- package/dist/runtime/pipes/zod-validation.pipe.js +3 -10
- package/dist/runtime/pipes/zod-validation.pipe.js.map +1 -1
- package/dist/runtime/shared/openapi/error-response.dto.js +5 -8
- package/dist/runtime/shared/openapi/error-response.dto.js.map +1 -1
- package/dist/runtime/shared/openapi/errors.js +5 -19
- package/dist/runtime/shared/openapi/errors.js.map +1 -1
- package/dist/runtime/shared/openapi/index.js +15 -106
- package/dist/runtime/shared/openapi/index.js.map +1 -1
- package/dist/runtime/shared/openapi/registry.js +6 -103
- package/dist/runtime/shared/openapi/registry.js.map +1 -1
- package/dist/runtime/shared/openapi/registry.tokens.js +4 -2
- package/dist/runtime/shared/openapi/registry.tokens.js.map +1 -1
- package/dist/runtime/subsystems/analytics/analytics.module.js +8 -117
- package/dist/runtime/subsystems/analytics/analytics.module.js.map +1 -1
- package/dist/runtime/subsystems/analytics/analytics.tokens.js +7 -8
- package/dist/runtime/subsystems/analytics/analytics.tokens.js.map +1 -1
- package/dist/runtime/subsystems/analytics/cube-backend.js +6 -71
- package/dist/runtime/subsystems/analytics/cube-backend.js.map +1 -1
- package/dist/runtime/subsystems/analytics/index.js +16 -117
- package/dist/runtime/subsystems/analytics/index.js.map +1 -1
- package/dist/runtime/subsystems/analytics/noop-backend.js +4 -21
- package/dist/runtime/subsystems/analytics/noop-backend.js.map +1 -1
- package/dist/runtime/subsystems/auth/auth-oauth-state.schema.js +4 -8
- package/dist/runtime/subsystems/auth/auth-oauth-state.schema.js.map +1 -1
- package/dist/runtime/subsystems/auth/auth.module.js +12 -359
- package/dist/runtime/subsystems/auth/auth.module.js.map +1 -1
- package/dist/runtime/subsystems/auth/auth.tokens.js +12 -13
- package/dist/runtime/subsystems/auth/auth.tokens.js.map +1 -1
- package/dist/runtime/subsystems/auth/backends/encryption-key/env.js +4 -49
- package/dist/runtime/subsystems/auth/backends/encryption-key/env.js.map +1 -1
- package/dist/runtime/subsystems/auth/backends/state-store.drizzle-backend.js +6 -64
- package/dist/runtime/subsystems/auth/backends/state-store.drizzle-backend.js.map +1 -1
- package/dist/runtime/subsystems/auth/backends/state-store.memory-backend.js +5 -47
- package/dist/runtime/subsystems/auth/backends/state-store.memory-backend.js.map +1 -1
- package/dist/runtime/subsystems/auth/controllers/auth.controller.js +5 -139
- package/dist/runtime/subsystems/auth/controllers/auth.controller.js.map +1 -1
- package/dist/runtime/subsystems/auth/index.js +53 -542
- package/dist/runtime/subsystems/auth/index.js.map +1 -1
- package/dist/runtime/subsystems/auth/middleware/requester-context.js +9 -65
- package/dist/runtime/subsystems/auth/middleware/requester-context.js.map +1 -1
- package/dist/runtime/subsystems/auth/protocols/oauth-state-store.js +4 -9
- package/dist/runtime/subsystems/auth/protocols/oauth-state-store.js.map +1 -1
- package/dist/runtime/subsystems/auth/runtime/connection-broken.error.js +4 -15
- package/dist/runtime/subsystems/auth/runtime/connection-broken.error.js.map +1 -1
- package/dist/runtime/subsystems/auth/runtime/oauth2-refresh.strategy.js +5 -104
- package/dist/runtime/subsystems/auth/runtime/oauth2-refresh.strategy.js.map +1 -1
- package/dist/runtime/subsystems/auth/runtime/session-expired.error.js +5 -16
- package/dist/runtime/subsystems/auth/runtime/session-expired.error.js.map +1 -1
- package/dist/runtime/subsystems/auth/runtime/with-auth-retry.js +5 -29
- package/dist/runtime/subsystems/auth/runtime/with-auth-retry.js.map +1 -1
- package/dist/runtime/subsystems/bridge/assert-tenant-id.js +5 -18
- package/dist/runtime/subsystems/bridge/assert-tenant-id.js.map +1 -1
- package/dist/runtime/subsystems/bridge/bridge-delivery-handler.js +12 -184
- package/dist/runtime/subsystems/bridge/bridge-delivery-handler.js.map +1 -1
- package/dist/runtime/subsystems/bridge/bridge-delivery.drizzle-backend.js +10 -448
- package/dist/runtime/subsystems/bridge/bridge-delivery.drizzle-backend.js.map +1 -1
- package/dist/runtime/subsystems/bridge/bridge-delivery.memory-backend.js +5 -126
- package/dist/runtime/subsystems/bridge/bridge-delivery.memory-backend.js.map +1 -1
- package/dist/runtime/subsystems/bridge/bridge-delivery.schema.js +6 -308
- package/dist/runtime/subsystems/bridge/bridge-delivery.schema.js.map +1 -1
- package/dist/runtime/subsystems/bridge/bridge-errors.js +6 -35
- package/dist/runtime/subsystems/bridge/bridge-errors.js.map +1 -1
- package/dist/runtime/subsystems/bridge/bridge-outbox-drain-hook.js +14 -606
- package/dist/runtime/subsystems/bridge/bridge-outbox-drain-hook.js.map +1 -1
- package/dist/runtime/subsystems/bridge/bridge.module.js +35 -3476
- package/dist/runtime/subsystems/bridge/bridge.module.js.map +1 -1
- package/dist/runtime/subsystems/bridge/bridge.tokens.js +9 -7
- package/dist/runtime/subsystems/bridge/bridge.tokens.js.map +1 -1
- package/dist/runtime/subsystems/bridge/event-flow.service.js +11 -137
- package/dist/runtime/subsystems/bridge/event-flow.service.js.map +1 -1
- package/dist/runtime/subsystems/bridge/generated/registry.js +4 -2
- package/dist/runtime/subsystems/bridge/generated/registry.js.map +1 -1
- package/dist/runtime/subsystems/bridge/index.js +60 -3470
- package/dist/runtime/subsystems/bridge/index.js.map +1 -1
- package/dist/runtime/subsystems/bridge/reserved-pools.js +4 -6
- package/dist/runtime/subsystems/bridge/reserved-pools.js.map +1 -1
- package/dist/runtime/subsystems/cache/cache.drizzle-backend.js +10 -133
- package/dist/runtime/subsystems/cache/cache.drizzle-backend.js.map +1 -1
- package/dist/runtime/subsystems/cache/cache.memory-backend.js +6 -101
- package/dist/runtime/subsystems/cache/cache.memory-backend.js.map +1 -1
- package/dist/runtime/subsystems/cache/cache.module.js +10 -278
- package/dist/runtime/subsystems/cache/cache.module.js.map +1 -1
- package/dist/runtime/subsystems/cache/cache.schema.js +4 -14
- package/dist/runtime/subsystems/cache/cache.schema.js.map +1 -1
- package/dist/runtime/subsystems/cache/cache.tokens.js +6 -7
- package/dist/runtime/subsystems/cache/cache.tokens.js.map +1 -1
- package/dist/runtime/subsystems/cache/index.js +20 -278
- package/dist/runtime/subsystems/cache/index.js.map +1 -1
- package/dist/runtime/subsystems/events/domain-events.schema.js +3 -72
- package/dist/runtime/subsystems/events/domain-events.schema.js.map +1 -1
- package/dist/runtime/subsystems/events/event-bus.drizzle-backend.js +9 -413
- package/dist/runtime/subsystems/events/event-bus.drizzle-backend.js.map +1 -1
- package/dist/runtime/subsystems/events/event-bus.memory-backend.js +7 -235
- package/dist/runtime/subsystems/events/event-bus.memory-backend.js.map +1 -1
- package/dist/runtime/subsystems/events/event-bus.redis-backend.js +8 -20
- package/dist/runtime/subsystems/events/event-bus.redis-backend.js.map +1 -1
- package/dist/runtime/subsystems/events/event-keyset-cursor.js +8 -30
- package/dist/runtime/subsystems/events/event-keyset-cursor.js.map +1 -1
- package/dist/runtime/subsystems/events/event-read.protocol.js +2 -0
- package/dist/runtime/subsystems/events/event-read.protocol.js.map +1 -1
- package/dist/runtime/subsystems/events/events-errors.js +4 -11
- package/dist/runtime/subsystems/events/events-errors.js.map +1 -1
- package/dist/runtime/subsystems/events/events.module.js +15 -949
- package/dist/runtime/subsystems/events/events.module.js.map +1 -1
- package/dist/runtime/subsystems/events/events.tokens.js +10 -11
- package/dist/runtime/subsystems/events/events.tokens.js.map +1 -1
- package/dist/runtime/subsystems/events/generated/bus.js +9 -240
- package/dist/runtime/subsystems/events/generated/bus.js.map +1 -1
- package/dist/runtime/subsystems/events/generated/index.js +23 -240
- package/dist/runtime/subsystems/events/generated/index.js.map +1 -1
- package/dist/runtime/subsystems/events/generated/registry.js +5 -82
- package/dist/runtime/subsystems/events/generated/registry.js.map +1 -1
- package/dist/runtime/subsystems/events/generated/schemas.js +12 -52
- package/dist/runtime/subsystems/events/generated/schemas.js.map +1 -1
- package/dist/runtime/subsystems/events/generated/types.js +1 -0
- package/dist/runtime/subsystems/events/index.js +32 -949
- package/dist/runtime/subsystems/events/index.js.map +1 -1
- package/dist/runtime/subsystems/index.d.ts +5 -1
- package/dist/runtime/subsystems/index.js +182 -5912
- package/dist/runtime/subsystems/index.js.map +1 -1
- package/dist/runtime/subsystems/integration/build-change-source.js +6 -178
- package/dist/runtime/subsystems/integration/build-change-source.js.map +1 -1
- package/dist/runtime/subsystems/integration/deep-equal.differ.js +4 -109
- package/dist/runtime/subsystems/integration/deep-equal.differ.js.map +1 -1
- package/dist/runtime/subsystems/integration/detection-config.schema.js +11 -78
- package/dist/runtime/subsystems/integration/detection-config.schema.js.map +1 -1
- package/dist/runtime/subsystems/integration/entity-change-source-registry.memory.js +5 -30
- package/dist/runtime/subsystems/integration/entity-change-source-registry.memory.js.map +1 -1
- package/dist/runtime/subsystems/integration/entity-change-source-registry.protocol.js +4 -9
- package/dist/runtime/subsystems/integration/entity-change-source-registry.protocol.js.map +1 -1
- package/dist/runtime/subsystems/integration/execute-integration.use-case.js +6 -239
- package/dist/runtime/subsystems/integration/execute-integration.use-case.js.map +1 -1
- package/dist/runtime/subsystems/integration/incremental-read.js +5 -144
- package/dist/runtime/subsystems/integration/incremental-read.js.map +1 -1
- package/dist/runtime/subsystems/integration/index.js +83 -1352
- package/dist/runtime/subsystems/integration/index.js.map +1 -1
- package/dist/runtime/subsystems/integration/integration-audit.schema.js +10 -155
- package/dist/runtime/subsystems/integration/integration-audit.schema.js.map +1 -1
- package/dist/runtime/subsystems/integration/integration-cursor-store.drizzle-backend.js +7 -270
- package/dist/runtime/subsystems/integration/integration-cursor-store.drizzle-backend.js.map +1 -1
- package/dist/runtime/subsystems/integration/integration-cursor-store.memory-backend.js +4 -65
- package/dist/runtime/subsystems/integration/integration-cursor-store.memory-backend.js.map +1 -1
- package/dist/runtime/subsystems/integration/integration-errors.js +5 -15
- package/dist/runtime/subsystems/integration/integration-errors.js.map +1 -1
- package/dist/runtime/subsystems/integration/integration-field-diff.protocol.js +5 -7
- package/dist/runtime/subsystems/integration/integration-field-diff.protocol.js.map +1 -1
- package/dist/runtime/subsystems/integration/integration-run-recorder.drizzle-backend.js +8 -303
- package/dist/runtime/subsystems/integration/integration-run-recorder.drizzle-backend.js.map +1 -1
- package/dist/runtime/subsystems/integration/integration-run-recorder.memory-backend.js +5 -125
- package/dist/runtime/subsystems/integration/integration-run-recorder.memory-backend.js.map +1 -1
- package/dist/runtime/subsystems/integration/integration.module.js +13 -700
- package/dist/runtime/subsystems/integration/integration.module.js.map +1 -1
- package/dist/runtime/subsystems/integration/integration.tokens.js +11 -9
- package/dist/runtime/subsystems/integration/integration.tokens.js.map +1 -1
- package/dist/runtime/subsystems/integration/loopback.middleware.js +4 -16
- package/dist/runtime/subsystems/integration/loopback.middleware.js.map +1 -1
- package/dist/runtime/subsystems/integration/poll-change-source.d.ts +1 -1
- package/dist/runtime/subsystems/integration/poll-change-source.js +4 -89
- package/dist/runtime/subsystems/integration/poll-change-source.js.map +1 -1
- package/dist/runtime/subsystems/integration/webhook-change-source.d.ts +4 -3
- package/dist/runtime/subsystems/integration/webhook-change-source.js +4 -70
- package/dist/runtime/subsystems/integration/webhook-change-source.js.map +1 -1
- package/dist/runtime/subsystems/jobs/bullmq.config.js +9 -140
- package/dist/runtime/subsystems/jobs/bullmq.config.js.map +1 -1
- package/dist/runtime/subsystems/jobs/index.js +88 -2691
- package/dist/runtime/subsystems/jobs/index.js.map +1 -1
- package/dist/runtime/subsystems/jobs/job-handler.base.js +10 -49
- package/dist/runtime/subsystems/jobs/job-handler.base.js.map +1 -1
- package/dist/runtime/subsystems/jobs/job-orchestration.schema.js +13 -152
- package/dist/runtime/subsystems/jobs/job-orchestration.schema.js.map +1 -1
- package/dist/runtime/subsystems/jobs/job-orchestrator.bullmq-backend.js +36 -699
- package/dist/runtime/subsystems/jobs/job-orchestrator.bullmq-backend.js.map +1 -1
- package/dist/runtime/subsystems/jobs/job-orchestrator.drizzle-backend.js +10 -564
- package/dist/runtime/subsystems/jobs/job-orchestrator.drizzle-backend.js.map +1 -1
- package/dist/runtime/subsystems/jobs/job-orchestrator.memory-backend.js +10 -824
- package/dist/runtime/subsystems/jobs/job-orchestrator.memory-backend.js.map +1 -1
- package/dist/runtime/subsystems/jobs/job-run-keyset-cursor.js +9 -51
- package/dist/runtime/subsystems/jobs/job-run-keyset-cursor.js.map +1 -1
- package/dist/runtime/subsystems/jobs/job-run-service.drizzle-backend.js +9 -416
- package/dist/runtime/subsystems/jobs/job-run-service.drizzle-backend.js.map +1 -1
- package/dist/runtime/subsystems/jobs/job-run-service.memory-backend.js +9 -290
- package/dist/runtime/subsystems/jobs/job-run-service.memory-backend.js.map +1 -1
- package/dist/runtime/subsystems/jobs/job-step-service.drizzle-backend.js +5 -213
- package/dist/runtime/subsystems/jobs/job-step-service.drizzle-backend.js.map +1 -1
- package/dist/runtime/subsystems/jobs/job-step-service.memory-backend.js +5 -131
- package/dist/runtime/subsystems/jobs/job-step-service.memory-backend.js.map +1 -1
- package/dist/runtime/subsystems/jobs/job-worker.bullmq-backend.js +9 -175
- package/dist/runtime/subsystems/jobs/job-worker.bullmq-backend.js.map +1 -1
- package/dist/runtime/subsystems/jobs/job-worker.js +14 -613
- package/dist/runtime/subsystems/jobs/job-worker.js.map +1 -1
- package/dist/runtime/subsystems/jobs/job-worker.module.js +23 -2647
- package/dist/runtime/subsystems/jobs/job-worker.module.js.map +1 -1
- package/dist/runtime/subsystems/jobs/jobs-domain.module.js +19 -1897
- package/dist/runtime/subsystems/jobs/jobs-domain.module.js.map +1 -1
- package/dist/runtime/subsystems/jobs/jobs-domain.tokens.js +8 -9
- package/dist/runtime/subsystems/jobs/jobs-domain.tokens.js.map +1 -1
- package/dist/runtime/subsystems/jobs/jobs-errors.js +10 -78
- package/dist/runtime/subsystems/jobs/jobs-errors.js.map +1 -1
- package/dist/runtime/subsystems/jobs/memory-job-store.js +4 -15
- package/dist/runtime/subsystems/jobs/memory-job-store.js.map +1 -1
- package/dist/runtime/subsystems/jobs/pool-config.loader.js +9 -124
- package/dist/runtime/subsystems/jobs/pool-config.loader.js.map +1 -1
- package/dist/runtime/subsystems/observability/index.js +21 -310
- package/dist/runtime/subsystems/observability/index.js.map +1 -1
- package/dist/runtime/subsystems/observability/observability-errors.js +4 -9
- package/dist/runtime/subsystems/observability/observability-errors.js.map +1 -1
- package/dist/runtime/subsystems/observability/observability.module.js +11 -300
- package/dist/runtime/subsystems/observability/observability.module.js.map +1 -1
- package/dist/runtime/subsystems/observability/observability.service.js +9 -197
- package/dist/runtime/subsystems/observability/observability.service.js.map +1 -1
- package/dist/runtime/subsystems/observability/observability.tokens.js +5 -3
- package/dist/runtime/subsystems/observability/observability.tokens.js.map +1 -1
- package/dist/runtime/subsystems/observability/reporters/bridge-metrics.reporter.js +4 -84
- package/dist/runtime/subsystems/observability/reporters/bridge-metrics.reporter.js.map +1 -1
- package/dist/runtime/subsystems/observability/reporters/index.js +5 -84
- package/dist/runtime/subsystems/observability/reporters/index.js.map +1 -1
- package/dist/runtime/subsystems/storage/index.js +15 -200
- package/dist/runtime/subsystems/storage/index.js.map +1 -1
- package/dist/runtime/subsystems/storage/storage.local-backend.js +4 -103
- package/dist/runtime/subsystems/storage/storage.local-backend.js.map +1 -1
- package/dist/runtime/subsystems/storage/storage.memory-backend.js +5 -68
- package/dist/runtime/subsystems/storage/storage.memory-backend.js.map +1 -1
- package/dist/runtime/subsystems/storage/storage.module.js +8 -200
- package/dist/runtime/subsystems/storage/storage.module.js.map +1 -1
- package/dist/runtime/subsystems/storage/storage.tokens.js +5 -6
- package/dist/runtime/subsystems/storage/storage.tokens.js.map +1 -1
- package/dist/runtime/subsystems/storage/storage.utils.js +4 -14
- package/dist/runtime/subsystems/storage/storage.utils.js.map +1 -1
- package/dist/runtime/subsystems/token-key.js +5 -3
- package/dist/runtime/subsystems/token-key.js.map +1 -1
- package/dist/src/cli/index.js +637 -5454
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/index.js +68 -4170
- package/dist/src/index.js.map +1 -1
- package/package.json +1 -1
- package/runtime/subsystems/bridge/bridge-outbox-drain-hook.ts +44 -21
- package/runtime/subsystems/index.ts +27 -0
- package/runtime/subsystems/integration/poll-change-source.ts +10 -7
- package/runtime/subsystems/integration/webhook-change-source.ts +12 -8
- package/runtime/subsystems/jobs/job-worker.ts +17 -11
|
@@ -1,452 +1,14 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
-
var __decorateClass = (decorators, target, key, kind) => {
|
|
4
|
-
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
5
|
-
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
6
|
-
if (decorator = decorators[i])
|
|
7
|
-
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
8
|
-
if (kind && result) __defProp(target, key, result);
|
|
9
|
-
return result;
|
|
10
|
-
};
|
|
11
|
-
var __decorateParam = (index4, decorator) => (target, key) => decorator(target, key, index4);
|
|
12
|
-
|
|
13
|
-
// runtime/subsystems/bridge/bridge-delivery.drizzle-backend.ts
|
|
14
|
-
import { Inject, Injectable, Optional } from "@nestjs/common";
|
|
15
|
-
import { eq, and, gte, isNull, sql as sql4 } from "drizzle-orm";
|
|
16
|
-
|
|
17
|
-
// runtime/constants/tokens.ts
|
|
18
|
-
var DRIZZLE = "DRIZZLE";
|
|
19
|
-
|
|
20
|
-
// runtime/subsystems/bridge/bridge-delivery.schema.ts
|
|
21
|
-
import {
|
|
22
|
-
index as index3,
|
|
23
|
-
jsonb as jsonb3,
|
|
24
|
-
pgEnum as pgEnum2,
|
|
25
|
-
pgTable as pgTable3,
|
|
26
|
-
text as text3,
|
|
27
|
-
timestamp as timestamp3,
|
|
28
|
-
unique,
|
|
29
|
-
uuid as uuid3
|
|
30
|
-
} from "drizzle-orm/pg-core";
|
|
31
|
-
import { sql as sql3 } from "drizzle-orm";
|
|
32
|
-
|
|
33
|
-
// runtime/subsystems/events/domain-events.schema.ts
|
|
34
|
-
import {
|
|
35
|
-
check,
|
|
36
|
-
index,
|
|
37
|
-
jsonb,
|
|
38
|
-
pgTable,
|
|
39
|
-
text,
|
|
40
|
-
timestamp,
|
|
41
|
-
uuid
|
|
42
|
-
} from "drizzle-orm/pg-core";
|
|
43
|
-
import { sql } from "drizzle-orm";
|
|
44
|
-
var domainEvents = pgTable(
|
|
45
|
-
"domain_events",
|
|
46
|
-
{
|
|
47
|
-
id: uuid("id").primaryKey(),
|
|
48
|
-
type: text("type").notNull(),
|
|
49
|
-
aggregateId: text("aggregate_id").notNull(),
|
|
50
|
-
aggregateType: text("aggregate_type").notNull(),
|
|
51
|
-
payload: jsonb("payload").notNull().$type(),
|
|
52
|
-
occurredAt: timestamp("occurred_at", { withTimezone: true }).notNull(),
|
|
53
|
-
processedAt: timestamp("processed_at", { withTimezone: true }),
|
|
54
|
-
/** Lifecycle status: pending | processed | failed */
|
|
55
|
-
status: text("status").notNull().default("pending"),
|
|
56
|
-
/** Error message from the last failed dispatch attempt. */
|
|
57
|
-
error: text("error"),
|
|
58
|
-
metadata: jsonb("metadata").$type(),
|
|
59
|
-
/** Routing pool (e.g. `events_inbound`, `events_change`, `events_outbound`). Populated by DrizzleEventBus.publish() in EVT-4. NULL when `tier='audit'`. */
|
|
60
|
-
pool: text("pool"),
|
|
61
|
-
/** Routing direction: `inbound` | `change` | `outbound`. Populated by DrizzleEventBus.publish() in EVT-4. NULL when `tier='audit'`. */
|
|
62
|
-
direction: text("direction"),
|
|
63
|
-
/**
|
|
64
|
-
* Event tier: `'domain'` (default) or `'audit'`. Audit-tier rows are
|
|
65
|
-
* observability-only and have null `pool`/`direction` by construction —
|
|
66
|
-
* enforced by the `domain_events_tier_routing_check` CHECK constraint
|
|
67
|
-
* declared below. (AUDIT-1)
|
|
68
|
-
*/
|
|
69
|
-
tier: text("tier").notNull().default("domain"),
|
|
70
|
-
// conditional: emitted only when events.multi_tenant: true
|
|
71
|
-
tenantId: text("tenant_id")
|
|
72
|
-
},
|
|
73
|
-
(t) => ({
|
|
74
|
-
/** Polling drain filter (existing — promoted from comment to declaration in EVT-1). */
|
|
75
|
-
idxDomainEventsStatusOccurredAt: index("idx_domain_events_status_occurred_at").on(
|
|
76
|
-
t.status,
|
|
77
|
-
t.occurredAt
|
|
78
|
-
),
|
|
79
|
-
/** Event replay per aggregate (existing — promoted from comment to declaration in EVT-1). */
|
|
80
|
-
idxDomainEventsAggregate: index("idx_domain_events_aggregate").on(
|
|
81
|
-
t.aggregateId,
|
|
82
|
-
t.aggregateType
|
|
83
|
-
),
|
|
84
|
-
/** Per-pool drain filter (EVT-1). Enables DrizzleEventBus to drain a single pool without scanning all events. */
|
|
85
|
-
idxDomainEventsPoolStatusOccurredAt: index(
|
|
86
|
-
"idx_domain_events_pool_status_occurred_at"
|
|
87
|
-
).on(t.pool, t.status, t.occurredAt),
|
|
88
|
-
/** Per-tier filter (AUDIT-1). Backs the observability viewer's tier toggle. */
|
|
89
|
-
idxDomainEventsTierStatusOccurredAt: index(
|
|
90
|
-
"idx_domain_events_tier_status_occurred_at"
|
|
91
|
-
).on(t.tier, t.status, t.occurredAt),
|
|
92
|
-
/**
|
|
93
|
-
* Tier ↔ routing-fields invariant (AUDIT-1):
|
|
94
|
-
* - `tier` is one of `'domain' | 'audit'`.
|
|
95
|
-
* - `tier='audit'` ⇔ `pool IS NULL AND direction IS NULL`.
|
|
96
|
-
* - `tier='domain'` ⇒ `pool` and `direction` are populated (the
|
|
97
|
-
* DrizzleEventBus inserts always supply them; the bus stamps them
|
|
98
|
-
* in AUDIT-3).
|
|
99
|
-
*/
|
|
100
|
-
tierRoutingCheck: check(
|
|
101
|
-
"domain_events_tier_routing_check",
|
|
102
|
-
sql`${t.tier} in ('domain','audit') AND ((${t.tier} = 'audit') = (${t.pool} is null and ${t.direction} is null))`
|
|
103
|
-
)
|
|
104
|
-
})
|
|
105
|
-
);
|
|
106
|
-
|
|
107
|
-
// runtime/subsystems/jobs/job-orchestration.schema.ts
|
|
108
1
|
import {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
import { sql as sql2 } from "drizzle-orm";
|
|
120
|
-
var jobRunStatusEnum = pgEnum("job_run_status", [
|
|
121
|
-
"pending",
|
|
122
|
-
"running",
|
|
123
|
-
"waiting",
|
|
124
|
-
"completed",
|
|
125
|
-
"failed",
|
|
126
|
-
"timed_out",
|
|
127
|
-
"canceled"
|
|
128
|
-
]);
|
|
129
|
-
var jobStepKindEnum = pgEnum("job_step_kind", ["task"]);
|
|
130
|
-
var jobStepStatusEnum = pgEnum("job_step_status", [
|
|
131
|
-
"pending",
|
|
132
|
-
"running",
|
|
133
|
-
"completed",
|
|
134
|
-
"failed",
|
|
135
|
-
"skipped"
|
|
136
|
-
]);
|
|
137
|
-
var collisionModeEnum = pgEnum("job_collision_mode", [
|
|
138
|
-
"queue",
|
|
139
|
-
"reject",
|
|
140
|
-
"replace"
|
|
141
|
-
]);
|
|
142
|
-
var replayFromEnum = pgEnum("job_replay_from", [
|
|
143
|
-
"scratch",
|
|
144
|
-
"last_step",
|
|
145
|
-
"last_checkpoint"
|
|
146
|
-
]);
|
|
147
|
-
var parentClosePolicyEnum = pgEnum("job_parent_close_policy", [
|
|
148
|
-
"terminate",
|
|
149
|
-
"cancel",
|
|
150
|
-
"abandon"
|
|
151
|
-
]);
|
|
152
|
-
var waitKindEnum = pgEnum("job_wait_kind", ["signal"]);
|
|
153
|
-
var triggerSourceEnum = pgEnum("job_trigger_source", [
|
|
154
|
-
"manual",
|
|
155
|
-
"schedule",
|
|
156
|
-
"event",
|
|
157
|
-
"parent"
|
|
158
|
-
]);
|
|
159
|
-
var jobs = pgTable2("job", {
|
|
160
|
-
type: text2("type").primaryKey(),
|
|
161
|
-
version: integer("version").notNull().default(1),
|
|
162
|
-
pool: text2("pool").notNull(),
|
|
163
|
-
scopeEntityType: text2("scope_entity_type"),
|
|
164
|
-
retryPolicy: jsonb2("retry_policy").notNull().$type(),
|
|
165
|
-
timeoutMs: integer("timeout_ms"),
|
|
166
|
-
concurrencyKeyTemplate: text2("concurrency_key_template"),
|
|
167
|
-
collisionMode: collisionModeEnum("collision_mode").notNull().default("queue"),
|
|
168
|
-
dedupeKeyTemplate: text2("dedupe_key_template"),
|
|
169
|
-
dedupeWindowMs: integer("dedupe_window_ms"),
|
|
170
|
-
priorityDefault: integer("priority_default").notNull().default(0),
|
|
171
|
-
replayFrom: replayFromEnum("replay_from").notNull().default("last_checkpoint"),
|
|
172
|
-
createdAt: timestamp2("created_at", { withTimezone: true }).notNull().defaultNow(),
|
|
173
|
-
updatedAt: timestamp2("updated_at", { withTimezone: true }).notNull().defaultNow()
|
|
174
|
-
});
|
|
175
|
-
var jobRuns = pgTable2(
|
|
176
|
-
"job_run",
|
|
177
|
-
{
|
|
178
|
-
id: uuid2("id").primaryKey().defaultRandom(),
|
|
179
|
-
jobType: text2("job_type").notNull().references(() => jobs.type),
|
|
180
|
-
jobVersion: integer("job_version").notNull(),
|
|
181
|
-
parentRunId: uuid2("parent_run_id").references(() => jobRuns.id),
|
|
182
|
-
/**
|
|
183
|
-
* Service generates `id` client-side via randomUUID() and sets
|
|
184
|
-
* root_run_id = id for root runs (single INSERT, no self-FK race).
|
|
185
|
-
*/
|
|
186
|
-
rootRunId: uuid2("root_run_id").notNull(),
|
|
187
|
-
parentClosePolicy: parentClosePolicyEnum("parent_close_policy").notNull().default("terminate"),
|
|
188
|
-
scopeEntityType: text2("scope_entity_type"),
|
|
189
|
-
scopeEntityId: text2("scope_entity_id"),
|
|
190
|
-
tenantId: text2("tenant_id"),
|
|
191
|
-
tags: jsonb2("tags").notNull().default({}).$type(),
|
|
192
|
-
pool: text2("pool").notNull(),
|
|
193
|
-
priority: integer("priority").notNull().default(0),
|
|
194
|
-
concurrencyKey: text2("concurrency_key"),
|
|
195
|
-
dedupeKey: text2("dedupe_key"),
|
|
196
|
-
status: jobRunStatusEnum("status").notNull().default("pending"),
|
|
197
|
-
input: jsonb2("input").notNull().$type(),
|
|
198
|
-
output: jsonb2("output").$type(),
|
|
199
|
-
error: jsonb2("error").$type(),
|
|
200
|
-
triggerSource: triggerSourceEnum("trigger_source").notNull(),
|
|
201
|
-
triggerRef: text2("trigger_ref"),
|
|
202
|
-
runAt: timestamp2("run_at", { withTimezone: true }).notNull().defaultNow(),
|
|
203
|
-
startedAt: timestamp2("started_at", { withTimezone: true }),
|
|
204
|
-
finishedAt: timestamp2("finished_at", { withTimezone: true }),
|
|
205
|
-
claimedAt: timestamp2("claimed_at", { withTimezone: true }),
|
|
206
|
-
attempts: integer("attempts").notNull().default(0),
|
|
207
|
-
// Phase 3 placeholder — see ADR-025
|
|
208
|
-
waitKind: waitKindEnum("wait_kind"),
|
|
209
|
-
// Phase 3 placeholder — see ADR-025
|
|
210
|
-
resumeToken: text2("resume_token"),
|
|
211
|
-
// Phase 3 placeholder — see ADR-025
|
|
212
|
-
waitDeadline: timestamp2("wait_deadline", { withTimezone: true }),
|
|
213
|
-
createdAt: timestamp2("created_at", { withTimezone: true }).notNull().defaultNow(),
|
|
214
|
-
updatedAt: timestamp2("updated_at", { withTimezone: true }).notNull().defaultNow()
|
|
215
|
-
},
|
|
216
|
-
(t) => ({
|
|
217
|
-
/** Claim query: ORDER BY priority DESC, run_at ASC. */
|
|
218
|
-
idxJobRunClaim: index2("idx_job_run_claim").on(t.status, t.pool, t.runAt),
|
|
219
|
-
/** Tree traversal / cascade cancel. */
|
|
220
|
-
idxJobRunRoot: index2("idx_job_run_root").on(t.rootRunId),
|
|
221
|
-
/** listForScope query. */
|
|
222
|
-
idxJobRunScope: index2("idx_job_run_scope").on(t.scopeEntityType, t.scopeEntityId),
|
|
223
|
-
/** Idempotency collapse — partial index. */
|
|
224
|
-
idxJobRunDedupe: index2("idx_job_run_dedupe").on(t.jobType, t.dedupeKey).where(sql2`${t.dedupeKey} IS NOT NULL`),
|
|
225
|
-
/** Collision check — partial index. */
|
|
226
|
-
idxJobRunConcurrency: index2("idx_job_run_concurrency").on(t.concurrencyKey).where(
|
|
227
|
-
sql2`${t.concurrencyKey} IS NOT NULL AND ${t.status} IN ('pending','running')`
|
|
228
|
-
)
|
|
229
|
-
})
|
|
230
|
-
);
|
|
231
|
-
var jobSteps = pgTable2(
|
|
232
|
-
"job_step",
|
|
233
|
-
{
|
|
234
|
-
id: uuid2("id").primaryKey().defaultRandom(),
|
|
235
|
-
jobRunId: uuid2("job_run_id").notNull().references(() => jobRuns.id),
|
|
236
|
-
stepId: text2("step_id").notNull(),
|
|
237
|
-
kind: jobStepKindEnum("kind").notNull().default("task"),
|
|
238
|
-
/**
|
|
239
|
-
* Monotonic within run. integer (max ~2B per run) is sufficient —
|
|
240
|
-
* downgraded from ADR-022's bigint; revisit only if a single run
|
|
241
|
-
* ever exceeds 2 billion steps.
|
|
242
|
-
*/
|
|
243
|
-
seq: integer("seq").notNull(),
|
|
244
|
-
status: jobStepStatusEnum("status").notNull().default("pending"),
|
|
245
|
-
input: jsonb2("input").$type(),
|
|
246
|
-
/** Memoised on success for replay. */
|
|
247
|
-
output: jsonb2("output").$type(),
|
|
248
|
-
error: jsonb2("error").$type(),
|
|
249
|
-
attempts: integer("attempts").notNull().default(0),
|
|
250
|
-
startedAt: timestamp2("started_at", { withTimezone: true }),
|
|
251
|
-
finishedAt: timestamp2("finished_at", { withTimezone: true })
|
|
252
|
-
},
|
|
253
|
-
(t) => ({
|
|
254
|
-
/** No duplicate step IDs per run. */
|
|
255
|
-
idxJobStepRunStep: uniqueIndex("idx_job_step_run_step").on(t.jobRunId, t.stepId),
|
|
256
|
-
/** Ordered timeline reads. */
|
|
257
|
-
idxJobStepTimeline: index2("idx_job_step_timeline").on(t.jobRunId, t.seq)
|
|
258
|
-
})
|
|
259
|
-
);
|
|
260
|
-
|
|
261
|
-
// runtime/subsystems/bridge/bridge-delivery.schema.ts
|
|
262
|
-
var bridgeDeliveryStatusEnum = pgEnum2("bridge_delivery_status", [
|
|
263
|
-
"pending",
|
|
264
|
-
"delivered",
|
|
265
|
-
"skipped",
|
|
266
|
-
"failed"
|
|
267
|
-
]);
|
|
268
|
-
var bridgeDelivery = pgTable3(
|
|
269
|
-
"bridge_delivery",
|
|
270
|
-
{
|
|
271
|
-
id: uuid3("id").primaryKey().defaultRandom(),
|
|
272
|
-
/** FK to the source event in the outbox. */
|
|
273
|
-
eventId: uuid3("event_id").notNull().references(() => domainEvents.id),
|
|
274
|
-
/**
|
|
275
|
-
* Stable codegen-emitted identifier for the (job, trigger) pair, of the
|
|
276
|
-
* form `<job_type>#<triggerIndex>` (BRIDGE-6). Forms the second half of
|
|
277
|
-
* the UNIQUE idempotency key.
|
|
278
|
-
*/
|
|
279
|
-
triggerId: text3("trigger_id").notNull(),
|
|
280
|
-
/**
|
|
281
|
-
* Wrapper `job_run.id` (the framework `@framework/bridge_delivery` run
|
|
282
|
-
* that drove this delivery). Nullable: the facade-eager path
|
|
283
|
-
* (`publishAndStart` Case B) pre-writes a delivered row with no wrapper.
|
|
284
|
-
*/
|
|
285
|
-
wrapperRunId: uuid3("wrapper_run_id").references(() => jobRuns.id),
|
|
286
|
-
/**
|
|
287
|
-
* Spawned user `job_run.id`. Null until status is `delivered`; remains
|
|
288
|
-
* null for `skipped` and `failed` deliveries.
|
|
289
|
-
*/
|
|
290
|
-
userRunId: uuid3("user_run_id").references(() => jobRuns.id),
|
|
291
|
-
status: bridgeDeliveryStatusEnum("status").notNull().default("pending"),
|
|
292
|
-
/** Populated when status=`skipped` (e.g. `'when_returned_false'`, `'trigger_unregistered'`). */
|
|
293
|
-
skipReason: text3("skip_reason"),
|
|
294
|
-
/** Populated when status=`failed`. Mirrors `job_run.error` shape. */
|
|
295
|
-
error: jsonb3("error").$type(),
|
|
296
|
-
/**
|
|
297
|
-
* Emitted unconditionally and nullable (JOB-8 / SYNC-6 precedent).
|
|
298
|
-
* Enforcement gated on `BRIDGE_MULTI_TENANT` at the service layer
|
|
299
|
-
* (BRIDGE-8); no DB constraint.
|
|
300
|
-
*/
|
|
301
|
-
tenantId: text3("tenant_id"),
|
|
302
|
-
attemptedAt: timestamp3("attempted_at", { withTimezone: true }).notNull().defaultNow(),
|
|
303
|
-
deliveredAt: timestamp3("delivered_at", { withTimezone: true })
|
|
304
|
-
},
|
|
305
|
-
(t) => ({
|
|
306
|
-
/**
|
|
307
|
-
* Idempotency ledger. Outbox replays and facade-vs-drain collisions both
|
|
308
|
-
* dedup through this constraint.
|
|
309
|
-
*/
|
|
310
|
-
uqBridgeDeliveryEventTrigger: unique("uq_bridge_delivery_event_trigger").on(
|
|
311
|
-
t.eventId,
|
|
312
|
-
t.triggerId
|
|
313
|
-
),
|
|
314
|
-
/** Lookup all deliveries for an event (fanout report, debugging). */
|
|
315
|
-
idxBridgeDeliveryEvent: index3("idx_bridge_delivery_event").on(t.eventId),
|
|
316
|
-
/**
|
|
317
|
-
* Ops dashboard filter — only the actionable states. Partial index keeps
|
|
318
|
-
* it small at scale (the bulk of rows will be `delivered`).
|
|
319
|
-
*/
|
|
320
|
-
idxBridgeDeliveryStatus: index3("idx_bridge_delivery_status").on(t.status).where(sql3`${t.status} IN ('pending','failed')`),
|
|
321
|
-
/**
|
|
322
|
-
* Reverse lookup from a spawned user run back to its delivery row.
|
|
323
|
-
* Partial — most rows in the bridge ledger but only successful
|
|
324
|
-
* deliveries have a `user_run_id`.
|
|
325
|
-
*/
|
|
326
|
-
idxBridgeDeliveryUserRun: index3("idx_bridge_delivery_user_run").on(t.userRunId).where(sql3`${t.userRunId} IS NOT NULL`)
|
|
327
|
-
})
|
|
328
|
-
);
|
|
329
|
-
|
|
330
|
-
// runtime/subsystems/bridge/bridge-errors.ts
|
|
331
|
-
var MissingTenantIdError = class extends Error {
|
|
332
|
-
constructor(callSite) {
|
|
333
|
-
super(
|
|
334
|
-
`MissingTenantIdError: BridgeModule was configured with multiTenant=true but ${callSite} was called without tenantId (undefined). Pass an explicit tenantId, or pass null for cross-tenant work.`
|
|
335
|
-
);
|
|
336
|
-
this.callSite = callSite;
|
|
337
|
-
}
|
|
338
|
-
callSite;
|
|
339
|
-
name = "MissingTenantIdError";
|
|
340
|
-
};
|
|
341
|
-
|
|
342
|
-
// runtime/subsystems/bridge/assert-tenant-id.ts
|
|
343
|
-
function assertTenantId(site, multiTenant, tenantId) {
|
|
344
|
-
if (multiTenant && tenantId === void 0) {
|
|
345
|
-
throw new MissingTenantIdError(site);
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
// runtime/subsystems/bridge/bridge.tokens.ts
|
|
350
|
-
var BRIDGE_MULTI_TENANT = "BRIDGE_MULTI_TENANT";
|
|
351
|
-
|
|
352
|
-
// runtime/subsystems/bridge/bridge-delivery.drizzle-backend.ts
|
|
353
|
-
var DrizzleBridgeDeliveryRepo = class {
|
|
354
|
-
constructor(db, multiTenant = false) {
|
|
355
|
-
this.db = db;
|
|
356
|
-
this.multiTenant = multiTenant;
|
|
357
|
-
}
|
|
358
|
-
db;
|
|
359
|
-
multiTenant;
|
|
360
|
-
async insertDelivery(row, tx) {
|
|
361
|
-
assertTenantId(
|
|
362
|
-
"DrizzleBridgeDeliveryRepo.insertDelivery",
|
|
363
|
-
this.multiTenant,
|
|
364
|
-
row.tenantId
|
|
365
|
-
);
|
|
366
|
-
const client = tx ?? this.db;
|
|
367
|
-
await client.insert(bridgeDelivery).values(row).onConflictDoNothing({
|
|
368
|
-
target: [bridgeDelivery.eventId, bridgeDelivery.triggerId]
|
|
369
|
-
});
|
|
370
|
-
}
|
|
371
|
-
async findDelivery(eventId, triggerId) {
|
|
372
|
-
const rows = await this.db.select().from(bridgeDelivery).where(
|
|
373
|
-
and(
|
|
374
|
-
eq(bridgeDelivery.eventId, eventId),
|
|
375
|
-
eq(bridgeDelivery.triggerId, triggerId)
|
|
376
|
-
)
|
|
377
|
-
).limit(1);
|
|
378
|
-
return rows[0] ?? null;
|
|
379
|
-
}
|
|
380
|
-
async findDeliveryById(id) {
|
|
381
|
-
const rows = await this.db.select().from(bridgeDelivery).where(eq(bridgeDelivery.id, id)).limit(1);
|
|
382
|
-
return rows[0] ?? null;
|
|
383
|
-
}
|
|
384
|
-
async markDelivered(id, userRunId, tx) {
|
|
385
|
-
const client = tx ?? this.db;
|
|
386
|
-
await client.update(bridgeDelivery).set({
|
|
387
|
-
status: "delivered",
|
|
388
|
-
userRunId,
|
|
389
|
-
deliveredAt: /* @__PURE__ */ new Date()
|
|
390
|
-
}).where(eq(bridgeDelivery.id, id));
|
|
391
|
-
}
|
|
392
|
-
async markSkipped(id, reason, tx) {
|
|
393
|
-
const client = tx ?? this.db;
|
|
394
|
-
await client.update(bridgeDelivery).set({ status: "skipped", skipReason: reason }).where(eq(bridgeDelivery.id, id));
|
|
395
|
-
}
|
|
396
|
-
async markFailed(id, error, tx) {
|
|
397
|
-
const client = tx ?? this.db;
|
|
398
|
-
await client.update(bridgeDelivery).set({ status: "failed", error }).where(eq(bridgeDelivery.id, id));
|
|
399
|
-
}
|
|
400
|
-
/**
|
|
401
|
-
* Observability read — see `IJobBridge.getStatusHistogram` JSDoc for the
|
|
402
|
-
* tenant-filter and windowHours contract.
|
|
403
|
-
*
|
|
404
|
-
* Tenant-filter note: this method intentionally does NOT call
|
|
405
|
-
* `assertTenantId`. The write methods on this repo (`insertDelivery`)
|
|
406
|
-
* treat `tenantId === undefined` as a misconfiguration and fail fast.
|
|
407
|
-
* Reads are different — `undefined` is the supported "cross-tenant
|
|
408
|
-
* admin view" mode that OBS-5 uses to render a framework-wide health
|
|
409
|
-
* panel. Callers that need strict tenant scoping pass an explicit
|
|
410
|
-
* string or `null`.
|
|
411
|
-
*
|
|
412
|
-
* Cast note: `count(*)::int` is applied in SQL so the node-pg driver
|
|
413
|
-
* returns a `number` instead of the default `bigint → string` for
|
|
414
|
-
* `count(*)`. Don't relax this cast — consumers (and the protocol)
|
|
415
|
-
* type the result as `number`.
|
|
416
|
-
*/
|
|
417
|
-
async getStatusHistogram(windowHours, tenantId) {
|
|
418
|
-
if (!Number.isFinite(windowHours) || windowHours <= 0) {
|
|
419
|
-
throw new RangeError("windowHours must be positive");
|
|
420
|
-
}
|
|
421
|
-
const cutoff = sql4`now() - make_interval(hours => ${windowHours})`;
|
|
422
|
-
const conditions = [gte(bridgeDelivery.attemptedAt, cutoff)];
|
|
423
|
-
if (tenantId === null) {
|
|
424
|
-
conditions.push(isNull(bridgeDelivery.tenantId));
|
|
425
|
-
} else if (typeof tenantId === "string") {
|
|
426
|
-
conditions.push(eq(bridgeDelivery.tenantId, tenantId));
|
|
427
|
-
}
|
|
428
|
-
const rows = await this.db.select({
|
|
429
|
-
status: bridgeDelivery.status,
|
|
430
|
-
count: sql4`count(*)::int`
|
|
431
|
-
}).from(bridgeDelivery).where(and(...conditions)).groupBy(bridgeDelivery.status);
|
|
432
|
-
const histogram = {
|
|
433
|
-
pending: 0,
|
|
434
|
-
delivered: 0,
|
|
435
|
-
skipped: 0,
|
|
436
|
-
failed: 0
|
|
437
|
-
};
|
|
438
|
-
for (const row of rows) {
|
|
439
|
-
histogram[row.status] = Number(row.count);
|
|
440
|
-
}
|
|
441
|
-
return histogram;
|
|
442
|
-
}
|
|
443
|
-
};
|
|
444
|
-
DrizzleBridgeDeliveryRepo = __decorateClass([
|
|
445
|
-
Injectable(),
|
|
446
|
-
__decorateParam(0, Inject(DRIZZLE)),
|
|
447
|
-
__decorateParam(1, Optional()),
|
|
448
|
-
__decorateParam(1, Inject(BRIDGE_MULTI_TENANT))
|
|
449
|
-
], DrizzleBridgeDeliveryRepo);
|
|
2
|
+
DrizzleBridgeDeliveryRepo
|
|
3
|
+
} from "../../../chunk-K2I6XIK5.js";
|
|
4
|
+
import "../../../chunk-6DWFJNIK.js";
|
|
5
|
+
import "../../../chunk-2TVVBC53.js";
|
|
6
|
+
import "../../../chunk-NXXDZ6ZF.js";
|
|
7
|
+
import "../../../chunk-4LH67P4U.js";
|
|
8
|
+
import "../../../chunk-OKXZ63IA.js";
|
|
9
|
+
import "../../../chunk-OFRRBC7M.js";
|
|
10
|
+
import "../../../chunk-U64T4YZE.js";
|
|
11
|
+
import "../../../chunk-2E224ZSN.js";
|
|
450
12
|
export {
|
|
451
13
|
DrizzleBridgeDeliveryRepo
|
|
452
14
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../runtime/subsystems/bridge/bridge-delivery.drizzle-backend.ts","../../../../runtime/constants/tokens.ts","../../../../runtime/subsystems/bridge/bridge-delivery.schema.ts","../../../../runtime/subsystems/events/domain-events.schema.ts","../../../../runtime/subsystems/jobs/job-orchestration.schema.ts","../../../../runtime/subsystems/bridge/bridge-errors.ts","../../../../runtime/subsystems/bridge/assert-tenant-id.ts","../../../../runtime/subsystems/bridge/bridge.tokens.ts"],"sourcesContent":["/**\n * DrizzleBridgeDeliveryRepo — Postgres implementation of `IJobBridge`\n * (BRIDGE-4, ADR-023 Phase 2).\n *\n * Behavioral twin of `MemoryBridgeDeliveryRepo` (BRIDGE-3). The key\n * difference is `insertDelivery`: where the memory backend throws\n * `UniqueConstraintError` on a duplicate `(event_id, trigger_id)`, the\n * Drizzle backend uses `INSERT … ON CONFLICT (event_id, trigger_id) DO\n * NOTHING` and surfaces the dedup as a silent no-op. This matches the\n * BRIDGE-4 spec recommendation — a thrown error inside the per-event tx\n * would abort sibling triggers, which is exactly the failure mode the\n * facade's Case B pre-write was designed to prevent.\n *\n * Tests that need to assert \"the constraint fired\" use `findDelivery` to\n * confirm the existing row is the facade-eager pre-write (or the prior\n * drain attempt's row), not the one this call tried to insert. The\n * `UniqueConstraintError` branch from BRIDGE-3 is the memory-backend\n * fidelity path; the Drizzle backend models the same idempotency through\n * SQL semantics rather than a thrown error.\n *\n * The other four methods (`findDelivery`, `findDeliveryById`,\n * `mark{Delivered,Skipped,Failed}`) are straightforward\n * `SELECT … LIMIT 1` / `UPDATE … WHERE id = ?` queries.\n */\nimport { Inject, Injectable, Optional } from '@nestjs/common';\nimport { eq, and, gte, isNull, sql } from 'drizzle-orm';\n\nimport { DRIZZLE } from '../../constants/tokens';\nimport type { DrizzleClient } from '../../types/drizzle';\nimport type { DrizzleTransaction } from '../events/event-bus.protocol';\n\nimport { bridgeDelivery } from './bridge-delivery.schema';\nimport type { BridgeDeliveryRecord } from './bridge-delivery.schema';\nimport type {\n BridgeDeliveryInsert,\n IJobBridge,\n StatusHistogram,\n} from './bridge.protocol';\nimport { assertTenantId } from './assert-tenant-id';\nimport { BRIDGE_MULTI_TENANT } from './bridge.tokens';\n\n@Injectable()\nexport class DrizzleBridgeDeliveryRepo implements IJobBridge {\n constructor(\n @Inject(DRIZZLE) private readonly db: DrizzleClient,\n /**\n * Site (c) of the three ADR-023 §Multi-tenancy enforcement sites.\n * `@Optional()` so unit tests / non-bridge mounts that don't provide\n * the token still construct the repo cleanly; defaults to `false`,\n * which makes `assertTenantId` a no-op.\n */\n @Optional()\n @Inject(BRIDGE_MULTI_TENANT)\n private readonly multiTenant: boolean = false,\n ) {}\n\n async insertDelivery(\n row: BridgeDeliveryInsert,\n tx?: DrizzleTransaction,\n ): Promise<void> {\n // Multi-tenancy gate — last-line defense. Even if callers skipped\n // sites (a) `EventFlowService.publishAndStart` and (b)\n // `BridgeDeliveryHandler.run`, a direct repo call still fails fast\n // BEFORE any SQL is issued.\n assertTenantId(\n 'DrizzleBridgeDeliveryRepo.insertDelivery',\n this.multiTenant,\n row.tenantId,\n );\n const client = (tx ?? this.db) as DrizzleClient;\n // ON CONFLICT DO NOTHING — surfaces dedup as silent no-op so the\n // per-event tx stays atomic across sibling triggers. RETURNING is\n // omitted here: the public IJobBridge contract is `Promise<void>`,\n // and the drain hook (BRIDGE-4) uses its own\n // `tx.insert(...).onConflictDoNothing().returning({id})` pattern\n // when it needs the rowcount discriminator. See class-level JSDoc.\n await client\n .insert(bridgeDelivery)\n .values(row)\n .onConflictDoNothing({\n target: [bridgeDelivery.eventId, bridgeDelivery.triggerId],\n });\n }\n\n async findDelivery(\n eventId: string,\n triggerId: string,\n ): Promise<BridgeDeliveryRecord | null> {\n const rows = await this.db\n .select()\n .from(bridgeDelivery)\n .where(\n and(\n eq(bridgeDelivery.eventId, eventId),\n eq(bridgeDelivery.triggerId, triggerId),\n ),\n )\n .limit(1);\n return (rows[0] as BridgeDeliveryRecord | undefined) ?? null;\n }\n\n async findDeliveryById(id: string): Promise<BridgeDeliveryRecord | null> {\n const rows = await this.db\n .select()\n .from(bridgeDelivery)\n .where(eq(bridgeDelivery.id, id))\n .limit(1);\n return (rows[0] as BridgeDeliveryRecord | undefined) ?? null;\n }\n\n async markDelivered(\n id: string,\n userRunId: string,\n tx?: DrizzleTransaction,\n ): Promise<void> {\n const client = (tx ?? this.db) as DrizzleClient;\n await client\n .update(bridgeDelivery)\n .set({\n status: 'delivered',\n userRunId,\n deliveredAt: new Date(),\n })\n .where(eq(bridgeDelivery.id, id));\n }\n\n async markSkipped(\n id: string,\n reason: string,\n tx?: DrizzleTransaction,\n ): Promise<void> {\n const client = (tx ?? this.db) as DrizzleClient;\n await client\n .update(bridgeDelivery)\n .set({ status: 'skipped', skipReason: reason })\n .where(eq(bridgeDelivery.id, id));\n }\n\n async markFailed(\n id: string,\n error: Record<string, unknown>,\n tx?: DrizzleTransaction,\n ): Promise<void> {\n const client = (tx ?? this.db) as DrizzleClient;\n await client\n .update(bridgeDelivery)\n .set({ status: 'failed', error })\n .where(eq(bridgeDelivery.id, id));\n }\n\n /**\n * Observability read — see `IJobBridge.getStatusHistogram` JSDoc for the\n * tenant-filter and windowHours contract.\n *\n * Tenant-filter note: this method intentionally does NOT call\n * `assertTenantId`. The write methods on this repo (`insertDelivery`)\n * treat `tenantId === undefined` as a misconfiguration and fail fast.\n * Reads are different — `undefined` is the supported \"cross-tenant\n * admin view\" mode that OBS-5 uses to render a framework-wide health\n * panel. Callers that need strict tenant scoping pass an explicit\n * string or `null`.\n *\n * Cast note: `count(*)::int` is applied in SQL so the node-pg driver\n * returns a `number` instead of the default `bigint → string` for\n * `count(*)`. Don't relax this cast — consumers (and the protocol)\n * type the result as `number`.\n */\n async getStatusHistogram(\n windowHours: number,\n tenantId?: string | null,\n ): Promise<StatusHistogram> {\n if (!Number.isFinite(windowHours) || windowHours <= 0) {\n throw new RangeError('windowHours must be positive');\n }\n\n const cutoff = sql<Date>`now() - make_interval(hours => ${windowHours})`;\n\n const conditions = [gte(bridgeDelivery.attemptedAt, cutoff)];\n if (tenantId === null) {\n conditions.push(isNull(bridgeDelivery.tenantId));\n } else if (typeof tenantId === 'string') {\n conditions.push(eq(bridgeDelivery.tenantId, tenantId));\n }\n // tenantId === undefined → no tenant filter (cross-tenant view).\n\n const rows = await this.db\n .select({\n status: bridgeDelivery.status,\n count: sql<number>`count(*)::int`,\n })\n .from(bridgeDelivery)\n .where(and(...conditions))\n .groupBy(bridgeDelivery.status);\n\n const histogram: StatusHistogram = {\n pending: 0,\n delivered: 0,\n skipped: 0,\n failed: 0,\n };\n for (const row of rows) {\n // row.status is typed as the enum union; narrow is safe because the\n // enum values match StatusHistogram keys 1:1 (BRIDGE-1 schema).\n histogram[row.status as keyof StatusHistogram] = Number(row.count);\n }\n return histogram;\n }\n}\n","/**\n * NestJS injection tokens\n *\n * Used with @Inject() decorator in concrete repository constructors.\n */\n\n/**\n * Injection token for the Drizzle ORM database client.\n *\n * Usage in concrete repositories:\n * ```typescript\n * constructor(@Inject(DRIZZLE) db: DrizzleClient) { super(db); }\n * ```\n */\nexport const DRIZZLE = 'DRIZZLE' as const;\n\n/**\n * Injection token for the event bus (IEventBus).\n *\n * Optional — only resolved when EventsModule.forRoot() is registered.\n * BaseService uses this with @Optional() to emit lifecycle events\n * without requiring the events subsystem to be installed.\n *\n * Usage in services/use cases:\n * ```typescript\n * @Optional() @Inject(EVENT_BUS) eventBus?: IEventBus\n * ```\n */\nexport const EVENT_BUS = 'EVENT_BUS' as const;\n","/**\n * Drizzle schema for the `bridge_delivery` ledger (ADR-023 Phase 2, BRIDGE-1).\n *\n * The `bridge_delivery` table is the idempotency ledger for the event-to-job\n * bridge. Every (event, trigger) pair the bridge is asked to spawn produces\n * exactly one row; the `UNIQUE (event_id, trigger_id)` constraint guarantees\n * that:\n *\n * 1. Outbox replays of an event do not double-spawn user job runs — the\n * drain attempts to insert the duplicate, the constraint trips, and the\n * drain skips that trigger.\n * 2. The `IEventFlow.publishAndStart` facade can pre-write a\n * `(status='delivered')` row before the drain runs (Case B from ADR-023\n * §`publishAndStart` + existing `triggers:` collision); the drain then\n * hits UNIQUE on that trigger and skips it while still spawning any\n * other triggers for the same event normally.\n *\n * Status values:\n * - `pending` — wrapper run exists; user job not yet started.\n * - `delivered` — user job started; `user_run_id` populated.\n * - `skipped` — intentional no-op (`when:` returned false, or\n * facade-eager path pre-empted the bridge spawn).\n * - `failed` — wrapper exhausted retry policy; no auto-retry past that\n * (mirrors events outbox stance — ops eyes only).\n *\n * `wrapper_run_id` is **nullable**: the facade-eager path (Case B) pre-writes\n * `bridge_delivery` with no wrapper. The bridge-drain path always populates\n * it.\n *\n * `tenant_id` is emitted **unconditionally and nullable** (per JOB-8\n * 2026-04-20 reversal); enforcement is service-layer (BRIDGE-8) gated on the\n * `BRIDGE_MULTI_TENANT` DI token, not a DB constraint.\n *\n * Indexes:\n * - `bridge_delivery_event_idx` — lookup all deliveries for an event.\n * - `bridge_delivery_status_idx` — partial; ops dashboards filter by\n * `pending | failed`.\n * - `bridge_delivery_user_run_idx` — partial; reverse lookup from a\n * spawned user run back to its delivery row.\n *\n * No service logic, no DI wiring — this is the schema foundation. Backends\n * (memory + drizzle) and the framework handler land in BRIDGE-3 / BRIDGE-4 /\n * BRIDGE-5.\n */\nimport {\n index,\n jsonb,\n pgEnum,\n pgTable,\n text,\n timestamp,\n unique,\n uuid,\n} from 'drizzle-orm/pg-core';\nimport { sql } from 'drizzle-orm';\nimport type { InferSelectModel } from 'drizzle-orm';\n\nimport { domainEvents } from '../events/domain-events.schema';\nimport { jobRuns } from '../jobs/job-orchestration.schema';\n\n// ─── Enum ───────────────────────────────────────────────────────────────────\n\nexport const bridgeDeliveryStatusEnum = pgEnum('bridge_delivery_status', [\n 'pending',\n 'delivered',\n 'skipped',\n 'failed',\n]);\n\n// ─── Table ──────────────────────────────────────────────────────────────────\n\nexport const bridgeDelivery = pgTable(\n 'bridge_delivery',\n {\n id: uuid('id').primaryKey().defaultRandom(),\n /** FK to the source event in the outbox. */\n eventId: uuid('event_id')\n .notNull()\n .references(() => domainEvents.id),\n /**\n * Stable codegen-emitted identifier for the (job, trigger) pair, of the\n * form `<job_type>#<triggerIndex>` (BRIDGE-6). Forms the second half of\n * the UNIQUE idempotency key.\n */\n triggerId: text('trigger_id').notNull(),\n /**\n * Wrapper `job_run.id` (the framework `@framework/bridge_delivery` run\n * that drove this delivery). Nullable: the facade-eager path\n * (`publishAndStart` Case B) pre-writes a delivered row with no wrapper.\n */\n wrapperRunId: uuid('wrapper_run_id').references(() => jobRuns.id),\n /**\n * Spawned user `job_run.id`. Null until status is `delivered`; remains\n * null for `skipped` and `failed` deliveries.\n */\n userRunId: uuid('user_run_id').references(() => jobRuns.id),\n status: bridgeDeliveryStatusEnum('status').notNull().default('pending'),\n /** Populated when status=`skipped` (e.g. `'when_returned_false'`, `'trigger_unregistered'`). */\n skipReason: text('skip_reason'),\n /** Populated when status=`failed`. Mirrors `job_run.error` shape. */\n error: jsonb('error').$type<Record<string, unknown>>(),\n /**\n * Emitted unconditionally and nullable (JOB-8 / SYNC-6 precedent).\n * Enforcement gated on `BRIDGE_MULTI_TENANT` at the service layer\n * (BRIDGE-8); no DB constraint.\n */\n tenantId: text('tenant_id'),\n attemptedAt: timestamp('attempted_at', { withTimezone: true })\n .notNull()\n .defaultNow(),\n deliveredAt: timestamp('delivered_at', { withTimezone: true }),\n },\n (t) => ({\n /**\n * Idempotency ledger. Outbox replays and facade-vs-drain collisions both\n * dedup through this constraint.\n */\n uqBridgeDeliveryEventTrigger: unique('uq_bridge_delivery_event_trigger').on(\n t.eventId,\n t.triggerId,\n ),\n /** Lookup all deliveries for an event (fanout report, debugging). */\n idxBridgeDeliveryEvent: index('idx_bridge_delivery_event').on(t.eventId),\n /**\n * Ops dashboard filter — only the actionable states. Partial index keeps\n * it small at scale (the bulk of rows will be `delivered`).\n */\n idxBridgeDeliveryStatus: index('idx_bridge_delivery_status')\n .on(t.status)\n .where(sql`${t.status} IN ('pending','failed')`),\n /**\n * Reverse lookup from a spawned user run back to its delivery row.\n * Partial — most rows in the bridge ledger but only successful\n * deliveries have a `user_run_id`.\n */\n idxBridgeDeliveryUserRun: index('idx_bridge_delivery_user_run')\n .on(t.userRunId)\n .where(sql`${t.userRunId} IS NOT NULL`),\n }),\n);\n\nexport type BridgeDeliveryRecord = InferSelectModel<typeof bridgeDelivery>;\n","/**\n * Drizzle schema for the domain_events outbox table.\n *\n * This table backs the DrizzleEventBus. Events are inserted within the\n * same database transaction as the domain write (outbox pattern). A\n * polling process reads unprocessed rows and dispatches to subscribers.\n *\n * First-class routing columns (EVT-1):\n * - `pool` — populated by DrizzleEventBus.publish() (EVT-4); enables\n * pool-filtered drain queries without unpacking metadata JSON.\n * NULL when `tier='audit'` (audit events are not routed).\n * - `direction` — `inbound` | `change` | `outbound`; mirrors the routing\n * dimension used by jobs' reserved `events_inbound` /\n * `events_change` / `events_outbound` pools.\n * NULL when `tier='audit'`.\n * - `tenant_id` — conditional: emitted only when `events.multi_tenant: true`\n * in `codegen.config.yaml`. The runtime source declares it\n * unconditionally; EVT-8's scaffold template handles the\n * config-driven include/exclude.\n *\n * Audit-tier column (AUDIT-1):\n * - `tier` — `'domain'` | `'audit'`. Defaults to `'domain'`. Audit-tier\n * rows are observability-only (subscribers may observe but\n * the bridge MUST NOT spawn jobs from them); they have null\n * `pool` and `direction` by construction. The CHECK\n * constraint `domain_events_tier_routing_check` enforces\n * `tier='audit' ⇔ (pool IS NULL AND direction IS NULL)`.\n *\n * The `metadata` JSON column continues to carry these values for protocol\n * stability; the first-class columns are an optimization for drain filtering.\n *\n * Indexes (declared below in the index callback):\n * - (status, occurred_at) — polling drain filter\n * - (aggregate_id, aggregate_type) — event replay per aggregate\n * - (pool, status, occurred_at) — per-pool drain filter (EVT-1)\n * - (tier, status, occurred_at) — per-tier filter for the observability\n * viewer's tier toggle (AUDIT-1).\n */\nimport {\n check,\n index,\n jsonb,\n pgTable,\n text,\n timestamp,\n uuid,\n} from 'drizzle-orm/pg-core';\nimport { sql } from 'drizzle-orm';\nimport type { InferSelectModel } from 'drizzle-orm';\n\nexport const domainEvents = pgTable(\n 'domain_events',\n {\n id: uuid('id').primaryKey(),\n type: text('type').notNull(),\n aggregateId: text('aggregate_id').notNull(),\n aggregateType: text('aggregate_type').notNull(),\n payload: jsonb('payload').notNull().$type<Record<string, unknown>>(),\n occurredAt: timestamp('occurred_at', { withTimezone: true }).notNull(),\n processedAt: timestamp('processed_at', { withTimezone: true }),\n /** Lifecycle status: pending | processed | failed */\n status: text('status').notNull().default('pending'),\n /** Error message from the last failed dispatch attempt. */\n error: text('error'),\n metadata: jsonb('metadata').$type<Record<string, unknown>>(),\n /** Routing pool (e.g. `events_inbound`, `events_change`, `events_outbound`). Populated by DrizzleEventBus.publish() in EVT-4. NULL when `tier='audit'`. */\n pool: text('pool'),\n /** Routing direction: `inbound` | `change` | `outbound`. Populated by DrizzleEventBus.publish() in EVT-4. NULL when `tier='audit'`. */\n direction: text('direction'),\n /**\n * Event tier: `'domain'` (default) or `'audit'`. Audit-tier rows are\n * observability-only and have null `pool`/`direction` by construction —\n * enforced by the `domain_events_tier_routing_check` CHECK constraint\n * declared below. (AUDIT-1)\n */\n tier: text('tier').notNull().default('domain'),\n // conditional: emitted only when events.multi_tenant: true\n tenantId: text('tenant_id'),\n },\n (t) => ({\n /** Polling drain filter (existing — promoted from comment to declaration in EVT-1). */\n idxDomainEventsStatusOccurredAt: index('idx_domain_events_status_occurred_at').on(\n t.status,\n t.occurredAt,\n ),\n /** Event replay per aggregate (existing — promoted from comment to declaration in EVT-1). */\n idxDomainEventsAggregate: index('idx_domain_events_aggregate').on(\n t.aggregateId,\n t.aggregateType,\n ),\n /** Per-pool drain filter (EVT-1). Enables DrizzleEventBus to drain a single pool without scanning all events. */\n idxDomainEventsPoolStatusOccurredAt: index(\n 'idx_domain_events_pool_status_occurred_at',\n ).on(t.pool, t.status, t.occurredAt),\n /** Per-tier filter (AUDIT-1). Backs the observability viewer's tier toggle. */\n idxDomainEventsTierStatusOccurredAt: index(\n 'idx_domain_events_tier_status_occurred_at',\n ).on(t.tier, t.status, t.occurredAt),\n /**\n * Tier ↔ routing-fields invariant (AUDIT-1):\n * - `tier` is one of `'domain' | 'audit'`.\n * - `tier='audit'` ⇔ `pool IS NULL AND direction IS NULL`.\n * - `tier='domain'` ⇒ `pool` and `direction` are populated (the\n * DrizzleEventBus inserts always supply them; the bus stamps them\n * in AUDIT-3).\n */\n tierRoutingCheck: check(\n 'domain_events_tier_routing_check',\n sql`${t.tier} in ('domain','audit') AND ((${t.tier} = 'audit') = (${t.pool} is null and ${t.direction} is null))`,\n ),\n }),\n);\n\nexport type DomainEventRecord = InferSelectModel<typeof domainEvents>;\n","/**\n * Drizzle schema for the job orchestration domain (ADR-022).\n *\n * Three tables model the lifecycle of a durable job:\n * - `job` — definitions keyed by handler type (e.g. 'onboarding').\n * - `job_run` — one row per attempt to execute a job; worker claims\n * rows directly via SELECT ... FOR UPDATE SKIP LOCKED.\n * - `job_step` — individual steps within a run; memoises output for replay.\n *\n * Phase 1 ships only this layer. There is no `job_queue` table, no executor\n * port — see ADR-022 and `.claude/skills/jobs/SKILL.md` for the rationale.\n */\nimport {\n pgEnum,\n pgTable,\n uuid,\n text,\n jsonb,\n integer,\n timestamp,\n index,\n uniqueIndex,\n} from 'drizzle-orm/pg-core';\nimport { sql } from 'drizzle-orm';\nimport type { InferSelectModel } from 'drizzle-orm';\n\n// ─── Internal $type<> helpers ───────────────────────────────────────────────\n// Annotation types for jsonb columns only. JOB-2 defines the public protocol\n// types; these remain private to this file.\n\ntype RetryPolicy = {\n attempts: number;\n backoff: 'fixed' | 'exponential';\n baseMs: number;\n nonRetryableErrors?: string[];\n};\n\ntype JobRunError = {\n message: string;\n stack?: string;\n retryable: boolean;\n attempt: number;\n};\n\n// ─── Enums ──────────────────────────────────────────────────────────────────\n\nexport const jobRunStatusEnum = pgEnum('job_run_status', [\n 'pending',\n 'running',\n 'waiting',\n 'completed',\n 'failed',\n 'timed_out',\n 'canceled',\n]);\n\n// extended in ADR-027: tool_call | llm_call | wait | checkpoint | message\nexport const jobStepKindEnum = pgEnum('job_step_kind', ['task']);\n\nexport const jobStepStatusEnum = pgEnum('job_step_status', [\n 'pending',\n 'running',\n 'completed',\n 'failed',\n 'skipped',\n]);\n\nexport const collisionModeEnum = pgEnum('job_collision_mode', [\n 'queue',\n 'reject',\n 'replace',\n]);\n\nexport const replayFromEnum = pgEnum('job_replay_from', [\n 'scratch',\n 'last_step',\n 'last_checkpoint',\n]);\n\nexport const parentClosePolicyEnum = pgEnum('job_parent_close_policy', [\n 'terminate',\n 'cancel',\n 'abandon',\n]);\n\n// Phase 3 placeholder — see ADR-025\nexport const waitKindEnum = pgEnum('job_wait_kind', ['signal']);\n\n// Phase 2 may add more sources; requires Atlas migration\nexport const triggerSourceEnum = pgEnum('job_trigger_source', [\n 'manual',\n 'schedule',\n 'event',\n 'parent',\n]);\n\n// ─── job ────────────────────────────────────────────────────────────────────\n\nexport const jobs = pgTable('job', {\n type: text('type').primaryKey(),\n version: integer('version').notNull().default(1),\n pool: text('pool').notNull(),\n scopeEntityType: text('scope_entity_type'),\n retryPolicy: jsonb('retry_policy').notNull().$type<RetryPolicy>(),\n timeoutMs: integer('timeout_ms'),\n concurrencyKeyTemplate: text('concurrency_key_template'),\n collisionMode: collisionModeEnum('collision_mode').notNull().default('queue'),\n dedupeKeyTemplate: text('dedupe_key_template'),\n dedupeWindowMs: integer('dedupe_window_ms'),\n priorityDefault: integer('priority_default').notNull().default(0),\n replayFrom: replayFromEnum('replay_from').notNull().default('last_checkpoint'),\n createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),\n});\n\nexport type JobDefinitionRow = InferSelectModel<typeof jobs>;\n\n// ─── job_run ────────────────────────────────────────────────────────────────\n\nexport const jobRuns = pgTable(\n 'job_run',\n {\n id: uuid('id').primaryKey().defaultRandom(),\n jobType: text('job_type').notNull().references(() => jobs.type),\n jobVersion: integer('job_version').notNull(),\n parentRunId: uuid('parent_run_id').references((): any => jobRuns.id),\n /**\n * Service generates `id` client-side via randomUUID() and sets\n * root_run_id = id for root runs (single INSERT, no self-FK race).\n */\n rootRunId: uuid('root_run_id').notNull(),\n parentClosePolicy: parentClosePolicyEnum('parent_close_policy')\n .notNull()\n .default('terminate'),\n scopeEntityType: text('scope_entity_type'),\n scopeEntityId: text('scope_entity_id'),\n tenantId: text('tenant_id'),\n tags: jsonb('tags').notNull().default({}).$type<Record<string, string>>(),\n pool: text('pool').notNull(),\n priority: integer('priority').notNull().default(0),\n concurrencyKey: text('concurrency_key'),\n dedupeKey: text('dedupe_key'),\n status: jobRunStatusEnum('status').notNull().default('pending'),\n input: jsonb('input').notNull().$type<Record<string, unknown>>(),\n output: jsonb('output').$type<Record<string, unknown>>(),\n error: jsonb('error').$type<JobRunError>(),\n triggerSource: triggerSourceEnum('trigger_source').notNull(),\n triggerRef: text('trigger_ref'),\n runAt: timestamp('run_at', { withTimezone: true }).notNull().defaultNow(),\n startedAt: timestamp('started_at', { withTimezone: true }),\n finishedAt: timestamp('finished_at', { withTimezone: true }),\n claimedAt: timestamp('claimed_at', { withTimezone: true }),\n attempts: integer('attempts').notNull().default(0),\n // Phase 3 placeholder — see ADR-025\n waitKind: waitKindEnum('wait_kind'),\n // Phase 3 placeholder — see ADR-025\n resumeToken: text('resume_token'),\n // Phase 3 placeholder — see ADR-025\n waitDeadline: timestamp('wait_deadline', { withTimezone: true }),\n createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),\n },\n (t) => ({\n /** Claim query: ORDER BY priority DESC, run_at ASC. */\n idxJobRunClaim: index('idx_job_run_claim').on(t.status, t.pool, t.runAt),\n /** Tree traversal / cascade cancel. */\n idxJobRunRoot: index('idx_job_run_root').on(t.rootRunId),\n /** listForScope query. */\n idxJobRunScope: index('idx_job_run_scope').on(t.scopeEntityType, t.scopeEntityId),\n /** Idempotency collapse — partial index. */\n idxJobRunDedupe: index('idx_job_run_dedupe')\n .on(t.jobType, t.dedupeKey)\n .where(sql`${t.dedupeKey} IS NOT NULL`),\n /** Collision check — partial index. */\n idxJobRunConcurrency: index('idx_job_run_concurrency')\n .on(t.concurrencyKey)\n .where(\n sql`${t.concurrencyKey} IS NOT NULL AND ${t.status} IN ('pending','running')`,\n ),\n }),\n);\n\nexport type JobRunRow = InferSelectModel<typeof jobRuns>;\n\n// ─── job_step ───────────────────────────────────────────────────────────────\n\nexport const jobSteps = pgTable(\n 'job_step',\n {\n id: uuid('id').primaryKey().defaultRandom(),\n jobRunId: uuid('job_run_id').notNull().references(() => jobRuns.id),\n stepId: text('step_id').notNull(),\n kind: jobStepKindEnum('kind').notNull().default('task'),\n /**\n * Monotonic within run. integer (max ~2B per run) is sufficient —\n * downgraded from ADR-022's bigint; revisit only if a single run\n * ever exceeds 2 billion steps.\n */\n seq: integer('seq').notNull(),\n status: jobStepStatusEnum('status').notNull().default('pending'),\n input: jsonb('input').$type<Record<string, unknown>>(),\n /** Memoised on success for replay. */\n output: jsonb('output').$type<Record<string, unknown>>(),\n error: jsonb('error').$type<JobRunError>(),\n attempts: integer('attempts').notNull().default(0),\n startedAt: timestamp('started_at', { withTimezone: true }),\n finishedAt: timestamp('finished_at', { withTimezone: true }),\n },\n (t) => ({\n /** No duplicate step IDs per run. */\n idxJobStepRunStep: uniqueIndex('idx_job_step_run_step').on(t.jobRunId, t.stepId),\n /** Ordered timeline reads. */\n idxJobStepTimeline: index('idx_job_step_timeline').on(t.jobRunId, t.seq),\n }),\n);\n\nexport type JobStepRow = InferSelectModel<typeof jobSteps>;\n","/**\n * Typed errors for the bridge subsystem (ADR-023 Phase 2, BRIDGE-2).\n *\n * All thrown by the three enforcement sites named in ADR-023 §Multi-tenancy:\n * - `EventFlowService.publishAndStart` entry (BRIDGE-7)\n * - `BridgeDeliveryHandler.handle` entry (BRIDGE-5)\n * - `DrizzleBridgeDeliveryRepo.insertDelivery` pre-write (BRIDGE-4)\n *\n * Same shape as `runtime/subsystems/jobs/jobs-errors.ts` and\n * `runtime/subsystems/events/events-errors.ts` so consumers can catch them\n * with the same exception-filter pattern across all three subsystems.\n */\n\n/**\n * Thrown when `BridgeModule` was configured with `multiTenant: true` but\n * the caller did not pass a `tenantId` at one of the three enforcement\n * sites listed above.\n *\n * **Strict enforcement rationale (mirrors JOB-8 / SYNC-6 stance, locked\n * 2026-04-18 for jobs; same rationale applies here).** Cross-tenant data\n * leakage is the worst class of bug a multi-tenant system can ship;\n * surfacing the misuse loudly at the call site (rather than silently\n * defaulting to `null` or to \"the last tenant seen\") prevents both\n * accidental global writes and sneaky reads that return a union of tenants.\n *\n * - `undefined` `tenantId` → throw this error.\n * - Explicit `null` `tenantId` → passes; opts the call into cross-tenant\n * work (e.g. a system housekeeping event with no owning tenant). The\n * `bridge_delivery` row is persisted with `tenant_id = NULL`.\n *\n * The `callSite` constructor argument names which of the three enforcement\n * sites threw — review reports and ops dashboards rely on a stable site\n * name, so use the canonical strings: `'EventFlowService.publishAndStart'`,\n * `'BridgeDeliveryHandler.handle'`,\n * `'DrizzleBridgeDeliveryRepo.insertDelivery'`.\n */\nexport class MissingTenantIdError extends Error {\n override readonly name = 'MissingTenantIdError';\n constructor(public readonly callSite: string) {\n super(\n `MissingTenantIdError: BridgeModule was configured with ` +\n `multiTenant=true but ${callSite} was called without tenantId ` +\n `(undefined). Pass an explicit tenantId, or pass null for ` +\n `cross-tenant work.`,\n );\n }\n}\n\n/**\n * Synthetic error thrown by `MemoryBridgeDeliveryRepo.insertDelivery` when\n * a duplicate `(event_id, trigger_id)` insert hits the simulated UNIQUE\n * constraint (BRIDGE-3).\n *\n * Carries a `constraint` field equal to the Drizzle constraint name\n * declared in BRIDGE-1's schema (`uq_bridge_delivery_event_trigger`) so\n * call sites can branch on the same discriminator regardless of which\n * backend is wired up. This matters because ADR-023 explicitly leans on\n * the constraint as the dedup mechanism in two places — outbox replay\n * and `publishAndStart` Case B — and BRIDGE-4 / BRIDGE-7 will share a\n * type-check path with BRIDGE-3-driven tests.\n *\n * The Drizzle backend (BRIDGE-4) does NOT throw this error: it uses\n * `INSERT … ON CONFLICT (event_id, trigger_id) DO NOTHING RETURNING id`\n * per the BRIDGE-4 spec recommendation, so collisions surface as an empty\n * result set rather than an exception. The error exists so the memory\n * backend can faithfully model the \"duplicate raises\" behaviour for tests\n * that want to assert the constraint actually fires.\n */\n/**\n * Thrown by `BridgeModule.onModuleInit` when `JobWorkerModule` is wired\n * alongside the bridge but its active `pools` list does not include one\n * or more of the three reserved bridge pools (`events_inbound`,\n * `events_change`, `events_outbound`).\n *\n * Without a worker polling those pools, the wrapper `job_run` rows the\n * outbox drain inserts (BRIDGE-4) sit `pending` forever — a silent\n * footgun where `eventFlow.publish(...)` returns success but no user\n * job ever spawns. The boot-time check converts that into a fail-fast.\n *\n * Operators can either (a) add `...BRIDGE_RESERVED_POOLS` to their\n * `JobWorkerModule.forRoot({ pools })` configuration so the same\n * process polls the reserved pools, or (b) run a separate worker\n * process per reserved pool for lane isolation (ADR-022 §Pool\n * isolation).\n */\nexport class BridgeReservedPoolsNotPolledError extends Error {\n override readonly name = 'BridgeReservedPoolsNotPolledError';\n constructor(public readonly missingPools: readonly string[]) {\n super(\n `BridgeModule loaded but JobWorkerModule is not polling reserved ` +\n `pool '${missingPools[0]}'. Add ...BRIDGE_RESERVED_POOLS to your ` +\n `JobWorkerModule.forRoot({ pools }) configuration. Missing pools: ` +\n `${missingPools.join(', ')}. (Bridge-fanout wrappers will sit ` +\n `pending forever without these pollers.)`,\n );\n }\n}\n\nexport class UniqueConstraintError extends Error {\n override readonly name = 'UniqueConstraintError';\n constructor(\n public readonly constraint: string,\n public readonly eventId: string,\n public readonly triggerId: string,\n ) {\n super(\n `UniqueConstraintError: duplicate insert into bridge_delivery for ` +\n `(event_id='${eventId}', trigger_id='${triggerId}') — violates ` +\n `constraint '${constraint}'.`,\n );\n }\n}\n","/**\n * `assertTenantId` — shared multi-tenancy enforcement helper for the\n * bridge subsystem (BRIDGE-8, ADR-023 §Multi-tenancy null-tenantId).\n *\n * Single source of truth for the three enforcement sites named in\n * ADR-023 §Multi-tenancy and the BRIDGE-2 spec:\n *\n * (a) `EventFlowService.publishAndStart` — request-path entry\n * (b) `BridgeDeliveryHandler.run` — wrapper handler entry\n * (c) `DrizzleBridgeDeliveryRepo.insertDelivery` — last-line repo defense\n *\n * Contract (mirrors JOB-8 / SYNC-6 — locked 2026-04-18 for jobs and\n * carried into the bridge here):\n *\n * - `multiTenant === false` → no-op (always passes).\n * - `multiTenant === true`,\n * `tenantId === undefined` → throw `MissingTenantIdError(site)`.\n * - `multiTenant === true`,\n * `tenantId === null` → passes; opts the call into\n * cross-tenant work (system\n * housekeeping, framework events\n * with no owning tenant). Persists\n * to the DB as `tenant_id = NULL`.\n * - `multiTenant === true`,\n * `tenantId` is a string → passes.\n *\n * The strict `undefined`-vs-`null` discrimination is the entire point —\n * silent defaulting is exactly the failure mode that lets cross-tenant\n * leaks ship.\n */\nimport { MissingTenantIdError } from './bridge-errors';\n\n/**\n * Throws `MissingTenantIdError(site)` if `multiTenant === true` and\n * `tenantId === undefined`. Explicit `null` always passes.\n *\n * @param site Canonical site name — one of:\n * `'EventFlowService.publishAndStart'`,\n * `'BridgeDeliveryHandler.run'`,\n * `'DrizzleBridgeDeliveryRepo.insertDelivery'`.\n * Stable strings; ops dashboards / review reports key\n * on these. Use the same string the existing tests\n * and `MissingTenantIdError` JSDoc enumerate.\n * @param multiTenant Resolved `BRIDGE_MULTI_TENANT` flag (from\n * `BridgeModule.forRoot({ multiTenant })`).\n * @param tenantId The tenantId the caller supplied (or didn't).\n */\nexport function assertTenantId(\n site: string,\n multiTenant: boolean,\n tenantId: string | null | undefined,\n): void {\n if (multiTenant && tenantId === undefined) {\n throw new MissingTenantIdError(site);\n }\n // explicit null passes — opts into cross-tenant work\n}\n","/**\n * Injection tokens for the bridge subsystem (ADR-023 Phase 2, BRIDGE-2).\n *\n * String constants (not Symbols) so they match by value across import\n * boundaries — same convention as `EVENT_BUS` / `EVENTS_MULTI_TENANT` in the\n * events subsystem (per EVT-6 §Implementation Notes). The jobs subsystem\n * uses Symbols for its analogous tokens; we keep the bridge file internally\n * consistent with the events convention because the bridge is conceptually\n * downstream of (and imports from) the events module.\n */\n\n/**\n * Token for the `IJobBridge` repo backend (memory in BRIDGE-3, Drizzle in\n * BRIDGE-4). Consumed by `BridgeDeliveryHandler` (BRIDGE-5), the outbox\n * drain (BRIDGE-4 modification), and `EventFlowService` (BRIDGE-7).\n */\nexport const BRIDGE_DELIVERY_REPO = 'BRIDGE_DELIVERY_REPO' as const;\n\n/**\n * Token for the `IEventFlow` facade implementation (BRIDGE-7). Use cases\n * inject this in preference to `EVENT_BUS` / `TYPED_EVENT_BUS` — calling\n * `eventFlow.publish(...)` / `eventFlow.publishAndStart(...)` is the\n * sanctioned authoring surface (ADR-023 §Decision 7).\n */\nexport const EVENT_FLOW = 'EVENT_FLOW' as const;\n\n/**\n * Token for the resolved multi-tenancy flag, provided by\n * `BridgeModule.forRoot({ multiTenant })` in BRIDGE-8. Consumed by\n * `EventFlowService.publishAndStart` (entry), `BridgeDeliveryHandler.handle`\n * (entry), and `DrizzleBridgeDeliveryRepo.insertDelivery` (pre-write) — the\n * three enforcement sites called out in ADR-023 §Multi-tenancy.\n */\nexport const BRIDGE_MULTI_TENANT = 'BRIDGE_MULTI_TENANT' as const;\n\n/**\n * Token for the resolved `BridgeModuleOptions` object. Provided by\n * `BridgeModule.forRoot(...)` / `forRootAsync(...)` in BRIDGE-8.\n * Mirrors `EVENTS_MODULE_OPTIONS` and `JOBS_DOMAIN_OPTIONS` shape — backends\n * inject this when they need to observe additional module configuration\n * (e.g. pool overrides) without each adding a dedicated token.\n */\nexport const BRIDGE_MODULE_OPTIONS = 'BRIDGE_MODULE_OPTIONS' as const;\n\n/**\n * Token for the codegen-emitted `bridgeRegistry` — the\n * `Record<EventTypeName, BridgeTriggerEntry[]>` map that drives\n * outbox-drain trigger lookup (BRIDGE-4) and `EventFlowService` Case B\n * dedup (BRIDGE-7). Provider registration lands in BRIDGE-8; the token is\n * declared here so generated code (BRIDGE-6) can import it without\n * depending on the still-being-formalised module.\n */\nexport const BRIDGE_REGISTRY = 'BRIDGE_REGISTRY' as const;\n\n\n/**\n * Token for the `IBridgeOutboxDrainHook` implementation (BRIDGE-4).\n * Injected `@Optional()` into `DrizzleEventBus` — when the bridge\n * subsystem is not installed the token is undefined and the events\n * outbox drain skips the bridge block entirely (preserves EVT-4\n * baseline behaviour).\n *\n * Resolution order: `BridgeModule.forRoot()` provides this token in\n * BRIDGE-8 alongside the rest of the bridge subsystem. `EventsModule`\n * itself never provides it; the events subsystem stays unaware of the\n * bridge unless the consumer wires it.\n */\nexport const BRIDGE_OUTBOX_DRAIN_HOOK = 'BRIDGE_OUTBOX_DRAIN_HOOK' as const;\n"],"mappings":"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","names":["sql","index","jsonb","pgEnum","pgTable","text","timestamp","uuid","sql","pgTable","uuid","text","jsonb","timestamp","index","sql","pgEnum","pgTable","uuid","text","jsonb","timestamp","index","sql","sql"]}
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|