@sixb/core 0.1.8 → 0.1.10
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/dist/actions/index.js +77 -89
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/run-dispatch.d.ts.map +1 -1
- package/dist/actions/types/context.d.ts +2 -0
- package/dist/actions/types/context.d.ts.map +1 -1
- package/dist/actions/validation.d.ts +1 -1
- package/dist/actions/validation.d.ts.map +1 -1
- package/dist/actions/worker.js +33 -37
- package/dist/actions/worker.js.map +2 -2
- package/dist/agents/adapters.d.ts +3 -3
- package/dist/agents/{context.d.ts → context/entries.d.ts} +3 -3
- package/dist/agents/context/entries.d.ts.map +1 -0
- package/dist/agents/context/index.d.ts +4 -0
- package/dist/agents/context/index.d.ts.map +1 -0
- package/dist/agents/context/index.js +19 -0
- package/dist/agents/{streams.js.map → context/index.js.map} +1 -1
- package/dist/agents/context-model.d.ts +1 -1
- package/dist/agents/context-model.d.ts.map +1 -1
- package/dist/agents/context-resolution.d.ts +1 -1
- package/dist/agents/context-resolution.d.ts.map +1 -1
- package/dist/agents/index.d.ts +4 -4
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +193 -204
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/message.d.ts +1 -1
- package/dist/agents/message.d.ts.map +1 -1
- package/dist/agents/model-loop.d.ts +2 -0
- package/dist/agents/model-loop.d.ts.map +1 -1
- package/dist/agents/request.d.ts +1 -1
- package/dist/agents/request.d.ts.map +1 -1
- package/dist/agents/streams/index.d.ts +4 -0
- package/dist/agents/streams/index.d.ts.map +1 -0
- package/dist/agents/streams/index.js +20 -0
- package/dist/{chunk-y64skrwp.js.map → agents/streams/index.js.map} +1 -1
- package/dist/agents/streams/internal.d.ts +3 -0
- package/dist/agents/streams/internal.d.ts.map +1 -0
- package/dist/agents/streams/internal.js +40 -0
- package/dist/agents/{context.js.map → streams/internal.js.map} +1 -1
- package/dist/agents/{streams.d.ts → streams/protocol.d.ts} +5 -5
- package/dist/agents/streams/protocol.d.ts.map +1 -0
- package/dist/agents/types.d.ts +1 -1
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/agents/validation.d.ts.map +1 -1
- package/dist/auth/index.d.ts +0 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +96 -108
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/strategy.js +8 -9
- package/dist/auth/strategy.js.map +1 -1
- package/dist/authorization/index.js +51 -56
- package/dist/authorization/index.js.map +1 -1
- package/dist/blob-storage/browser.js +15 -17
- package/dist/blob-storage/browser.js.map +1 -1
- package/dist/blob-storage/index.js +36 -38
- package/dist/blob-storage/index.js.map +1 -1
- package/dist/bootstrap/discovery.d.ts +14 -1
- package/dist/bootstrap/discovery.d.ts.map +1 -1
- package/dist/bootstrap/index.d.ts +2 -2
- package/dist/bootstrap/index.d.ts.map +1 -1
- package/dist/bootstrap/index.js +80 -88
- package/dist/bootstrap/index.js.map +1 -1
- package/dist/broker/in-memory.d.ts +8 -2
- package/dist/broker/in-memory.d.ts.map +1 -1
- package/dist/broker/index.d.ts +4 -2
- package/dist/broker/index.d.ts.map +1 -1
- package/dist/broker/index.js +12 -10
- package/dist/broker/index.js.map +1 -1
- package/dist/broker/retention.d.ts +4 -0
- package/dist/broker/retention.d.ts.map +1 -0
- package/dist/broker/subscriber.d.ts +10 -0
- package/dist/broker/subscriber.d.ts.map +1 -0
- package/dist/broker/types.d.ts +14 -1
- package/dist/broker/types.d.ts.map +1 -1
- package/dist/chunk-0y39rgsb.js +43 -0
- package/dist/{chunk-c15dr03f.js.map → chunk-0y39rgsb.js.map} +2 -2
- package/dist/{chunk-k522z7v6.js → chunk-17kfctj6.js} +16 -11
- package/dist/chunk-17kfctj6.js.map +10 -0
- package/dist/{chunk-ajnan18g.js → chunk-1824gssz.js} +74 -106
- package/dist/chunk-1824gssz.js.map +12 -0
- package/dist/chunk-28ja2cjs.js +602 -0
- package/dist/chunk-28ja2cjs.js.map +18 -0
- package/dist/{chunk-5gd7tpv6.js → chunk-2c4j899j.js} +4 -4
- package/dist/chunk-2c4j899j.js.map +11 -0
- package/dist/{chunk-rv2hkwwa.js → chunk-358caqf5.js} +157 -180
- package/dist/chunk-358caqf5.js.map +12 -0
- package/dist/{chunk-fvt9rjsa.js → chunk-38zv5rkr.js} +4 -4
- package/dist/{chunk-fvt9rjsa.js.map → chunk-38zv5rkr.js.map} +1 -1
- package/dist/{chunk-w3e09qqk.js → chunk-39tqv9hz.js} +24 -24
- package/dist/{chunk-w3e09qqk.js.map → chunk-39tqv9hz.js.map} +2 -2
- package/dist/{chunk-04b07a9q.js → chunk-3bh94gbw.js} +13 -13
- package/dist/{chunk-04b07a9q.js.map → chunk-3bh94gbw.js.map} +2 -2
- package/dist/{chunk-s5y30bc9.js → chunk-3qms4nax.js} +52 -50
- package/dist/{chunk-s5y30bc9.js.map → chunk-3qms4nax.js.map} +5 -5
- package/dist/{chunk-nf4r78r4.js → chunk-5a4a52tq.js} +4 -4
- package/dist/{chunk-nf4r78r4.js.map → chunk-5a4a52tq.js.map} +2 -2
- package/dist/{chunk-wtf06et8.js → chunk-5c7ga8zz.js} +54 -177
- package/dist/chunk-5c7ga8zz.js.map +12 -0
- package/dist/{chunk-rte5sm3z.js → chunk-5hz0fnca.js} +23 -23
- package/dist/{chunk-rte5sm3z.js.map → chunk-5hz0fnca.js.map} +2 -2
- package/dist/{chunk-xajtptbw.js → chunk-5p1v802y.js} +1401 -445
- package/dist/chunk-5p1v802y.js.map +44 -0
- package/dist/chunk-653vwrzr.js +39 -0
- package/dist/chunk-653vwrzr.js.map +10 -0
- package/dist/{chunk-qw9gvjv5.js → chunk-72w2pxk7.js} +13 -13
- package/dist/{chunk-qw9gvjv5.js.map → chunk-72w2pxk7.js.map} +2 -2
- package/dist/chunk-7apz6hg4.js +50 -0
- package/dist/{chunk-jq43kdvk.js.map → chunk-7apz6hg4.js.map} +2 -2
- package/dist/chunk-7bs40fe1.js +218 -0
- package/dist/{chunk-p1rzczbt.js.map → chunk-7bs40fe1.js.map} +3 -3
- package/dist/chunk-7zgecwy1.js +113 -0
- package/dist/chunk-7zgecwy1.js.map +10 -0
- package/dist/{chunk-xhy826cz.js → chunk-85cd7e8c.js} +8 -7
- package/dist/chunk-85cd7e8c.js.map +10 -0
- package/dist/{chunk-pc7ys28c.js → chunk-860dwwy0.js} +29 -29
- package/dist/{chunk-pc7ys28c.js.map → chunk-860dwwy0.js.map} +2 -2
- package/dist/chunk-8vj0rjgs.js +165 -0
- package/dist/chunk-8vj0rjgs.js.map +15 -0
- package/dist/{chunk-7y0f6rf1.js → chunk-92vk7gta.js} +58 -58
- package/dist/chunk-92vk7gta.js.map +10 -0
- package/dist/{chunk-rafagrwr.js → chunk-93csa55g.js} +45 -17
- package/dist/chunk-93csa55g.js.map +11 -0
- package/dist/{chunk-aa2pen2v.js → chunk-976rxdpx.js} +188 -175
- package/dist/{chunk-aa2pen2v.js.map → chunk-976rxdpx.js.map} +2 -2
- package/dist/{chunk-d8qkxt2v.js → chunk-98cw09sw.js} +7 -7
- package/dist/chunk-98cw09sw.js.map +10 -0
- package/dist/{chunk-n4khvw9n.js → chunk-9qsh3p5y.js} +17 -17
- package/dist/{chunk-n4khvw9n.js.map → chunk-9qsh3p5y.js.map} +2 -2
- package/dist/{chunk-4a849fr1.js → chunk-9tc8dxmn.js} +1 -1
- package/dist/{chunk-9nbmsvn5.js → chunk-9vx5e9g1.js} +9 -9
- package/dist/{chunk-9nbmsvn5.js.map → chunk-9vx5e9g1.js.map} +2 -2
- package/dist/{chunk-8m5ejdpn.js → chunk-9x8dybsb.js} +5 -5
- package/dist/chunk-9x8dybsb.js.map +10 -0
- package/dist/chunk-aa6z4a19.js +358 -0
- package/dist/chunk-aa6z4a19.js.map +12 -0
- package/dist/{chunk-3xep5cjx.js → chunk-agbbygvh.js} +104 -86
- package/dist/chunk-agbbygvh.js.map +15 -0
- package/dist/{chunk-2dw777qw.js → chunk-ap0g1g74.js} +37 -82
- package/dist/{chunk-2dw777qw.js.map → chunk-ap0g1g74.js.map} +3 -4
- package/dist/{chunk-v4en4jc2.js → chunk-awbhdqyc.js} +7 -7
- package/dist/{chunk-v4en4jc2.js.map → chunk-awbhdqyc.js.map} +2 -2
- package/dist/{chunk-w9tg6yyb.js → chunk-b0ec55a1.js} +54 -37
- package/dist/chunk-b0ec55a1.js.map +12 -0
- package/dist/{chunk-ka3a2ft3.js → chunk-b19g04jk.js} +12 -12
- package/dist/{chunk-ka3a2ft3.js.map → chunk-b19g04jk.js.map} +2 -2
- package/dist/{chunk-gbejpkex.js → chunk-bn138h9w.js} +27 -28
- package/dist/{chunk-gbejpkex.js.map → chunk-bn138h9w.js.map} +3 -3
- package/dist/{chunk-nx7k8tpr.js → chunk-br3k6qbf.js} +23 -23
- package/dist/{chunk-nx7k8tpr.js.map → chunk-br3k6qbf.js.map} +2 -2
- package/dist/{chunk-dbc80ad7.js → chunk-c5rkjrgp.js} +28 -28
- package/dist/{chunk-dbc80ad7.js.map → chunk-c5rkjrgp.js.map} +2 -2
- package/dist/{chunk-dktq02ne.js → chunk-cqr3acm1.js} +4 -4
- package/dist/{chunk-dktq02ne.js.map → chunk-cqr3acm1.js.map} +2 -2
- package/dist/chunk-d62kjtbg.js +7 -0
- package/dist/{chunk-zcnhxkvd.js.map → chunk-d62kjtbg.js.map} +2 -2
- package/dist/{chunk-74drx9gd.js → chunk-dfm066qg.js} +10 -10
- package/dist/{chunk-74drx9gd.js.map → chunk-dfm066qg.js.map} +2 -2
- package/dist/{chunk-5e3pq99w.js → chunk-dmn70ztd.js} +30 -30
- package/dist/chunk-dmn70ztd.js.map +11 -0
- package/dist/{chunk-p1x242ad.js → chunk-dz5h08xv.js} +175 -175
- package/dist/{chunk-p1x242ad.js.map → chunk-dz5h08xv.js.map} +2 -2
- package/dist/{chunk-p2vqaxkc.js → chunk-e0d1rzef.js} +27 -22
- package/dist/{chunk-p2vqaxkc.js.map → chunk-e0d1rzef.js.map} +3 -3
- package/dist/{chunk-5sz8ta9r.js → chunk-e1c18xjx.js} +52 -52
- package/dist/{chunk-5sz8ta9r.js.map → chunk-e1c18xjx.js.map} +2 -2
- package/dist/{chunk-19jp6g9d.js → chunk-f0rwz2vh.js} +54 -33
- package/dist/chunk-f0rwz2vh.js.map +11 -0
- package/dist/{chunk-2xns679x.js → chunk-f4w3yp4f.js} +171 -36
- package/dist/chunk-f4w3yp4f.js.map +12 -0
- package/dist/{chunk-979ww6b3.js → chunk-fb3feg1e.js} +29 -29
- package/dist/{chunk-979ww6b3.js.map → chunk-fb3feg1e.js.map} +2 -2
- package/dist/{chunk-f26bck4t.js → chunk-ftv470j8.js} +393 -355
- package/dist/{chunk-f26bck4t.js.map → chunk-ftv470j8.js.map} +7 -7
- package/dist/{chunk-4sm0aznx.js → chunk-g00bfdq6.js} +254 -256
- package/dist/{chunk-4sm0aznx.js.map → chunk-g00bfdq6.js.map} +3 -3
- package/dist/{chunk-p03r0h5s.js → chunk-g53f0e4j.js} +76 -202
- package/dist/chunk-g53f0e4j.js.map +15 -0
- package/dist/chunk-g6cke204.js +124 -0
- package/dist/chunk-g6cke204.js.map +10 -0
- package/dist/{chunk-q0k9nc5a.js → chunk-g7knyczr.js} +98 -98
- package/dist/{chunk-q0k9nc5a.js.map → chunk-g7knyczr.js.map} +2 -2
- package/dist/{chunk-51fjndv0.js → chunk-gfdh9kqa.js} +4 -4
- package/dist/{chunk-51fjndv0.js.map → chunk-gfdh9kqa.js.map} +2 -2
- package/dist/{chunk-8tsf6dmc.js → chunk-gqh45d2n.js} +244 -205
- package/dist/chunk-gqh45d2n.js.map +15 -0
- package/dist/chunk-h3v76ams.js +32 -0
- package/dist/{chunk-08m3b6w8.js.map → chunk-h3v76ams.js.map} +2 -2
- package/dist/{chunk-jecn6t54.js → chunk-jgwb25gc.js} +74 -74
- package/dist/{chunk-jecn6t54.js.map → chunk-jgwb25gc.js.map} +2 -2
- package/dist/{chunk-wdage1eb.js → chunk-jmfet9r4.js} +6 -6
- package/dist/{chunk-wdage1eb.js.map → chunk-jmfet9r4.js.map} +2 -2
- package/dist/{chunk-k34z5rvh.js → chunk-kfee1h52.js} +132 -48
- package/dist/chunk-kfee1h52.js.map +13 -0
- package/dist/{chunk-2ab72m2h.js → chunk-m2ca93my.js} +3 -3
- package/dist/{chunk-2ab72m2h.js.map → chunk-m2ca93my.js.map} +2 -2
- package/dist/{chunk-4jjp5k14.js → chunk-mmagke4x.js} +6 -6
- package/dist/{chunk-4jjp5k14.js.map → chunk-mmagke4x.js.map} +2 -2
- package/dist/{chunk-359jm1jw.js → chunk-mrp7k0pw.js} +20 -20
- package/dist/{chunk-359jm1jw.js.map → chunk-mrp7k0pw.js.map} +2 -2
- package/dist/{chunk-h0k55pc7.js → chunk-ms2tmn1k.js} +139 -139
- package/dist/{chunk-h0k55pc7.js.map → chunk-ms2tmn1k.js.map} +2 -2
- package/dist/{chunk-h5vqbfmd.js → chunk-nmbxcaqx.js} +117 -117
- package/dist/{chunk-h5vqbfmd.js.map → chunk-nmbxcaqx.js.map} +3 -3
- package/dist/{chunk-n2w475r0.js → chunk-nt99sxd6.js} +82 -82
- package/dist/{chunk-n2w475r0.js.map → chunk-nt99sxd6.js.map} +3 -3
- package/dist/{chunk-v1xppd0y.js → chunk-p5vcsw9c.js} +60 -60
- package/dist/{chunk-v1xppd0y.js.map → chunk-p5vcsw9c.js.map} +2 -2
- package/dist/{chunk-sbzzr4kx.js → chunk-p6a4npdx.js} +1260 -1289
- package/dist/chunk-p6a4npdx.js.map +58 -0
- package/dist/{chunk-trxxmgnf.js → chunk-pqajwytd.js} +10 -10
- package/dist/{chunk-trxxmgnf.js.map → chunk-pqajwytd.js.map} +3 -3
- package/dist/{chunk-nn0tekr1.js → chunk-pr2h4bv4.js} +33 -33
- package/dist/{chunk-nn0tekr1.js.map → chunk-pr2h4bv4.js.map} +2 -2
- package/dist/{chunk-xwnf87e1.js → chunk-q5gz3g2j.js} +64 -64
- package/dist/{chunk-xwnf87e1.js.map → chunk-q5gz3g2j.js.map} +2 -2
- package/dist/{chunk-5ntny1qx.js → chunk-qf954wje.js} +6 -6
- package/dist/{chunk-5ntny1qx.js.map → chunk-qf954wje.js.map} +2 -2
- package/dist/chunk-qma80ych.js +30 -0
- package/dist/chunk-qma80ych.js.map +11 -0
- package/dist/{chunk-mth82m8t.js → chunk-qyeptdyv.js} +171 -77
- package/dist/chunk-qyeptdyv.js.map +15 -0
- package/dist/{chunk-b49dgvsj.js → chunk-r2y23egw.js} +3 -3
- package/dist/{chunk-b49dgvsj.js.map → chunk-r2y23egw.js.map} +2 -2
- package/dist/{chunk-mwsxn98e.js → chunk-r7fj830t.js} +253 -200
- package/dist/chunk-r7fj830t.js.map +36 -0
- package/dist/{chunk-4rh2m6zg.js → chunk-rb1xx120.js} +13 -13
- package/dist/{chunk-4rh2m6zg.js.map → chunk-rb1xx120.js.map} +2 -2
- package/dist/{chunk-gzasd5b6.js → chunk-rtk71jzp.js} +22 -22
- package/dist/{chunk-gzasd5b6.js.map → chunk-rtk71jzp.js.map} +2 -2
- package/dist/chunk-s3csryxe.js +152 -0
- package/dist/chunk-s3csryxe.js.map +11 -0
- package/dist/chunk-s670k14v.js +60 -0
- package/dist/{chunk-407j3msh.js.map → chunk-s670k14v.js.map} +2 -2
- package/dist/chunk-skz0hst3.js +788 -0
- package/dist/chunk-skz0hst3.js.map +19 -0
- package/dist/{chunk-3z1qec12.js → chunk-t1f4f1ve.js} +107 -64
- package/dist/{chunk-3z1qec12.js.map → chunk-t1f4f1ve.js.map} +3 -3
- package/dist/chunk-v2vcg0w6.js +151 -0
- package/dist/chunk-v2vcg0w6.js.map +11 -0
- package/dist/{chunk-r8jrnexe.js → chunk-v4jbb3rs.js} +4 -4
- package/dist/{chunk-r8jrnexe.js.map → chunk-v4jbb3rs.js.map} +2 -2
- package/dist/{chunk-w1tvjszy.js → chunk-vsj3mdfj.js} +8 -8
- package/dist/{chunk-w1tvjszy.js.map → chunk-vsj3mdfj.js.map} +2 -2
- package/dist/{chunk-9dzba0f2.js → chunk-wjasrj67.js} +8 -8
- package/dist/{chunk-9dzba0f2.js.map → chunk-wjasrj67.js.map} +2 -2
- package/dist/{chunk-1evzqhks.js → chunk-wr8qp979.js} +6 -6
- package/dist/{chunk-1evzqhks.js.map → chunk-wr8qp979.js.map} +2 -2
- package/dist/{chunk-n6jxh8sw.js → chunk-wy0qdqfm.js} +18 -18
- package/dist/{chunk-n6jxh8sw.js.map → chunk-wy0qdqfm.js.map} +2 -2
- package/dist/{chunk-z4ccwbkz.js → chunk-x9v4cx1d.js} +1 -1
- package/dist/{chunk-ry24jbr1.js → chunk-yv79ncbv.js} +10 -10
- package/dist/{chunk-ry24jbr1.js.map → chunk-yv79ncbv.js.map} +2 -2
- package/dist/{chunk-yp8ee62z.js → chunk-z30bv4ga.js} +35 -35
- package/dist/{chunk-yp8ee62z.js.map → chunk-z30bv4ga.js.map} +2 -2
- package/dist/{chunk-8ydjhh27.js → chunk-z3y411fq.js} +11 -7
- package/dist/{chunk-8ydjhh27.js.map → chunk-z3y411fq.js.map} +3 -3
- package/dist/{chunk-9t8f5xfx.js → chunk-z5rnrmz1.js} +10 -10
- package/dist/{chunk-9t8f5xfx.js.map → chunk-z5rnrmz1.js.map} +2 -2
- package/dist/{chunk-96swp2wd.js → chunk-z667z3sg.js} +3 -3
- package/dist/{chunk-96swp2wd.js.map → chunk-z667z3sg.js.map} +2 -2
- package/dist/{chunk-4yqmp43v.js → chunk-z8fx5cgb.js} +12 -12
- package/dist/{chunk-4yqmp43v.js.map → chunk-z8fx5cgb.js.map} +2 -2
- package/dist/{chunk-yt8wphsx.js → chunk-zvx7h87b.js} +3 -3
- package/dist/{chunk-yt8wphsx.js.map → chunk-zvx7h87b.js.map} +2 -2
- package/dist/connectors/connections/authorizations.d.ts.map +1 -1
- package/dist/connectors/connections/contracts.d.ts +3 -0
- package/dist/connectors/connections/contracts.d.ts.map +1 -1
- package/dist/connectors/connections/internal.js +9 -10
- package/dist/connectors/connections/internal.js.map +1 -1
- package/dist/connectors/connections/request.d.ts +3 -1
- package/dist/connectors/connections/request.d.ts.map +1 -1
- package/dist/connectors/connections/runs.d.ts.map +1 -1
- package/dist/connectors/connections/tokens.d.ts.map +1 -1
- package/dist/connectors/connections/validation.d.ts +5 -1
- package/dist/connectors/connections/validation.d.ts.map +1 -1
- package/dist/connectors/types.d.ts +19 -4
- package/dist/connectors/types.d.ts.map +1 -1
- package/dist/datasets/write.js +8 -12
- package/dist/datasets/write.js.map +1 -1
- package/dist/edits/index.js +7 -8
- package/dist/edits/index.js.map +1 -1
- package/dist/error-reporting/internal.js +22 -24
- package/dist/error-reporting/internal.js.map +1 -1
- package/dist/errors/internal.d.ts +1 -1
- package/dist/errors/internal.d.ts.map +1 -1
- package/dist/errors/internal.js +22 -24
- package/dist/errors/internal.js.map +1 -1
- package/dist/errors/redaction.d.ts +8 -0
- package/dist/errors/redaction.d.ts.map +1 -0
- package/dist/errors/types.d.ts +4 -0
- package/dist/errors/types.d.ts.map +1 -1
- package/dist/events/execution.d.ts +1 -1
- package/dist/events/execution.d.ts.map +1 -1
- package/dist/events/index.js +60 -63
- package/dist/events/index.js.map +1 -1
- package/dist/events/scope.js +4 -5
- package/dist/events/scope.js.map +1 -1
- package/dist/events/selectors/index.js +9 -10
- package/dist/events/selectors/index.js.map +1 -1
- package/dist/events/service.d.ts +2 -2
- package/dist/events/service.d.ts.map +1 -1
- package/dist/execution/agent.d.ts +3 -3
- package/dist/execution/agent.d.ts.map +1 -1
- package/dist/execution/agent.js +71 -82
- package/dist/execution/agent.js.map +1 -1
- package/dist/execution/durable.d.ts +1 -0
- package/dist/execution/durable.d.ts.map +1 -1
- package/dist/execution/primitive.d.ts +2 -0
- package/dist/execution/primitive.d.ts.map +1 -1
- package/dist/execution/primitive.js +64 -71
- package/dist/execution/primitive.js.map +3 -3
- package/dist/execution/request.d.ts +1 -0
- package/dist/execution/request.d.ts.map +1 -1
- package/dist/execution/request.js +66 -75
- package/dist/execution/request.js.map +3 -3
- package/dist/http/index.js +10 -11
- package/dist/http/index.js.map +1 -1
- package/dist/index.d.ts +17 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +457 -477
- package/dist/index.js.map +1 -1
- package/dist/lake-storage/changes.d.ts +5 -0
- package/dist/lake-storage/changes.d.ts.map +1 -0
- package/dist/lake-storage/in-memory.d.ts +2 -1
- package/dist/lake-storage/in-memory.d.ts.map +1 -1
- package/dist/lake-storage/index.d.ts +2 -1
- package/dist/lake-storage/index.d.ts.map +1 -1
- package/dist/lake-storage/index.js +40 -42
- package/dist/lake-storage/index.js.map +1 -1
- package/dist/lake-storage/types.d.ts +36 -0
- package/dist/lake-storage/types.d.ts.map +1 -1
- package/dist/logging/index.d.ts +3 -4
- package/dist/logging/index.d.ts.map +1 -1
- package/dist/logging/index.js +18 -40
- package/dist/logging/index.js.map +1 -1
- package/dist/logging/internal.d.ts +5 -0
- package/dist/logging/internal.d.ts.map +1 -0
- package/dist/logging/internal.js +43 -0
- package/dist/logging/internal.js.map +9 -0
- package/dist/materialization/index.d.ts +1 -1
- package/dist/materialization/index.d.ts.map +1 -1
- package/dist/materialization/index.js +46 -49
- package/dist/materialization/index.js.map +1 -1
- package/dist/materialization/model.d.ts +12 -1
- package/dist/materialization/model.d.ts.map +1 -1
- package/dist/materializer/index.d.ts +1 -1
- package/dist/materializer/index.d.ts.map +1 -1
- package/dist/materializer/index.js +137 -145
- package/dist/materializer/index.js.map +1 -1
- package/dist/materializer/materializer.d.ts +5 -1
- package/dist/materializer/materializer.d.ts.map +1 -1
- package/dist/materializer/projections/entry-validator.d.ts +2 -1
- package/dist/materializer/projections/entry-validator.d.ts.map +1 -1
- package/dist/materializer/projections/replace.d.ts.map +1 -1
- package/dist/materializer/projections/source-materialization.d.ts +4 -3
- package/dist/materializer/projections/source-materialization.d.ts.map +1 -1
- package/dist/materializer/shared/normalize.d.ts +2 -1
- package/dist/materializer/shared/normalize.d.ts.map +1 -1
- package/dist/models/errors.d.ts +4 -0
- package/dist/models/errors.d.ts.map +1 -1
- package/dist/models/execution/binding.d.ts +9 -0
- package/dist/models/execution/binding.d.ts.map +1 -0
- package/dist/models/execution/errors.d.ts +9 -0
- package/dist/models/execution/errors.d.ts.map +1 -0
- package/dist/models/execution/index.d.ts +11 -0
- package/dist/models/execution/index.d.ts.map +1 -0
- package/dist/models/execution/index.js +55 -0
- package/dist/models/execution/index.js.map +9 -0
- package/dist/models/execution/model-call-accounting.d.ts +17 -0
- package/dist/models/execution/model-call-accounting.d.ts.map +1 -0
- package/dist/models/execution/model-call-admission.d.ts +47 -0
- package/dist/models/execution/model-call-admission.d.ts.map +1 -0
- package/dist/models/execution/model-call-limits.d.ts +15 -0
- package/dist/models/execution/model-call-limits.d.ts.map +1 -0
- package/dist/models/execution/model-call-recorder.d.ts +40 -0
- package/dist/models/execution/model-call-recorder.d.ts.map +1 -0
- package/dist/models/execution/model-call-recovery.d.ts +12 -0
- package/dist/models/execution/model-call-recovery.d.ts.map +1 -0
- package/dist/models/execution/recovery-queue.d.ts +5 -0
- package/dist/models/execution/recovery-queue.d.ts.map +1 -0
- package/dist/models/execution/types.d.ts +44 -0
- package/dist/models/execution/types.d.ts.map +1 -0
- package/dist/models/execution/usage.d.ts +5 -0
- package/dist/models/execution/usage.d.ts.map +1 -0
- package/dist/models/execution.d.ts +6 -0
- package/dist/models/execution.d.ts.map +1 -0
- package/dist/models/generation-types.d.ts +40 -0
- package/dist/models/generation-types.d.ts.map +1 -0
- package/dist/models/index.d.ts +1 -0
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +42 -43
- package/dist/models/index.js.map +1 -1
- package/dist/models/language-model.d.ts +3 -0
- package/dist/models/language-model.d.ts.map +1 -1
- package/dist/models/output.d.ts +5 -0
- package/dist/models/output.d.ts.map +1 -0
- package/dist/models/resolve.d.ts +4 -0
- package/dist/models/resolve.d.ts.map +1 -0
- package/dist/objects/execution.d.ts.map +1 -1
- package/dist/objects/index.js +75 -87
- package/dist/objects/index.js.map +1 -1
- package/dist/objects/query/index.js +67 -76
- package/dist/objects/query/index.js.map +1 -1
- package/dist/ontology/index.d.ts +1 -2
- package/dist/ontology/index.d.ts.map +1 -1
- package/dist/ontology/index.js +62 -113
- package/dist/ontology/index.js.map +1 -1
- package/dist/ontology/internal.d.ts +7 -0
- package/dist/ontology/internal.d.ts.map +1 -1
- package/dist/ontology/internal.js +65 -116
- package/dist/ontology/internal.js.map +3 -4
- package/dist/pipelines/index.js +57 -66
- package/dist/pipelines/index.js.map +1 -1
- package/dist/pipelines/run-dispatch.d.ts.map +1 -1
- package/dist/projections/internal.js +56 -67
- package/dist/projections/internal.js.map +1 -1
- package/dist/projections/run-dispatch.d.ts.map +1 -1
- package/dist/query.d.ts +0 -1
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +11 -15
- package/dist/query.js.map +1 -1
- package/dist/queues/in-memory.d.ts +7 -3
- package/dist/queues/in-memory.d.ts.map +1 -1
- package/dist/queues/index.d.ts +2 -1
- package/dist/queues/index.d.ts.map +1 -1
- package/dist/queues/index.js +6 -7
- package/dist/queues/index.js.map +1 -1
- package/dist/queues/indexed-heap.d.ts +15 -0
- package/dist/queues/indexed-heap.d.ts.map +1 -0
- package/dist/queues/types.d.ts +3 -20
- package/dist/queues/types.d.ts.map +1 -1
- package/dist/rules/internal.js +4 -5
- package/dist/rules/internal.js.map +1 -1
- package/dist/runtime/create.d.ts +2 -1
- package/dist/runtime/create.d.ts.map +1 -1
- package/dist/runtime/host.d.ts +2 -1
- package/dist/runtime/host.d.ts.map +1 -1
- package/dist/runtime/internal.js +13 -14
- package/dist/runtime/internal.js.map +1 -1
- package/dist/runtime/ontology-mutations.d.ts +3 -1
- package/dist/runtime/ontology-mutations.d.ts.map +1 -1
- package/dist/runtime/sixb.d.ts +2 -0
- package/dist/runtime/sixb.d.ts.map +1 -1
- package/dist/sandboxes/errors.d.ts +4 -0
- package/dist/sandboxes/errors.d.ts.map +1 -1
- package/dist/sandboxes/index.d.ts +2 -2
- package/dist/sandboxes/index.d.ts.map +1 -1
- package/dist/sandboxes/index.js +14 -13
- package/dist/sandboxes/index.js.map +1 -1
- package/dist/sandboxes/sandbox.d.ts +35 -7
- package/dist/sandboxes/sandbox.d.ts.map +1 -1
- package/dist/scheduler/index.js +9 -10
- package/dist/scheduler/index.js.map +1 -1
- package/dist/schedules/index.js +31 -33
- package/dist/schedules/index.js.map +1 -1
- package/dist/shares/internal.js +46 -54
- package/dist/shares/internal.js.map +2 -2
- package/dist/storage/action-runs/failure.js +7 -9
- package/dist/storage/action-runs/failure.js.map +1 -1
- package/dist/storage/action-runs/provider.js +4 -8
- package/dist/storage/action-runs/provider.js.map +1 -1
- package/dist/storage/agents/in-memory.d.ts.map +1 -1
- package/dist/storage/agents/provider.js +26 -30
- package/dist/storage/agents/provider.js.map +1 -1
- package/dist/storage/agents/types.d.ts +0 -3
- package/dist/storage/agents/types.d.ts.map +1 -1
- package/dist/storage/ai-cost/attribution.d.ts +4 -0
- package/dist/storage/ai-cost/attribution.d.ts.map +1 -0
- package/dist/storage/ai-cost/groups.d.ts +3 -0
- package/dist/storage/ai-cost/groups.d.ts.map +1 -1
- package/dist/storage/ai-cost/provider.d.ts +1 -0
- package/dist/storage/ai-cost/provider.d.ts.map +1 -1
- package/dist/storage/ai-cost/provider.js +30 -143
- package/dist/storage/ai-cost/provider.js.map +3 -4
- package/dist/storage/ai-cost/types.d.ts +15 -0
- package/dist/storage/ai-cost/types.d.ts.map +1 -1
- package/dist/storage/ai-limits/enforcement.js +14 -16
- package/dist/storage/ai-limits/enforcement.js.map +1 -1
- package/dist/storage/ai-limits/provider.js +56 -57
- package/dist/storage/ai-limits/provider.js.map +1 -1
- package/dist/storage/auth/in-memory.d.ts +1 -1
- package/dist/storage/auth/in-memory.d.ts.map +1 -1
- package/dist/storage/connector-connections/in-memory.d.ts.map +1 -1
- package/dist/storage/connector-connections/provider/runs.d.ts.map +1 -1
- package/dist/storage/connector-connections/provider.js +35 -37
- package/dist/storage/connector-connections/provider.js.map +3 -3
- package/dist/storage/connector-connections/types.d.ts +3 -2
- package/dist/storage/connector-connections/types.d.ts.map +1 -1
- package/dist/storage/executions/in-memory.d.ts.map +1 -1
- package/dist/storage/executions/provider.d.ts +2 -1
- package/dist/storage/executions/provider.d.ts.map +1 -1
- package/dist/storage/executions/provider.js +14 -11
- package/dist/storage/executions/provider.js.map +3 -3
- package/dist/storage/executions/types.d.ts +6 -2
- package/dist/storage/executions/types.d.ts.map +1 -1
- package/dist/storage/executions/validation.d.ts +2 -0
- package/dist/storage/executions/validation.d.ts.map +1 -1
- package/dist/storage/in-memory/index.d.ts.map +1 -1
- package/dist/storage/index.d.ts +7 -8
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +221 -256
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/internal.d.ts +10 -0
- package/dist/storage/internal.d.ts.map +1 -0
- package/dist/storage/internal.js +47 -0
- package/dist/storage/internal.js.map +9 -0
- package/dist/storage/ontology/in-memory/materializations-state.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/materializations.d.ts +1 -1
- package/dist/storage/ontology/in-memory/materializations.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/shared-state.d.ts +15 -2
- package/dist/storage/ontology/in-memory/shared-state.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/source-roots.d.ts +6 -0
- package/dist/storage/ontology/in-memory/source-roots.d.ts.map +1 -0
- package/dist/storage/ontology/in-memory/sources.d.ts.map +1 -1
- package/dist/storage/ontology/index.d.ts +1 -1
- package/dist/storage/ontology/index.d.ts.map +1 -1
- package/dist/storage/ontology/provider.d.ts +16 -0
- package/dist/storage/ontology/provider.d.ts.map +1 -1
- package/dist/storage/ontology/provider.js +107 -109
- package/dist/storage/ontology/provider.js.map +1 -1
- package/dist/storage/ontology/sources.d.ts +13 -4
- package/dist/storage/ontology/sources.d.ts.map +1 -1
- package/dist/storage/operation-scope.js +18 -19
- package/dist/storage/operation-scope.js.map +1 -1
- package/dist/storage/pipeline-runs/provider.js +4 -6
- package/dist/storage/pipeline-runs/provider.js.map +1 -1
- package/dist/storage/projection-runs/lifecycle.d.ts.map +1 -1
- package/dist/storage/projection-runs/provider.js +66 -70
- package/dist/storage/projection-runs/provider.js.map +1 -1
- package/dist/storage/projection-runs/types.d.ts +2 -0
- package/dist/storage/projection-runs/types.d.ts.map +1 -1
- package/dist/storage/share-grants/provider.js +17 -19
- package/dist/storage/share-grants/provider.js.map +1 -1
- package/dist/storage/share-sessions/provider.js +14 -15
- package/dist/storage/share-sessions/provider.js.map +1 -1
- package/dist/storage/sync-runs/provider.js +4 -6
- package/dist/storage/sync-runs/provider.js.map +1 -1
- package/dist/storage/webhook-runs/provider.js +4 -6
- package/dist/storage/webhook-runs/provider.js.map +1 -1
- package/dist/storage/workflow-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/workflow-runs/provider.js +13 -21
- package/dist/storage/workflow-runs/provider.js.map +1 -1
- package/dist/storage/workflow-runs/types.d.ts +0 -3
- package/dist/storage/workflow-runs/types.d.ts.map +1 -1
- package/dist/syncs/index.js +56 -65
- package/dist/syncs/index.js.map +1 -1
- package/dist/syncs/run-dispatch.d.ts.map +1 -1
- package/dist/testing/action-execution.d.ts +4 -1
- package/dist/testing/action-execution.d.ts.map +1 -1
- package/dist/testing/agent-execution.d.ts +1 -0
- package/dist/testing/agent-execution.d.ts.map +1 -1
- package/dist/testing/agent-storage-contract.d.ts.map +1 -1
- package/dist/testing/ai-model-call-groups-contract.d.ts.map +1 -1
- package/dist/testing/broker-contract.d.ts.map +1 -1
- package/dist/testing/connector-connection-storage-contract.d.ts.map +1 -1
- package/dist/testing/execution-storage-contract.d.ts.map +1 -1
- package/dist/testing/execution.d.ts +1 -0
- package/dist/testing/execution.d.ts.map +1 -1
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +2282 -1662
- package/dist/testing/index.js.map +16 -15
- package/dist/testing/lake-changes-contract.d.ts +6 -0
- package/dist/testing/lake-changes-contract.d.ts.map +1 -0
- package/dist/testing/materializer-storage-contract.d.ts.map +1 -1
- package/dist/testing/ontology-storage-contract.d.ts.map +1 -1
- package/dist/testing/projection-run-storage-contract.d.ts.map +1 -1
- package/dist/testing/workflow-execution.d.ts +1 -0
- package/dist/testing/workflow-execution.d.ts.map +1 -1
- package/dist/webhooks/connections.d.ts +6 -0
- package/dist/webhooks/connections.d.ts.map +1 -0
- package/dist/webhooks/index.d.ts +1 -1
- package/dist/webhooks/index.d.ts.map +1 -1
- package/dist/webhooks/internal.d.ts +2 -0
- package/dist/webhooks/internal.d.ts.map +1 -1
- package/dist/webhooks/internal.js +98 -61
- package/dist/webhooks/internal.js.map +4 -3
- package/dist/webhooks/registry.d.ts +1 -1
- package/dist/webhooks/registry.d.ts.map +1 -1
- package/dist/webhooks/types.d.ts +15 -4
- package/dist/webhooks/types.d.ts.map +1 -1
- package/dist/workers/index.js +11 -13
- package/dist/workers/index.js.map +2 -2
- package/dist/workflows/failure.d.ts +2 -0
- package/dist/workflows/failure.d.ts.map +1 -1
- package/dist/workflows/index.js +136 -147
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/request.d.ts.map +1 -1
- package/dist/workflows/run-dispatch.d.ts +3 -2
- package/dist/workflows/run-dispatch.d.ts.map +1 -1
- package/dist/workflows/types.d.ts +2 -0
- package/dist/workflows/types.d.ts.map +1 -1
- package/package.json +48 -30
- package/src/actions/run-dispatch.ts +2 -6
- package/src/actions/types/context.ts +2 -0
- package/src/actions/validation.ts +2 -1
- package/src/agents/adapters.ts +4 -9
- package/src/agents/{context.ts → context/entries.ts} +4 -4
- package/src/agents/context/index.ts +15 -0
- package/src/agents/context-model.ts +1 -1
- package/src/agents/context-resolution.ts +1 -1
- package/src/agents/index.ts +4 -4
- package/src/agents/message.ts +1 -1
- package/src/agents/model-loop.ts +8 -0
- package/src/agents/request.ts +11 -26
- package/src/agents/streams/index.ts +18 -0
- package/src/agents/streams/internal.ts +19 -0
- package/src/agents/{streams.ts → streams/protocol.ts} +5 -5
- package/src/agents/types.ts +1 -1
- package/src/agents/validation.ts +3 -7
- package/src/auth/index.ts +0 -1
- package/src/bootstrap/discovery.ts +81 -24
- package/src/bootstrap/index.ts +8 -1
- package/src/broker/in-memory.ts +104 -39
- package/src/broker/index.ts +4 -1
- package/src/broker/retention.ts +28 -0
- package/src/broker/subscriber.ts +21 -0
- package/src/broker/types.ts +15 -1
- package/src/connectors/builders.ts +0 -6
- package/src/connectors/connections/authorizations.ts +11 -5
- package/src/connectors/connections/contracts.ts +3 -0
- package/src/connectors/connections/request.ts +56 -22
- package/src/connectors/connections/runs.ts +1 -0
- package/src/connectors/connections/tokens.ts +4 -0
- package/src/connectors/connections/validation.ts +91 -5
- package/src/connectors/types.ts +19 -4
- package/src/errors/internal.ts +90 -10
- package/src/errors/redaction.ts +98 -0
- package/src/errors/types.ts +4 -0
- package/src/events/execution.ts +2 -2
- package/src/events/service.ts +3 -3
- package/src/execution/agent.ts +5 -3
- package/src/execution/durable.ts +11 -1
- package/src/execution/primitive.ts +5 -1
- package/src/execution/request.ts +3 -0
- package/src/index.ts +30 -20
- package/src/lake-storage/changes.ts +43 -0
- package/src/lake-storage/in-memory.ts +73 -0
- package/src/lake-storage/index.ts +4 -0
- package/src/lake-storage/types.ts +40 -0
- package/src/logging/index.ts +2 -33
- package/src/logging/internal.ts +43 -0
- package/src/logging/service.ts +1 -1
- package/src/materialization/index.ts +2 -0
- package/src/materialization/model.ts +14 -1
- package/src/materializer/index.ts +2 -0
- package/src/materializer/materializer.ts +10 -0
- package/src/materializer/projections/entry-validator.ts +19 -1
- package/src/materializer/projections/replace.ts +36 -1
- package/src/materializer/projections/source-materialization.ts +26 -6
- package/src/materializer/shared/normalize.ts +1 -1
- package/src/models/errors.ts +12 -0
- package/src/models/execution/binding.ts +29 -0
- package/src/models/execution/errors.ts +18 -0
- package/src/models/execution/index.ts +26 -0
- package/src/models/execution/model-call-accounting.ts +211 -0
- package/src/models/execution/model-call-admission.ts +127 -0
- package/src/models/execution/model-call-limits.ts +135 -0
- package/src/models/execution/model-call-recorder.ts +235 -0
- package/src/models/execution/model-call-recovery.ts +125 -0
- package/src/models/execution/recovery-queue.ts +31 -0
- package/src/models/execution/types.ts +58 -0
- package/src/models/execution/usage.ts +23 -0
- package/src/models/execution.ts +207 -0
- package/src/models/generation-types.ts +50 -0
- package/src/models/index.ts +8 -0
- package/src/models/language-model.ts +3 -0
- package/src/models/output.ts +45 -0
- package/src/models/resolve.ts +27 -0
- package/src/objects/execution.ts +1 -1
- package/src/ontology/index.ts +1 -2
- package/src/ontology/internal.ts +35 -0
- package/src/pipelines/run-dispatch.ts +21 -1
- package/src/projections/run-dispatch.ts +31 -68
- package/src/query.ts +0 -1
- package/src/queues/in-memory.ts +105 -62
- package/src/queues/index.ts +4 -2
- package/src/queues/indexed-heap.ts +74 -0
- package/src/queues/types.ts +6 -25
- package/src/runtime/create.ts +2 -1
- package/src/runtime/host.ts +2 -15
- package/src/runtime/ontology-mutations.ts +4 -0
- package/src/runtime/sixb.ts +4 -0
- package/src/sandboxes/errors.ts +5 -0
- package/src/sandboxes/index.ts +3 -0
- package/src/sandboxes/sandbox.ts +35 -7
- package/src/storage/agents/in-memory.ts +0 -3
- package/src/storage/agents/types.ts +0 -3
- package/src/storage/ai-cost/analytics.ts +1 -1
- package/src/storage/ai-cost/attribution.ts +15 -0
- package/src/storage/ai-cost/groups.ts +5 -1
- package/src/storage/ai-cost/provider.ts +1 -0
- package/src/storage/ai-cost/types.ts +7 -0
- package/src/storage/auth/in-memory.ts +1 -1
- package/src/storage/connector-connections/in-memory.ts +3 -1
- package/src/storage/connector-connections/provider/runs.ts +3 -1
- package/src/storage/connector-connections/types.ts +3 -2
- package/src/storage/executions/in-memory.ts +4 -9
- package/src/storage/executions/provider.ts +4 -0
- package/src/storage/executions/types.ts +6 -2
- package/src/storage/executions/validation.ts +32 -0
- package/src/storage/in-memory/index.ts +16 -1
- package/src/storage/index.ts +4 -29
- package/src/storage/internal.ts +20 -0
- package/src/storage/ontology/in-memory/materializations-state.ts +5 -18
- package/src/storage/ontology/in-memory/materializations.ts +73 -92
- package/src/storage/ontology/in-memory/shared-state.ts +26 -1
- package/src/storage/ontology/in-memory/source-roots.ts +123 -0
- package/src/storage/ontology/in-memory/sources.ts +78 -23
- package/src/storage/ontology/index.ts +1 -0
- package/src/storage/ontology/provider.ts +70 -0
- package/src/storage/ontology/sources.ts +14 -3
- package/src/storage/projection-runs/lifecycle.ts +5 -2
- package/src/storage/projection-runs/types.ts +4 -3
- package/src/storage/workflow-runs/in-memory.ts +0 -2
- package/src/storage/workflow-runs/types.ts +0 -3
- package/src/syncs/run-dispatch.ts +19 -1
- package/src/testing/action-execution.ts +9 -2
- package/src/testing/agent-execution.ts +3 -0
- package/src/testing/agent-storage-contract.ts +0 -5
- package/src/testing/ai-model-call-groups-contract.ts +74 -2
- package/src/testing/broker-contract.ts +95 -0
- package/src/testing/connector-connection-storage-contract.ts +18 -1
- package/src/testing/execution-storage-contract.ts +59 -1
- package/src/testing/execution.ts +6 -0
- package/src/testing/index.ts +1 -0
- package/src/testing/lake-changes-contract.ts +240 -0
- package/src/testing/materializer-storage-contract.ts +172 -1
- package/src/testing/ontology-storage-contract.ts +7 -0
- package/src/testing/projection-run-storage-contract.ts +34 -0
- package/src/testing/workflow-execution.ts +4 -0
- package/src/webhooks/connections.ts +56 -0
- package/src/webhooks/index.ts +2 -0
- package/src/webhooks/internal.ts +2 -0
- package/src/webhooks/registry.ts +3 -4
- package/src/webhooks/types.ts +17 -4
- package/src/workflows/failure.ts +62 -1
- package/src/workflows/request.ts +0 -9
- package/src/workflows/run-dispatch.ts +42 -32
- package/src/workflows/types.ts +2 -0
- package/src/workflows/validation.ts +1 -1
- package/dist/agents/context.d.ts.map +0 -1
- package/dist/agents/context.js +0 -23
- package/dist/agents/streams.d.ts.map +0 -1
- package/dist/agents/streams.js +0 -55
- package/dist/chunk-08m3b6w8.js +0 -32
- package/dist/chunk-19jp6g9d.js.map +0 -11
- package/dist/chunk-2xns679x.js.map +0 -11
- package/dist/chunk-3xep5cjx.js.map +0 -15
- package/dist/chunk-407j3msh.js +0 -60
- package/dist/chunk-4qfkag59.js +0 -1568
- package/dist/chunk-4qfkag59.js.map +0 -20
- package/dist/chunk-5e3pq99w.js.map +0 -11
- package/dist/chunk-5gd7tpv6.js.map +0 -11
- package/dist/chunk-7y0f6rf1.js.map +0 -10
- package/dist/chunk-8m5ejdpn.js.map +0 -10
- package/dist/chunk-8tsf6dmc.js.map +0 -15
- package/dist/chunk-ajnan18g.js.map +0 -12
- package/dist/chunk-c15dr03f.js +0 -43
- package/dist/chunk-d8qkxt2v.js.map +0 -10
- package/dist/chunk-jq43kdvk.js +0 -50
- package/dist/chunk-k34z5rvh.js.map +0 -11
- package/dist/chunk-k522z7v6.js.map +0 -10
- package/dist/chunk-mth82m8t.js.map +0 -14
- package/dist/chunk-mwsxn98e.js.map +0 -36
- package/dist/chunk-p03r0h5s.js.map +0 -16
- package/dist/chunk-p1rzczbt.js +0 -218
- package/dist/chunk-rafagrwr.js.map +0 -11
- package/dist/chunk-rv2hkwwa.js.map +0 -14
- package/dist/chunk-sbzzr4kx.js.map +0 -63
- package/dist/chunk-tpnd31c1.js +0 -242
- package/dist/chunk-tpnd31c1.js.map +0 -11
- package/dist/chunk-w9tg6yyb.js.map +0 -12
- package/dist/chunk-wtf06et8.js.map +0 -14
- package/dist/chunk-xajtptbw.js.map +0 -40
- package/dist/chunk-xhy826cz.js.map +0 -10
- package/dist/chunk-y64skrwp.js +0 -19
- package/dist/chunk-zcnhxkvd.js +0 -7
- package/dist/logging/types.js +0 -27
- package/dist/logging/types.js.map +0 -9
- /package/dist/{chunk-zqqz8052.js → chunk-7n30ybym.js} +0 -0
- /package/dist/{chunk-zqqz8052.js.map → chunk-7n30ybym.js.map} +0 -0
- /package/dist/{chunk-4a849fr1.js.map → chunk-9tc8dxmn.js.map} +0 -0
- /package/dist/{chunk-j1sbhm7p.js → chunk-ey1nk510.js} +0 -0
- /package/dist/{chunk-j1sbhm7p.js.map → chunk-ey1nk510.js.map} +0 -0
- /package/dist/{chunk-z4ccwbkz.js.map → chunk-x9v4cx1d.js.map} +0 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/webhooks/errors.ts", "../src/webhooks/builders.ts", "../src/webhooks/connector.ts", "../src/webhooks/registry.ts", "../src/webhooks/unverified.ts", "../src/runtime/create.ts", "../src/runtime/host.ts", "../src/connectors/credentials.ts", "../src/connectors/connections/service.ts", "../src/connectors/connections/authorizations.ts", "../src/connectors/connections/validation.ts", "../src/connectors/connections/credential-codec.ts", "../src/connectors/connections/credential-mutations.ts", "../src/connectors/connections/provider-operation.ts", "../src/connectors/connections/storage-boundary.ts", "../src/connectors/connections/tokens.ts", "../src/connectors/connections/command-context.ts", "../src/connectors/connections/request.ts", "../src/connectors/connections/views.ts", "../src/connectors/connections/runs.ts", "../src/connectors/service.ts", "../src/maintenance/ontology-maintenance.ts", "../src/agents/tool-catalog.ts", "../src/syncs/validation.ts", "../src/runtime/definitions.ts", "../src/runtime/resolve-definitions.ts", "../src/runtime/storage-readiness.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"export class WebhookValidationError extends Error {\n readonly name = \"WebhookValidationError\"\n}\n",
|
|
6
|
+
"import { WebhookValidationError } from \"./errors\"\nimport type {\n WebhookBodyParser,\n WebhookBodySchema,\n WebhookDefinition,\n WebhookHandlerContext,\n WebhookHandlerResult,\n WebhookIdempotencyKeyResolver,\n WebhookVerifyContext,\n} from \"./types\"\n\ntype WebhookHandler<TBody, TClient> = (\n ctx: WebhookHandlerContext<TBody, TClient>\n) => Promise<WebhookHandlerResult> | WebhookHandlerResult\n\ntype WebhookVerifyHandler = (ctx: WebhookVerifyContext) => Promise<void> | void\n\ninterface WebhookDraft<TBody> {\n readonly id: string\n readonly method: \"POST\"\n readonly body: WebhookBodyParser<TBody>\n readonly verify?: WebhookVerifyHandler\n readonly idempotencyKey?: WebhookIdempotencyKeyResolver<TBody>\n}\n\n/** Define an inbound webhook owned by a connector adapter. */\nexport function defineWebhook(id: string): WebhookMethodBuilder {\n assertNonEmpty(id, \"Webhook id\")\n return new WebhookMethodBuilder(id)\n}\n\nexport class WebhookMethodBuilder<TClient = unknown> {\n constructor(private readonly id: string) {}\n\n post(): WebhookBodyBuilder<TClient> {\n return new WebhookBodyBuilder(this.id, \"POST\")\n }\n}\n\nexport class WebhookBodyBuilder<TClient = unknown> {\n constructor(\n private readonly id: string,\n private readonly method: \"POST\"\n ) {}\n\n /**\n * Decode JSON and keep the handler body as unknown.\n *\n * Prefer `.json(schema)` for provider payloads that have a known shape.\n */\n json(): WebhookBuilder<unknown, TClient>\n /** Decode JSON, validate or normalize it at runtime, and infer the handler body. */\n json<TBody>(schema: WebhookBodySchema<TBody>): WebhookBuilder<TBody, TClient>\n json<TBody>(schema?: WebhookBodySchema<TBody>): WebhookBuilder<TBody | unknown, TClient> {\n if (schema !== undefined && typeof schema.parse !== \"function\") {\n throw new WebhookValidationError(\"[Sixb] Webhook JSON schema must provide parse(value).\")\n }\n\n return new WebhookBuilder({\n id: this.id,\n method: this.method,\n body: {\n format: \"json\",\n parse(value: unknown) {\n return schema ? schema.parse(value) : value\n },\n },\n })\n }\n\n text(): WebhookBuilder<string, TClient> {\n return new WebhookBuilder({\n id: this.id,\n method: this.method,\n body: {\n format: \"text\",\n parse(value: unknown) {\n if (typeof value !== \"string\") {\n throw new Error(\"Expected webhook body to be text.\")\n }\n\n return value\n },\n },\n })\n }\n\n raw(): WebhookBuilder<Uint8Array, TClient> {\n return new WebhookBuilder({\n id: this.id,\n method: this.method,\n body: {\n format: \"raw\",\n parse(value: unknown) {\n if (!(value instanceof Uint8Array)) {\n throw new Error(\"Expected webhook body to be raw bytes.\")\n }\n\n return value\n },\n },\n })\n }\n}\n\nexport class WebhookBuilder<TBody, TClient = unknown> {\n constructor(private readonly draft: WebhookDraft<TBody>) {}\n\n verify(verify: WebhookVerifyHandler): WebhookBuilder<TBody, TClient> {\n if (typeof verify !== \"function\") {\n throw new WebhookValidationError(\"[Sixb] Webhook verify must be a function.\")\n }\n\n return new WebhookBuilder({\n ...this.draft,\n verify,\n })\n }\n\n idempotencyKey(resolver: WebhookIdempotencyKeyResolver<TBody>): WebhookBuilder<TBody, TClient> {\n if (typeof resolver !== \"function\") {\n throw new WebhookValidationError(\"[Sixb] Webhook idempotencyKey must be a function.\")\n }\n\n return new WebhookBuilder({\n ...this.draft,\n idempotencyKey: resolver,\n })\n }\n\n handle<TNextClient = TClient>(\n handle: WebhookHandler<TBody, TNextClient>\n ): WebhookDefinition<TBody, TNextClient> {\n if (typeof handle !== \"function\") {\n throw new WebhookValidationError(\"[Sixb] Webhook handle must be a function.\")\n }\n\n return {\n kind: \"webhook\",\n id: this.draft.id,\n method: this.draft.method,\n body: this.draft.body,\n idempotencyKey: this.draft.idempotencyKey,\n verify: this.draft.verify,\n handle,\n }\n }\n}\n\nfunction assertNonEmpty(value: string, field: string): void {\n if (!value.trim()) {\n throw new WebhookValidationError(`[Sixb] ${field} must not be empty.`)\n }\n}\n",
|
|
7
|
+
"import type { ConnectorAdapter } from \"../connectors/types\"\nimport type { WebhookDefinition } from \"./types\"\n\nexport interface WebhookConnectorClient {\n readonly kind: \"webhook\"\n}\n\n/** Connector adapter for inbound-only integrations that expose no outbound client. */\nexport function webhookConnector(options: {\n readonly webhooks: readonly WebhookDefinition<unknown, WebhookConnectorClient>[]\n}): ConnectorAdapter<\"webhook\", WebhookConnectorClient> {\n return {\n type: \"webhook\",\n webhooks: options.webhooks,\n connect() {\n return { kind: \"webhook\" }\n },\n }\n}\n",
|
|
8
|
+
"import type { ConnectorDefinition } from \"../connectors/types\"\nimport { WebhookValidationError } from \"./errors\"\nimport type { RegisteredWebhook } from \"./types\"\n\n/** Read-only access to connector webhooks registered by a host. */\nexport interface WebhookCatalog {\n list(): readonly RegisteredWebhook[]\n getByRoute(route: string): RegisteredWebhook | null\n getById(connectorId: string, webhookId: string): RegisteredWebhook | null\n}\n\nexport interface WebhookRegistryOptions {\n readonly connectors: readonly ConnectorDefinition[]\n}\n\nexport class WebhookRegistry implements WebhookCatalog {\n private readonly webhooks: readonly RegisteredWebhook[]\n private readonly byRoute = new Map<string, RegisteredWebhook>()\n\n constructor(options: WebhookRegistryOptions) {\n const registered: RegisteredWebhook[] = []\n\n for (const connector of options.connectors) {\n const webhooks = connector.adapter.webhooks ?? []\n if (!Array.isArray(webhooks)) {\n throw new WebhookValidationError(\n `[Sixb] Connector '${connector.id}' webhooks must be an array when provided.`\n )\n }\n\n const ids = new Set<string>()\n for (const webhook of webhooks) {\n assertValidWebhook(connector.id, webhook)\n\n if (ids.has(webhook.id)) {\n throw new WebhookValidationError(\n `[Sixb] Duplicate webhook id '${webhook.id}' for connector '${connector.id}'.`\n )\n }\n ids.add(webhook.id)\n\n const route = webhookRoute(connector.id, webhook.id)\n const duplicate = this.byRoute.get(route)\n if (duplicate) {\n throw new WebhookValidationError(\n `[Sixb] Duplicate webhook route '${route}' for connectors '${duplicate.connector.id}' and '${connector.id}'.`\n )\n }\n\n const registeredWebhook = {\n connector,\n webhook,\n route,\n } satisfies RegisteredWebhook\n\n this.byRoute.set(route, registeredWebhook)\n registered.push(registeredWebhook)\n }\n }\n\n this.webhooks = Object.freeze(registered)\n }\n\n list(): readonly RegisteredWebhook[] {\n return this.webhooks\n }\n\n getByRoute(route: string): RegisteredWebhook | null {\n return this.byRoute.get(route) ?? null\n }\n\n getById(connectorId: string, webhookId: string): RegisteredWebhook | null {\n return this.getByRoute(webhookRoute(connectorId, webhookId))\n }\n}\n\nexport function webhookRoute(connectorId: string, webhookId: string): string {\n return `/api/webhooks/${connectorId}/${webhookId}`\n}\n\nfunction assertValidWebhook(\n connectorId: string,\n webhook: unknown\n): asserts webhook is RegisteredWebhook[\"webhook\"] {\n if (!isRecord(webhook)) {\n throw new WebhookValidationError(`[Sixb] Connector '${connectorId}' has an invalid webhook.`)\n }\n\n if (webhook.kind !== \"webhook\") {\n throw new WebhookValidationError(\n `[Sixb] Connector '${connectorId}' webhook must be created with defineWebhook(...).`\n )\n }\n\n if (typeof webhook.id !== \"string\" || !webhook.id.trim()) {\n throw new WebhookValidationError(\n `[Sixb] Connector '${connectorId}' webhook id must not be empty.`\n )\n }\n\n if (webhook.method !== \"POST\") {\n throw new WebhookValidationError(\n `[Sixb] Webhook '${connectorId}/${webhook.id}' must use method POST.`\n )\n }\n\n if (!isRecord(webhook.body)) {\n throw new WebhookValidationError(\n `[Sixb] Webhook '${connectorId}/${webhook.id}' body is required.`\n )\n }\n\n if (\n webhook.body.format !== \"json\" &&\n webhook.body.format !== \"text\" &&\n webhook.body.format !== \"raw\"\n ) {\n throw new WebhookValidationError(\n `[Sixb] Webhook '${connectorId}/${webhook.id}' body format must be json, text, or raw.`\n )\n }\n\n if (typeof webhook.body.parse !== \"function\") {\n throw new WebhookValidationError(\n `[Sixb] Webhook '${connectorId}/${webhook.id}' body parser must provide parse(value).`\n )\n }\n\n if (webhook.verify !== undefined && typeof webhook.verify !== \"function\") {\n throw new WebhookValidationError(\n `[Sixb] Webhook '${connectorId}/${webhook.id}' verify must be a function.`\n )\n }\n\n if (webhook.idempotencyKey !== undefined && typeof webhook.idempotencyKey !== \"function\") {\n throw new WebhookValidationError(\n `[Sixb] Webhook '${connectorId}/${webhook.id}' idempotencyKey must be a function.`\n )\n }\n\n if (typeof webhook.handle !== \"function\") {\n throw new WebhookValidationError(\n `[Sixb] Webhook '${connectorId}/${webhook.id}' handle must be a function.`\n )\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n",
|
|
9
|
+
"/**\n * How a webhook is allowed to treat the credential its provider sends.\n *\n * A union, so no value carries neither branch. `resolveWebhookVerification` covers the path\n * where the credential arrives as `TCredential | undefined` from the environment, which no type\n * can narrow. Generic because a credential is not always a signing secret: PandaDoc resolves a\n * shared key, Pipedrive compares a username and password.\n */\nexport type WebhookVerification<TCredential = string> =\n | { readonly credential: TCredential; readonly allowUnverified?: never }\n | {\n readonly credential?: never\n /**\n * Accept deliveries this webhook cannot verify. Without a credential the route accepts\n * requests from anyone who can reach it, so it has to be asked for.\n */\n readonly allowUnverified: true\n }\n\n/**\n * How to name a webhook, and its options, in a message about its verification.\n *\n * The options are part of the subject because a connector has two entry points with different\n * names for the same thing: a message fixed to one sends half the callers to an option their\n * API does not have.\n */\nexport interface WebhookVerificationSubject {\n /** The connector, as it appears in its own message prefix — `SixbGitHub`, `SixbMercury`. */\n readonly connector: string\n /** What this webhook checks when a credential is configured, as a noun phrase. */\n readonly verifies: string\n /** The option carrying the credential, written as the caller would type it. */\n readonly credentialOption: string\n /** The option that accepts unverified deliveries, written as the caller would type it. */\n readonly allowOption: string\n}\n\nexport class UnverifiedWebhookError extends Error {\n readonly name = \"UnverifiedWebhookError\"\n}\n\n/**\n * Narrows a credential that may be absent into a {@link WebhookVerification}, or refuses.\n *\n * Returns the union so a caller spreads the result into the builder instead of deciding again.\n * Refusing is the point: a missing credential used to mean `.verify()` returned early and the\n * route accepted anything that reached it. Throwing here fails `createSixb()` instead, so the\n * API role never starts open.\n */\nexport function resolveWebhookVerification<TCredential>(\n subject: WebhookVerificationSubject,\n options: { readonly credential?: TCredential; readonly allowUnverified?: boolean }\n): WebhookVerification<TCredential> {\n if (options.credential) return { credential: options.credential }\n\n if (!options.allowUnverified) {\n throw new UnverifiedWebhookError(\n `[${subject.connector}] This webhook has no credential, so ${subject.verifies} cannot be ` +\n `checked and the route would accept unverified requests from anyone who can reach it. ` +\n `Set ${subject.credentialOption}, or pass ${subject.allowOption} to accept that.`\n )\n }\n\n return { allowUnverified: true }\n}\n\n/**\n * Announces a webhook whose author chose to accept unverified deliveries. Called where the\n * webhook is defined, not inside `verify()`: once per boot is a fact, once per request is noise.\n */\nexport function warnUnverifiedWebhook<TCredential>(\n subject: WebhookVerificationSubject,\n verification: WebhookVerification<TCredential>\n): void {\n if (verification.credential) return\n\n console.warn(\n `[${subject.connector}] ${subject.allowOption}, so ${subject.verifies} is not checked ` +\n `and this route accepts unverified requests from anyone who can reach it. ` +\n `Set ${subject.credentialOption} before exposing it.`\n )\n}\n",
|
|
10
|
+
"import { resolve } from \"node:path\"\nimport type { ActionDefinition } from \"../actions\"\nimport type { AgentToolDefinition } from \"../agents\"\nimport { assertNoAgentDefinitions } from \"../agents/retired-config\"\nimport type { SixbAuthConfig } from \"../auth\"\nimport type { BlobStorage } from \"../blob-storage\"\nimport { discoverOntologySources, discoverProjectDefinitions } from \"../bootstrap\"\nimport type { Broker } from \"../broker\"\nimport type { ConnectorConnectionOptions, ConnectorDefinition } from \"../connectors/types\"\nimport type { DatasetDefinition } from \"../datasets\"\nimport type { SixbErrorHandler } from \"../error-reporting/types\"\nimport type { LakeStorage } from \"../lake-storage\"\nimport type { LoggerProvider } from \"../logging\"\nimport type { ObservabilityOptions } from \"../logging/service\"\nimport type { OntologyMaintenanceOptions } from \"../maintenance\"\nimport type { ModelCatalogInput } from \"../models\"\nimport type { PipelineDefinition } from \"../pipelines/types\"\nimport type { ProjectionDefinition } from \"../projections/types\"\nimport type { Queues } from \"../queues\"\nimport type { RuleDefinition } from \"../rules\"\nimport type { SandboxFactory } from \"../sandboxes\"\nimport type { ScheduleDefinition } from \"../schedules\"\nimport type { GroupDefinition, MembershipPolicyDefinition, RoleDefinition } from \"../security\"\nimport type { ShareDefinition } from \"../shares\"\nimport type { Storage } from \"../storage\"\nimport type { SyncDefinition } from \"../syncs\"\nimport type { WorkflowDefinition } from \"../workflows\"\nimport { RuntimeError } from \"./errors\"\nimport { SixbHost } from \"./host\"\nimport type { OntologySource } from \"./types\"\n\nexport interface CreateSixbOptions {\n id?: string\n broker: Broker\n storage: Storage\n lakeStorage: LakeStorage\n blobStorage: BlobStorage\n queues: Queues\n sandboxes?: SandboxFactory\n /** Optional process-level output provider. Omit for broker-only logging. */\n logger?: LoggerProvider\n /** Broker capture controls, independent from the output provider. */\n observability?: ObservabilityOptions\n /** Observes runtime failures without changing their outcome. */\n onError?: SixbErrorHandler\n /** Recovery and retention settings. The runtime constructor never starts maintenance timers. */\n ontologyMaintenance?: OntologyMaintenanceOptions\n ontologies?: readonly OntologySource[]\n actions?: readonly ActionDefinition[]\n /** Models this project allows Sixb to use. The first of each kind is the default. */\n models?: ModelCatalogInput\n /** Project tools available to Agent runtimes. */\n tools?: readonly AgentToolDefinition[]\n datasets?: readonly DatasetDefinition[]\n /** Connector definitions to register in addition to auto-discovered `connectors/` exports. */\n connectors?: readonly ConnectorDefinition[]\n /** Required to protect OAuth credentials when connector connection storage is durable. */\n connectorConnections?: ConnectorConnectionOptions\n schedules?: readonly ScheduleDefinition[]\n syncs?: readonly SyncDefinition[]\n pipelines?: readonly PipelineDefinition[]\n projections?: readonly ProjectionDefinition[]\n rules?: readonly RuleDefinition[]\n workflows?: readonly WorkflowDefinition[]\n groups?: readonly GroupDefinition[]\n roles?: readonly RoleDefinition[]\n membershipPolicies?: readonly MembershipPolicyDefinition[]\n /** Share definitions to register in addition to auto-discovered `shares/` exports. */\n shares?: readonly ShareDefinition[]\n auth?: SixbAuthConfig\n projectRoot?: string\n}\n\n/**\n * Create a SixbHost using convention-based discovery.\n *\n * The host auto-discovers exported definitions from `ontology/`, `actions/`, `datasets/`,\n * `connectors/`, `syncs/`, `schedules/`, `pipelines/`, `projections/`,\n * `rules/`, `workflows/`, `shares/`, and `security/{groups,roles,policies}/`\n * relative to `projectRoot`.\n */\nexport async function createSixb(\n options: CreateSixbOptions\n): Promise<SixbHost<readonly OntologySource[]>> {\n assertNoAgentDefinitions(options)\n const projectRoot = resolve(options.projectRoot ?? process.cwd())\n\n const discoveredOntology = await discoverOntologySources(projectRoot)\n const allSources = [...(options.ontologies ?? []), ...discoveredOntology]\n\n if (allSources.length === 0) {\n throw new RuntimeError(\n \"No ontology found. Create an 'ontology/' folder or pass 'ontologies' to createSixb().\"\n )\n }\n\n const definitions = await discoverProjectDefinitions(projectRoot)\n\n // Explicit definitions come first so local setup can override ordering while duplicate ids are\n // still rejected by the SixbHost constructor. Every family merges — `actions` and `projections`\n // used to *replace* discovery instead, silently and undocumented.\n return new SixbHost<readonly OntologySource[]>({\n id: options.id,\n ontology: allSources,\n broker: options.broker,\n storage: options.storage,\n lakeStorage: options.lakeStorage,\n blobStorage: options.blobStorage,\n queues: options.queues,\n sandboxes: options.sandboxes,\n logger: options.logger,\n observability: options.observability,\n onError: options.onError,\n ontologyMaintenance: options.ontologyMaintenance,\n projectRoot,\n actions: [...(options.actions ?? []), ...definitions.actions],\n datasets: [...(options.datasets ?? []), ...definitions.datasets],\n connectors: [...(options.connectors ?? []), ...definitions.connectors],\n connectorConnections: options.connectorConnections,\n schedules: [...(options.schedules ?? []), ...definitions.schedules],\n syncs: [...(options.syncs ?? []), ...definitions.syncs],\n pipelines: [...(options.pipelines ?? []), ...definitions.pipelines],\n projections: [...(options.projections ?? []), ...definitions.projections],\n rules: [...(options.rules ?? []), ...definitions.rules],\n workflows: [...(options.workflows ?? []), ...definitions.workflows],\n groups: [...(options.groups ?? []), ...definitions.groups],\n roles: [...(options.roles ?? []), ...definitions.roles],\n membershipPolicies: [...(options.membershipPolicies ?? []), ...definitions.membershipPolicies],\n models: options.models,\n tools: options.tools,\n shares: [...(options.shares ?? []), ...definitions.shares],\n auth: options.auth,\n })\n}\n",
|
|
11
|
+
"/**\n * SixbHost is the configured composition root.\n *\n * It owns providers, registered definitions, and process lifecycle. Domain operations live on a\n * {@link Sixb} SDK bound to one execution through {@link SixbHost.withScope}.\n */\n\nimport { resolve } from \"node:path\"\nimport type { ActionDefinition } from \"../actions/types\"\nimport type { AgentToolDefinition } from \"../agents\"\nimport {\n AuthRuntime,\n AuthRuntimeError,\n isMagicLinkAuthStrategy,\n isOidcAuthStrategy,\n type SixbAuthConfig,\n} from \"../auth\"\nimport type { BlobStorage } from \"../blob-storage\"\nimport type { Broker } from \"../broker\"\nimport { registerConnectorConnectionCallbackProcess } from \"../connectors/connections/capability\"\nimport { createConnectorCredentialProtectorFromKey } from \"../connectors/credentials\"\nimport { ConnectorService } from \"../connectors/service\"\nimport {\n type ConnectorConnectionOptions,\n type ConnectorDefinition,\n isOAuthConnectorDefinition,\n} from \"../connectors/types\"\nimport type { DatasetDefinition } from \"../datasets/types\"\nimport { attachSixbErrorReporter, shareSixbErrorReporter } from \"../error-reporting/capability\"\nimport { reportEventDeliveryFailure } from \"../error-reporting/reports\"\nimport type { SixbErrorHandler } from \"../error-reporting/types\"\nimport {\n createDomainEventService,\n type DomainEventLog,\n type DomainEventService,\n OntologyOutboxDispatcher,\n} from \"../events\"\nimport {\n captureExecutionScope,\n resolveExecutionScopeAuthorization,\n} from \"../execution/authorization\"\nimport { createAuthorizedObjectReader } from \"../execution/authorized-object-reader\"\nimport type { ExecutionScope } from \"../execution/types\"\nimport type { LakeStorage } from \"../lake-storage\"\nimport type { LoggerProvider } from \"../logging\"\nimport { LoggingService, type ObservabilityOptions } from \"../logging/service\"\nimport {\n OntologyMaintenance,\n type OntologyMaintenanceHandle,\n type OntologyMaintenanceOptions,\n type OntologyOperationalStatus,\n type SixbReadiness,\n} from \"../maintenance\"\nimport { createOntologyMaterializer, type OntologyMaterializerContract } from \"../materializer\"\nimport type { ModelCatalogInput } from \"../models\"\nimport type { PipelineDefinition } from \"../pipelines/types\"\nimport { registerProjectionRegistry } from \"../projections/internal\"\nimport type { ProjectionDefinition } from \"../projections/types\"\nimport type { Queues } from \"../queues\"\nimport type { RuleDefinition } from \"../rules\"\nimport type { SandboxFactory } from \"../sandboxes\"\nimport { type SchedulerController, SchedulerRuntime } from \"../scheduler\"\nimport type { ScheduleDefinition } from \"../schedules\"\nimport type {\n GroupDefinition,\n MembershipPolicyDefinition,\n RoleDefinition,\n SecurityDefinitionCatalog,\n} from \"../security\"\nimport type { ShareDefinition } from \"../shares\"\nimport type { Storage } from \"../storage\"\nimport type { SyncDefinition } from \"../syncs\"\nimport type { RegisteredWebhook } from \"../webhooks\"\nimport { WebhookRegistry, WebhookValidationError } from \"../webhooks\"\nimport type { WorkflowDefinition } from \"../workflows\"\nimport type { SixbDefinitions } from \"./definitions\"\nimport {\n createOntologyMutationRuntime,\n registerOntologyMutationRuntime,\n} from \"./ontology-mutations\"\nimport { resolveDefinitions } from \"./resolve-definitions\"\nimport { createBoundSixb, type Sixb, type SixbDependencies } from \"./sixb\"\nimport { StorageReadiness } from \"./storage-readiness\"\nimport type { OntologySource, SixbHostContext, SixbRuntimeContext } from \"./types\"\n\nexport interface SixbHostOptions<TOntologySources extends readonly OntologySource[]> {\n id?: string\n ontology: TOntologySources\n broker: Broker\n storage: Storage\n lakeStorage: LakeStorage\n blobStorage: BlobStorage\n queues: Queues\n sandboxes?: SandboxFactory\n /** Optional process-level output provider. Omit for broker-only logging. */\n logger?: LoggerProvider\n /** Broker capture controls, independent from the output provider. */\n observability?: ObservabilityOptions\n /** Observes runtime failures without changing their outcome. */\n onError?: SixbErrorHandler\n /** Recovery and retention settings. The runtime constructor never starts maintenance timers. */\n ontologyMaintenance?: OntologyMaintenanceOptions\n projectRoot?: string\n actions?: readonly ActionDefinition[]\n datasets?: readonly DatasetDefinition[]\n /** Connector definitions registered with this host. */\n connectors?: readonly ConnectorDefinition[]\n /** Persistent connector connection settings. Required for OAuth with durable storage. */\n connectorConnections?: ConnectorConnectionOptions\n schedules?: readonly ScheduleDefinition[]\n syncs?: readonly SyncDefinition[]\n pipelines?: readonly PipelineDefinition[]\n projections?: readonly ProjectionDefinition[]\n rules?: readonly RuleDefinition[]\n workflows?: readonly WorkflowDefinition[]\n models?: ModelCatalogInput\n /** Project tools available to Agent runtimes. */\n tools?: readonly AgentToolDefinition[]\n groups?: readonly GroupDefinition[]\n roles?: readonly RoleDefinition[]\n membershipPolicies?: readonly MembershipPolicyDefinition[]\n shares?: readonly ShareDefinition[]\n auth?: SixbAuthConfig\n}\n\nexport class SixbHost<\n TOntologySources extends readonly OntologySource[] = readonly OntologySource[],\n> {\n readonly projectId: string\n private readonly webhookRegistry: WebhookRegistry\n private readonly hostContext: SixbHostContext\n private readonly committedFacts: OntologyOutboxDispatcher\n private readonly eventService: DomainEventService\n private readonly ontologyMaintenance: OntologyMaintenance\n private readonly storageReadiness: StorageReadiness\n private readonly connectorService: ConnectorService\n private readonly materializer: OntologyMaterializerContract\n readonly definitions: SixbDefinitions\n readonly broker: Broker\n readonly events: DomainEventLog\n readonly logging: LoggingService\n readonly storage: Storage\n readonly lakeStorage: LakeStorage\n readonly blobStorage: BlobStorage\n readonly queues: Queues\n readonly sandboxes?: SandboxFactory\n readonly projectRoot: string\n readonly scheduler: SchedulerController\n readonly auth: AuthRuntime\n\n constructor(options: SixbHostOptions<TOntologySources>) {\n const errorReporter = attachSixbErrorReporter(this, options.onError)\n this.projectId = options.id ?? \"default\"\n this.broker = options.broker\n this.eventService = createDomainEventService({\n projectId: this.projectId,\n broker: this.broker,\n errorReporter,\n })\n this.events = this.eventService\n this.logging = new LoggingService({\n projectId: this.projectId,\n broker: this.broker,\n logger: options.logger,\n observability: options.observability?.logs,\n })\n this.storage = options.storage\n this.storageReadiness = new StorageReadiness(this.storage)\n this.lakeStorage = options.lakeStorage\n this.blobStorage = options.blobStorage\n this.queues = options.queues\n this.sandboxes = options.sandboxes\n this.projectRoot = resolve(options.projectRoot ?? process.cwd())\n\n const definitions = resolveDefinitions(options)\n this.definitions = definitions\n registerProjectionRegistry(this, definitions.projections)\n\n this.auth = new AuthRuntime({\n projectId: this.projectId,\n storage: this.storage,\n security: definitions.security,\n config: options.auth,\n })\n validateAuthStrategySecurityReferences(this.auth.getStrategy(), definitions.security)\n const connectors = definitions.connectors.list()\n const hasOAuthConnectors = connectors.some(isOAuthConnectorDefinition)\n const credentialProtector =\n hasOAuthConnectors && options.connectorConnections?.encryptionKey !== undefined\n ? createConnectorCredentialProtectorFromKey(options.connectorConnections.encryptionKey)\n : undefined\n this.connectorService = new ConnectorService(this.projectId, connectors, {\n storage: this.storage,\n credentialProtector,\n })\n if (this.connectorService.connectionProcess) {\n registerConnectorConnectionCallbackProcess(\n this,\n this.connectorService.connectionProcess.callbackProcess\n )\n }\n assertWebhookRunStorage(connectors, this.storage)\n this.webhookRegistry = new WebhookRegistry({ connectors })\n\n this.materializer = createOntologyMaterializer({\n projectId: this.projectId,\n ontology: definitions.ontology,\n projections: definitions.projections,\n storage: this.storage,\n })\n this.committedFacts = new OntologyOutboxDispatcher({\n projectId: this.projectId,\n storage: this.storage,\n events: this.eventService,\n onDeliveryFailure: (error, failure) =>\n reportEventDeliveryFailure(errorReporter, error, {\n projectId: this.projectId,\n ...failure,\n }),\n })\n this.ontologyMaintenance = new OntologyMaintenance({\n projectId: this.projectId,\n storage: this.storage,\n dispatcher: this.committedFacts,\n options: options.ontologyMaintenance,\n })\n\n this.hostContext = {\n projectId: this.projectId,\n broker: this.broker,\n ontology: definitions.ontology,\n actionRegistry: definitions.actions,\n events: this.events,\n storage: this.storage,\n queues: this.queues,\n }\n registerProjectionRegistry(this.hostContext, definitions.projections)\n shareSixbErrorReporter(this, this.hostContext)\n this.scheduler = new SchedulerRuntime({\n schedules: definitions.schedules.list(),\n events: this.eventService,\n })\n }\n\n /** Bind an existing opaque scope. This method never creates or escalates authority. */\n withScope(scope: ExecutionScope): Sixb<TOntologySources> {\n const capturedScope = captureExecutionScope(scope)\n const authorization = resolveExecutionScopeAuthorization(this.projectId, capturedScope)\n if (authorization.type === \"unrestricted\" && authorization.ref.type === \"kernel\") {\n throw new Error(\"[Sixb] Kernel authority cannot be bound to the domain SDK.\")\n }\n\n const objectReader = createAuthorizedObjectReader({\n scope: capturedScope,\n ontology: this.hostContext.ontology,\n objectStorage: this.storage.objects,\n })\n\n const runtime: SixbRuntimeContext = {\n ...this.hostContext,\n runtimeAuthorization: capturedScope.authorization,\n objectReader,\n ...(authorization.type === \"principal\" ? { authorization: authorization.context } : {}),\n }\n registerOntologyMutationRuntime(\n runtime,\n createOntologyMutationRuntime({\n materializer: this.materializer.withScope(capturedScope),\n notifyCommittedFacts: () => this.committedFacts.notify(),\n })\n )\n return createBoundSixb<TOntologySources>(\n runtime,\n this.sixbDependencies(),\n capturedScope.execution\n )\n }\n\n get id(): string {\n return this.projectId\n }\n\n /** All webhook endpoints registered through connector adapters. */\n listWebhooks(): readonly RegisteredWebhook[] {\n return this.webhookRegistry.list()\n }\n\n /** Lookup a registered connector webhook by connector id and webhook id. */\n getWebhookById(connectorId: string, webhookId: string): RegisteredWebhook | null {\n return this.webhookRegistry.getById(connectorId, webhookId)\n }\n\n /** Start the API-owned recovery and retention loop. Embedded runtimes opt in explicitly. */\n startOntologyMaintenance(): Promise<OntologyMaintenanceHandle> {\n this.storageReadiness.startSchemaValidation()\n return this.ontologyMaintenance.start()\n }\n\n getOntologyOperationalStatus(): OntologyOperationalStatus {\n return this.ontologyMaintenance.getOperationalStatus()\n }\n\n async checkReadiness(): Promise<SixbReadiness> {\n return this.storageReadiness.check()\n }\n\n /** Flush and close the configured process logger provider. */\n async closeLogger(): Promise<void> {\n await this.logging.close()\n }\n\n /** Disconnect every lazily created connector client. */\n async closeConnectors(): Promise<void> {\n await this.connectorService.close()\n }\n\n /** Close blob-provider resources owned by this host. */\n async closeBlobs(): Promise<void> {\n await this.blobStorage.close?.()\n }\n\n /** Close the runtime broker provider if it owns external resources. */\n async closeBroker(): Promise<void> {\n await this.committedFacts.stop()\n await this.ontologyMaintenance.stop()\n await this.broker.close?.()\n }\n\n private sixbDependencies(): SixbDependencies {\n return {\n definitions: this.definitions,\n logging: this.logging,\n connectorService: this.connectorService,\n ...(this.connectorService.connectionProcess === undefined\n ? {}\n : { connectorConnections: this.connectorService.connectionProcess }),\n blobStorage: this.blobStorage,\n lakeStorage: this.lakeStorage,\n }\n }\n}\n\n/**\n * Ontology-agnostic host view for infrastructure that only composes providers and execution\n * boundaries. Authoring code should retain {@link SixbHost}'s inferred ontology parameter; CLI,\n * server, and worker infrastructure deliberately do not depend on it.\n */\nexport type SixbHostView = Omit<SixbHost, \"withScope\"> & {\n withScope(scope: ExecutionScope): object\n}\n\nfunction validateAuthStrategySecurityReferences(\n strategy: ReturnType<AuthRuntime[\"getStrategy\"]>,\n security: SecurityDefinitionCatalog\n): void {\n if (!isMagicLinkAuthStrategy(strategy) && !isOidcAuthStrategy(strategy)) {\n return\n }\n\n for (const groupId of strategy.bootstrapGroupIds ?? []) {\n if (!security.getGroupById(groupId)) {\n throw new AuthRuntimeError(\n \"invalid_auth_config\",\n `[Sixb] Auth bootstrapGroups references unknown group '${groupId}'. Add it to 'security/groups/' or pass it to createSixb({ groups }).`\n )\n }\n }\n}\n\nfunction assertWebhookRunStorage(\n connectors: readonly ConnectorDefinition[],\n storage: Storage\n): void {\n if (storage.webhookRuns !== undefined) {\n return\n }\n\n for (const connector of connectors) {\n const webhooks = connector.adapter.webhooks\n if (Array.isArray(webhooks) && webhooks.length > 0) {\n throw new WebhookValidationError(\n \"[Sixb] Webhooks require storage.webhookRuns to be configured.\"\n )\n }\n }\n}\n",
|
|
12
|
+
"import { createCipheriv, createDecipheriv, randomBytes } from \"node:crypto\"\nimport { createConnectorCodedError } from \"./errors\"\n\nexport type ConnectorCredentialPurpose = \"oauth-authorization\" | \"pkce-verifier\"\n\n/** Immutable identity authenticated alongside one sealed connector credential. */\nexport interface ConnectorCredentialContext {\n readonly projectId: string\n readonly connectorId: string\n readonly recordId: string\n readonly purpose: ConnectorCredentialPurpose\n}\n\n/** Versioned AEAD envelope safe to persist. */\nexport interface SealedConnectorCredential {\n readonly version: 1\n readonly algorithm: \"A256GCM\"\n readonly nonce: string\n readonly ciphertext: string\n readonly tag: string\n}\n\n/** Pluggable at-rest protection for connector OAuth credentials and transient PKCE secrets. */\nexport interface ConnectorCredentialProtector {\n seal(\n plaintext: Uint8Array,\n context: ConnectorCredentialContext\n ): Promise<SealedConnectorCredential>\n open(\n envelope: SealedConnectorCredential,\n context: ConnectorCredentialContext\n ): Promise<Uint8Array>\n}\n\n/** Create credential protection from the base64url key exposed by Sixb configuration. */\nexport function createConnectorCredentialProtectorFromKey(\n encodedKey: string\n): ConnectorCredentialProtector {\n let key: Buffer\n try {\n key = decodeBase64Url(encodedKey)\n } catch (error) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n \"connectorConnections.encryptionKey must be canonical base64url encoding.\",\n { cause: error }\n )\n }\n if (key.byteLength !== 32) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n \"connectorConnections.encryptionKey must encode exactly 32 random bytes.\"\n )\n }\n return createAesGcmConnectorCredentialProtector(key)\n}\n\nfunction createAesGcmConnectorCredentialProtector(\n encryptionKey: Uint8Array\n): ConnectorCredentialProtector {\n if (encryptionKey.byteLength !== 32) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n \"Connector credential encryption key must contain exactly 32 bytes.\"\n )\n }\n const key = Buffer.from(encryptionKey)\n\n return {\n async seal(plaintext, context) {\n assertCredentialContext(context)\n const nonce = randomBytes(12)\n const cipher = createCipheriv(\"aes-256-gcm\", key, nonce)\n cipher.setAAD(credentialAad(context))\n const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()])\n return {\n version: 1,\n algorithm: \"A256GCM\",\n nonce: nonce.toString(\"base64url\"),\n ciphertext: ciphertext.toString(\"base64url\"),\n tag: cipher.getAuthTag().toString(\"base64url\"),\n }\n },\n async open(envelope, context) {\n assertCredentialContext(context)\n if (envelope.version !== 1 || envelope.algorithm !== \"A256GCM\") {\n throw createConnectorCodedError(\n \"connector.credentials_unavailable\",\n \"Connector credential envelope format is not supported.\"\n )\n }\n try {\n const nonce = decodeBase64Url(envelope.nonce)\n const ciphertext = decodeBase64Url(envelope.ciphertext)\n const tag = decodeBase64Url(envelope.tag)\n if (nonce.byteLength !== 12 || tag.byteLength !== 16) throw new Error(\"invalid envelope\")\n const decipher = createDecipheriv(\"aes-256-gcm\", key, nonce)\n decipher.setAAD(credentialAad(context))\n decipher.setAuthTag(tag)\n return Buffer.concat([decipher.update(ciphertext), decipher.final()])\n } catch (error) {\n throw createConnectorCodedError(\n \"connector.credentials_unavailable\",\n \"Connector credential envelope authentication failed.\",\n { cause: error }\n )\n }\n },\n }\n}\n\nfunction decodeBase64Url(value: string): Buffer {\n if (!/^[A-Za-z0-9_-]*$/.test(value)) throw new Error(\"invalid base64url\")\n const decoded = Buffer.from(value, \"base64url\")\n if (decoded.toString(\"base64url\") !== value) throw new Error(\"non-canonical base64url\")\n return decoded\n}\n\nexport function createEphemeralConnectorCredentialProtector(): ConnectorCredentialProtector {\n return createAesGcmConnectorCredentialProtector(randomBytes(32))\n}\n\nfunction credentialAad(context: ConnectorCredentialContext): Buffer {\n return Buffer.from(\n JSON.stringify({\n version: 1,\n projectId: context.projectId,\n connectorId: context.connectorId,\n recordId: context.recordId,\n purpose: context.purpose,\n })\n )\n}\n\nfunction assertCredentialContext(context: ConnectorCredentialContext): void {\n assertNonblank(context.projectId, \"context projectId\")\n assertNonblank(context.connectorId, \"context connectorId\")\n assertNonblank(context.recordId, \"context recordId\")\n}\n\nfunction assertNonblank(value: string, field: string): string {\n if (!value.trim()) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n `Connector credential ${field} must not be empty.`\n )\n }\n return value\n}\n",
|
|
13
|
+
"import { randomUUID } from \"node:crypto\"\nimport { isSixbError } from \"../../errors/internal\"\nimport type {\n ConnectorConnectionRecord,\n ConnectorConnectionStorage,\n PutConnectorConnectionResult,\n Storage,\n} from \"../../storage\"\nimport {\n type ConnectorCredentialProtector,\n createEphemeralConnectorCredentialProtector,\n} from \"../credentials\"\nimport {\n createConnectorCodedError,\n isConnectorStorageError,\n providerBoundaryError,\n providerFailureCode,\n storageBoundaryError,\n} from \"../errors\"\nimport type {\n ConnectorClient,\n ConnectorConnectionSelector,\n ConnectorDefinition,\n OAuthConnectorAdapter,\n} from \"../types\"\nimport { isOAuthConnectorDefinition } from \"../types\"\nimport {\n assertConnectorAuthorizationActor,\n DefaultConnectorAuthorizationLifecycle,\n} from \"./authorizations\"\nimport { requireConnectorConnectionCommandActor } from \"./command-context\"\nimport type {\n AddConnectorConnectionInput,\n CompleteConnectorAuthorizationInput,\n CompleteConnectorAuthorizationResult,\n CompleteConnectorConnectionRunInput,\n CompleteConnectorConnectionRunResult,\n ConnectorConnectionCallbackProcess,\n ConnectorConnectionCommandContext,\n ConnectorConnectionProcess,\n ConnectorConnectionRunView,\n ConnectorConnectionView,\n RevokeConnectorAuthorizationResult,\n SelectConnectorAccountInput,\n SelectConnectorConnectionRunAccountInput,\n StartConnectorAuthorizationInput,\n StartConnectorAuthorizationResult,\n StartConnectorConnectionRunInput,\n StartConnectorConnectionRunResult,\n} from \"./contracts\"\nimport { connectorAuthorizationStatusError } from \"./credential-mutations\"\nimport { runBoundedConnectorProviderOperation } from \"./provider-operation\"\nimport { ConnectorAuthorizationRequestHandler } from \"./request\"\nimport { ConnectorConnectionRunService } from \"./runs\"\nimport { withConnectorStorageBoundary } from \"./storage-boundary\"\nimport { nonblank, positiveDuration } from \"./validation\"\nimport { assertConnectorConnectionSelector, connectorConnectionView } from \"./views\"\n\nconst DEFAULT_ATTEMPT_TTL_MS = 10 * 60_000\nconst DEFAULT_SELECTION_TTL_MS = 15 * 60_000\nconst DEFAULT_CREDENTIAL_MUTATION_LEASE_MS = 30_000\nconst DEFAULT_PROVIDER_OPERATION_TIMEOUT_MS = 2 * 60_000\nconst DEFAULT_REFRESH_SKEW_MS = 60_000\n\nexport interface ConnectorConnectionServiceOptions {\n readonly storage?: Storage\n readonly credentialProtector?: ConnectorCredentialProtector\n readonly authorizationAttemptTtlMs?: number\n readonly accountSelectionTtlMs?: number\n readonly credentialMutationLeaseMs?: number\n readonly providerOperationTimeoutMs?: number\n readonly connectionRunProcessingTtlMs?: number\n readonly refreshSkewMs?: number\n readonly now?: () => Date\n}\n\n/** Process-owned composition of connector connection lookup and OAuth lifecycle state. */\nexport class ConnectorConnectionService implements ConnectorConnectionProcess {\n private readonly definitionsById: ReadonlyMap<string, ConnectorDefinition>\n private abortController = new AbortController()\n private readonly connectionStorage: ConnectorConnectionStorage\n private readonly providerOperationTimeoutMs: number\n private readonly authorizations: DefaultConnectorAuthorizationLifecycle\n private readonly requests: ConnectorAuthorizationRequestHandler\n private readonly runs: ConnectorConnectionRunService\n readonly callbackProcess: ConnectorConnectionCallbackProcess\n\n constructor(\n private readonly projectId: string,\n definitions: readonly ConnectorDefinition[],\n options: ConnectorConnectionServiceOptions = {}\n ) {\n this.definitionsById = new Map(definitions.map((definition) => [definition.id, definition]))\n const storage = requireConnectionStorage(options.storage)\n this.connectionStorage = storage.connectorConnections\n const credentialProtector = credentialProtectorFor(storage.connectorConnections, options)\n const resolveDefinition = (connectorId: string) => this.requireOAuthDefinition(connectorId)\n const hostSignal = () => this.abortController.signal\n const now = options.now ?? (() => new Date())\n const accountSelectionTtlMs = options.accountSelectionTtlMs ?? DEFAULT_SELECTION_TTL_MS\n const providerOperationTimeoutMs = positiveDuration(\n options.providerOperationTimeoutMs ?? DEFAULT_PROVIDER_OPERATION_TIMEOUT_MS,\n \"provider operation timeout\"\n )\n this.providerOperationTimeoutMs = providerOperationTimeoutMs\n\n this.authorizations = new DefaultConnectorAuthorizationLifecycle({\n projectId,\n storage: storage.connectorConnections,\n credentialProtector,\n resolveDefinition,\n hostSignal,\n accountSelectionTtlMs,\n credentialMutationLeaseMs:\n options.credentialMutationLeaseMs ?? DEFAULT_CREDENTIAL_MUTATION_LEASE_MS,\n providerOperationTimeoutMs,\n refreshSkewMs: options.refreshSkewMs ?? DEFAULT_REFRESH_SKEW_MS,\n now,\n })\n this.requests = new ConnectorAuthorizationRequestHandler({\n projectId,\n storage: storage.root,\n credentialProtector,\n authorizationAttemptTtlMs: options.authorizationAttemptTtlMs ?? DEFAULT_ATTEMPT_TTL_MS,\n providerOperationTimeoutMs,\n resolveDefinition,\n lifecycle: this.authorizations,\n hostSignal,\n })\n this.runs = new ConnectorConnectionRunService({\n projectId,\n storage: storage.root,\n requestHandler: this.requests,\n authorizations: this.authorizations,\n resolveDefinition,\n processingTtlMs:\n options.connectionRunProcessingTtlMs ?? providerOperationTimeoutMs * 2 + 30_000,\n selectionTtlMs: accountSelectionTtlMs,\n now,\n })\n this.callbackProcess = Object.freeze({\n completeConnectionRun: (input: CompleteConnectorConnectionRunInput) =>\n this.completeConnectionRun(input),\n })\n }\n\n async connectConnection<TAdapter extends OAuthConnectorAdapter>(\n definition: ConnectorDefinition<string, TAdapter>,\n selector: ConnectorConnectionSelector\n ): Promise<ConnectorClient<TAdapter>> {\n this.assertOAuthRegistered(definition)\n assertConnectorConnectionSelector(selector)\n const connection = await withConnectorStorageBoundary(\n \"Connector connection could not be read.\",\n () =>\n this.connectionStorage.getConnection({\n projectId: this.projectId,\n connectorId: definition.id,\n ...selector,\n })\n )\n if (!connection) {\n throw createConnectorCodedError(\n \"connector.not_found\",\n `Connector '${definition.id}' has no connection for project slot '${selector.slot}'.`\n )\n }\n\n return this.connectExecutionConnection(definition, connection)\n }\n\n /** Snapshot the connected records that one trusted primitive execution may consume. */\n async listExecutionConnections<TAdapter extends OAuthConnectorAdapter>(\n definition: ConnectorDefinition<string, TAdapter>\n ): Promise<readonly ConnectorConnectionRecord[]> {\n this.assertOAuthRegistered(definition)\n const connections = await withConnectorStorageBoundary(\n \"Connector connections could not be listed.\",\n () =>\n this.connectionStorage.listConnections({\n projectId: this.projectId,\n connectorId: definition.id,\n })\n )\n return connections\n .filter((connection) => connection.status === \"connected\")\n .sort((left, right) => left.id.localeCompare(right.id))\n }\n\n /** Resolve a client from an immutable connection snapshot captured for one execution. */\n async connectExecutionConnection<TAdapter extends OAuthConnectorAdapter>(\n definition: ConnectorDefinition<string, TAdapter>,\n connection: ConnectorConnectionRecord,\n signal: AbortSignal = this.abortController.signal\n ): Promise<ConnectorClient<TAdapter>> {\n this.assertOAuthRegistered(definition)\n if (\n connection.projectId !== this.projectId ||\n connection.connectorId !== definition.id ||\n connection.status !== \"connected\"\n ) {\n throw createConnectorCodedError(\n \"connector.not_found\",\n `Connector '${definition.id}' connection '${connection.id}' is not active in this project.`\n )\n }\n\n const authorization = await this.authorizations.requireStableActiveAuthorization(\n definition,\n connection.authorizationId\n )\n const hostSignal = this.abortController.signal\n const operationSignal =\n signal === hostSignal ? hostSignal : AbortSignal.any([hostSignal, signal])\n try {\n return (await runBoundedConnectorProviderOperation(\n {\n hostSignal: operationSignal,\n timeoutMs: this.providerOperationTimeoutMs,\n },\n (providerSignal) => {\n const clientSignal = AbortSignal.any([operationSignal, providerSignal])\n return definition.adapter.connect({\n projectId: this.projectId,\n connectorId: definition.id,\n connectionId: connection.id,\n account: connection.account,\n tokenSource: this.authorizations.createTokenSource(definition, authorization.id),\n signal: clientSignal,\n })\n },\n () => connectorClientInterruptionError(operationSignal)\n )) as ConnectorClient<TAdapter>\n } catch (error) {\n if (operationSignal.aborted) throw error\n throw providerBoundaryError(\n error,\n providerFailureCode(error),\n \"Connector connection client creation failed.\"\n )\n }\n }\n\n async listConnections(\n command: ConnectorConnectionCommandContext,\n connectorId: string\n ): Promise<readonly ConnectorConnectionView[]> {\n const definition = this.requireOAuthDefinition(connectorId)\n requireConnectorConnectionCommandActor(command.execution, this.projectId)\n let connections: readonly ConnectorConnectionRecord[]\n try {\n connections = await this.connectionStorage.listConnections({\n projectId: this.projectId,\n connectorId: definition.id,\n })\n } catch (error) {\n throw storageBoundaryError(error, \"Connector connections could not be listed.\")\n }\n return withConnectorStorageBoundary(\"Connector authorizations could not be read.\", () =>\n Promise.all(\n connections.map(async (connection) => {\n const authorization = await this.connectionStorage.getAuthorization({\n projectId: this.projectId,\n connectorId: definition.id,\n authorizationId: connection.authorizationId,\n })\n if (!authorization) {\n throw createConnectorCodedError(\n \"internal.unexpected\",\n \"Connector connection references an unavailable authorization.\"\n )\n }\n return connectorConnectionView(connection, authorization.status)\n })\n )\n )\n }\n\n startConnectionRun(\n command: ConnectorConnectionCommandContext,\n connectorId: string,\n input: StartConnectorConnectionRunInput\n ): Promise<StartConnectorConnectionRunResult> {\n return this.runs.start(command, connectorId, input)\n }\n\n async addConnection(\n command: ConnectorConnectionCommandContext,\n connectorId: string,\n input: AddConnectorConnectionInput\n ): Promise<ConnectorConnectionRunView> {\n const definition = this.requireOAuthDefinition(connectorId)\n const actor = requireConnectorConnectionCommandActor(command.execution, this.projectId)\n assertConnectorConnectionSelector(input)\n const source = await withConnectorStorageBoundary(\n \"Source connector connection could not be read.\",\n () =>\n this.connectionStorage.getConnectionById({\n projectId: this.projectId,\n connectorId: definition.id,\n connectionId: nonblank(input.fromConnectionId, \"source connection id\"),\n })\n )\n if (!source) {\n throw createConnectorCodedError(\"connector.not_found\", \"Source connection was not found.\")\n }\n if (source.status !== \"connected\") {\n throw createConnectorCodedError(\n \"connector.authorization_required\",\n \"Source connection is disconnected.\"\n )\n }\n const authorization = await this.authorizations.requireStableActiveAuthorization(\n definition,\n source.authorizationId\n )\n assertConnectorAuthorizationActor(authorization, actor.principal)\n return this.runs.startSelection(command, definition.id, {\n owner: input.owner,\n slot: input.slot,\n authorizationId: authorization.id,\n })\n }\n\n getConnectionRun(\n command: ConnectorConnectionCommandContext,\n connectorId: string,\n runId: string\n ): Promise<ConnectorConnectionRunView | null> {\n this.requireOAuthDefinition(connectorId)\n return this.runs.get(command, connectorId, runId)\n }\n\n selectConnectionRunAccount(\n command: ConnectorConnectionCommandContext,\n connectorId: string,\n input: SelectConnectorConnectionRunAccountInput\n ): Promise<ConnectorConnectionRunView> {\n return this.runs.selectAccount(command, connectorId, input)\n }\n\n async startReauthorization(\n command: ConnectorConnectionCommandContext,\n connectorId: string,\n connectionId: string,\n input: Pick<StartConnectorConnectionRunInput, \"redirectUri\" | \"returnTo\">\n ): Promise<StartConnectorConnectionRunResult> {\n const definition = this.requireOAuthDefinition(connectorId)\n requireConnectorConnectionCommandActor(command.execution, this.projectId)\n const connection = await withConnectorStorageBoundary(\n \"Connector connection could not be read.\",\n () =>\n this.connectionStorage.getConnectionById({\n projectId: this.projectId,\n connectorId: definition.id,\n connectionId: nonblank(connectionId, \"connection id\"),\n })\n )\n if (!connection) {\n throw createConnectorCodedError(\"connector.not_found\", \"Connector connection was not found.\")\n }\n if (connection.status !== \"connected\") {\n throw createConnectorCodedError(\n \"connector.authorization_required\",\n \"Disconnected connector connections cannot be reauthorized; start a new connection.\"\n )\n }\n return this.runs.start(command, definition.id, {\n owner: connection.owner,\n slot: connection.slot,\n redirectUri: input.redirectUri,\n returnTo: input.returnTo,\n reauthorizationId: connection.authorizationId,\n })\n }\n\n async revokeConnection(\n command: ConnectorConnectionCommandContext,\n connectorId: string,\n connectionId: string\n ): Promise<RevokeConnectorAuthorizationResult> {\n const definition = this.requireOAuthDefinition(connectorId)\n requireConnectorConnectionCommandActor(command.execution, this.projectId)\n const authorization = await withConnectorStorageBoundary(\n \"Connector authorization could not be resolved from its connection.\",\n () =>\n this.connectionStorage.getAuthorizationByConnectionId({\n projectId: this.projectId,\n connectorId: definition.id,\n connectionId: nonblank(connectionId, \"connection id\"),\n })\n )\n if (!authorization) {\n throw createConnectorCodedError(\"connector.not_found\", \"Connector connection was not found.\")\n }\n return this.revokeAuthorization(command, definition.id, authorization.id)\n }\n\n completeConnectionRun(\n input: CompleteConnectorConnectionRunInput\n ): Promise<CompleteConnectorConnectionRunResult> {\n return this.runs.complete(input)\n }\n\n startAuthorization(\n command: ConnectorConnectionCommandContext,\n connectorId: string,\n input: StartConnectorAuthorizationInput\n ): Promise<StartConnectorAuthorizationResult> {\n return this.requests.startAuthorization(command, connectorId, input)\n }\n\n completeAuthorization(\n command: ConnectorConnectionCommandContext,\n connectorId: string,\n input: CompleteConnectorAuthorizationInput\n ): Promise<CompleteConnectorAuthorizationResult> {\n return this.requests.completeAuthorization(command, connectorId, input)\n }\n\n async selectAccount(\n command: ConnectorConnectionCommandContext,\n connectorId: string,\n input: SelectConnectorAccountInput\n ): Promise<ConnectorConnectionView> {\n const definition = this.requireOAuthDefinition(connectorId)\n const actor = requireConnectorConnectionCommandActor(command.execution, this.projectId)\n assertConnectorConnectionSelector(input)\n const authorization = await this.authorizations.requireAuthorization(\n definition.id,\n input.authorizationId\n )\n if (authorization.status !== \"pending_selection\" && authorization.status !== \"active\") {\n throw connectorAuthorizationStatusError(authorization.status)\n }\n assertConnectorAuthorizationActor(authorization, actor.principal)\n const account = authorization.accounts.find((candidate) => candidate.id === input.accountId)\n if (!account) {\n throw createConnectorCodedError(\n \"connector.not_found\",\n `Account '${input.accountId}' is not exposed by this connector authorization.`\n )\n }\n\n let result: PutConnectorConnectionResult\n try {\n result = await this.connectionStorage.putConnection({\n id: `ccn_${randomUUID()}`,\n projectId: this.projectId,\n connectorId: definition.id,\n owner: input.owner,\n slot: input.slot,\n authorizationId: authorization.id,\n account,\n replace: input.replace === true,\n })\n } catch (error) {\n if (isConnectorStorageError(error, \"authorization_conflict\")) {\n await this.continueRevocationIfPending(definition, authorization.id)\n throw createConnectorCodedError(\n \"connector.operation_conflict\",\n \"Connector authorization cannot be selected in its current state.\",\n { cause: error }\n )\n }\n if (isConnectorStorageError(error, \"connection_conflict\")) {\n throw createConnectorCodedError(\n \"connector.operation_conflict\",\n \"Connector slot is already occupied; explicit replacement is required.\",\n { cause: error }\n )\n }\n throw storageBoundaryError(error, \"Connector account selection could not be persisted.\")\n }\n if (result.revocationPendingAuthorizationId) {\n await this.continuePendingRevocation(definition, result.revocationPendingAuthorizationId)\n }\n return connectorConnectionView(result.connection, result.authorization.status)\n }\n\n async disconnect(\n command: ConnectorConnectionCommandContext,\n connectorId: string,\n connectionId: string\n ): Promise<ConnectorConnectionView | null> {\n const definition = this.requireOAuthDefinition(connectorId)\n requireConnectorConnectionCommandActor(command.execution, this.projectId)\n const normalizedConnectionId = nonblank(connectionId, \"connection id\")\n try {\n const disconnected = await this.connectionStorage.disconnectConnection({\n projectId: this.projectId,\n connectorId: definition.id,\n connectionId: normalizedConnectionId,\n })\n if (!disconnected) return null\n if (disconnected.revocationPendingAuthorizationId) {\n await this.continuePendingRevocation(\n definition,\n disconnected.revocationPendingAuthorizationId\n )\n }\n return connectorConnectionView(disconnected.connection, disconnected.authorization.status)\n } catch (error) {\n if (isConnectorStorageError(error, \"authorization_conflict\")) {\n throw createConnectorCodedError(\n \"connector.operation_conflict\",\n \"Connector connection cannot be disconnected while its authorization is changing.\",\n { cause: error }\n )\n }\n throw storageBoundaryError(error, \"Connector disconnection could not be persisted.\")\n }\n }\n\n async revokeAuthorization(\n command: ConnectorConnectionCommandContext,\n connectorId: string,\n authorizationId: string\n ): Promise<RevokeConnectorAuthorizationResult> {\n const definition = this.requireOAuthDefinition(connectorId)\n const actor = requireConnectorConnectionCommandActor(command.execution, this.projectId)\n const revoked = await this.authorizations.revokeAuthorization({\n definition,\n authorizationId: nonblank(\n authorizationId,\n \"authorization id\",\n \"connector.authorization_invalid\"\n ),\n principal: actor.principal,\n })\n return {\n affectedConnections: revoked.disconnected.map((connection) =>\n connectorConnectionView(connection, \"revoked\")\n ),\n }\n }\n\n async close(): Promise<void> {\n this.runs.close()\n this.abortController.abort()\n this.abortController = new AbortController()\n }\n\n private assertOAuthRegistered(\n definition: ConnectorDefinition\n ): asserts definition is ConnectorDefinition<string, OAuthConnectorAdapter> {\n const registered = this.requireOAuthDefinition(definition.id)\n if (registered !== definition) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n `Connector '${definition.id}' is not the registered definition instance.`\n )\n }\n }\n\n private requireOAuthDefinition(\n connectorId: string\n ): ConnectorDefinition<string, OAuthConnectorAdapter> {\n const definition = this.definitionsById.get(nonblank(connectorId, \"connector id\"))\n if (!definition) {\n throw createConnectorCodedError(\"connector.not_found\", `Unknown connector '${connectorId}'.`)\n }\n if (!isOAuthConnectorDefinition(definition)) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n `Connector '${connectorId}' does not use OAuth authentication.`\n )\n }\n return definition\n }\n\n private async continueRevocationIfPending(\n definition: ConnectorDefinition<string, OAuthConnectorAdapter>,\n authorizationId: string\n ): Promise<void> {\n const authorization = await this.authorizations.requireAuthorization(\n definition.id,\n authorizationId\n )\n if (authorization.status !== \"revocation_pending\") return\n await this.continuePendingRevocation(definition, authorization.id)\n }\n\n private async continuePendingRevocation(\n definition: ConnectorDefinition<string, OAuthConnectorAdapter>,\n authorizationId: string\n ): Promise<void> {\n try {\n await this.authorizations.continuePendingRevocation(definition, authorizationId)\n } catch (error) {\n if (isSixbError(error) && error.code === \"connector.revocation_pending\") return\n throw error\n }\n }\n}\n\nfunction connectorClientInterruptionError(signal: AbortSignal): Error {\n if (signal.aborted) {\n if (signal.reason instanceof Error) return signal.reason\n const error = new Error(\"[Sixb] Connector client creation was cancelled.\")\n error.name = \"AbortError\"\n return error\n }\n return createConnectorCodedError(\n \"connector.provider_unavailable\",\n \"Connector client creation timed out.\"\n )\n}\n\nfunction requireConnectionStorage(storage: Storage | undefined): {\n readonly root: Storage\n readonly connectorConnections: ConnectorConnectionStorage\n} {\n const connectorConnections = storage?.connectorConnections\n if (!storage || !connectorConnections) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n \"OAuth connectors require storage.connectorConnections to be configured.\"\n )\n }\n if (\n connectorConnections.durability !== \"ephemeral\" &&\n connectorConnections.durability !== \"durable\"\n ) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n \"Connector connection storage must declare 'ephemeral' or 'durable' durability.\"\n )\n }\n return { root: storage, connectorConnections }\n}\n\nfunction credentialProtectorFor(\n storage: ConnectorConnectionStorage,\n options: ConnectorConnectionServiceOptions\n): ConnectorCredentialProtector {\n if (storage.durability === \"durable\" && !options.credentialProtector) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n \"Durable connector connection storage requires connectorConnections.encryptionKey to be configured.\"\n )\n }\n return options.credentialProtector ?? createEphemeralConnectorCredentialProtector()\n}\n",
|
|
14
|
+
"import { randomUUID } from \"node:crypto\"\nimport { AuthorizationError } from \"../../authorization\"\nimport { isSixbError } from \"../../errors/internal\"\nimport type { AuthorizablePrincipal } from \"../../execution\"\nimport type {\n ConnectorAuthorizationRecord,\n ConnectorConnectionRecord,\n ConnectorConnectionStorage,\n} from \"../../storage\"\nimport type { ConnectorCredentialProtector } from \"../credentials\"\nimport {\n createConnectorCodedError,\n oauthErrorKind,\n providerBoundaryError,\n recoverConnectorFailure,\n storageBoundaryError,\n} from \"../errors\"\nimport type {\n ConnectorAccountCandidate,\n ConnectorDefinition,\n ConnectorOAuthCredentials,\n ConnectorTokenSource,\n OAuthConnectorAdapter,\n} from \"../types\"\nimport { ConnectorCredentialCodec } from \"./credential-codec\"\nimport {\n assertCredentialMutationOperationActive,\n ConnectorCredentialMutationCoordinator,\n} from \"./credential-mutations\"\nimport type {\n CompleteConnectorReauthorizationInput,\n CompleteNewConnectorAuthorizationInput,\n ConnectorAuthorizationLifecycle,\n PrepareConnectorReauthorizationInput,\n PreparedConnectorReauthorization,\n} from \"./request\"\nimport { withConnectorStorageBoundary } from \"./storage-boundary\"\nimport { ConnectorTokenAccess } from \"./tokens\"\nimport { positiveDuration, validateAccounts, validateCredentials } from \"./validation\"\n\nexport type OAuthConnectorDefinition = ConnectorDefinition<string, OAuthConnectorAdapter>\n\nexport interface ConnectorAuthorizationLifecycleOptions {\n readonly projectId: string\n readonly storage: ConnectorConnectionStorage\n readonly credentialProtector: ConnectorCredentialProtector\n readonly resolveDefinition: (connectorId: string) => OAuthConnectorDefinition\n readonly hostSignal: () => AbortSignal\n readonly accountSelectionTtlMs: number\n readonly credentialMutationLeaseMs: number\n readonly providerOperationTimeoutMs: number\n readonly refreshSkewMs: number\n readonly now: () => Date\n}\n\nexport interface RevokeConnectorAuthorizationInput {\n readonly definition: OAuthConnectorDefinition\n readonly authorizationId: string\n readonly principal: AuthorizablePrincipal\n}\n\nexport interface ConnectorAuthorizationRevocation {\n readonly disconnected: readonly ConnectorConnectionRecord[]\n}\n\n/**\n * Owns OAuth grants and their encrypted credentials.\n *\n * Request authorization and attempt persistence stay in `request.ts`; provider-side mutations are\n * fenced here through one shared coordinator. The host owns cancellation and exposes its current\n * signal through a callback, so closing and restarting a host never leaves this lifecycle attached\n * to a stale controller.\n */\nexport class DefaultConnectorAuthorizationLifecycle implements ConnectorAuthorizationLifecycle {\n private readonly projectId: string\n private readonly storage: ConnectorConnectionStorage\n private readonly resolveDefinition: (connectorId: string) => OAuthConnectorDefinition\n private readonly accountSelectionTtlMs: number\n private readonly mutations: ConnectorCredentialMutationCoordinator\n private readonly credentials: ConnectorCredentialCodec\n private readonly tokens: ConnectorTokenAccess\n\n constructor(options: ConnectorAuthorizationLifecycleOptions) {\n this.projectId = options.projectId\n this.storage = options.storage\n this.resolveDefinition = options.resolveDefinition\n this.accountSelectionTtlMs = positiveDuration(\n options.accountSelectionTtlMs,\n \"account selection TTL\"\n )\n this.credentials = new ConnectorCredentialCodec({\n projectId: options.projectId,\n protector: options.credentialProtector,\n })\n this.mutations = new ConnectorCredentialMutationCoordinator({\n projectId: options.projectId,\n storage: options.storage,\n leaseDurationMs: options.credentialMutationLeaseMs,\n operationTimeoutMs: options.providerOperationTimeoutMs,\n hostSignal: options.hostSignal,\n discoverReauthorizationAccounts: async (authorization, staged) => {\n const definition = this.definitionFor(authorization.connectorId)\n const credentials = await this.credentials.open(\n definition.id,\n authorization.id,\n staged.credentials\n )\n return this.discoverAccounts(definition, credentials)\n },\n })\n this.tokens = new ConnectorTokenAccess({\n projectId: options.projectId,\n storage: options.storage,\n credentials: this.credentials,\n mutations: this.mutations,\n refreshSkewMs: options.refreshSkewMs,\n now: options.now,\n })\n }\n\n async prepareReauthorization(\n input: PrepareConnectorReauthorizationInput\n ): Promise<PreparedConnectorReauthorization> {\n this.assertRegistered(input.definition)\n const authorization = await this.requireAuthorization(\n input.definition.id,\n input.authorizationId\n )\n if (authorization.status === \"pending_selection\") {\n throw createConnectorCodedError(\n \"connector.authorization_invalid\",\n \"Pending connector credentials cannot be reauthorized; restart authorization or select an account.\"\n )\n }\n if (authorization.status === \"revoked\" || authorization.status === \"revocation_pending\") {\n throw createConnectorCodedError(\n \"connector.authorization_invalid\",\n \"Revoked connector credentials cannot be reauthorized.\"\n )\n }\n assertConnectorAuthorizationActor(authorization, input.principal)\n const connections = await withConnectorStorageBoundary(\n \"Connector authorization connections could not be read.\",\n () =>\n this.storage.listConnectionsByAuthorization({\n projectId: this.projectId,\n connectorId: input.definition.id,\n authorizationId: authorization.id,\n })\n )\n return { authorization, connections }\n }\n\n async completeNewAuthorization(\n input: CompleteNewConnectorAuthorizationInput\n ): Promise<ConnectorAuthorizationRecord> {\n this.assertRegistered(input.definition)\n const authorizationId = `cau_${randomUUID()}`\n const credentials = await this.exchangeAuthorizationCode(\n input.definition,\n input.code,\n input.codeVerifier,\n input.redirectUri,\n input.callbackParameters\n )\n const credentialsEnvelope = await this.credentials.seal(\n input.definition.id,\n authorizationId,\n credentials\n )\n\n let pending: ConnectorAuthorizationRecord\n try {\n pending = await this.storage.createAuthorization({\n id: authorizationId,\n projectId: this.projectId,\n connectorId: input.definition.id,\n authorizedBy: input.principal,\n credentials: credentialsEnvelope,\n ...(credentials.expiresAt === undefined\n ? {}\n : { credentialExpiresAt: credentials.expiresAt }),\n scopes: credentials.scopes ?? [],\n accounts: [],\n selectionTtlMs: this.accountSelectionTtlMs,\n })\n } catch (error) {\n throw storageBoundaryError(error, \"Connector authorization could not be persisted.\")\n }\n\n if (input.onAuthorizationPersisted) {\n try {\n await input.onAuthorizationPersisted(pending)\n } catch (error) {\n await this.revokeAbandonedAuthorization(\n input.definition,\n authorizationId,\n input.principal,\n error\n )\n throw error\n }\n }\n\n let accounts: readonly ConnectorAccountCandidate[]\n try {\n accounts = await this.discoverAccounts(input.definition, credentials)\n } catch (error) {\n const discoveryError = providerBoundaryError(\n error,\n \"connector.provider_failed\",\n \"Connector account discovery failed; the unused authorization is being revoked.\"\n )\n await this.revokeAbandonedAuthorization(\n input.definition,\n authorizationId,\n input.principal,\n discoveryError\n )\n throw discoveryError\n }\n const initialized = await withConnectorStorageBoundary(\n \"Connector authorization accounts could not be persisted.\",\n () =>\n this.storage.initializeAuthorizationAccounts({\n projectId: this.projectId,\n connectorId: input.definition.id,\n authorizationId,\n expectedRevision: pending.revision,\n accounts,\n })\n )\n if (!initialized) {\n throw createConnectorCodedError(\n \"connector.operation_conflict\",\n \"Connector authorization changed while accounts were discovered.\"\n )\n }\n return initialized\n }\n\n async completeReauthorization(\n input: CompleteConnectorReauthorizationInput\n ): Promise<ConnectorAuthorizationRecord> {\n this.assertRegistered(input.definition)\n return this.mutations.runLocallySerialized(input.authorizationId, () =>\n this.completeReauthorizationMutation(input)\n )\n }\n\n async revokeAuthorization(\n input: RevokeConnectorAuthorizationInput\n ): Promise<ConnectorAuthorizationRevocation> {\n this.assertRegistered(input.definition)\n return this.mutations.runLocallySerialized(input.authorizationId, async () => {\n const authorization = await this.requireAuthorization(\n input.definition.id,\n input.authorizationId\n )\n assertConnectorAuthorizationActor(authorization, input.principal)\n return this.revokeAuthorizationRecord(input.definition, authorization)\n })\n }\n\n /** Continues cleanup only after storage has already fenced the authorization from new usage. */\n async continuePendingRevocation(\n definition: OAuthConnectorDefinition,\n authorizationId: string\n ): Promise<ConnectorAuthorizationRevocation> {\n this.assertRegistered(definition)\n return this.mutations.runLocallySerialized(authorizationId, async () => {\n const authorization = await this.requireAuthorization(definition.id, authorizationId)\n if (authorization.status !== \"revocation_pending\" && authorization.status !== \"revoked\") {\n throw createConnectorCodedError(\n \"internal.unexpected\",\n \"Connector cleanup requires an authorization already pending revocation.\"\n )\n }\n return this.revokeAuthorizationRecord(definition, authorization)\n })\n }\n\n async requireStableActiveAuthorization(\n definition: OAuthConnectorDefinition,\n authorizationId: string\n ): Promise<ConnectorAuthorizationRecord> {\n this.assertRegistered(definition)\n return this.tokens.requireStableActiveAuthorization(definition, authorizationId)\n }\n\n createTokenSource(\n definition: OAuthConnectorDefinition,\n authorizationId: string\n ): ConnectorTokenSource {\n this.assertRegistered(definition)\n return this.tokens.createTokenSource(definition, authorizationId)\n }\n\n async requireAuthorization(\n connectorId: string,\n authorizationId: string\n ): Promise<ConnectorAuthorizationRecord> {\n const authorization = await withConnectorStorageBoundary(\n \"Connector authorization could not be read.\",\n () =>\n this.storage.getAuthorization({\n projectId: this.projectId,\n connectorId,\n authorizationId,\n })\n )\n if (!authorization) {\n throw createConnectorCodedError(\n \"connector.not_found\",\n \"Connector authorization was not found.\"\n )\n }\n return authorization\n }\n\n private async revokeAuthorizationRecord(\n definition: OAuthConnectorDefinition,\n initial: ConnectorAuthorizationRecord\n ): Promise<ConnectorAuthorizationRevocation> {\n if (initial.status === \"revoked\") return { disconnected: [] }\n\n const authorization = await this.mutations.prepareAuthorizationForMutation(\n definition.id,\n initial,\n \"revocation\"\n )\n if (authorization.status === \"revoked\") return { disconnected: [] }\n\n const claimOutcome = await this.mutations.claimCredentialMutation(\n definition.id,\n authorization,\n \"revocation\"\n )\n if (claimOutcome.type === \"superseded\") return { disconnected: [] }\n const { claim } = claimOutcome\n\n let credentials: ConnectorOAuthCredentials | undefined\n if (definition.adapter.authentication.revoke) {\n try {\n if (!claim.authorization.credentials) {\n throw createConnectorCodedError(\n \"connector.credentials_unavailable\",\n \"Stored connector credentials are unavailable.\"\n )\n }\n credentials = await this.credentials.open(\n definition.id,\n claim.authorization.id,\n claim.authorization.credentials\n )\n } catch (error) {\n await recoverConnectorFailure(\n error,\n \"Connector credential mutation could not be released after credential decryption failed.\",\n () => this.mutations.releaseCredentialMutation(claim.authorization)\n )\n throw createConnectorCodedError(\n \"connector.credentials_unavailable\",\n \"Connector revocation is pending, but stored credentials could not be opened.\",\n { cause: error }\n )\n }\n }\n\n try {\n await this.mutations.executeCredentialMutation(\n claim.authorization,\n async (executing, signal) => {\n if (definition.adapter.authentication.revoke && credentials) {\n await definition.adapter.authentication.revoke(\n this.adapterContext(definition.id, signal),\n credentials\n )\n }\n return this.mutations.stageCredentialMutationRevocation(executing, signal)\n }\n )\n } catch (error) {\n const latest = await recoverConnectorFailure(\n error,\n \"Connector revocation outcome could not be recovered from storage.\",\n () => this.requireAuthorization(definition.id, authorization.id)\n )\n if (this.mutations.isStagedMutation(latest, claim.authorization, \"revocation\")) {\n await recoverConnectorFailure(\n error,\n \"Staged connector revocation could not be finalized during recovery.\",\n () => this.mutations.finalizeStagedMutation(latest)\n )\n return { disconnected: claim.disconnected }\n }\n await recoverConnectorFailure(\n error,\n \"Connector revocation mutation could not be released for retry.\",\n () => this.mutations.releaseCredentialMutation(claim.authorization)\n )\n throw createConnectorCodedError(\n \"connector.revocation_pending\",\n \"Connector revocation is pending; provider revocation can be retried safely.\",\n { cause: error }\n )\n }\n\n const staged = await this.requireAuthorization(definition.id, authorization.id)\n await this.mutations.finalizeStagedMutation(staged)\n return { disconnected: claim.disconnected }\n }\n\n private async revokeAbandonedAuthorization(\n definition: OAuthConnectorDefinition,\n authorizationId: string,\n principal: AuthorizablePrincipal,\n primaryError: unknown\n ): Promise<void> {\n try {\n await this.revokeAuthorization({ definition, authorizationId, principal })\n } catch (cleanupError) {\n if (isSixbError(cleanupError) && cleanupError.code === \"connector.revocation_pending\") return\n throw createConnectorCodedError(\n \"internal.unexpected\",\n \"Unused connector credentials could not be scheduled for revocation.\",\n {\n cause: new AggregateError(\n [primaryError, cleanupError],\n \"Connector authorization failed and cleanup could not be secured.\"\n ),\n }\n )\n }\n }\n\n private async completeReauthorizationMutation(\n input: CompleteConnectorReauthorizationInput\n ): Promise<ConnectorAuthorizationRecord> {\n let authorization = await this.requireAuthorization(input.definition.id, input.authorizationId)\n assertReauthorizationRevision(authorization, input.expectedRevision)\n if (authorization.status === \"revoked\" || authorization.status === \"revocation_pending\") {\n throw createConnectorCodedError(\n \"connector.authorization_invalid\",\n \"Revoked connector credentials cannot be reauthorized.\"\n )\n }\n assertConnectorAuthorizationActor(authorization, input.principal)\n await this.mutations.assertAttachedConnections(\n input.definition.id,\n authorization.id,\n input.expectedConnectionIds\n )\n authorization = await this.mutations.prepareAuthorizationForMutation(\n input.definition.id,\n authorization,\n \"reauthorization\"\n )\n assertReauthorizationRevision(authorization, input.expectedRevision)\n await this.mutations.assertAttachedConnections(\n input.definition.id,\n authorization.id,\n input.expectedConnectionIds\n )\n const claimOutcome = await this.mutations.claimCredentialMutation(\n input.definition.id,\n authorization,\n \"reauthorization\",\n input.expectedConnectionIds\n )\n if (claimOutcome.type === \"superseded\") {\n throw createConnectorCodedError(\n \"internal.unexpected\",\n \"Connector reauthorization was superseded unexpectedly.\"\n )\n }\n const { claim } = claimOutcome\n\n try {\n await this.mutations.executeCredentialMutation(\n claim.authorization,\n async (executing, signal) => {\n const credentials = validateCredentials(\n await input.definition.adapter.authentication.exchangeCode(\n this.authorizationAdapterContext(input.definition.id, input.redirectUri, signal),\n {\n code: input.code,\n ...(input.codeVerifier === undefined ? {} : { codeVerifier: input.codeVerifier }),\n callbackParameters: input.callbackParameters,\n }\n )\n )\n assertCredentialMutationOperationActive(signal)\n const envelope = await this.credentials.seal(\n input.definition.id,\n input.authorizationId,\n credentials\n )\n return this.mutations.stageCredentialMutationCredentials(executing, signal, {\n credentials: envelope,\n ...(credentials.expiresAt === undefined\n ? {}\n : { credentialExpiresAt: credentials.expiresAt }),\n scopes: credentials.scopes ?? [],\n })\n }\n )\n } catch (error) {\n const latest = await recoverConnectorFailure(\n error,\n \"Connector reauthorization outcome could not be recovered from storage.\",\n () => this.requireAuthorization(input.definition.id, input.authorizationId)\n )\n if (this.mutations.isStagedMutation(latest, claim.authorization, \"reauthorization\")) {\n return recoverConnectorFailure(\n error,\n \"Staged connector reauthorization could not be finalized during recovery.\",\n () => this.mutations.finalizeStagedMutation(latest)\n )\n }\n if (oauthErrorKind(error) === \"retryable\" || oauthErrorKind(error) === \"terminal\") {\n await recoverConnectorFailure(\n error,\n \"Connector reauthorization mutation could not be released after provider failure.\",\n () => this.mutations.releaseCredentialMutation(claim.authorization)\n )\n throw createConnectorCodedError(\n \"connector.provider_failed\",\n \"Connector authorization code exchange failed; restart authorization.\",\n { cause: error }\n )\n }\n await recoverConnectorFailure(\n error,\n \"Connector authorization could not be failed closed after an ambiguous code exchange.\",\n () => this.mutations.markNeedsReauthorization(claim.authorization)\n )\n throw createConnectorCodedError(\n \"connector.authorization_required\",\n \"Connector authorization code exchange had an ambiguous outcome; reauthorization is required.\",\n { cause: error }\n )\n }\n\n const staged = await this.requireAuthorization(input.definition.id, input.authorizationId)\n return this.mutations.finalizeStagedMutation(staged)\n }\n\n private async exchangeAuthorizationCode(\n definition: OAuthConnectorDefinition,\n code: string,\n codeVerifier: string | undefined,\n redirectUri: string,\n callbackParameters: Readonly<Record<string, string>> | undefined\n ): Promise<ConnectorOAuthCredentials> {\n try {\n return validateCredentials(\n await this.mutations.withBoundedProviderSignal((signal) =>\n definition.adapter.authentication.exchangeCode(\n this.authorizationAdapterContext(definition.id, redirectUri, signal),\n { code, ...(codeVerifier === undefined ? {} : { codeVerifier }), callbackParameters }\n )\n )\n )\n } catch (error) {\n throw providerBoundaryError(\n error,\n \"connector.provider_failed\",\n \"Connector authorization code exchange failed.\"\n )\n }\n }\n\n private async discoverAccounts(\n definition: OAuthConnectorDefinition,\n credentials: ConnectorOAuthCredentials\n ): Promise<readonly ConnectorAccountCandidate[]> {\n return validateAccounts(\n await this.mutations.withBoundedProviderSignal(\n (signal) =>\n definition.adapter.discoverAccounts(\n this.adapterContext(definition.id, signal),\n credentials\n ),\n () =>\n createConnectorCodedError(\n \"connector.provider_failed\",\n \"Connector account discovery did not complete.\"\n )\n )\n )\n }\n\n private adapterContext(connectorId: string, signal: AbortSignal) {\n return { projectId: this.projectId, connectorId, signal }\n }\n\n private authorizationAdapterContext(\n connectorId: string,\n redirectUri: string,\n signal: AbortSignal\n ) {\n return { ...this.adapterContext(connectorId, signal), redirectUri }\n }\n\n private definitionFor(connectorId: string): OAuthConnectorDefinition {\n const definition = this.resolveDefinition(connectorId)\n if (definition.id !== connectorId) {\n throw createConnectorCodedError(\n \"internal.unexpected\",\n \"Connector definition resolver returned a mismatched definition.\"\n )\n }\n return definition\n }\n\n private assertRegistered(definition: OAuthConnectorDefinition): void {\n if (this.definitionFor(definition.id) !== definition) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n `Connector '${definition.id}' is not the registered definition instance.`\n )\n }\n }\n}\n\nexport function assertConnectorAuthorizationActor(\n authorization: ConnectorAuthorizationRecord,\n principal: AuthorizablePrincipal\n): void {\n if (\n authorization.authorizedBy.type !== principal.type ||\n authorization.authorizedBy.id !== principal.id\n ) {\n throw new AuthorizationError(\n `authorization:connector:${authorization.connectorId}`,\n \"[Sixb] This connector authorization can only be changed by its authorizing principal.\"\n )\n }\n}\n\nfunction assertReauthorizationRevision(\n authorization: ConnectorAuthorizationRecord,\n expectedRevision: number\n): void {\n if (authorization.revision !== expectedRevision) {\n throw createConnectorCodedError(\n \"connector.authorization_invalid\",\n \"Connector reauthorization attempt is stale; restart authorization.\"\n )\n }\n}\n",
|
|
15
|
+
"import { createHash } from \"node:crypto\"\nimport { isJsonObject } from \"../../json\"\nimport type { ConnectorAuthorizationRecord } from \"../../storage\"\nimport { createConnectorCodedError } from \"../errors\"\nimport type { ConnectorAccountCandidate, ConnectorOAuthCredentials } from \"../types\"\n\n/** Internal validation and normalization shared by the connector connection lifecycle. */\n\ntype ConnectorValidationErrorCode =\n | \"connector.adapter_invalid\"\n | \"connector.authorization_invalid\"\n | \"connector.configuration_invalid\"\n\nexport function validateCredentials(\n credentials: ConnectorOAuthCredentials\n): ConnectorOAuthCredentials {\n if (!isRecord(credentials)) {\n throw createConnectorCodedError(\n \"connector.adapter_invalid\",\n \"OAuth connector adapter returned invalid credentials.\"\n )\n }\n\n const normalized: {\n accessToken: string\n refreshToken?: string\n tokenType?: string\n scopes?: string[]\n expiresAt?: Date\n authorizationContext?: ConnectorOAuthCredentials[\"authorizationContext\"]\n } = {\n accessToken: nonblank(\n credentials.accessToken,\n \"provider access token\",\n \"connector.adapter_invalid\"\n ),\n }\n\n if (credentials.refreshToken !== undefined) {\n normalized.refreshToken = nonblank(\n credentials.refreshToken,\n \"provider refresh token\",\n \"connector.adapter_invalid\"\n )\n }\n\n if (credentials.tokenType !== undefined) {\n normalized.tokenType = nonblank(\n credentials.tokenType,\n \"provider token type\",\n \"connector.adapter_invalid\"\n )\n }\n\n if (credentials.scopes !== undefined) {\n if (!Array.isArray(credentials.scopes)) {\n throw createConnectorCodedError(\n \"connector.adapter_invalid\",\n \"OAuth connector adapter returned invalid scopes.\"\n )\n }\n normalized.scopes = [\n ...new Set(\n credentials.scopes.map((scope) =>\n nonblank(scope, \"provider scope\", \"connector.adapter_invalid\")\n )\n ),\n ]\n }\n\n if (credentials.expiresAt !== undefined) {\n if (!(credentials.expiresAt instanceof Date) || Number.isNaN(credentials.expiresAt.getTime())) {\n throw createConnectorCodedError(\n \"connector.adapter_invalid\",\n \"OAuth connector adapter returned an invalid token expiry.\"\n )\n }\n normalized.expiresAt = new Date(credentials.expiresAt)\n }\n\n if (credentials.authorizationContext !== undefined) {\n if (!isJsonObject(credentials.authorizationContext)) {\n throw createConnectorCodedError(\n \"connector.adapter_invalid\",\n \"OAuth connector adapter returned invalid authorization context; expected a JSON object.\"\n )\n }\n normalized.authorizationContext = structuredClone(credentials.authorizationContext)\n }\n\n return normalized\n}\n\nexport function validateAccounts(\n accounts: readonly ConnectorAccountCandidate[]\n): readonly ConnectorAccountCandidate[] {\n if (!Array.isArray(accounts)) {\n throw createConnectorCodedError(\n \"connector.adapter_invalid\",\n \"OAuth connector adapter returned an invalid account list.\"\n )\n }\n const ids = new Set<string>()\n return accounts.map((account) => {\n if (!isRecord(account)) {\n throw createConnectorCodedError(\n \"connector.adapter_invalid\",\n \"OAuth connector adapter returned an invalid account.\"\n )\n }\n const id = nonblank(account.id, \"external account id\", \"connector.adapter_invalid\")\n if (ids.has(id)) {\n throw createConnectorCodedError(\n \"connector.adapter_invalid\",\n `OAuth connector adapter returned duplicate account '${id}'.`\n )\n }\n ids.add(id)\n const description =\n account.description === undefined\n ? undefined\n : nonblank(account.description, \"external account description\", \"connector.adapter_invalid\")\n const avatarUrl =\n account.avatarUrl === undefined\n ? undefined\n : normalizedHttpUrl(\n nonblank(account.avatarUrl, \"external account avatar URL\", \"connector.adapter_invalid\"),\n \"external account avatar URL\",\n \"connector.adapter_invalid\"\n )\n return {\n id,\n label: nonblank(account.label, \"external account label\", \"connector.adapter_invalid\"),\n ...(description === undefined ? {} : { description }),\n ...(avatarUrl === undefined ? {} : { avatarUrl }),\n }\n })\n}\n\nexport function serializeCredentials(credentials: ConnectorOAuthCredentials): string {\n return JSON.stringify({\n version: 1,\n accessToken: credentials.accessToken,\n ...(credentials.refreshToken === undefined ? {} : { refreshToken: credentials.refreshToken }),\n ...(credentials.tokenType === undefined ? {} : { tokenType: credentials.tokenType }),\n ...(credentials.scopes === undefined ? {} : { scopes: credentials.scopes }),\n ...(credentials.expiresAt === undefined\n ? {}\n : { expiresAt: credentials.expiresAt.toISOString() }),\n ...(credentials.authorizationContext === undefined\n ? {}\n : { authorizationContext: credentials.authorizationContext }),\n })\n}\n\nexport function parseCredentials(serialized: string): ConnectorOAuthCredentials {\n let value: unknown\n try {\n value = JSON.parse(serialized)\n } catch (error) {\n throw createConnectorCodedError(\n \"connector.credentials_unavailable\",\n \"Stored connector credentials are invalid.\",\n { cause: error }\n )\n }\n if (!isRecord(value) || value.version !== 1 || typeof value.accessToken !== \"string\") {\n throw createConnectorCodedError(\n \"connector.credentials_unavailable\",\n \"Stored connector credentials are invalid.\"\n )\n }\n if (\n (value.refreshToken !== undefined && typeof value.refreshToken !== \"string\") ||\n (value.tokenType !== undefined && typeof value.tokenType !== \"string\") ||\n (value.scopes !== undefined &&\n (!Array.isArray(value.scopes) || value.scopes.some((scope) => typeof scope !== \"string\"))) ||\n (value.expiresAt !== undefined && typeof value.expiresAt !== \"string\") ||\n (value.authorizationContext !== undefined && !isJsonObject(value.authorizationContext))\n ) {\n throw createConnectorCodedError(\n \"connector.credentials_unavailable\",\n \"Stored connector credentials are invalid.\"\n )\n }\n const expiresAt = value.expiresAt === undefined ? undefined : new Date(value.expiresAt)\n try {\n return validateCredentials({\n accessToken: value.accessToken,\n ...(value.refreshToken === undefined ? {} : { refreshToken: value.refreshToken }),\n ...(value.tokenType === undefined ? {} : { tokenType: value.tokenType }),\n ...(value.scopes === undefined ? {} : { scopes: value.scopes as string[] }),\n ...(expiresAt === undefined ? {} : { expiresAt }),\n ...(value.authorizationContext === undefined\n ? {}\n : { authorizationContext: value.authorizationContext }),\n })\n } catch (error) {\n throw createConnectorCodedError(\n \"connector.credentials_unavailable\",\n \"Stored connector credentials are invalid.\",\n { cause: error }\n )\n }\n}\n\nexport function shouldRefresh(\n authorization: ConnectorAuthorizationRecord,\n now: Date,\n skewMs: number\n): boolean {\n return (\n authorization.credentialExpiresAt !== undefined &&\n authorization.credentialExpiresAt.getTime() <= now.getTime() + skewMs\n )\n}\n\nexport function tokenView(credentials: ConnectorOAuthCredentials) {\n return {\n accessToken: credentials.accessToken,\n ...(credentials.tokenType === undefined ? {} : { tokenType: credentials.tokenType }),\n }\n}\n\nexport function parseAttemptId(state: string): string {\n const separator = state.indexOf(\".\")\n if (separator <= 0 || separator === state.length - 1) {\n throw createConnectorCodedError(\"connector.authorization_invalid\", \"OAuth state is invalid.\")\n }\n return state.slice(0, separator)\n}\n\nexport function hashSecret(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"base64url\")\n}\n\nexport function normalizedHttpUrl(\n value: string | URL,\n field: string,\n code: ConnectorValidationErrorCode = \"connector.configuration_invalid\"\n): string {\n let url: URL\n try {\n if (typeof value !== \"string\" && !(value instanceof URL)) throw new Error(\"invalid URL\")\n url = new URL(value)\n } catch (error) {\n throw createConnectorCodedError(code, `${field} must be an absolute URL.`, { cause: error })\n }\n if (url.username || url.password) {\n throw createConnectorCodedError(code, `${field} must not contain credentials.`)\n }\n if (url.protocol !== \"https:\" && !(url.protocol === \"http:\" && isLoopbackHost(url.hostname))) {\n throw createConnectorCodedError(code, `${field} must use HTTPS, except on a loopback host.`)\n }\n return url.toString()\n}\n\nexport function assertAuthorizationUrlParameters(\n authorizationUrl: string,\n expected: { readonly state: string; readonly codeChallenge?: string }\n): void {\n const parameters = new URL(authorizationUrl).searchParams\n if (\n !sameSingleParameter(parameters, \"state\", expected.state) ||\n (expected.codeChallenge === undefined\n ? parameters.has(\"code_challenge\") || parameters.has(\"code_challenge_method\")\n : !sameSingleParameter(parameters, \"code_challenge\", expected.codeChallenge) ||\n !sameSingleParameter(parameters, \"code_challenge_method\", \"S256\"))\n ) {\n throw createConnectorCodedError(\n \"connector.adapter_invalid\",\n expected.codeChallenge === undefined\n ? \"OAuth connector authorization URL must preserve the framework-provided state and omit disabled PKCE parameters.\"\n : \"OAuth connector authorization URL must preserve the framework-provided state and PKCE S256 parameters.\"\n )\n }\n}\n\nexport function connectorPkceEnabled(pkce: \"S256\" | \"disabled\" | undefined): boolean {\n if (pkce === undefined || pkce === \"S256\") return true\n if (pkce === \"disabled\") return false\n throw createConnectorCodedError(\n \"connector.adapter_invalid\",\n \"OAuth connector PKCE must be S256 or disabled.\"\n )\n}\n\nconst reservedCallbackParameters = new Set([\n \"state\",\n \"code\",\n \"auth_code\",\n \"error\",\n \"error_description\",\n \"error_uri\",\n])\n\nexport function validateCallbackParameterNames(names: readonly string[] = []): void {\n if (\n !Array.isArray(names) ||\n names.some(\n (name) =>\n typeof name !== \"string\" ||\n !/^[A-Za-z_][A-Za-z0-9_.-]*$/.test(name) ||\n reservedCallbackParameters.has(name)\n ) ||\n new Set(names).size !== names.length\n ) {\n throw createConnectorCodedError(\n \"connector.adapter_invalid\",\n \"OAuth callback parameter names must be unique, non-reserved parameter names.\"\n )\n }\n}\n\n/** Select only declared provider values after the callback's state and browser binding are proved. */\nexport function selectCallbackParameters(\n names: readonly string[] = [],\n parameters: Readonly<Record<string, string | readonly string[]>> = {}\n): Readonly<Record<string, string>> {\n validateCallbackParameterNames(names)\n if (!isRecord(parameters)) {\n throw createConnectorCodedError(\n \"connector.authorization_invalid\",\n \"OAuth provider callback parameters must be an object.\"\n )\n }\n return Object.fromEntries(\n names.flatMap((name) => {\n if (!Object.hasOwn(parameters, name)) return []\n const value = parameters[name]\n if (typeof value !== \"string\") {\n throw createConnectorCodedError(\n \"connector.authorization_invalid\",\n \"OAuth provider callback parameters must have a single string value.\"\n )\n }\n return [[name, value]]\n })\n )\n}\n\nexport function nonblank(\n value: unknown,\n field: string,\n code: ConnectorValidationErrorCode = \"connector.configuration_invalid\"\n): string {\n if (typeof value !== \"string\" || !value.trim()) {\n throw createConnectorCodedError(code, `${field} must be a non-empty string.`)\n }\n return value\n}\n\nexport function positiveDuration(value: number, field: string): number {\n if (!Number.isFinite(value) || value <= 0) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n `Connector ${field} must be a positive duration.`\n )\n }\n return value\n}\n\nexport function nonNegativeDuration(value: number, field: string): number {\n if (!Number.isFinite(value) || value < 0) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n `Connector ${field} must not be negative.`\n )\n }\n return value\n}\n\nexport function delay(milliseconds: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, milliseconds))\n}\n\nexport function sameIds(left: readonly string[], right: readonly string[]): boolean {\n const leftSorted = [...left].sort()\n const rightSorted = [...right].sort()\n return (\n leftSorted.length === rightSorted.length &&\n leftSorted.every((value, index) => value === rightSorted[index])\n )\n}\n\nfunction sameSingleParameter(parameters: URLSearchParams, name: string, expected: string): boolean {\n const values = parameters.getAll(name)\n return values.length === 1 && values[0] === expected\n}\n\nfunction isLoopbackHost(hostname: string): boolean {\n return (\n hostname === \"localhost\" ||\n hostname.endsWith(\".localhost\") ||\n hostname === \"127.0.0.1\" ||\n hostname === \"[::1]\"\n )\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null\n}\n",
|
|
16
|
+
"import type { ConnectorCredentialProtector, SealedConnectorCredential } from \"../credentials\"\nimport type { ConnectorOAuthCredentials } from \"../types\"\nimport { parseCredentials, serializeCredentials } from \"./validation\"\n\nconst textEncoder = new TextEncoder()\nconst textDecoder = new TextDecoder()\n\nexport interface ConnectorCredentialCodecOptions {\n readonly projectId: string\n readonly protector: ConnectorCredentialProtector\n}\n\n/** Authenticated serialization boundary for one project's OAuth credential envelopes. */\nexport class ConnectorCredentialCodec {\n constructor(private readonly options: ConnectorCredentialCodecOptions) {}\n\n seal(\n connectorId: string,\n authorizationId: string,\n credentials: ConnectorOAuthCredentials\n ): Promise<SealedConnectorCredential> {\n return this.options.protector.seal(\n textEncoder.encode(serializeCredentials(credentials)),\n this.context(connectorId, authorizationId)\n )\n }\n\n async open(\n connectorId: string,\n authorizationId: string,\n credentials: SealedConnectorCredential\n ): Promise<ConnectorOAuthCredentials> {\n const plaintext = await this.options.protector.open(\n credentials,\n this.context(connectorId, authorizationId)\n )\n return parseCredentials(textDecoder.decode(plaintext))\n }\n\n private context(connectorId: string, authorizationId: string) {\n return {\n projectId: this.options.projectId,\n connectorId,\n recordId: authorizationId,\n purpose: \"oauth-authorization\" as const,\n }\n }\n}\n",
|
|
17
|
+
"import { randomUUID } from \"node:crypto\"\nimport type {\n ClaimConnectorCredentialMutationResult,\n ConnectorAuthorizationRecord,\n ConnectorConnectionStorage,\n ConnectorCredentialMutationKind,\n ConnectorStagedCredentials,\n} from \"../../storage\"\nimport type { SealedConnectorCredential } from \"../credentials\"\nimport {\n createAmbiguousProviderOperationError,\n createConnectorCodedError,\n isConnectorStorageError,\n providerBoundaryError,\n recoverConnectorFailure,\n storageBoundaryError,\n} from \"../errors\"\nimport type { ConnectorAccountCandidate } from \"../types\"\nimport { runBoundedConnectorProviderOperation } from \"./provider-operation\"\nimport { withConnectorStorageBoundary } from \"./storage-boundary\"\nimport { delay, positiveDuration, sameIds } from \"./validation\"\n\nconst MUTATION_POLL_MS = 25\nconst MUTATION_WAIT_MS = 5_000\n\nexport type ConnectorCredentialMutationClaimOutcome =\n | {\n readonly type: \"claimed\"\n readonly claim: ClaimConnectorCredentialMutationResult\n }\n | {\n readonly type: \"superseded\"\n readonly authorization: ConnectorAuthorizationRecord\n }\n\nexport interface ConnectorCredentialMutationCoordinatorOptions {\n readonly projectId: string\n readonly storage: ConnectorConnectionStorage\n readonly leaseDurationMs: number\n readonly operationTimeoutMs: number\n /** Returns the current host signal; the host may replace its controller after closing. */\n readonly hostSignal: () => AbortSignal\n readonly discoverReauthorizationAccounts: (\n authorization: ConnectorAuthorizationRecord,\n staged: ConnectorStagedCredentials\n ) => Promise<readonly ConnectorAccountCandidate[]>\n /** Injectable for deterministic tests. A unique value is generated in normal operation. */\n readonly holderId?: string\n}\n\nexport interface StageConnectorCredentialMutationInput {\n readonly credentials: SealedConnectorCredential\n readonly credentialExpiresAt?: Date\n readonly scopes: readonly string[]\n}\n\n/**\n * Coordinates every provider-side OAuth credential mutation.\n *\n * Storage owns the durable fence and deadline. This coordinator owns process-local serialization,\n * lease renewal, provider deadlines, ambiguous-outcome handling, and staged-result finalization.\n */\nexport class ConnectorCredentialMutationCoordinator {\n private readonly projectId: string\n private readonly storage: ConnectorConnectionStorage\n private readonly leaseDurationMs: number\n private readonly operationTimeoutMs: number\n private readonly hostSignal: () => AbortSignal\n private readonly discoverReauthorizationAccounts: (\n authorization: ConnectorAuthorizationRecord,\n staged: ConnectorStagedCredentials\n ) => Promise<readonly ConnectorAccountCandidate[]>\n private readonly holderId: string\n private readonly localMutationTails = new Map<string, Promise<void>>()\n\n constructor(options: ConnectorCredentialMutationCoordinatorOptions) {\n this.projectId = options.projectId\n this.storage = options.storage\n this.leaseDurationMs = positiveDuration(\n options.leaseDurationMs,\n \"credential mutation lease duration\"\n )\n this.operationTimeoutMs = positiveDuration(\n options.operationTimeoutMs,\n \"credential mutation timeout\"\n )\n this.hostSignal = options.hostSignal\n this.discoverReauthorizationAccounts = options.discoverReauthorizationAccounts\n this.holderId = options.holderId ?? `connector-service-${randomUUID()}`\n }\n\n async claimCredentialMutation(\n connectorId: string,\n initial: ConnectorAuthorizationRecord,\n kind: ConnectorCredentialMutationKind,\n expectedConnectionIds?: readonly string[]\n ): Promise<ConnectorCredentialMutationClaimOutcome> {\n const waitDeadline = Date.now() + MUTATION_WAIT_MS\n const initialRevision = initial.revision\n let authorization = initial\n\n while (true) {\n const claimed = await withConnectorStorageBoundary(\n \"Connector credential mutation could not be claimed.\",\n () =>\n this.storage.claimCredentialMutation({\n projectId: this.projectId,\n connectorId,\n authorizationId: authorization.id,\n expectedRevision: authorization.revision,\n mutation: { id: `ccm_${randomUUID()}`, kind, holderId: this.holderId },\n ...(expectedConnectionIds === undefined ? {} : { expectedConnectionIds }),\n leaseDurationMs: this.leaseDurationMs,\n operationTimeoutMs: this.operationTimeoutMs,\n })\n )\n if (claimed) return { type: \"claimed\", claim: claimed }\n\n await delay(MUTATION_POLL_MS)\n authorization = await this.prepareAuthorizationForMutation(connectorId, authorization, kind)\n if (kind === \"reauthorization\" && authorization.status === \"revoked\") {\n throw createConnectorCodedError(\n \"connector.authorization_invalid\",\n \"Revoked connector credentials cannot be reauthorized.\"\n )\n }\n if (kind === \"reauthorization\" && authorization.status === \"revocation_pending\") {\n throw createConnectorCodedError(\n \"connector.authorization_invalid\",\n \"Connector authorization revocation is pending.\"\n )\n }\n if (kind === \"reauthorization\" && authorization.revision !== initialRevision) {\n throw staleReauthorizationError()\n }\n if (kind === \"revocation\" && authorization.status === \"revoked\") {\n return { type: \"superseded\", authorization }\n }\n if (kind === \"refresh\" && authorization.revision !== initialRevision) {\n if (authorization.status !== \"active\") {\n throw connectorAuthorizationStatusError(authorization.status)\n }\n return { type: \"superseded\", authorization }\n }\n if (kind === \"reauthorization\" && expectedConnectionIds) {\n await this.assertAttachedConnections(connectorId, authorization.id, expectedConnectionIds)\n }\n if (Date.now() >= waitDeadline) {\n throw createConnectorCodedError(\n \"connector.operation_in_progress\",\n \"Connector credentials are being changed by another operation; retry shortly.\"\n )\n }\n }\n }\n\n async prepareAuthorizationForMutation(\n connectorId: string,\n initial: ConnectorAuthorizationRecord,\n requestedKind: ConnectorCredentialMutationKind\n ): Promise<ConnectorAuthorizationRecord> {\n const authorization = await this.requireAuthorization(connectorId, initial.id)\n const mutation = authorization.credentialMutation\n if (!mutation) return authorization\n\n if (mutation.phase === \"result_staged\") {\n if (requestedKind === \"revocation\" && mutation.kind !== \"revocation\") {\n const marked = await this.markNeedsReauthorization(authorization)\n return marked ?? this.requireAuthorization(connectorId, authorization.id)\n }\n return this.finalizeStagedMutation(authorization)\n }\n\n const recovered = await this.recoverExpiredCredentialMutation(connectorId, authorization.id)\n return recovered ?? authorization\n }\n\n async recoverExpiredCredentialMutation(\n connectorId: string,\n authorizationId: string\n ): Promise<ConnectorAuthorizationRecord | null> {\n return withConnectorStorageBoundary(\n \"Expired connector credential mutation could not be recovered.\",\n () =>\n this.storage.recoverExpiredCredentialMutation({\n projectId: this.projectId,\n connectorId,\n authorizationId,\n })\n )\n }\n\n async executeCredentialMutation<T>(\n authorization: ConnectorAuthorizationRecord,\n run: (executing: ConnectorAuthorizationRecord, signal: AbortSignal) => Promise<T>\n ): Promise<T> {\n if (!authorization.credentialMutation) {\n throw createConnectorCodedError(\n \"internal.unexpected\",\n \"Connector credential mutation was not claimed.\"\n )\n }\n const executing = await withConnectorStorageBoundary(\n \"Connector credential mutation could not be marked as executing.\",\n () =>\n this.storage.markCredentialMutationExecuting({\n ...credentialMutationFence(authorization),\n holderId: this.holderId,\n })\n )\n if (!executing) throw createAmbiguousProviderOperationError()\n return this.withCredentialMutationSignal(executing, (signal) => run(executing, signal))\n }\n\n async stageCredentialMutationCredentials(\n executing: ConnectorAuthorizationRecord,\n signal: AbortSignal,\n input: StageConnectorCredentialMutationInput\n ): Promise<ConnectorAuthorizationRecord> {\n assertCredentialMutationOperationActive(signal)\n const staged = await withConnectorStorageBoundary(\n \"Connector credential mutation result could not be staged.\",\n () =>\n this.storage.stageCredentialMutationCredentials({\n ...credentialMutationFence(executing),\n holderId: this.holderId,\n credentials: input.credentials,\n ...(input.credentialExpiresAt === undefined\n ? {}\n : { credentialExpiresAt: input.credentialExpiresAt }),\n scopes: input.scopes,\n })\n )\n if (!staged) throw createAmbiguousProviderOperationError()\n return staged\n }\n\n async stageCredentialMutationRevocation(\n executing: ConnectorAuthorizationRecord,\n signal: AbortSignal\n ): Promise<ConnectorAuthorizationRecord> {\n assertCredentialMutationOperationActive(signal)\n const staged = await withConnectorStorageBoundary(\n \"Connector revocation result could not be staged.\",\n () =>\n this.storage.stageCredentialMutationRevocation({\n ...credentialMutationFence(executing),\n holderId: this.holderId,\n })\n )\n if (!staged) throw createAmbiguousProviderOperationError()\n return staged\n }\n\n async withBoundedProviderSignal<T>(\n run: (signal: AbortSignal) => Promise<T> | T,\n interruptionError: () => Error = createAmbiguousProviderOperationError\n ): Promise<T> {\n return runBoundedConnectorProviderOperation(\n { hostSignal: this.hostSignal(), timeoutMs: this.operationTimeoutMs },\n run,\n interruptionError\n )\n }\n\n async finalizeStagedMutation(\n authorization: ConnectorAuthorizationRecord\n ): Promise<ConnectorAuthorizationRecord> {\n const mutation = authorization.credentialMutation\n if (!mutation || mutation.phase !== \"result_staged\") return authorization\n\n const fence = credentialMutationFence(authorization)\n let finalized: ConnectorAuthorizationRecord | null\n if (mutation.kind === \"refresh\") {\n finalized = await withConnectorStorageBoundary(\n \"Connector credential refresh could not be finalized.\",\n () => this.storage.finalizeRefresh(fence)\n )\n } else if (mutation.kind === \"revocation\") {\n finalized = await withConnectorStorageBoundary(\n \"Connector credential revocation could not be finalized.\",\n () => this.storage.finalizeRevocation(fence)\n )\n } else {\n const staged = mutation.stagedCredentials\n if (!staged) {\n throw createConnectorCodedError(\n \"internal.unexpected\",\n \"Staged connector credentials are missing.\"\n )\n }\n let accounts: readonly ConnectorAccountCandidate[]\n try {\n accounts = await this.discoverReauthorizationAccounts(authorization, staged)\n } catch (error) {\n throw providerBoundaryError(\n error,\n \"connector.provider_failed\",\n \"Connector account discovery failed; reauthorization remains safely staged.\"\n )\n }\n try {\n finalized = await this.storage.finalizeReauthorization({\n ...fence,\n accounts,\n })\n } catch (error) {\n if (isConnectorStorageError(error)) {\n await recoverConnectorFailure(\n error,\n \"Connector authorization could not be failed closed after incompatible account discovery.\",\n () => this.markNeedsReauthorization(authorization)\n )\n throw createConnectorCodedError(\n \"connector.authorization_required\",\n \"Reauthorized connector accounts changed incompatibly; reauthorization is required.\",\n { cause: error }\n )\n }\n throw storageBoundaryError(\n error,\n \"Connector credential reauthorization could not be finalized.\"\n )\n }\n }\n if (finalized) return finalized\n\n const latest = await this.requireAuthorization(authorization.connectorId, authorization.id)\n if (latest.revision !== authorization.revision || !latest.credentialMutation) return latest\n throw createConnectorCodedError(\n \"internal.unexpected\",\n \"Connector credential mutation could not be finalized safely.\"\n )\n }\n\n async markNeedsReauthorization(\n authorization: ConnectorAuthorizationRecord\n ): Promise<ConnectorAuthorizationRecord | null> {\n if (!authorization.credentialMutation) return null\n return withConnectorStorageBoundary(\n \"Connector authorization could not be marked for reauthorization.\",\n () => this.storage.markNeedsReauthorization(credentialMutationFence(authorization))\n )\n }\n\n async releaseCredentialMutation(authorization: ConnectorAuthorizationRecord): Promise<boolean> {\n if (!authorization.credentialMutation) return false\n return withConnectorStorageBoundary(\n \"Connector credential mutation could not be released.\",\n () =>\n this.storage.releaseCredentialMutation({\n ...credentialMutationFence(authorization),\n holderId: this.holderId,\n })\n )\n }\n\n async requireStableActiveAuthorization(\n connectorId: string,\n authorizationId: string\n ): Promise<ConnectorAuthorizationRecord> {\n const waitDeadline = Date.now() + MUTATION_WAIT_MS\n while (true) {\n let authorization = await this.requireAuthorization(connectorId, authorizationId)\n if (authorization.credentialMutation) {\n authorization = await this.prepareAuthorizationForMutation(\n connectorId,\n authorization,\n \"refresh\"\n )\n if (authorization.credentialMutation) {\n if (Date.now() >= waitDeadline) {\n throw createConnectorCodedError(\n \"connector.operation_in_progress\",\n \"Connector credentials are being changed by another operation; retry shortly.\"\n )\n }\n await delay(MUTATION_POLL_MS)\n continue\n }\n }\n if (authorization.status !== \"active\") {\n throw connectorAuthorizationStatusError(authorization.status)\n }\n return authorization\n }\n }\n\n async assertAttachedConnections(\n connectorId: string,\n authorizationId: string,\n expectedConnectionIds: readonly string[]\n ): Promise<void> {\n const attachedIds = (\n await withConnectorStorageBoundary(\n \"Connector authorization connections could not be read.\",\n () =>\n this.storage.listConnectionsByAuthorization({\n projectId: this.projectId,\n connectorId,\n authorizationId,\n })\n )\n ).map((connection) => connection.id)\n if (!sameIds(attachedIds, expectedConnectionIds)) {\n throw createConnectorCodedError(\n \"connector.operation_conflict\",\n \"Connections attached to this authorization changed; restart reauthorization.\"\n )\n }\n }\n\n async runLocallySerialized<T>(authorizationId: string, run: () => Promise<T>): Promise<T> {\n const previous = this.localMutationTails.get(authorizationId) ?? Promise.resolve()\n const operation = previous.catch(() => {}).then(run)\n const tail = operation.then(\n () => undefined,\n () => undefined\n )\n this.localMutationTails.set(authorizationId, tail)\n try {\n return await operation\n } finally {\n if (this.localMutationTails.get(authorizationId) === tail) {\n this.localMutationTails.delete(authorizationId)\n }\n }\n }\n\n isStagedMutation(\n authorization: ConnectorAuthorizationRecord,\n claimed: ConnectorAuthorizationRecord,\n kind: ConnectorCredentialMutationKind\n ): boolean {\n const claimedMutation = claimed.credentialMutation\n return (\n claimedMutation !== undefined &&\n authorization.credentialMutation?.id === claimedMutation.id &&\n authorization.credentialMutation.kind === kind &&\n authorization.credentialMutation.phase === \"result_staged\"\n )\n }\n\n private async withCredentialMutationSignal<T>(\n authorization: ConnectorAuthorizationRecord,\n run: (signal: AbortSignal) => Promise<T>\n ): Promise<T> {\n const controller = new AbortController()\n const hostSignal = this.hostSignal()\n const abortFromHost = () => controller.abort(createAmbiguousProviderOperationError())\n if (hostSignal.aborted) abortFromHost()\n else hostSignal.addEventListener(\"abort\", abortFromHost, { once: true })\n const timeout = setTimeout(\n () => controller.abort(createAmbiguousProviderOperationError()),\n this.operationTimeoutMs\n )\n const heartbeat = setInterval(\n () => {\n void this.storage\n .renewCredentialMutation({\n ...credentialMutationFence(authorization),\n holderId: this.holderId,\n leaseDurationMs: this.leaseDurationMs,\n })\n .then((renewed) => {\n if (!renewed) controller.abort(createAmbiguousProviderOperationError())\n })\n .catch((error) =>\n controller.abort(createAmbiguousProviderOperationError({ cause: error }))\n )\n },\n Math.max(5, Math.floor(this.leaseDurationMs / 3))\n )\n\n const aborted = new Promise<never>((_resolve, reject) => {\n const rejectAborted = () => reject(abortReason(controller.signal))\n if (controller.signal.aborted) rejectAborted()\n else controller.signal.addEventListener(\"abort\", rejectAborted, { once: true })\n })\n const operation = Promise.resolve().then(() => {\n assertCredentialMutationOperationActive(controller.signal)\n return run(controller.signal)\n })\n operation.catch(() => {})\n try {\n return await Promise.race([operation, aborted])\n } finally {\n clearInterval(heartbeat)\n clearTimeout(timeout)\n hostSignal.removeEventListener(\"abort\", abortFromHost)\n }\n }\n\n private async requireAuthorization(\n connectorId: string,\n authorizationId: string\n ): Promise<ConnectorAuthorizationRecord> {\n const authorization = await withConnectorStorageBoundary(\n \"Connector authorization could not be read.\",\n () =>\n this.storage.getAuthorization({\n projectId: this.projectId,\n connectorId,\n authorizationId,\n })\n )\n if (!authorization) {\n throw createConnectorCodedError(\n \"connector.not_found\",\n \"Connector authorization was not found.\"\n )\n }\n return authorization\n }\n}\n\nexport function assertCredentialMutationOperationActive(signal: AbortSignal): void {\n if (signal.aborted) throw abortReason(signal)\n}\n\nexport function connectorAuthorizationStatusError(\n status: ConnectorAuthorizationRecord[\"status\"]\n): ReturnType<typeof createConnectorCodedError> {\n if (status === \"needs_reauthorization\") {\n return createConnectorCodedError(\n \"connector.authorization_required\",\n \"Connector credentials require reauthorization.\"\n )\n }\n if (status === \"pending_selection\") {\n return createConnectorCodedError(\n \"connector.authorization_required\",\n \"Connector authorization requires account selection.\"\n )\n }\n if (status === \"revocation_pending\") {\n return createConnectorCodedError(\n \"connector.authorization_required\",\n \"Connector authorization revocation is pending.\"\n )\n }\n return createConnectorCodedError(\n \"connector.authorization_required\",\n \"Connector authorization has been revoked.\"\n )\n}\n\nfunction credentialMutationFence(authorization: ConnectorAuthorizationRecord) {\n const mutation = authorization.credentialMutation\n if (!mutation) {\n throw createConnectorCodedError(\n \"internal.unexpected\",\n \"Connector credential mutation is missing.\"\n )\n }\n return {\n projectId: authorization.projectId,\n connectorId: authorization.connectorId,\n authorizationId: authorization.id,\n expectedRevision: authorization.revision,\n mutationId: mutation.id,\n }\n}\n\nfunction abortReason(signal: AbortSignal): Error {\n return signal.reason instanceof Error ? signal.reason : createAmbiguousProviderOperationError()\n}\n\nfunction staleReauthorizationError(): ReturnType<typeof createConnectorCodedError> {\n return createConnectorCodedError(\n \"connector.authorization_invalid\",\n \"Connector reauthorization attempt is stale; restart authorization.\"\n )\n}\n",
|
|
18
|
+
"import { createAmbiguousProviderOperationError } from \"../errors\"\n\nexport interface BoundedConnectorProviderOperationOptions {\n readonly hostSignal: AbortSignal\n readonly timeoutMs: number\n}\n\n/** Bound one provider call to both the current host lifetime and an explicit deadline. */\nexport async function runBoundedConnectorProviderOperation<T>(\n options: BoundedConnectorProviderOperationOptions,\n run: (signal: AbortSignal) => Promise<T> | T,\n interruptionError: () => Error = createAmbiguousProviderOperationError\n): Promise<T> {\n const controller = new AbortController()\n const abortFromHost = () => controller.abort(interruptionError())\n if (options.hostSignal.aborted) abortFromHost()\n else options.hostSignal.addEventListener(\"abort\", abortFromHost, { once: true })\n\n const timeout = setTimeout(() => controller.abort(interruptionError()), options.timeoutMs)\n const aborted = new Promise<never>((_resolve, reject) => {\n const rejectAborted = () => reject(abortReason(controller.signal))\n if (controller.signal.aborted) rejectAborted()\n else controller.signal.addEventListener(\"abort\", rejectAborted, { once: true })\n })\n const operation = Promise.resolve().then(() => {\n if (controller.signal.aborted) throw abortReason(controller.signal)\n return run(controller.signal)\n })\n operation.catch(() => {})\n\n try {\n return await Promise.race([operation, aborted])\n } finally {\n clearTimeout(timeout)\n options.hostSignal.removeEventListener(\"abort\", abortFromHost)\n }\n}\n\nfunction abortReason(signal: AbortSignal): Error {\n return signal.reason instanceof Error ? signal.reason : createAmbiguousProviderOperationError()\n}\n",
|
|
19
|
+
"import { storageBoundaryError } from \"../errors\"\n\n/** Converts raw connector-storage failures before they can cross a Core boundary. */\nexport async function withConnectorStorageBoundary<T>(\n message: string,\n operation: () => Promise<T>\n): Promise<T> {\n try {\n return await operation()\n } catch (error) {\n throw storageBoundaryError(error, message)\n }\n}\n",
|
|
20
|
+
"import type { ConnectorAuthorizationRecord, ConnectorConnectionStorage } from \"../../storage\"\nimport { createConnectorCodedError, oauthErrorKind, recoverConnectorFailure } from \"../errors\"\nimport type {\n ConnectorAccessToken,\n ConnectorDefinition,\n ConnectorOAuthCredentials,\n ConnectorTokenSource,\n OAuthConnectorAdapter,\n} from \"../types\"\nimport type { ConnectorCredentialCodec } from \"./credential-codec\"\nimport {\n assertCredentialMutationOperationActive,\n type ConnectorCredentialMutationCoordinator,\n connectorAuthorizationStatusError,\n} from \"./credential-mutations\"\nimport { withConnectorStorageBoundary } from \"./storage-boundary\"\nimport { nonNegativeDuration, shouldRefresh, tokenView, validateCredentials } from \"./validation\"\n\ntype OAuthConnectorDefinition = ConnectorDefinition<string, OAuthConnectorAdapter>\n\nexport interface ConnectorTokenAccessOptions {\n readonly projectId: string\n readonly storage: ConnectorConnectionStorage\n readonly credentials: ConnectorCredentialCodec\n readonly mutations: ConnectorCredentialMutationCoordinator\n readonly refreshSkewMs: number\n readonly now: () => Date\n}\n\n/** Owns revision-aware access-token delivery and refresh. */\nexport class ConnectorTokenAccess {\n private readonly projectId: string\n private readonly storage: ConnectorConnectionStorage\n private readonly credentials: ConnectorCredentialCodec\n private readonly mutations: ConnectorCredentialMutationCoordinator\n private readonly refreshSkewMs: number\n private readonly now: () => Date\n\n constructor(options: ConnectorTokenAccessOptions) {\n this.projectId = options.projectId\n this.storage = options.storage\n this.credentials = options.credentials\n this.mutations = options.mutations\n this.refreshSkewMs = nonNegativeDuration(options.refreshSkewMs, \"refresh skew\")\n this.now = options.now\n }\n\n requireStableActiveAuthorization(\n definition: OAuthConnectorDefinition,\n authorizationId: string\n ): Promise<ConnectorAuthorizationRecord> {\n return this.mutations.requireStableActiveAuthorization(definition.id, authorizationId)\n }\n\n createTokenSource(\n definition: OAuthConnectorDefinition,\n authorizationId: string\n ): ConnectorTokenSource {\n return new RevisionAwareConnectorTokenSource((rejectedRevision) =>\n this.getAccessToken(definition, authorizationId, rejectedRevision)\n )\n }\n\n private open(\n connectorId: string,\n authorization: ConnectorAuthorizationRecord\n ): Promise<ConnectorOAuthCredentials> {\n if (!authorization.credentials) {\n throw createConnectorCodedError(\n \"connector.credentials_unavailable\",\n \"Stored connector credentials are unavailable.\"\n )\n }\n return this.credentials.open(connectorId, authorization.id, authorization.credentials)\n }\n\n private async getAccessToken(\n definition: OAuthConnectorDefinition,\n authorizationId: string,\n rejectedRevision?: number\n ): Promise<{\n readonly token: { readonly accessToken: string; readonly tokenType?: string }\n readonly revision: number\n }> {\n let authorization = await this.mutations.requireStableActiveAuthorization(\n definition.id,\n authorizationId\n )\n const credentials = await this.open(definition.id, authorization)\n const refreshRejectedToken =\n rejectedRevision !== undefined && rejectedRevision === authorization.revision\n if (refreshRejectedToken || shouldRefresh(authorization, this.now(), this.refreshSkewMs)) {\n authorization = await this.refreshAuthorization(definition, authorization)\n const refreshed = await this.open(definition.id, authorization)\n return { token: tokenView(refreshed), revision: authorization.revision }\n }\n return { token: tokenView(credentials), revision: authorization.revision }\n }\n\n private async refreshAuthorization(\n definition: OAuthConnectorDefinition,\n initial: ConnectorAuthorizationRecord\n ): Promise<ConnectorAuthorizationRecord> {\n return this.mutations.runLocallySerialized(initial.id, async () => {\n let authorization = await this.mutations.requireStableActiveAuthorization(\n definition.id,\n initial.id\n )\n if (authorization.revision !== initial.revision) return authorization\n authorization = await this.mutations.prepareAuthorizationForMutation(\n definition.id,\n authorization,\n \"refresh\"\n )\n if (authorization.revision !== initial.revision) return authorization\n const claimOutcome = await this.mutations.claimCredentialMutation(\n definition.id,\n authorization,\n \"refresh\"\n )\n if (claimOutcome.type === \"superseded\") return claimOutcome.authorization\n const { claim } = claimOutcome\n\n let current: ConnectorOAuthCredentials\n try {\n current = await this.open(definition.id, claim.authorization)\n } catch (error) {\n await recoverConnectorFailure(\n error,\n \"Connector credential mutation could not be released after credential decryption failed.\",\n () => this.mutations.releaseCredentialMutation(claim.authorization)\n )\n throw createConnectorCodedError(\n \"connector.credentials_unavailable\",\n \"Stored connector credentials could not be opened.\",\n { cause: error }\n )\n }\n if (!current.refreshToken) {\n const error = createConnectorCodedError(\n \"connector.authorization_required\",\n \"Connector credentials require reauthorization.\"\n )\n await recoverConnectorFailure(\n error,\n \"Connector authorization could not be marked for reauthorization after finding no refresh token.\",\n () => this.mutations.markNeedsReauthorization(claim.authorization)\n )\n throw error\n }\n\n try {\n await this.mutations.executeCredentialMutation(\n claim.authorization,\n async (executing, signal) => {\n const refreshed = validateCredentials(\n await definition.adapter.authentication.refresh(\n this.adapterContext(definition.id, signal),\n current\n )\n )\n assertCredentialMutationOperationActive(signal)\n const normalized = {\n ...refreshed,\n ...(refreshed.refreshToken === undefined\n ? { refreshToken: current.refreshToken }\n : {}),\n ...(refreshed.tokenType === undefined && current.tokenType !== undefined\n ? { tokenType: current.tokenType }\n : {}),\n scopes: refreshed.scopes ?? current.scopes ?? authorization.scopes,\n ...(refreshed.authorizationContext === undefined &&\n current.authorizationContext !== undefined\n ? { authorizationContext: current.authorizationContext }\n : {}),\n } satisfies ConnectorOAuthCredentials\n const envelope = await this.credentials.seal(\n definition.id,\n authorization.id,\n normalized\n )\n return this.mutations.stageCredentialMutationCredentials(executing, signal, {\n credentials: envelope,\n ...(normalized.expiresAt === undefined\n ? {}\n : { credentialExpiresAt: normalized.expiresAt }),\n scopes: normalized.scopes,\n })\n }\n )\n } catch (error) {\n const latest = await recoverConnectorFailure(\n error,\n \"Connector refresh outcome could not be recovered from storage.\",\n () => this.requireAuthorization(definition.id, authorization.id)\n )\n if (this.mutations.isStagedMutation(latest, claim.authorization, \"refresh\")) {\n return recoverConnectorFailure(\n error,\n \"Staged connector refresh could not be finalized during recovery.\",\n () => this.mutations.finalizeStagedMutation(latest)\n )\n }\n if (oauthErrorKind(error) === \"retryable\") {\n await recoverConnectorFailure(\n error,\n \"Connector refresh mutation could not be released after a retryable provider failure.\",\n () => this.mutations.releaseCredentialMutation(claim.authorization)\n )\n throw createConnectorCodedError(\n \"connector.provider_unavailable\",\n \"Connector credential refresh failed; retry later.\",\n { cause: error }\n )\n }\n const marked = await recoverConnectorFailure(\n error,\n \"Connector authorization could not be failed closed after an ambiguous refresh.\",\n () => this.mutations.markNeedsReauthorization(claim.authorization)\n )\n if (marked) {\n throw createConnectorCodedError(\n \"connector.authorization_required\",\n \"Connector credentials require reauthorization.\",\n { cause: error }\n )\n }\n const recovered = await recoverConnectorFailure(\n error,\n \"Connector refresh state could not be reloaded after failed closed recovery.\",\n () => this.requireAuthorization(definition.id, authorization.id)\n )\n if (recovered.revision !== authorization.revision && recovered.status === \"active\") {\n return recovered\n }\n throw connectorAuthorizationStatusError(recovered.status)\n }\n\n const staged = await this.requireAuthorization(definition.id, authorization.id)\n return this.mutations.finalizeStagedMutation(staged)\n })\n }\n\n private async requireAuthorization(\n connectorId: string,\n authorizationId: string\n ): Promise<ConnectorAuthorizationRecord> {\n const authorization = await withConnectorStorageBoundary(\n \"Connector authorization could not be read.\",\n () =>\n this.storage.getAuthorization({\n projectId: this.projectId,\n connectorId,\n authorizationId,\n })\n )\n if (!authorization) {\n throw createConnectorCodedError(\n \"connector.not_found\",\n \"Connector authorization was not found.\"\n )\n }\n return authorization\n }\n\n private adapterContext(connectorId: string, signal: AbortSignal) {\n return { projectId: this.projectId, connectorId, signal }\n }\n}\n\nclass RevisionAwareConnectorTokenSource implements ConnectorTokenSource {\n private rejectedRevision: number | undefined\n\n constructor(\n private readonly resolveToken: (rejectedRevision?: number) => Promise<{\n readonly token: { readonly accessToken: string; readonly tokenType?: string }\n readonly revision: number\n }>\n ) {}\n\n async get(): Promise<ConnectorAccessToken> {\n const consumedRejection = this.rejectedRevision\n const result = await this.resolveToken(consumedRejection)\n if (this.rejectedRevision === consumedRejection) this.rejectedRevision = undefined\n\n let invalidated = false\n return Object.freeze({\n ...result.token,\n invalidate: () => {\n if (invalidated) return\n invalidated = true\n this.rejectedRevision = Math.max(this.rejectedRevision ?? -1, result.revision)\n },\n })\n }\n}\n",
|
|
21
|
+
"import { AuthorizationError } from \"../../authorization\"\nimport type { AuthorizablePrincipal } from \"../../execution\"\nimport { ConnectorConnectionStorageError } from \"../../storage\"\nimport type { CreateExecutionInput, ExecutionRecord } from \"../../storage/executions\"\n\nexport interface ConnectorConnectionCommandActor {\n readonly principal: AuthorizablePrincipal\n readonly credential:\n | { readonly type: \"session\"; readonly id: string }\n | { readonly type: \"accessToken\"; readonly id: string }\n}\n\n/** Validate and recover the authenticated actor carried by one durable request execution. */\nexport function requireConnectorConnectionCommandActor(\n execution: CreateExecutionInput,\n projectId: string\n): ConnectorConnectionCommandActor {\n const actor = connectorConnectionActorFromExecution(execution, projectId)\n if (actor) return actor\n\n throw new AuthorizationError(\n \"manage:connector\",\n \"[Sixb] Connector connection commands require an authenticated request execution.\"\n )\n}\n\n/**\n * Bind an OAuth callback to the same principal and credential that initiated its attempt.\n *\n * The storage error intentionally shares the regular invalid-attempt path: callers must not learn\n * whether a valid state belongs to another authenticated actor.\n */\nexport function assertConnectorAuthorizationAttemptInitiator(\n execution: ExecutionRecord | null,\n current: ConnectorConnectionCommandActor\n): asserts execution is ExecutionRecord {\n const initiating = execution\n ? connectorConnectionActorFromExecution(execution, execution.projectId)\n : null\n if (!initiating || !sameConnectorConnectionCommandActor(initiating, current)) {\n throw new ConnectorConnectionStorageError(\n \"attempt_invalid\",\n \"[Sixb] Connector authorization attempt is invalid, expired, or already used.\"\n )\n }\n}\n\nexport function assertConnectorConnectionRunInitiator(\n execution: ExecutionRecord | null,\n current: ConnectorConnectionCommandActor,\n connectorId: string\n): asserts execution is ExecutionRecord {\n const initiating = execution\n ? connectorConnectionActorFromExecution(execution, execution.projectId)\n : null\n if (!initiating || !sameConnectorConnectionCommandActor(initiating, current)) {\n throw new AuthorizationError(\n `connection-run:connector:${connectorId}`,\n \"[Sixb] This connector connection run can only be accessed by its initiating actor.\"\n )\n }\n}\n\nfunction connectorConnectionActorFromExecution(\n execution: CreateExecutionInput | ExecutionRecord,\n projectId: string\n): ConnectorConnectionCommandActor | null {\n const authorization = execution.authorizationRef\n if (\n execution.projectId !== projectId ||\n execution.executor.type !== \"request\" ||\n execution.source.type !== \"http\" ||\n execution.executor.requestId !== execution.source.requestId ||\n authorization.type !== \"principal\" ||\n authorization.credential === undefined ||\n execution.requestedBy?.type !== authorization.principal.type ||\n execution.requestedBy.id !== authorization.principal.id\n ) {\n return null\n }\n\n return {\n principal: authorization.principal,\n credential: authorization.credential,\n }\n}\n\nfunction sameConnectorConnectionCommandActor(\n left: ConnectorConnectionCommandActor,\n right: ConnectorConnectionCommandActor\n): boolean {\n return (\n left.principal.type === right.principal.type &&\n left.principal.id === right.principal.id &&\n left.credential.type === right.credential.type &&\n left.credential.id === right.credential.id\n )\n}\n",
|
|
22
|
+
"import { createHash, randomBytes, randomUUID } from \"node:crypto\"\nimport type { AuthorizablePrincipal } from \"../../execution\"\nimport { ensureExecutionRecord } from \"../../execution/durable\"\nimport type {\n ConnectorAuthorizationAttemptRecord,\n ConnectorAuthorizationRecord,\n ConnectorConnectionRecord,\n ConnectorConnectionStorage,\n CreateConnectorAuthorizationAttemptInput,\n Storage,\n} from \"../../storage\"\nimport type { ConnectorCredentialProtector } from \"../credentials\"\nimport {\n createConnectorCodedError,\n isConnectorStorageError,\n providerBoundaryError,\n providerFailureCode,\n storageBoundaryError,\n} from \"../errors\"\nimport type { ConnectorDefinition, OAuthConnectorAdapter } from \"../types\"\nimport {\n assertConnectorAuthorizationAttemptInitiator,\n type ConnectorConnectionCommandActor,\n requireConnectorConnectionCommandActor,\n} from \"./command-context\"\nimport type {\n CompleteConnectorAuthorizationInput,\n CompleteConnectorAuthorizationResult,\n ConnectorConnectionCommandContext,\n ConnectorConnectionView,\n StartConnectorAuthorizationInput,\n StartConnectorAuthorizationResult,\n} from \"./contracts\"\nimport { runBoundedConnectorProviderOperation } from \"./provider-operation\"\nimport {\n assertAuthorizationUrlParameters,\n connectorPkceEnabled,\n hashSecret,\n nonblank,\n normalizedHttpUrl,\n parseAttemptId,\n positiveDuration,\n selectCallbackParameters,\n validateCallbackParameterNames,\n} from \"./validation\"\nimport { assertConnectorConnectionSelector, connectorConnectionView } from \"./views\"\n\nconst textEncoder = new TextEncoder()\nconst textDecoder = new TextDecoder()\n\ntype OAuthConnectorDefinition = ConnectorDefinition<string, OAuthConnectorAdapter>\n\nexport type ResolveOAuthConnectorDefinition = (connectorId: string) => OAuthConnectorDefinition\n\nexport interface PrepareConnectorReauthorizationInput {\n readonly definition: OAuthConnectorDefinition\n readonly authorizationId: string\n readonly principal: AuthorizablePrincipal\n}\n\nexport interface PreparedConnectorReauthorization {\n readonly authorization: ConnectorAuthorizationRecord\n readonly connections: readonly ConnectorConnectionRecord[]\n}\n\nexport interface CompleteNewConnectorAuthorizationInput {\n readonly definition: OAuthConnectorDefinition\n readonly principal: AuthorizablePrincipal\n readonly code: string\n readonly codeVerifier?: string\n readonly redirectUri: string\n readonly callbackParameters?: Readonly<Record<string, string>>\n /** Called immediately after the encrypted grant is durable, before account discovery. */\n readonly onAuthorizationPersisted?: (authorization: ConnectorAuthorizationRecord) => Promise<void>\n}\n\nexport interface CompleteConnectorReauthorizationInput\n extends CompleteNewConnectorAuthorizationInput {\n readonly authorizationId: string\n readonly expectedRevision: number\n readonly expectedConnectionIds: readonly string[]\n}\n\n/** Grant lifecycle required after an OAuth request has proved its state and initiating actor. */\nexport interface ConnectorAuthorizationLifecycle {\n prepareReauthorization(\n input: PrepareConnectorReauthorizationInput\n ): Promise<PreparedConnectorReauthorization>\n completeNewAuthorization(\n input: CompleteNewConnectorAuthorizationInput\n ): Promise<ConnectorAuthorizationRecord>\n completeReauthorization(\n input: CompleteConnectorReauthorizationInput\n ): Promise<ConnectorAuthorizationRecord>\n}\n\nexport interface ConnectorAuthorizationRequestHandlerOptions {\n readonly projectId: string\n readonly storage: Storage\n readonly credentialProtector: ConnectorCredentialProtector\n readonly authorizationAttemptTtlMs: number\n readonly providerOperationTimeoutMs: number\n readonly resolveDefinition: ResolveOAuthConnectorDefinition\n readonly lifecycle: ConnectorAuthorizationLifecycle\n /** Returns the current host signal; the host may replace its controller after closing. */\n readonly hostSignal: () => AbortSignal\n}\n\nexport interface PreparedConnectorAuthorizationRequest {\n readonly definition: OAuthConnectorDefinition\n readonly actor: ConnectorConnectionCommandActor\n readonly state: string\n readonly authorizationUrl: string\n readonly attempt: CreateConnectorAuthorizationAttemptInput\n readonly affectedConnections: readonly ConnectorConnectionView[]\n}\n\n/** Owns OAuth request state, PKCE, callback binding, and durable attempt provenance. */\nexport class ConnectorAuthorizationRequestHandler {\n private readonly projectId: string\n private readonly storage: Storage\n private readonly credentialProtector: ConnectorCredentialProtector\n private readonly authorizationAttemptTtlMs: number\n private readonly providerOperationTimeoutMs: number\n private readonly resolveDefinition: ResolveOAuthConnectorDefinition\n private readonly lifecycle: ConnectorAuthorizationLifecycle\n private readonly hostSignal: () => AbortSignal\n\n constructor(options: ConnectorAuthorizationRequestHandlerOptions) {\n this.projectId = options.projectId\n this.storage = options.storage\n this.credentialProtector = options.credentialProtector\n this.authorizationAttemptTtlMs = positiveDuration(\n options.authorizationAttemptTtlMs,\n \"authorization attempt TTL\"\n )\n this.providerOperationTimeoutMs = positiveDuration(\n options.providerOperationTimeoutMs,\n \"provider operation timeout\"\n )\n this.resolveDefinition = options.resolveDefinition\n this.lifecycle = options.lifecycle\n this.hostSignal = options.hostSignal\n }\n\n async startAuthorization(\n command: ConnectorConnectionCommandContext,\n connectorId: string,\n input: StartConnectorAuthorizationInput\n ): Promise<StartConnectorAuthorizationResult> {\n const prepared = await this.prepareAuthorizationRequest(command, connectorId, input)\n\n try {\n await this.storage.transaction(\n async (tx) => {\n await ensureExecutionRecord(tx.executions, command.execution)\n await requireConnectorConnectionStorage(tx).createAuthorizationAttempt(prepared.attempt)\n },\n { isolation: \"serializable\" }\n )\n } catch (error) {\n throw storageBoundaryError(error, \"Connector authorization attempt could not be persisted.\")\n }\n\n return {\n authorizationUrl: prepared.authorizationUrl,\n affectedConnections: prepared.affectedConnections,\n }\n }\n\n async prepareAuthorizationRequest(\n command: ConnectorConnectionCommandContext,\n connectorId: string,\n input: StartConnectorAuthorizationInput\n ): Promise<PreparedConnectorAuthorizationRequest> {\n const definition = this.resolveDefinition(nonblank(connectorId, \"connector id\"))\n const actor = requireConnectorConnectionCommandActor(command.execution, this.projectId)\n assertConnectorConnectionSelector(input)\n validateCallbackParameterNames(definition.adapter.authentication.callbackParameters)\n const redirectUri = normalizedHttpUrl(input.redirectUri, \"OAuth callback URL\")\n const reauthorization = await this.prepareReauthorization(\n definition,\n actor,\n input.reauthorizationId\n )\n\n const attemptId = `cat_${randomUUID()}`\n const state = `${attemptId}.${randomBytes(32).toString(\"base64url\")}`\n const codeVerifier = connectorPkceEnabled(definition.adapter.authentication.pkce)\n ? randomBytes(32).toString(\"base64url\")\n : undefined\n const codeChallenge =\n codeVerifier === undefined\n ? undefined\n : createHash(\"sha256\").update(codeVerifier).digest(\"base64url\")\n let authorizationUrlInput: string | URL\n try {\n authorizationUrlInput = await runBoundedConnectorProviderOperation(\n {\n hostSignal: this.hostSignal(),\n timeoutMs: this.providerOperationTimeoutMs,\n },\n (signal) =>\n definition.adapter.authentication.authorizationUrl(\n {\n projectId: this.projectId,\n connectorId: definition.id,\n redirectUri,\n signal,\n },\n {\n state,\n ...(codeChallenge === undefined\n ? {}\n : { codeChallenge, codeChallengeMethod: \"S256\" }),\n }\n ),\n () =>\n createConnectorCodedError(\n \"connector.provider_unavailable\",\n \"Connector authorization URL generation did not complete.\"\n )\n )\n } catch (error) {\n throw providerBoundaryError(\n error,\n providerFailureCode(error),\n \"Connector authorization could not be started.\"\n )\n }\n\n const authorizationUrl = normalizedHttpUrl(\n authorizationUrlInput,\n \"provider authorization URL\",\n \"connector.adapter_invalid\"\n )\n assertAuthorizationUrlParameters(authorizationUrl, { state, codeChallenge })\n const codeVerifierEnvelope =\n codeVerifier === undefined\n ? undefined\n : await this.credentialProtector.seal(textEncoder.encode(codeVerifier), {\n projectId: this.projectId,\n connectorId: definition.id,\n recordId: attemptId,\n purpose: \"pkce-verifier\",\n })\n\n return {\n definition,\n actor,\n state,\n authorizationUrl,\n attempt: {\n id: attemptId,\n projectId: this.projectId,\n connectorId: definition.id,\n owner: input.owner,\n slot: input.slot,\n initiatedByExecutionId: command.execution.id,\n stateHash: hashSecret(state),\n ...(codeVerifierEnvelope === undefined ? {} : { codeVerifier: codeVerifierEnvelope }),\n redirectUri,\n ...(reauthorization === undefined\n ? {}\n : {\n reauthorizationId: reauthorization.authorization.id,\n reauthorizationRevision: reauthorization.authorization.revision,\n reauthorizationConnectionIds: reauthorization.connectionIds,\n }),\n ttlMs: this.authorizationAttemptTtlMs,\n },\n affectedConnections: reauthorization?.affectedConnections ?? [],\n }\n }\n\n async completeAuthorization(\n command: ConnectorConnectionCommandContext,\n connectorId: string,\n input: CompleteConnectorAuthorizationInput\n ): Promise<CompleteConnectorAuthorizationResult> {\n const definition = this.resolveDefinition(nonblank(connectorId, \"connector id\"))\n const actor = requireConnectorConnectionCommandActor(command.execution, this.projectId)\n const state = nonblank(input.state, \"OAuth state\", \"connector.authorization_invalid\")\n const code = nonblank(input.code, \"OAuth authorization code\", \"connector.authorization_invalid\")\n const redirectUri = normalizedHttpUrl(input.redirectUri, \"OAuth callback URL\")\n const attempt = await this.consumeAuthorizationAttempt(definition.id, actor, state, redirectUri)\n const completed = await this.completeAuthorizationAttempt({\n definition,\n attempt,\n principal: actor.principal,\n code,\n redirectUri,\n callbackParameters: input.callbackParameters,\n })\n\n return {\n authorizationId: completed.id,\n owner: attempt.owner,\n slot: attempt.slot,\n accounts: completed.accounts,\n }\n }\n\n async completeAuthorizationAttempt(input: {\n readonly definition: OAuthConnectorDefinition\n readonly attempt: ConnectorAuthorizationAttemptRecord\n readonly principal: AuthorizablePrincipal\n readonly code: string\n readonly redirectUri: string\n readonly callbackParameters?: Readonly<Record<string, string | readonly string[]>>\n readonly onAuthorizationPersisted?: (\n authorization: ConnectorAuthorizationRecord\n ) => Promise<void>\n }): Promise<ConnectorAuthorizationRecord> {\n const enabled = connectorPkceEnabled(input.definition.adapter.authentication.pkce)\n if (enabled !== (input.attempt.codeVerifier !== undefined)) {\n throw createConnectorCodedError(\n \"connector.authorization_invalid\",\n \"OAuth connector PKCE configuration changed; restart authorization.\"\n )\n }\n const verifierBytes =\n input.attempt.codeVerifier === undefined\n ? undefined\n : await this.credentialProtector.open(input.attempt.codeVerifier, {\n projectId: this.projectId,\n connectorId: input.definition.id,\n recordId: input.attempt.id,\n purpose: \"pkce-verifier\",\n })\n return this.completeGrant({\n ...input,\n callbackParameters: selectCallbackParameters(\n input.definition.adapter.authentication.callbackParameters,\n input.callbackParameters\n ),\n ...(verifierBytes === undefined ? {} : { codeVerifier: textDecoder.decode(verifierBytes) }),\n })\n }\n\n private async prepareReauthorization(\n definition: OAuthConnectorDefinition,\n actor: ConnectorConnectionCommandActor,\n reauthorizationId: string | undefined\n ): Promise<\n | {\n readonly authorization: ConnectorAuthorizationRecord\n readonly connectionIds: readonly string[]\n readonly affectedConnections: readonly ConnectorConnectionView[]\n }\n | undefined\n > {\n if (reauthorizationId === undefined) return undefined\n\n const prepared = await this.lifecycle.prepareReauthorization({\n definition,\n authorizationId: nonblank(reauthorizationId, \"reauthorization id\"),\n principal: actor.principal,\n })\n const connectionIds = prepared.connections.map((connection) => connection.id).sort()\n return {\n authorization: prepared.authorization,\n connectionIds,\n affectedConnections: prepared.connections.map((connection) =>\n connectorConnectionView(connection, prepared.authorization.status)\n ),\n }\n }\n\n private async consumeAuthorizationAttempt(\n connectorId: string,\n actor: ConnectorConnectionCommandActor,\n state: string,\n redirectUri: string\n ): Promise<ConnectorAuthorizationAttemptRecord> {\n const attemptId = parseAttemptId(state)\n let outcome:\n | { readonly type: \"consumed\"; readonly attempt: ConnectorAuthorizationAttemptRecord }\n | { readonly type: \"invalid\"; readonly cause: unknown }\n try {\n outcome = await this.storage.transaction(\n async (tx) => {\n let attempt: ConnectorAuthorizationAttemptRecord\n try {\n attempt = await requireConnectorConnectionStorage(tx).consumeAuthorizationAttempt({\n id: attemptId,\n projectId: this.projectId,\n connectorId,\n stateHash: hashSecret(state),\n redirectUri,\n })\n } catch (error) {\n if (isConnectorStorageError(error, \"attempt_invalid\")) {\n return { type: \"invalid\", cause: error } as const\n }\n throw error\n }\n const initiator = await tx.executions.getById({\n projectId: this.projectId,\n id: attempt.initiatedByExecutionId,\n })\n assertConnectorAuthorizationAttemptInitiator(initiator, actor)\n return { type: \"consumed\", attempt } as const\n },\n { isolation: \"serializable\" }\n )\n } catch (error) {\n if (isConnectorStorageError(error, \"attempt_invalid\")) {\n throw createConnectorCodedError(\n \"connector.authorization_invalid\",\n \"Connector authorization attempt is invalid, expired, or already used.\",\n { cause: error }\n )\n }\n throw storageBoundaryError(error, \"Connector authorization attempt could not be consumed.\")\n }\n\n if (outcome.type === \"invalid\") {\n throw createConnectorCodedError(\n \"connector.authorization_invalid\",\n \"Connector authorization attempt is invalid, expired, or already used.\",\n { cause: outcome.cause }\n )\n }\n return outcome.attempt\n }\n\n private completeGrant(input: {\n readonly definition: OAuthConnectorDefinition\n readonly attempt: ConnectorAuthorizationAttemptRecord\n readonly principal: AuthorizablePrincipal\n readonly code: string\n readonly codeVerifier?: string\n readonly redirectUri: string\n readonly callbackParameters: Readonly<Record<string, string>>\n readonly onAuthorizationPersisted?: (\n authorization: ConnectorAuthorizationRecord\n ) => Promise<void>\n }): Promise<ConnectorAuthorizationRecord> {\n if (input.attempt.reauthorizationId === undefined) {\n return this.lifecycle.completeNewAuthorization({\n definition: input.definition,\n principal: input.principal,\n code: input.code,\n codeVerifier: input.codeVerifier,\n callbackParameters: input.callbackParameters,\n redirectUri: input.redirectUri,\n ...(input.onAuthorizationPersisted === undefined\n ? {}\n : { onAuthorizationPersisted: input.onAuthorizationPersisted }),\n })\n }\n\n const expectedRevision = input.attempt.reauthorizationRevision\n if (expectedRevision === undefined) {\n throw createConnectorCodedError(\n \"internal.unexpected\",\n \"Connector reauthorization attempt is missing its revision.\"\n )\n }\n return this.lifecycle.completeReauthorization({\n definition: input.definition,\n authorizationId: input.attempt.reauthorizationId,\n expectedRevision,\n expectedConnectionIds: input.attempt.reauthorizationConnectionIds ?? [],\n principal: input.principal,\n code: input.code,\n codeVerifier: input.codeVerifier,\n callbackParameters: input.callbackParameters,\n redirectUri: input.redirectUri,\n })\n }\n}\n\nfunction requireConnectorConnectionStorage(storage: Storage): ConnectorConnectionStorage {\n if (storage.connectorConnections) return storage.connectorConnections\n throw createConnectorCodedError(\n \"internal.unexpected\",\n \"Connector connection storage is unavailable inside the storage transaction.\"\n )\n}\n",
|
|
23
|
+
"import type { ConnectorAuthorizationRecord, ConnectorConnectionRecord } from \"../../storage\"\nimport { createConnectorCodedError } from \"../errors\"\nimport type { ConnectorConnectionSelector } from \"../types\"\nimport type { ConnectorConnectionView } from \"./contracts\"\nimport { nonblank } from \"./validation\"\n\n/** V1 accepts only project-owned slots; future owner kinds remain explicit extensions. */\nexport function assertConnectorConnectionSelector(selector: ConnectorConnectionSelector): void {\n if (selector.owner.type !== \"project\") {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n \"Connector connections only support project ownership in V1.\"\n )\n }\n nonblank(selector.slot, \"connection slot\")\n}\n\nexport function connectorConnectionView(\n connection: ConnectorConnectionRecord,\n status: ConnectorAuthorizationRecord[\"status\"]\n): ConnectorConnectionView {\n return {\n id: connection.id,\n connectorId: connection.connectorId,\n owner: connection.owner,\n slot: connection.slot,\n account: connection.account,\n status:\n connection.status === \"disconnected\" ||\n status === \"revoked\" ||\n status === \"revocation_pending\"\n ? \"disconnected\"\n : status === \"active\"\n ? \"connected\"\n : \"needs_reauthorization\",\n }\n}\n",
|
|
24
|
+
"import { randomBytes, randomUUID } from \"node:crypto\"\nimport { captureSixbFailure, isSixbError } from \"../../errors/internal\"\nimport { ensureExecutionRecord } from \"../../execution/durable\"\nimport {\n CONNECTOR_CONNECTION_RUN_FAILURE_CODES,\n type ConnectorAuthorizationRecord,\n type ConnectorConnectionRunProcessingRecord,\n type ConnectorConnectionRunRecord,\n type ConnectorConnectionStorage,\n type Storage,\n} from \"../../storage\"\nimport { createConnectorCodedError, isConnectorStorageError, storageBoundaryError } from \"../errors\"\nimport {\n assertConnectorAuthorizationActor,\n type DefaultConnectorAuthorizationLifecycle,\n} from \"./authorizations\"\nimport {\n assertConnectorConnectionRunInitiator,\n requireConnectorConnectionCommandActor,\n} from \"./command-context\"\nimport type {\n CompleteConnectorConnectionRunInput,\n CompleteConnectorConnectionRunResult,\n ConnectorConnectionCommandContext,\n ConnectorConnectionRunView,\n SelectConnectorConnectionRunAccountInput,\n StartConnectorConnectionRunInput,\n StartConnectorConnectionRunResult,\n} from \"./contracts\"\nimport type {\n ConnectorAuthorizationRequestHandler,\n ResolveOAuthConnectorDefinition,\n} from \"./request\"\nimport { withConnectorStorageBoundary } from \"./storage-boundary\"\nimport {\n hashSecret,\n nonblank,\n normalizedHttpUrl,\n parseAttemptId,\n positiveDuration,\n} from \"./validation\"\nimport { connectorConnectionView } from \"./views\"\n\nconst CLEANUP_RETRY_DELAY_MS = 30_000\nconst MAX_TIMER_DELAY_MS = 2_147_483_647\n\nexport interface ConnectorConnectionRunServiceOptions {\n readonly projectId: string\n readonly storage: Storage\n readonly requestHandler: ConnectorAuthorizationRequestHandler\n readonly authorizations: DefaultConnectorAuthorizationLifecycle\n readonly resolveDefinition: ResolveOAuthConnectorDefinition\n readonly processingTtlMs: number\n readonly selectionTtlMs: number\n readonly now: () => Date\n}\n\n/** Durable orchestration for the user-visible connector connection flow. */\nexport class ConnectorConnectionRunService {\n private readonly projectId: string\n private readonly storage: Storage\n private readonly connectionStorage: ConnectorConnectionStorage\n private readonly requests: ConnectorAuthorizationRequestHandler\n private readonly authorizations: DefaultConnectorAuthorizationLifecycle\n private readonly resolveDefinition: ResolveOAuthConnectorDefinition\n private readonly processingTtlMs: number\n private readonly selectionTtlMs: number\n private readonly now: () => Date\n private readonly maintenanceTimers = new Map<string, ReturnType<typeof setTimeout>>()\n\n constructor(options: ConnectorConnectionRunServiceOptions) {\n this.projectId = options.projectId\n this.storage = options.storage\n this.connectionStorage = requireConnectorConnectionStorage(options.storage)\n this.requests = options.requestHandler\n this.authorizations = options.authorizations\n this.resolveDefinition = options.resolveDefinition\n this.processingTtlMs = positiveDuration(\n options.processingTtlMs,\n \"connection run processing TTL\"\n )\n this.selectionTtlMs = positiveDuration(options.selectionTtlMs, \"account selection TTL\")\n this.now = options.now\n }\n\n async startSelection(\n command: ConnectorConnectionCommandContext,\n connectorId: string,\n input: {\n readonly owner: StartConnectorConnectionRunInput[\"owner\"]\n readonly slot: string\n readonly authorizationId: string\n }\n ): Promise<ConnectorConnectionRunView> {\n const runId = `ccr_${randomUUID()}`\n let run: ConnectorConnectionRunRecord\n try {\n run = await this.storage.transaction(\n async (tx) => {\n await ensureExecutionRecord(tx.executions, command.execution)\n return requireConnectorConnectionStorage(tx).createConnectionSelectionRun({\n id: runId,\n projectId: this.projectId,\n connectorId,\n owner: input.owner,\n slot: input.slot,\n initiatedByExecutionId: command.execution.id,\n authorizationId: input.authorizationId,\n ttlMs: this.selectionTtlMs,\n })\n },\n { isolation: \"serializable\" }\n )\n } catch (error) {\n throw storageBoundaryError(error, \"Connector account-selection run could not be persisted.\")\n }\n this.scheduleRunMaintenance(run, this.selectionTtlMs + 1)\n return this.view(run)\n }\n\n async start(\n command: ConnectorConnectionCommandContext,\n connectorId: string,\n input: StartConnectorConnectionRunInput\n ): Promise<StartConnectorConnectionRunResult> {\n const returnTo = normalizedHttpUrl(input.returnTo, \"connector return URL\")\n const prepared = await this.requests.prepareAuthorizationRequest(command, connectorId, input)\n const runId = `ccr_${randomUUID()}`\n const callbackBinding = randomBytes(32).toString(\"base64url\")\n\n let expiresAt: Date\n try {\n expiresAt = await this.storage.transaction(\n async (tx) => {\n await ensureExecutionRecord(tx.executions, command.execution)\n const connections = requireConnectorConnectionStorage(tx)\n await connections.createConnectionRun({\n id: runId,\n projectId: this.projectId,\n connectorId: prepared.definition.id,\n kind: prepared.attempt.reauthorizationId === undefined ? \"connect\" : \"reauthorize\",\n owner: prepared.attempt.owner,\n slot: prepared.attempt.slot,\n initiatedByExecutionId: command.execution.id,\n ttlMs: prepared.attempt.ttlMs,\n })\n const attempt = await connections.createAuthorizationAttempt({\n ...prepared.attempt,\n connectionRunId: runId,\n returnTo,\n callbackBindingHash: hashSecret(callbackBinding),\n })\n return attempt.expiresAt\n },\n { isolation: \"serializable\" }\n )\n } catch (error) {\n throw storageBoundaryError(error, \"Connector connection run could not be persisted.\")\n }\n\n return {\n runId,\n authorizationUrl: prepared.authorizationUrl,\n affectedConnections: prepared.affectedConnections,\n callbackBinding: {\n attemptId: prepared.attempt.id,\n secret: callbackBinding,\n expiresAt,\n },\n }\n }\n\n async complete(\n input: CompleteConnectorConnectionRunInput\n ): Promise<CompleteConnectorConnectionRunResult> {\n const state = nonblank(input.state, \"OAuth state\", \"connector.authorization_invalid\")\n const redirectUri = normalizedHttpUrl(input.redirectUri, \"OAuth callback URL\")\n const callbackBinding = nonblank(\n input.callbackBinding,\n \"OAuth callback binding\",\n \"connector.authorization_invalid\"\n )\n const claimed = await this.claimCallback(state, callbackBinding, redirectUri)\n if (claimed.type === \"expired\") {\n return {\n runId: claimed.run.id,\n connectorId: claimed.run.connectorId,\n returnTo: claimed.returnTo,\n }\n }\n\n const { run, attempt, principal, returnTo } = claimed\n this.scheduleRunMaintenance(run, this.processingTtlMs + 1)\n if (\"error\" in input) {\n const finished =\n input.error === \"access_denied\"\n ? await this.cancelRun(run)\n : await this.failRun(run, providerCallbackError(input.error))\n return { runId: finished.id, connectorId: finished.connectorId, returnTo }\n }\n\n let authorizationId = run.authorizationId\n try {\n const definition = this.resolveDefinition(attempt.connectorId)\n const authorization = await this.requests.completeAuthorizationAttempt({\n definition,\n attempt,\n principal,\n code: nonblank(input.code, \"OAuth authorization code\", \"connector.authorization_invalid\"),\n callbackParameters: input.callbackParameters,\n redirectUri,\n onAuthorizationPersisted: async (persisted) => {\n authorizationId = persisted.id\n const attached = await withConnectorStorageBoundary(\n \"Connector authorization could not be attached to its run.\",\n () =>\n this.connectionStorage.attachConnectionRunAuthorization({\n projectId: this.projectId,\n connectorId: run.connectorId,\n runId: run.id,\n processingId: run.processingId,\n authorizationId: persisted.id,\n })\n )\n if (!attached) {\n throw createConnectorCodedError(\n \"internal.unexpected\",\n \"Connector authorization arrived after its run stopped accepting results.\"\n )\n }\n },\n })\n const finished = await this.finalizeCompletedRun(run, authorization)\n return { runId: finished.id, connectorId: finished.connectorId, returnTo }\n } catch (error) {\n const failed = await this.failRun(run, error, authorizationId)\n return { runId: failed.id, connectorId: failed.connectorId, returnTo }\n }\n }\n\n async get(\n command: ConnectorConnectionCommandContext,\n connectorId: string,\n runId: string\n ): Promise<ConnectorConnectionRunView | null> {\n const id = nonblank(runId, \"connection run id\")\n const run = await this.readRun(connectorId, id)\n if (!run) return null\n await this.assertRunActor(command, run)\n if (run.status === \"waiting\" || run.status === \"running\") {\n if (!this.maintenanceTimers.has(run.id)) this.scheduleRunMaintenance(run)\n } else if (!(await this.continueRunCleanup(run))) {\n this.scheduleRunMaintenance(run, CLEANUP_RETRY_DELAY_MS)\n } else {\n this.cancelRunMaintenance(run.id)\n }\n return this.view(run)\n }\n\n async selectAccount(\n command: ConnectorConnectionCommandContext,\n connectorId: string,\n input: SelectConnectorConnectionRunAccountInput\n ): Promise<ConnectorConnectionRunView> {\n const definition = this.resolveDefinition(connectorId)\n const runId = nonblank(input.runId, \"connection run id\")\n const run = await this.readRun(definition.id, runId)\n if (!run) {\n throw createConnectorCodedError(\"connector.not_found\", \"Connector connection run not found.\")\n }\n const actor = await this.assertRunActor(command, run)\n if (run.status !== \"waiting\" || run.waitingFor !== \"account_selection\") {\n throw createConnectorCodedError(\n \"connector.operation_conflict\",\n \"Connector connection run is not waiting for account selection.\"\n )\n }\n\n const authorization = await this.authorizations.requireAuthorization(\n definition.id,\n run.authorizationId\n )\n assertConnectorAuthorizationActor(authorization, actor.principal)\n const account = authorization.accounts.find((candidate) => candidate.id === input.accountId)\n if (!account) {\n throw createConnectorCodedError(\n \"connector.not_found\",\n `Account '${input.accountId}' is not exposed by this connector connection run.`\n )\n }\n\n let selected: Awaited<ReturnType<ConnectorConnectionStorage[\"putConnectionFromRun\"]>>\n try {\n selected = await this.connectionStorage.putConnectionFromRun({\n id: `ccn_${randomUUID()}`,\n projectId: this.projectId,\n connectorId: definition.id,\n runId: run.id,\n account,\n replace: input.replace === true,\n })\n } catch (error) {\n if (isConnectorStorageError(error, \"run_invalid\")) {\n const latest = await this.readRun(definition.id, run.id)\n if (latest) await this.continueRunCleanup(latest)\n throw createConnectorCodedError(\n \"connector.operation_conflict\",\n \"Connector connection run is no longer waiting for account selection.\",\n { cause: error }\n )\n }\n if (isConnectorStorageError(error, \"authorization_conflict\")) {\n throw createConnectorCodedError(\n \"connector.operation_conflict\",\n \"Connector authorization cannot be selected in its current state.\",\n { cause: error }\n )\n }\n if (isConnectorStorageError(error, \"connection_conflict\")) {\n throw createConnectorCodedError(\n \"connector.replacement_required\",\n \"Connector slot is already occupied; explicit replacement is required.\",\n { cause: error }\n )\n }\n throw storageBoundaryError(error, \"Connector account selection could not be persisted.\")\n }\n const cleanupCompleted = selected.revocationPendingAuthorizationId\n ? await this.continuePendingRevocation(\n definition.id,\n selected.revocationPendingAuthorizationId\n )\n : true\n if (cleanupCompleted) {\n this.cancelRunMaintenance(run.id)\n } else {\n this.scheduleRunMaintenance(selected.run, CLEANUP_RETRY_DELAY_MS)\n }\n return this.view(selected.run)\n }\n\n private async claimCallback(state: string, callbackBinding: string, redirectUri: string) {\n let claimed:\n | {\n readonly type: \"claimed\"\n readonly run: ConnectorConnectionRunProcessingRecord\n readonly attempt: Awaited<\n ReturnType<ConnectorConnectionStorage[\"consumeAuthorizationAttempt\"]>\n >\n readonly principal: ReturnType<typeof requireConnectorConnectionCommandActor>[\"principal\"]\n readonly returnTo: string\n }\n | {\n readonly type: \"expired\"\n readonly run: Extract<ConnectorConnectionRunRecord, { readonly status: \"expired\" }>\n readonly returnTo: string\n }\n | null\n\n try {\n claimed = await this.storage.transaction(\n async (tx) => {\n const result = await requireConnectorConnectionStorage(tx).claimConnectionRunCallback({\n projectId: this.projectId,\n attemptId: parseAttemptId(state),\n stateHash: hashSecret(state),\n callbackBindingHash: hashSecret(callbackBinding),\n redirectUri,\n processingId: `ccp_${randomUUID()}`,\n processingTtlMs: this.processingTtlMs,\n })\n if (!result || result.type === \"expired\") return result\n const execution = await tx.executions.getById({\n projectId: this.projectId,\n id: result.attempt.initiatedByExecutionId,\n })\n if (!execution) {\n throw createConnectorCodedError(\n \"internal.unexpected\",\n \"Connector connection run initiating execution is unavailable.\"\n )\n }\n const actor = requireConnectorConnectionCommandActor(execution, this.projectId)\n return { ...result, principal: actor.principal }\n },\n { isolation: \"serializable\" }\n )\n } catch (error) {\n throw storageBoundaryError(error, \"Connector connection run callback could not be claimed.\")\n }\n\n if (!claimed) {\n throw createConnectorCodedError(\n \"connector.authorization_invalid\",\n \"Connector connection run is invalid, expired, or already used.\"\n )\n }\n return claimed\n }\n\n private async finalizeCompletedRun(\n run: ConnectorConnectionRunProcessingRecord,\n authorization: ConnectorAuthorizationRecord\n ): Promise<ConnectorConnectionRunRecord> {\n if (run.kind === \"connect\") {\n if (!authorization.selectionExpiresAt) {\n throw createConnectorCodedError(\n \"internal.unexpected\",\n \"Connector authorization is missing its account-selection deadline.\"\n )\n }\n const selectionExpiresAt = authorization.selectionExpiresAt\n const waiting = await withConnectorStorageBoundary(\n \"Connector connection run could not wait for account selection.\",\n () =>\n this.connectionStorage.waitForConnectionRunSelection({\n projectId: this.projectId,\n connectorId: run.connectorId,\n runId: run.id,\n processingId: run.processingId,\n authorizationId: authorization.id,\n expiresAt: selectionExpiresAt,\n })\n )\n if (waiting) {\n this.scheduleRunMaintenance(waiting, this.selectionTtlMs + 1)\n return waiting\n }\n } else {\n const connections = await withConnectorStorageBoundary(\n \"Reauthorized connector connections could not be read.\",\n () =>\n this.connectionStorage.listConnectionsByAuthorization({\n projectId: this.projectId,\n connectorId: run.connectorId,\n authorizationId: authorization.id,\n })\n )\n const succeeded = await withConnectorStorageBoundary(\n \"Connector reauthorization run could not be finalized.\",\n () =>\n this.connectionStorage.finishConnectionRun({\n projectId: this.projectId,\n connectorId: run.connectorId,\n runId: run.id,\n processingId: run.processingId,\n status: \"succeeded\",\n authorizationId: authorization.id,\n connections,\n })\n )\n if (succeeded) {\n this.cancelRunMaintenance(run.id)\n return succeeded\n }\n }\n throw createConnectorCodedError(\n \"internal.unexpected\",\n \"Connector connection run could not be finalized.\"\n )\n }\n\n private async failRun(\n run: ConnectorConnectionRunProcessingRecord,\n error: unknown,\n authorizationId = run.authorizationId\n ): Promise<ConnectorConnectionRunRecord> {\n const failed = await withConnectorStorageBoundary(\n \"Connector connection run failure could not be persisted.\",\n () =>\n this.connectionStorage.finishConnectionRun({\n projectId: this.projectId,\n connectorId: run.connectorId,\n runId: run.id,\n processingId: run.processingId,\n status: \"failed\",\n ...(authorizationId === undefined ? {} : { authorizationId }),\n error: captureSixbFailure(error, {\n allowedCodes: CONNECTOR_CONNECTION_RUN_FAILURE_CODES,\n defaultCode: \"internal.unexpected\",\n at: this.now(),\n }),\n })\n )\n if (failed) {\n this.cancelRunMaintenance(run.id)\n if (!(await this.continueRunCleanup(failed))) {\n this.scheduleRunMaintenance(failed, CLEANUP_RETRY_DELAY_MS)\n }\n return failed\n }\n throw createConnectorCodedError(\n \"internal.unexpected\",\n \"Connector connection run failure could not be persisted.\",\n { cause: error }\n )\n }\n\n private async cancelRun(\n run: ConnectorConnectionRunProcessingRecord\n ): Promise<ConnectorConnectionRunRecord> {\n const cancelled = await withConnectorStorageBoundary(\n \"Connector connection run cancellation could not be persisted.\",\n () =>\n this.connectionStorage.finishConnectionRun({\n projectId: this.projectId,\n connectorId: run.connectorId,\n runId: run.id,\n processingId: run.processingId,\n status: \"cancelled\",\n })\n )\n if (cancelled) {\n this.cancelRunMaintenance(run.id)\n return cancelled\n }\n throw createConnectorCodedError(\n \"internal.unexpected\",\n \"Connector connection run cancellation could not be persisted.\"\n )\n }\n\n private async readRun(\n connectorId: string,\n runId: string\n ): Promise<ConnectorConnectionRunRecord | null> {\n try {\n return await this.connectionStorage.getConnectionRun({\n projectId: this.projectId,\n connectorId,\n runId,\n })\n } catch (error) {\n throw storageBoundaryError(error, \"Connector connection run could not be read.\")\n }\n }\n\n private async assertRunActor(\n command: ConnectorConnectionCommandContext,\n run: ConnectorConnectionRunRecord\n ) {\n const actor = requireConnectorConnectionCommandActor(command.execution, this.projectId)\n const initiating = await withConnectorStorageBoundary(\n \"Connector connection run initiating execution could not be read.\",\n () =>\n this.storage.executions.getById({\n projectId: this.projectId,\n id: run.initiatedByExecutionId,\n })\n )\n assertConnectorConnectionRunInitiator(initiating, actor, run.connectorId)\n return actor\n }\n\n private async view(run: ConnectorConnectionRunRecord): Promise<ConnectorConnectionRunView> {\n const base = {\n id: run.id,\n connectorId: run.connectorId,\n kind: run.kind,\n owner: run.owner,\n slot: run.slot,\n createdAt: run.createdAt,\n updatedAt: run.updatedAt,\n }\n if (run.status === \"running\") return { ...base, status: \"running\" }\n if (run.status === \"waiting\" && run.waitingFor === \"provider_authorization\") {\n return {\n ...base,\n status: \"waiting\",\n waitingFor: \"provider_authorization\",\n expiresAt: run.expiresAt,\n }\n }\n if (run.status === \"waiting\") {\n const authorization = await this.authorizations.requireAuthorization(\n run.connectorId,\n run.authorizationId\n )\n return {\n ...base,\n status: \"waiting\",\n waitingFor: \"account_selection\",\n accounts: authorization.accounts,\n expiresAt: run.expiresAt,\n }\n }\n if (run.status === \"succeeded\") {\n return {\n ...base,\n status: \"succeeded\",\n connections: run.connections.map((connection) =>\n connectorConnectionView(connection, \"active\")\n ),\n finishedAt: run.finishedAt,\n }\n }\n if (run.status === \"failed\") {\n return { ...base, status: \"failed\", error: run.error, finishedAt: run.finishedAt }\n }\n return { ...base, status: run.status, finishedAt: run.finishedAt }\n }\n\n close(): void {\n for (const timer of this.maintenanceTimers.values()) clearTimeout(timer)\n this.maintenanceTimers.clear()\n }\n\n private async continueRunCleanup(run: ConnectorConnectionRunRecord): Promise<boolean> {\n if (run.kind !== \"connect\") return true\n const authorizationId =\n run.status === \"succeeded\"\n ? run.cleanupAuthorizationId\n : run.status === \"failed\" || run.status === \"expired\" || run.status === \"cancelled\"\n ? run.authorizationId\n : undefined\n if (authorizationId === undefined) return true\n const authorization = await this.authorizations.requireAuthorization(\n run.connectorId,\n authorizationId\n )\n if (authorization.status !== \"revocation_pending\") return true\n return this.continuePendingRevocation(run.connectorId, authorization.id)\n }\n\n private async continuePendingRevocation(\n connectorId: string,\n authorizationId: string\n ): Promise<boolean> {\n try {\n await this.authorizations.continuePendingRevocation(\n this.resolveDefinition(connectorId),\n authorizationId\n )\n return true\n } catch (error) {\n if (isSixbError(error) && error.code === \"connector.revocation_pending\") return false\n throw error\n }\n }\n\n private scheduleRunMaintenance(\n run: ConnectorConnectionRunRecord,\n delayMs = run.status === \"waiting\" || run.status === \"running\"\n ? Math.max(1_000, run.expiresAt.getTime() - this.now().getTime())\n : CLEANUP_RETRY_DELAY_MS\n ): void {\n this.cancelRunMaintenance(run.id)\n const timer = setTimeout(\n () => void this.maintainRun(run.connectorId, run.id),\n Math.min(delayMs, MAX_TIMER_DELAY_MS)\n )\n timer.unref?.()\n this.maintenanceTimers.set(run.id, timer)\n }\n\n private cancelRunMaintenance(runId: string): void {\n const timer = this.maintenanceTimers.get(runId)\n if (timer) clearTimeout(timer)\n this.maintenanceTimers.delete(runId)\n }\n\n private async maintainRun(connectorId: string, runId: string): Promise<void> {\n this.maintenanceTimers.delete(runId)\n try {\n const run = await this.readRun(connectorId, runId)\n if (!run) return\n if (run.status === \"waiting\" || run.status === \"running\") {\n this.scheduleRunMaintenance(run)\n return\n }\n if (!(await this.continueRunCleanup(run))) {\n this.scheduleRunMaintenance(run, CLEANUP_RETRY_DELAY_MS)\n }\n } catch {\n console.warn(\"[Sixb] Connector connection run cleanup failed and will be retried.\")\n const timer = setTimeout(\n () => void this.maintainRun(connectorId, runId),\n CLEANUP_RETRY_DELAY_MS\n )\n timer.unref?.()\n this.maintenanceTimers.set(runId, timer)\n }\n }\n}\n\nfunction requireConnectorConnectionStorage(storage: Storage): ConnectorConnectionStorage {\n if (storage.connectorConnections) return storage.connectorConnections\n throw createConnectorCodedError(\n \"internal.unexpected\",\n \"Connector connection storage is unavailable.\"\n )\n}\n\nfunction providerCallbackError(error: string): ReturnType<typeof createConnectorCodedError> {\n const code =\n error === \"server_error\" || error === \"temporarily_unavailable\"\n ? \"connector.provider_unavailable\"\n : \"connector.provider_failed\"\n return createConnectorCodedError(\n code,\n \"Connector provider could not complete the authorization request.\"\n )\n}\n",
|
|
25
|
+
"import type { ConnectorConnectionRecord } from \"../storage\"\nimport type { ConnectorConnectionProcess } from \"./connections/contracts\"\nimport {\n ConnectorConnectionService,\n type ConnectorConnectionServiceOptions,\n} from \"./connections/service\"\nimport { ConnectorError, ConnectorNotFoundError, createConnectorCodedError } from \"./errors\"\nimport type {\n ConnectorAdapter,\n ConnectorClient,\n ConnectorConnectionSelector,\n ConnectorDefinition,\n OAuthConnectorAdapter,\n} from \"./types\"\nimport { isOAuthConnectorDefinition } from \"./types\"\n\nexport type ConnectorServiceOptions = ConnectorConnectionServiceOptions\n\ntype StaticConnectorConnectionState = {\n readonly controller: AbortController\n readonly clientPromise: Promise<unknown>\n}\n\n/** Process-owned facade for static clients and persistent connector connections. */\nexport class ConnectorService {\n private readonly definitionsById: ReadonlyMap<string, ConnectorDefinition>\n private readonly staticConnectionStates = new Map<\n ConnectorDefinition<string, ConnectorAdapter>,\n StaticConnectorConnectionState\n >()\n private readonly connections?: ConnectorConnectionService\n\n constructor(\n private readonly projectId: string,\n definitions: readonly ConnectorDefinition[],\n options: ConnectorServiceOptions = {}\n ) {\n this.definitionsById = new Map(definitions.map((definition) => [definition.id, definition]))\n if (definitions.some(isOAuthConnectorDefinition)) {\n this.connections = new ConnectorConnectionService(projectId, definitions, options)\n }\n }\n\n async connect<TAdapter extends ConnectorAdapter>(\n definition: ConnectorDefinition<string, TAdapter>\n ): Promise<ConnectorClient<TAdapter>> {\n this.assertRegistered(definition)\n\n let state = this.staticConnectionStates.get(definition)\n if (!state) {\n const controller = new AbortController()\n const clientPromise = Promise.resolve(\n definition.adapter.connect({\n projectId: this.projectId,\n connectorId: definition.id,\n signal: controller.signal,\n })\n )\n state = { controller, clientPromise }\n this.staticConnectionStates.set(definition, state)\n }\n\n try {\n return (await state.clientPromise) as ConnectorClient<TAdapter>\n } catch (error) {\n if (this.staticConnectionStates.get(definition) === state) {\n this.staticConnectionStates.delete(definition)\n }\n throw error\n }\n }\n\n connectConnection<TAdapter extends OAuthConnectorAdapter>(\n definition: ConnectorDefinition<string, TAdapter>,\n selector: ConnectorConnectionSelector\n ): Promise<ConnectorClient<TAdapter>> {\n return this.requireConnections().connectConnection(definition, selector)\n }\n\n listExecutionConnections<TAdapter extends OAuthConnectorAdapter>(\n definition: ConnectorDefinition<string, TAdapter>\n ): Promise<readonly ConnectorConnectionRecord[]> {\n return this.requireConnections().listExecutionConnections(definition)\n }\n\n connectExecutionConnection<TAdapter extends OAuthConnectorAdapter>(\n definition: ConnectorDefinition<string, TAdapter>,\n connection: ConnectorConnectionRecord,\n signal?: AbortSignal\n ): Promise<ConnectorClient<TAdapter>> {\n return this.requireConnections().connectExecutionConnection(definition, connection, signal)\n }\n\n get connectionProcess(): ConnectorConnectionProcess | undefined {\n return this.connections\n }\n\n async close(): Promise<void> {\n await this.connections?.close()\n const activeConnections = [...this.staticConnectionStates.entries()]\n this.staticConnectionStates.clear()\n for (const [definition, state] of activeConnections) {\n await this.disconnectStaticState(definition, state)\n }\n }\n\n private assertRegistered(definition: ConnectorDefinition): void {\n const registeredDefinition = this.definitionsById.get(definition.id)\n if (!registeredDefinition) throw new ConnectorNotFoundError(definition.id)\n if (registeredDefinition !== definition) {\n throw new ConnectorError(\n `Connector '${definition.id}' is not the registered definition instance.`\n )\n }\n }\n\n private requireConnections(): ConnectorConnectionService {\n if (!this.connections) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n \"No OAuth connectors are registered with this runtime.\"\n )\n }\n return this.connections\n }\n\n private async disconnectStaticState(\n definition: ConnectorDefinition<string, ConnectorAdapter>,\n state: StaticConnectorConnectionState\n ): Promise<void> {\n state.controller.abort()\n let client: unknown\n try {\n client = await state.clientPromise\n } catch {\n return\n }\n if (typeof definition.adapter.disconnect === \"function\") {\n await definition.adapter.disconnect(client as never)\n }\n }\n}\n",
|
|
26
|
+
"import type { OntologyOutboxDispatcher } from \"../events\"\nimport type { Storage } from \"../storage\"\nimport type {\n OntologyMaintenanceCleanupSnapshot,\n OntologyMaintenanceHandle,\n OntologyMaintenanceOptions,\n OntologyMaintenanceSnapshot,\n OntologyOperationalStatus,\n} from \"./types\"\n\nconst DEFAULT_INTERVAL_MS = 60_000\nconst DEFAULT_RETENTION_MS = 24 * 60 * 60_000\nconst DEFAULT_CLEANUP_LIMIT = 1_000\nconst DEFAULT_SHUTDOWN_TIMEOUT_MS = 30_000\nconst DEGRADED_ATTEMPT_THRESHOLD = 3\nconst DEGRADED_FAILURE_THRESHOLD = 2\n\ninterface OntologyMaintenanceDependencies {\n readonly projectId: string\n readonly storage: Storage\n readonly dispatcher: OntologyOutboxDispatcher\n readonly options?: OntologyMaintenanceOptions\n readonly now?: () => Date\n readonly onError?: (error: unknown) => void\n}\n\n/** API-owned catch-up, retention, and operational snapshot lifecycle. */\nexport class OntologyMaintenance {\n private readonly projectId: string\n private readonly storage: Storage\n private readonly dispatcher: OntologyOutboxDispatcher\n private readonly intervalMs: number\n private readonly publishedOutboxRetentionMs: number\n private readonly terminalSourceRetentionMs: number\n private readonly cleanupLimit: number\n private readonly shutdownTimeoutMs: number\n private readonly now: () => Date\n private readonly onError: (error: unknown) => void\n private readonly owners = new Set<symbol>()\n private timer: ReturnType<typeof setTimeout> | null = null\n private pass: Promise<void> | null = null\n private stopping: Promise<void> | null = null\n private snapshot: OntologyMaintenanceSnapshot\n\n constructor(dependencies: OntologyMaintenanceDependencies) {\n assertNonblank(dependencies.projectId, \"projectId\")\n const options = dependencies.options ?? {}\n this.projectId = dependencies.projectId\n this.storage = dependencies.storage\n this.dispatcher = dependencies.dispatcher\n this.intervalMs = positiveInteger(options.intervalMs ?? DEFAULT_INTERVAL_MS, \"intervalMs\")\n this.publishedOutboxRetentionMs = nonnegativeInteger(\n options.publishedOutboxRetentionMs ?? DEFAULT_RETENTION_MS,\n \"publishedOutboxRetentionMs\"\n )\n this.terminalSourceRetentionMs = nonnegativeInteger(\n options.terminalSourceRetentionMs ?? DEFAULT_RETENTION_MS,\n \"terminalSourceRetentionMs\"\n )\n this.cleanupLimit = positiveInteger(\n options.cleanupLimit ?? DEFAULT_CLEANUP_LIMIT,\n \"cleanupLimit\"\n )\n this.shutdownTimeoutMs = nonnegativeInteger(\n options.shutdownTimeoutMs ?? DEFAULT_SHUTDOWN_TIMEOUT_MS,\n \"shutdownTimeoutMs\"\n )\n this.now = dependencies.now ?? (() => new Date())\n this.onError =\n dependencies.onError ??\n ((error) => console.error(\"[Sixb] Ontology maintenance error:\", error))\n this.snapshot = emptySnapshot(this.intervalMs)\n }\n\n /** Acquires maintenance ownership and starts catch-up without blocking the host from listening. */\n async start(): Promise<OntologyMaintenanceHandle> {\n if (this.stopping) await this.stopping\n const owner = Symbol(\"ontology-maintenance-owner\")\n const startsHosting = this.owners.size === 0\n this.owners.add(owner)\n if (startsHosting) this.startHostedPass()\n\n let released = false\n return {\n stop: async () => {\n if (released) return\n released = true\n this.owners.delete(owner)\n if (this.owners.size === 0) await this.stopLoop()\n },\n }\n }\n\n /** Runs one coalesced pass. Exposed for deterministic hosting and tests. */\n runNow(): Promise<void> {\n this.pass ??= this.runPass().finally(() => {\n this.pass = null\n })\n return this.pass\n }\n\n /** Force-stops every owner; used during provider shutdown. */\n async stop(): Promise<void> {\n this.owners.clear()\n await this.stopLoop()\n }\n\n getSnapshot(): OntologyMaintenanceSnapshot {\n return structuredClone(this.snapshot)\n }\n\n getOperationalStatus(): OntologyOperationalStatus {\n const snapshot = this.getSnapshot()\n const lastActivityAt = latestTimestamp(snapshot.lastStartedAt, snapshot.lastCompletedAt)\n const overdue =\n lastActivityAt !== null &&\n this.now().getTime() - Date.parse(lastActivityAt) > this.intervalMs * 2\n const oldestPendingAt = snapshot.outbox?.oldestPendingAt ?? null\n const pendingTooLong =\n oldestPendingAt !== null &&\n this.now().getTime() - Date.parse(oldestPendingAt) > this.intervalMs * 2\n const repeatedlyFailing = (snapshot.outbox?.maxAttempts ?? 0) >= DEGRADED_ATTEMPT_THRESHOLD\n const degraded =\n snapshot.consecutiveFailures >= DEGRADED_FAILURE_THRESHOLD ||\n repeatedlyFailing ||\n pendingTooLong ||\n overdue\n return { status: degraded ? \"degraded\" : \"ok\", maintenance: snapshot }\n }\n\n private startHostedPass(): void {\n void this.runNow()\n .catch((error) => this.reportError(error))\n .finally(() => this.scheduleNextPass())\n }\n\n private async runPass(): Promise<void> {\n const started = this.now()\n this.snapshot = { ...this.snapshot, running: true, lastStartedAt: started.toISOString() }\n\n const failures: unknown[] = []\n await captureFailure(() => this.dispatcher.drain(), failures)\n const cleanup = await this.cleanupExpiredRows(started, failures)\n const { outbox, terminalSources } = await this.readOperationalSummaries(failures)\n this.completePass({ started, failures, cleanup, outbox, terminalSources })\n }\n\n private async cleanupExpiredRows(\n started: Date,\n failures: unknown[]\n ): Promise<OntologyMaintenanceCleanupSnapshot> {\n const publishedOutboxRowsDeleted = await captureFailure(\n () =>\n this.storage.ontology.outbox.purgePublished({\n projectId: this.projectId,\n publishedBefore: new Date(\n started.getTime() - this.publishedOutboxRetentionMs\n ).toISOString(),\n limit: this.cleanupLimit,\n }),\n failures,\n 0\n )\n const terminalSources = await captureFailure(\n () =>\n this.storage.ontology.sources.cleanupTerminal({\n projectId: this.projectId,\n terminalBefore: new Date(\n started.getTime() - this.terminalSourceRetentionMs\n ).toISOString(),\n limit: this.cleanupLimit,\n }),\n failures,\n { rowsDeleted: 0, materializationsDeleted: 0 }\n )\n\n return {\n publishedOutboxRowsDeleted,\n terminalSourceRowsDeleted: terminalSources.rowsDeleted,\n terminalSourceMaterializationsDeleted: terminalSources.materializationsDeleted,\n }\n }\n\n private async readOperationalSummaries(failures: unknown[]): Promise<{\n readonly outbox: OntologyMaintenanceSnapshot[\"outbox\"]\n readonly terminalSources: OntologyMaintenanceSnapshot[\"terminalSources\"]\n }> {\n const outbox = await captureFailure(\n () => this.storage.ontology.outbox.summarize({ projectId: this.projectId }),\n failures,\n this.snapshot.outbox\n )\n const terminalSummary = await captureFailure(\n () => this.storage.ontology.sources.summarizeTerminal({ projectId: this.projectId }),\n failures,\n this.snapshot.terminalSources\n )\n return { outbox, terminalSources: terminalSummary }\n }\n\n private completePass(input: {\n readonly started: Date\n readonly failures: readonly unknown[]\n readonly cleanup: OntologyMaintenanceCleanupSnapshot\n readonly outbox: OntologyMaintenanceSnapshot[\"outbox\"]\n readonly terminalSources: OntologyMaintenanceSnapshot[\"terminalSources\"]\n }): void {\n const completed = this.now()\n const failure =\n input.failures.length > 0\n ? new AggregateError(input.failures, \"Maintenance pass failed.\")\n : null\n this.snapshot = {\n running: false,\n intervalMs: this.intervalMs,\n lastStartedAt: input.started.toISOString(),\n lastCompletedAt: completed.toISOString(),\n lastDurationMs: Math.max(0, completed.getTime() - input.started.getTime()),\n consecutiveFailures: failure ? this.snapshot.consecutiveFailures + 1 : 0,\n lastError: failure ? errorMessage(failure) : null,\n outbox: input.outbox,\n terminalSources: input.terminalSources,\n cleanup: input.cleanup,\n }\n if (failure) this.reportError(failure)\n }\n\n private scheduleNextPass(): void {\n if (this.owners.size === 0 || this.timer !== null) return\n this.timer = setTimeout(() => {\n this.timer = null\n if (this.owners.size === 0) return\n void this.runNow()\n .catch((error) => this.reportError(error))\n .finally(() => this.scheduleNextPass())\n }, this.intervalMs)\n this.timer.unref?.()\n }\n\n private stopLoop(): Promise<void> {\n if (this.stopping) return this.stopping\n if (this.timer !== null) {\n clearTimeout(this.timer)\n this.timer = null\n }\n const activePass = this.pass ?? Promise.resolve()\n const stopping = settlesWithin(activePass, this.shutdownTimeoutMs).then((settled) => {\n if (!settled) {\n this.reportError(\n new Error(`[Sixb] Ontology maintenance did not stop within ${this.shutdownTimeoutMs}ms.`)\n )\n }\n })\n this.stopping = stopping.finally(() => {\n this.stopping = null\n })\n return this.stopping\n }\n\n private reportError(error: unknown): void {\n try {\n this.onError(error)\n } catch {\n // Maintenance failures stay observable without escaping into runtime lifecycle code.\n }\n }\n}\n\nfunction emptySnapshot(intervalMs: number): OntologyMaintenanceSnapshot {\n return {\n running: false,\n intervalMs,\n lastStartedAt: null,\n lastCompletedAt: null,\n lastDurationMs: null,\n consecutiveFailures: 0,\n lastError: null,\n outbox: null,\n terminalSources: null,\n cleanup: null,\n }\n}\n\nfunction positiveInteger(value: number, name: string): number {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new Error(`[Sixb] Ontology maintenance ${name} must be a positive integer.`)\n }\n return value\n}\n\nfunction nonnegativeInteger(value: number, name: string): number {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(`[Sixb] Ontology maintenance ${name} must be a nonnegative integer.`)\n }\n return value\n}\n\nfunction assertNonblank(value: string, name: string): void {\n if (value.trim().length === 0) {\n throw new Error(`[Sixb] Ontology maintenance ${name} must not be blank.`)\n }\n}\n\nfunction errorMessage(error: unknown): string {\n if (error instanceof AggregateError) {\n return [...error.errors].map(errorMessage).join(\" | \").slice(0, 2_000)\n }\n const message = error instanceof Error ? `${error.name}: ${error.message}` : String(error)\n return message.slice(0, 2_000)\n}\n\nfunction latestTimestamp(left: string | null, right: string | null): string | null {\n if (left === null) return right\n if (right === null) return left\n return Date.parse(left) >= Date.parse(right) ? left : right\n}\n\nasync function settlesWithin(promise: Promise<void>, timeoutMs: number): Promise<boolean> {\n let timer: ReturnType<typeof setTimeout> | undefined\n const timedOut = new Promise<false>((resolve) => {\n timer = setTimeout(() => resolve(false), timeoutMs)\n })\n const result = await Promise.race([\n promise.then(\n () => true as const,\n () => true as const\n ),\n timedOut,\n ])\n if (timer !== undefined) clearTimeout(timer)\n return result\n}\n\nasync function captureFailure(run: () => Promise<void>, failures: unknown[]): Promise<void>\nasync function captureFailure<T>(\n run: () => Promise<T>,\n failures: unknown[],\n fallback: T\n): Promise<T>\nasync function captureFailure<T>(\n run: () => Promise<T>,\n failures: unknown[],\n fallback?: T\n): Promise<T | undefined> {\n try {\n return await run()\n } catch (error) {\n failures.push(error)\n return fallback\n }\n}\n",
|
|
27
|
+
"import { toolsFromProjectConfig } from \"./tool-definition\"\nimport type { AgentToolDefinition } from \"./types\"\n\n/** Immutable catalog of project tools registered with a Sixb host. */\nexport interface AgentToolCatalog {\n list(): readonly AgentToolDefinition[]\n getByName(name: string): AgentToolDefinition | null\n}\n\n/** Validate, normalize, and index the tools supplied through `createSixb({ tools })`. */\nexport function createAgentToolCatalog(\n definitions: readonly AgentToolDefinition[] | undefined\n): AgentToolCatalog {\n const tools = toolsFromProjectConfig(definitions)\n const toolsByName = new Map(tools.map((tool) => [tool.name, tool]))\n\n return Object.freeze({\n list: () => tools,\n getByName: (name: string) => toolsByName.get(name) ?? null,\n })\n}\n",
|
|
28
|
+
"import type { DatasetDefinition } from \"../datasets\"\nimport type { PipelineDefinition } from \"../pipelines\"\nimport type { TelemetryProjectionDefinition } from \"../projections\"\nimport { SyncValidationError } from \"./errors\"\nimport type { SyncDefinition } from \"./types\"\n\ninterface DatasetWriter {\n readonly datasetId: string\n readonly label: string\n}\n\nexport function validateKeyedDatasetWriterTopology(input: {\n readonly datasetsById: ReadonlyMap<string, DatasetDefinition>\n readonly syncs: readonly SyncDefinition[]\n readonly pipelines: readonly PipelineDefinition[]\n}): void {\n for (const sync of input.syncs) {\n const dataset = input.datasetsById.get(sync.target.dataset.id)\n if (sync.config.mode === \"merge\" && dataset?.primaryKey === undefined) {\n throw new SyncValidationError(\n `[Sixb] Merge sync '${sync.id}' targets dataset '${sync.target.dataset.id}', which must define a primaryKey.`\n )\n }\n }\n\n const firstWriterByDataset = new Map<string, DatasetWriter>()\n for (const writer of datasetWriters(input.syncs, input.pipelines)) {\n const dataset = input.datasetsById.get(writer.datasetId)\n if (dataset?.primaryKey === undefined) continue\n\n const first = firstWriterByDataset.get(writer.datasetId)\n if (!first) {\n firstWriterByDataset.set(writer.datasetId, writer)\n continue\n }\n\n throw new SyncValidationError(\n `[Sixb] Keyed dataset '${writer.datasetId}' has multiple registered writers: ${first.label} and ${writer.label}. V1 allows one writer per keyed dataset.`\n )\n }\n}\n\nexport function validateMergeSyncProjectionSafety(input: {\n readonly syncs: readonly SyncDefinition[]\n readonly telemetryProjections: readonly TelemetryProjectionDefinition[]\n}): void {\n const mergeSyncByDataset = new Map(\n input.syncs\n .filter((sync) => sync.config.mode === \"merge\")\n .map((sync) => [sync.target.dataset.id, sync] as const)\n )\n\n for (const projection of input.telemetryProjections) {\n const sync = mergeSyncByDataset.get(projection.datasetId)\n if (!sync) continue\n throw new SyncValidationError(\n `[Sixb] Telemetry projection '${projection.id}' cannot read merge-written dataset '${projection.datasetId}' from sync '${sync.id}'. V1 merge syncs support object and link replacement projections only.`\n )\n }\n}\n\nfunction* datasetWriters(\n syncs: readonly SyncDefinition[],\n pipelines: readonly PipelineDefinition[]\n): Iterable<DatasetWriter> {\n for (const sync of syncs) {\n yield { datasetId: sync.target.dataset.id, label: `sync '${sync.id}'` }\n }\n for (const pipeline of pipelines) {\n for (const node of pipeline.graph.nodes) {\n yield {\n datasetId: node.step.output.id,\n label: `pipeline '${pipeline.id}' step '${node.step.id}'`,\n }\n }\n }\n}\n",
|
|
29
|
+
"import type { ActionDefinitionCatalog } from \"../actions\"\nimport type { AgentToolCatalog } from \"../agents\"\nimport type { ConnectorDefinition } from \"../connectors\"\nimport type { DatasetDefinition } from \"../datasets\"\nimport type { ModelCatalog } from \"../models\"\nimport type { OntologyDefinitionCatalog } from \"../ontology\"\nimport type { PipelineDefinition } from \"../pipelines\"\nimport type { ProjectionDefinitionCatalog } from \"../projections\"\nimport type { RuleDefinition } from \"../rules\"\nimport type { ScheduleDefinition } from \"../schedules\"\nimport type { SecurityDefinitionCatalog } from \"../security\"\nimport type { ShareDefinition } from \"../shares\"\nimport type { SyncDefinition } from \"../syncs\"\nimport type { WorkflowDefinition } from \"../workflows\"\n\n/** Immutable, host-owned catalog of validated project definitions. */\nexport interface DefinitionCatalog<TDefinition> {\n list(): readonly TDefinition[]\n getById(id: string): TDefinition | null\n}\n\n/** Definitions resolved and cross-validated while composing a {@link SixbHost}. */\nexport interface SixbDefinitions {\n readonly ontology: OntologyDefinitionCatalog\n readonly actions: ActionDefinitionCatalog\n readonly tools: AgentToolCatalog\n readonly connectors: DefinitionCatalog<ConnectorDefinition>\n readonly datasets: DefinitionCatalog<DatasetDefinition>\n /** Absent until a project configures `models` in createSixb(). */\n readonly models?: ModelCatalog\n readonly pipelines: DefinitionCatalog<PipelineDefinition>\n readonly projections: ProjectionDefinitionCatalog\n readonly rules: DefinitionCatalog<RuleDefinition>\n readonly schedules: DefinitionCatalog<ScheduleDefinition>\n readonly security: SecurityDefinitionCatalog\n readonly shares: DefinitionCatalog<ShareDefinition>\n readonly syncs: DefinitionCatalog<SyncDefinition>\n readonly workflows: DefinitionCatalog<WorkflowDefinition>\n}\n\n/** Build a read-only catalog over an already validated definition index. */\nexport function createDefinitionCatalog<TDefinition>(\n definitionsById: ReadonlyMap<string, TDefinition>\n): DefinitionCatalog<TDefinition> {\n return Object.freeze({\n list: () => [...definitionsById.values()],\n getById: (id: string) => definitionsById.get(id) ?? null,\n })\n}\n",
|
|
30
|
+
"import { ActionRegistry } from \"../actions\"\nimport type { ActionDefinition } from \"../actions/types\"\nimport type { AgentToolDefinition } from \"../agents\"\nimport { assertNoAgentDefinitions } from \"../agents/retired-config\"\nimport { createAgentToolCatalog } from \"../agents/tool-catalog\"\nimport type { ConnectorDefinition } from \"../connectors\"\nimport type { DatasetDefinition } from \"../datasets/types\"\nimport { assertDatasetDefinition } from \"../datasets/validation\"\nimport { createModelCatalog, type ModelCatalogInput } from \"../models\"\nimport { OntologyRegistry } from \"../ontology\"\nimport type { PipelineDefinition } from \"../pipelines/types\"\nimport { ProjectionRegistry } from \"../projections\"\nimport type { ProjectionDefinition } from \"../projections/types\"\nimport { type RuleDefinition, validateRulesAtStartup } from \"../rules\"\nimport { type ScheduleDefinition, validateSchedulesAtStartup } from \"../schedules\"\nimport {\n type GroupDefinition,\n type MembershipPolicyDefinition,\n type RoleDefinition,\n SecurityRegistry,\n} from \"../security\"\nimport { type ShareDefinition, validateSharesAtStartup } from \"../shares\"\nimport type { SyncDefinition } from \"../syncs\"\nimport {\n validateKeyedDatasetWriterTopology,\n validateMergeSyncProjectionSafety,\n} from \"../syncs/validation\"\nimport type { WorkflowDefinition } from \"../workflows\"\nimport { validateWorkflowAgentStepGroupReferences, validateWorkflowsAtStartup } from \"../workflows\"\nimport { createDefinitionCatalog, type SixbDefinitions } from \"./definitions\"\nimport { RuntimeError } from \"./errors\"\nimport type { OntologySource } from \"./types\"\n\ninterface DefinitionOptions {\n readonly ontology: readonly OntologySource[]\n readonly actions?: readonly ActionDefinition[]\n readonly connectors?: readonly ConnectorDefinition[]\n readonly datasets?: readonly DatasetDefinition[]\n readonly schedules?: readonly ScheduleDefinition[]\n readonly syncs?: readonly SyncDefinition[]\n readonly pipelines?: readonly PipelineDefinition[]\n readonly projections?: readonly ProjectionDefinition[]\n readonly rules?: readonly RuleDefinition[]\n readonly workflows?: readonly WorkflowDefinition[]\n readonly tools?: readonly AgentToolDefinition[]\n readonly models?: ModelCatalogInput\n readonly shares?: readonly ShareDefinition[]\n readonly groups?: readonly GroupDefinition[]\n readonly roles?: readonly RoleDefinition[]\n readonly membershipPolicies?: readonly MembershipPolicyDefinition[]\n}\n\ninterface ResolvedDefinitions extends SixbDefinitions {\n readonly ontology: OntologyRegistry\n readonly actions: ActionRegistry\n readonly projections: ProjectionRegistry\n readonly security: SecurityRegistry\n}\n\n/** Resolve and cross-validate every registered definition before runtime services are composed. */\nexport function resolveDefinitions(options: DefinitionOptions): ResolvedDefinitions {\n assertNoAgentDefinitions(options)\n const ontology = new OntologyRegistry({ sources: options.ontology })\n const actionRegistry = new ActionRegistry({ actions: options.actions ?? [], ontology })\n const registeredActionIds = new Set(actionRegistry.list().map((action) => action.id))\n const sharesById = validateSharesAtStartup({\n shares: options.shares ?? [],\n ontology,\n actions: actionRegistry,\n })\n\n const models = options.models === undefined ? undefined : createModelCatalog(options.models)\n const tools = createAgentToolCatalog(options.tools)\n const connectorsById = indexUniqueDefinitions(\"connector\", options.connectors ?? [])\n\n // Datasets resolve first because syncs, pipelines, projections, and security depend on them.\n const datasetsById = new Map<string, DatasetDefinition>()\n for (const dataset of options.datasets ?? []) {\n assertDatasetDefinition(dataset, (message) => new RuntimeError(message))\n assertUniqueDefinitionId(\"dataset\", dataset.id, datasetsById)\n datasetsById.set(dataset.id, dataset)\n }\n\n const schedulesById = indexUniqueDefinitions(\"schedule\", options.schedules ?? [])\n\n const syncsById = new Map<string, SyncDefinition>()\n for (const sync of options.syncs ?? []) {\n assertUniqueDefinitionId(\"sync\", sync.id, syncsById)\n\n if (!datasetsById.has(sync.target.dataset.id)) {\n throw new RuntimeError(\n `Sync '${sync.id}' targets unknown dataset '${sync.target.dataset.id}'. Add it to 'datasets' in createSixb() or export it from 'datasets/'.`\n )\n }\n\n syncsById.set(sync.id, sync)\n }\n\n const pipelinesById = new Map<string, PipelineDefinition>()\n for (const pipeline of options.pipelines ?? []) {\n assertUniqueDefinitionId(\"pipeline\", pipeline.id, pipelinesById)\n validatePipelineDatasets(pipeline, datasetsById)\n pipelinesById.set(pipeline.id, pipeline)\n }\n\n const schedules = [...schedulesById.values()]\n const syncs = [...syncsById.values()]\n const pipelines = [...pipelinesById.values()]\n\n validateKeyedDatasetWriterTopology({ datasetsById, syncs, pipelines })\n\n // Rules resolve against the complete ontology so inherited properties and links are available.\n const rules = options.rules ?? []\n validateRulesAtStartup(rules, ontology)\n const rulesById = indexUniqueDefinitions(\"rule\", rules)\n\n validateSchedulesAtStartup(schedules, ontology, {\n registeredRuleIds: new Set(rulesById.keys()),\n registeredActionIds,\n registeredDatasetIds: new Set(datasetsById.keys()),\n registeredSyncIds: new Set(syncsById.keys()),\n registeredPipelineIds: new Set(pipelinesById.keys()),\n })\n for (const sync of syncs) {\n validateScheduleReferences(\"Sync\", sync.id, sync.triggers, schedulesById)\n }\n for (const pipeline of pipelines) {\n validateScheduleReferences(\"Pipeline\", pipeline.id, pipeline.triggers, schedulesById)\n }\n\n const workflows = validateWorkflowsAtStartup({\n workflows: options.workflows ?? [],\n registeredSchedules: schedulesById,\n registeredActionIds,\n ...(models === undefined ? {} : { models }),\n tools,\n })\n const workflowsById = indexUniqueDefinitions(\"workflow\", workflows)\n\n const security = new SecurityRegistry({\n groups: options.groups ?? [],\n roles: options.roles ?? [],\n membershipPolicies: options.membershipPolicies ?? [],\n objectTypeIds: new Set(ontology.getObjectTypesById().keys()),\n datasetIds: new Set(datasetsById.keys()),\n actionIds: registeredActionIds,\n workflowIds: new Set(workflowsById.keys()),\n syncIds: new Set(syncsById.keys()),\n pipelineIds: new Set(pipelinesById.keys()),\n agentAvailable: models !== undefined,\n connectorIds: new Set(connectorsById.keys()),\n shareIds: new Set(sharesById.keys()),\n getSubTypes: (objectTypeId) => ontology.listSubTypes(objectTypeId),\n })\n validateWorkflowAgentStepGroupReferences(workflows, security)\n\n const projectionRegistry = new ProjectionRegistry({\n projections: options.projections ?? [],\n ontology,\n datasetsById,\n })\n validateMergeSyncProjectionSafety({\n syncs,\n telemetryProjections: projectionRegistry.listTelemetry(),\n })\n\n return Object.freeze({\n ontology,\n actions: actionRegistry,\n tools,\n connectors: createDefinitionCatalog(connectorsById),\n datasets: createDefinitionCatalog(datasetsById),\n ...(models === undefined ? {} : { models }),\n pipelines: createDefinitionCatalog(pipelinesById),\n projections: projectionRegistry,\n rules: createDefinitionCatalog(rulesById),\n schedules: createDefinitionCatalog(schedulesById),\n security,\n shares: createDefinitionCatalog(sharesById),\n syncs: createDefinitionCatalog(syncsById),\n workflows: createDefinitionCatalog(workflowsById),\n })\n}\n\nfunction indexUniqueDefinitions<TDefinition extends { readonly id: string }>(\n kind: \"schedule\" | \"workflow\" | \"agent\" | \"connector\" | \"rule\",\n definitions: readonly TDefinition[]\n): ReadonlyMap<string, TDefinition> {\n const definitionsById = new Map<string, TDefinition>()\n for (const definition of definitions) {\n assertUniqueDefinitionId(kind, definition.id, definitionsById)\n definitionsById.set(definition.id, definition)\n }\n return definitionsById\n}\n\nfunction assertUniqueDefinitionId(\n kind: \"dataset\" | \"schedule\" | \"sync\" | \"pipeline\" | \"workflow\" | \"agent\" | \"connector\" | \"rule\",\n id: string,\n definitionsById: ReadonlyMap<string, unknown>\n): void {\n if (definitionsById.has(id)) {\n throw new RuntimeError(`Duplicate ${kind} id: ${id}`)\n }\n}\n\nfunction validatePipelineDatasets(\n pipeline: PipelineDefinition,\n datasetsById: ReadonlyMap<string, DatasetDefinition>\n): void {\n if (pipeline.graph.nodes.length === 0) {\n throw new RuntimeError(`Pipeline '${pipeline.id}' must contain at least one step.`)\n }\n\n const stepIds = new Set<string>()\n for (const node of pipeline.graph.nodes) {\n const { step } = node\n if (stepIds.has(step.id)) {\n throw new RuntimeError(`Pipeline '${pipeline.id}' contains duplicate step id '${step.id}'.`)\n }\n stepIds.add(step.id)\n\n for (const [inputName, dataset] of Object.entries(step.inputs)) {\n if (!datasetsById.has(dataset.id)) {\n throw new RuntimeError(\n `Pipeline '${pipeline.id}' step '${step.id}' input '${inputName}' references unknown dataset '${dataset.id}'. Add it to 'datasets' in createSixb() or export it from 'datasets/'.`\n )\n }\n }\n\n if (!datasetsById.has(step.output.id)) {\n throw new RuntimeError(\n `Pipeline '${pipeline.id}' step '${step.id}' outputs unknown dataset '${step.output.id}'. Add it to 'datasets' in createSixb() or export it from 'datasets/'.`\n )\n }\n }\n}\n\nfunction validateScheduleReferences(\n consumerKind: \"Sync\" | \"Pipeline\",\n consumerId: string,\n references: readonly { readonly scheduleId: string }[],\n schedulesById: ReadonlyMap<string, ScheduleDefinition>\n): void {\n for (const reference of references) {\n if (!schedulesById.has(reference.scheduleId)) {\n throw new RuntimeError(\n `${consumerKind} '${consumerId}' references unknown schedule '${reference.scheduleId}'. Add it to 'schedules' in createSixb() or export it from 'schedules/'.`\n )\n }\n }\n}\n",
|
|
31
|
+
"import type { SixbReadiness } from \"../maintenance\"\nimport { checkStorageSchema, isMigrationCapableStorage, type Storage } from \"../storage\"\n\nconst DEFAULT_SCHEMA_RETRY_DELAY_MS = 60_000\n\ntype SchemaReadiness =\n | { readonly status: \"unchecked\" | \"checking\" }\n | { readonly status: \"valid\" }\n | { readonly status: \"invalid\"; readonly reason: string; readonly retryAt: number }\n\ninterface StorageReadinessOptions {\n readonly schemaRetryDelayMs?: number\n readonly now?: () => Date\n}\n\n/** Caches the process schema invariant while keeping each readiness probe lock-free. */\nexport class StorageReadiness {\n private schema: SchemaReadiness\n private readonly schemaRetryDelayMs: number\n private readonly now: () => Date\n\n constructor(\n private readonly storage: Storage,\n options: StorageReadinessOptions = {}\n ) {\n this.schemaRetryDelayMs = positiveInteger(\n options.schemaRetryDelayMs ?? DEFAULT_SCHEMA_RETRY_DELAY_MS,\n \"schemaRetryDelayMs\"\n )\n this.now = options.now ?? (() => new Date())\n this.schema = isMigrationCapableStorage(storage) ? { status: \"unchecked\" } : { status: \"valid\" }\n }\n\n startSchemaValidation(): void {\n if (this.schema.status === \"checking\" || this.schema.status === \"valid\") return\n if (this.schema.status === \"invalid\" && this.now().getTime() < this.schema.retryAt) return\n this.schema = { status: \"checking\" }\n void this.validateSchema()\n }\n\n async check(): Promise<SixbReadiness> {\n try {\n await this.storage.ping()\n } catch {\n return {\n status: \"unready\",\n storage: { reachable: false, schemaValid: false },\n reason: \"Storage is unreachable.\",\n }\n }\n\n this.startSchemaValidation()\n if (this.schema.status === \"valid\") {\n return { status: \"ready\", storage: { reachable: true, schemaValid: true } }\n }\n\n return {\n status: \"unready\",\n storage: { reachable: true, schemaValid: false },\n reason:\n this.schema.status === \"invalid\"\n ? this.schema.reason\n : \"Storage schema validation is in progress.\",\n }\n }\n\n private async validateSchema(): Promise<void> {\n // Shared with `sixb check`, so the panel an author reads before deploying and the\n // `/ready` a load balancer polls after cannot disagree about what \"usable\" means.\n const result = await checkStorageSchema(this.storage)\n\n this.schema = result.ok\n ? { status: \"valid\" }\n : this.invalidSchema(result.reason ?? \"Storage schema is not usable.\")\n }\n\n private invalidSchema(reason: string): SchemaReadiness {\n return {\n status: \"invalid\",\n reason,\n retryAt: this.now().getTime() + this.schemaRetryDelayMs,\n }\n }\n}\n\nfunction positiveInteger(value: number, name: string): number {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new Error(`[Sixb] Storage readiness ${name} must be a positive integer.`)\n }\n return value\n}\n"
|
|
32
|
+
],
|
|
33
|
+
"mappings": "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",
|
|
34
|
+
"debugId": "4CB6C5C3405BADC164756E2164756E21",
|
|
35
|
+
"names": []
|
|
36
|
+
}
|