@sixb/core 0.1.7 → 0.1.9
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/delegated-admission.d.ts +24 -0
- package/dist/actions/delegated-admission.d.ts.map +1 -0
- package/dist/actions/descriptor.d.ts +29 -0
- package/dist/actions/descriptor.d.ts.map +1 -0
- package/dist/actions/execution.d.ts +5 -5
- package/dist/actions/execution.d.ts.map +1 -1
- package/dist/actions/index.js +78 -84
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/request.d.ts.map +1 -1
- package/dist/actions/run-authorization.d.ts +20 -0
- package/dist/actions/run-authorization.d.ts.map +1 -0
- package/dist/actions/run-dispatch.d.ts +3 -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 +8 -125
- package/dist/agents/adapters.d.ts.map +1 -1
- package/dist/agents/authority.d.ts +1 -1
- package/dist/agents/authority.d.ts.map +1 -1
- 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/errors.d.ts +0 -9
- package/dist/agents/errors.d.ts.map +1 -1
- package/dist/agents/execution.d.ts.map +1 -1
- package/dist/agents/identity.d.ts +3 -0
- package/dist/agents/identity.d.ts.map +1 -0
- package/dist/agents/index.d.ts +7 -7
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +193 -205
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/message.d.ts +5 -6
- package/dist/agents/message.d.ts.map +1 -1
- package/dist/agents/model-loop.d.ts +4 -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/tool-definition.d.ts +0 -1
- package/dist/agents/tool-definition.d.ts.map +1 -1
- package/dist/agents/types.d.ts +1 -1
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/agents/validation.d.ts +0 -4
- package/dist/agents/validation.d.ts.map +1 -1
- package/dist/ai-usage/execution.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 -105
- 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/decision.d.ts +10 -2
- package/dist/authorization/decision.d.ts.map +1 -1
- package/dist/authorization/grant-kinds.d.ts +2 -1
- package/dist/authorization/grant-kinds.d.ts.map +1 -1
- package/dist/authorization/index.d.ts +1 -1
- package/dist/authorization/index.d.ts.map +1 -1
- package/dist/authorization/index.js +51 -53
- 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 +20 -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 +79 -81
- package/dist/bootstrap/index.js.map +1 -1
- package/dist/bootstrap/ontology-type-manifest.d.ts.map +1 -1
- package/dist/broker/index.js +8 -10
- package/dist/broker/index.js.map +1 -1
- package/dist/{chunk-k34z5rvh.js → chunk-0rdrecsb.js} +18 -18
- package/dist/{chunk-k34z5rvh.js.map → chunk-0rdrecsb.js.map} +2 -2
- package/dist/{chunk-3fqt22c4.js → chunk-0w35wavj.js} +360 -168
- package/dist/chunk-0w35wavj.js.map +14 -0
- package/dist/chunk-0y39rgsb.js +43 -0
- package/dist/{chunk-c15dr03f.js.map → chunk-0y39rgsb.js.map} +2 -2
- package/dist/{chunk-hdz94br2.js → chunk-17kfctj6.js} +23 -13
- package/dist/chunk-17kfctj6.js.map +10 -0
- package/dist/{chunk-e4rvtvpw.js → chunk-1enhpacz.js} +418 -233
- package/dist/chunk-1enhpacz.js.map +34 -0
- package/dist/{chunk-5gd7tpv6.js → chunk-2c4j899j.js} +4 -4
- package/dist/{chunk-5gd7tpv6.js.map → chunk-2c4j899j.js.map} +2 -2
- package/dist/{chunk-7ds9620f.js → chunk-38zv5rkr.js} +24 -8
- package/dist/chunk-38zv5rkr.js.map +10 -0
- 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-8m5ejdpn.js → chunk-3f7veca0.js} +4 -4
- package/dist/{chunk-8m5ejdpn.js.map → chunk-3f7veca0.js.map} +2 -2
- package/dist/chunk-3frsnm7x.js +32 -0
- package/dist/chunk-3frsnm7x.js.map +11 -0
- package/dist/{chunk-n2w475r0.js → chunk-3tgwrcyh.js} +81 -81
- package/dist/{chunk-n2w475r0.js.map → chunk-3tgwrcyh.js.map} +2 -2
- package/dist/{chunk-qv38twt8.js → chunk-52hbv0ak.js} +192 -171
- package/dist/{chunk-qv38twt8.js.map → chunk-52hbv0ak.js.map} +6 -6
- 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-rte5sm3z.js → chunk-5hz0fnca.js} +23 -23
- package/dist/{chunk-rte5sm3z.js.map → chunk-5hz0fnca.js.map} +2 -2
- 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-08twe8m6.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-tn7xcs2n.js → chunk-860dwwy0.js} +93 -30
- package/dist/chunk-860dwwy0.js.map +14 -0
- 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-gbrpsx4m.js → chunk-93csa55g.js} +72 -16
- package/dist/chunk-93csa55g.js.map +11 -0
- package/dist/{chunk-d8qkxt2v.js → chunk-98cw09sw.js} +7 -7
- package/dist/chunk-98cw09sw.js.map +10 -0
- package/dist/chunk-9qsh3p5y.js +111 -0
- package/dist/chunk-9qsh3p5y.js.map +11 -0
- package/dist/{chunk-4a849fr1.js → chunk-9tc8dxmn.js} +1 -1
- package/dist/{chunk-z2sery1b.js → chunk-9vx5e9g1.js} +68 -28
- package/dist/chunk-9vx5e9g1.js.map +11 -0
- package/dist/{chunk-9aehf39w.js → chunk-an5tt9y0.js} +353 -353
- package/dist/{chunk-9aehf39w.js.map → chunk-an5tt9y0.js.map} +2 -2
- package/dist/{chunk-x0qhkqje.js → chunk-ap0g1g74.js} +37 -37
- package/dist/{chunk-x0qhkqje.js.map → chunk-ap0g1g74.js.map} +2 -2
- package/dist/chunk-awbhdqyc.js +252 -0
- package/dist/chunk-awbhdqyc.js.map +10 -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-br3k6qbf.js +436 -0
- package/dist/chunk-br3k6qbf.js.map +12 -0
- 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-atmkaf60.js → chunk-dmn70ztd.js} +30 -34
- package/dist/chunk-dmn70ztd.js.map +11 -0
- package/dist/chunk-dz5h08xv.js +1887 -0
- package/dist/chunk-dz5h08xv.js.map +25 -0
- 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-ha58tjtt.js → chunk-emyyk7dx.js} +59 -55
- package/dist/{chunk-ha58tjtt.js.map → chunk-emyyk7dx.js.map} +3 -3
- package/dist/{chunk-3kv70xwp.js → chunk-ey1nk510.js} +18 -2
- package/dist/chunk-ey1nk510.js.map +10 -0
- package/dist/chunk-f0rwz2vh.js +152 -0
- 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-rre42skh.js → chunk-g00bfdq6.js} +729 -296
- package/dist/{chunk-rre42skh.js.map → chunk-g00bfdq6.js.map} +11 -7
- 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-51fjndv0.js → chunk-gfdh9kqa.js} +4 -4
- package/dist/{chunk-51fjndv0.js.map → chunk-gfdh9kqa.js.map} +2 -2
- package/dist/chunk-h1gfhhbh.js +602 -0
- package/dist/chunk-h1gfhhbh.js.map +18 -0
- package/dist/chunk-h3v76ams.js +32 -0
- package/dist/{chunk-08m3b6w8.js.map → chunk-h3v76ams.js.map} +2 -2
- package/dist/chunk-hpr1r6av.js +4006 -0
- package/dist/chunk-hpr1r6av.js.map +44 -0
- 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-rp1mvzb4.js → chunk-jjy0fhrn.js} +40 -35
- package/dist/{chunk-rp1mvzb4.js.map → chunk-jjy0fhrn.js.map} +3 -3
- package/dist/{chunk-4nxeacx7.js → chunk-jmfet9r4.js} +6 -6
- package/dist/{chunk-4nxeacx7.js.map → chunk-jmfet9r4.js.map} +2 -2
- package/dist/{chunk-64sr682n.js → chunk-k3cqkkn2.js} +61 -55
- package/dist/chunk-k3cqkkn2.js.map +12 -0
- package/dist/{chunk-s5y30bc9.js → chunk-kxwa347f.js} +51 -49
- package/dist/{chunk-s5y30bc9.js.map → chunk-kxwa347f.js.map} +4 -4
- 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-qjycjdj6.js → chunk-m3z3x9v0.js} +106 -65
- package/dist/{chunk-qjycjdj6.js.map → chunk-m3z3x9v0.js.map} +3 -3
- package/dist/{chunk-6ed5bwnd.js → chunk-mjbk2djy.js} +2092 -1714
- package/dist/chunk-mjbk2djy.js.map +57 -0
- package/dist/{chunk-5jcdmjam.js → chunk-mmagke4x.js} +6 -6
- package/dist/{chunk-5jcdmjam.js.map → chunk-mmagke4x.js.map} +2 -2
- package/dist/chunk-mrp7k0pw.js +147 -0
- package/dist/chunk-mrp7k0pw.js.map +10 -0
- package/dist/{chunk-d63tybny.js → chunk-ms2tmn1k.js} +139 -139
- package/dist/{chunk-d63tybny.js.map → chunk-ms2tmn1k.js.map} +2 -2
- package/dist/{chunk-xdpwpkha.js → chunk-ppytyr6w.js} +156 -179
- package/dist/{chunk-xdpwpkha.js.map → chunk-ppytyr6w.js.map} +3 -5
- 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-qjzp9xyb.js → chunk-pr2h4bv4.js} +33 -35
- package/dist/chunk-pr2h4bv4.js.map +12 -0
- 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-agsvg9ar.js → chunk-qf954wje.js} +6 -6
- package/dist/{chunk-agsvg9ar.js.map → chunk-qf954wje.js.map} +2 -2
- package/dist/{chunk-wjgm6jjt.js → chunk-qhcpj9wc.js} +166 -132
- package/dist/chunk-qhcpj9wc.js.map +14 -0
- package/dist/{chunk-tpnd31c1.js → chunk-r29fxdhn.js} +12 -12
- package/dist/{chunk-tpnd31c1.js.map → chunk-r29fxdhn.js.map} +2 -2
- 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-2b5qtban.js → chunk-r4tfx1sf.js} +142 -89
- package/dist/chunk-r4tfx1sf.js.map +15 -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-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-v4jbb3rs.js +403 -0
- package/dist/chunk-v4jbb3rs.js.map +10 -0
- package/dist/{chunk-d2ndstdf.js → chunk-vf691g1r.js} +61 -59
- package/dist/{chunk-d2ndstdf.js.map → chunk-vf691g1r.js.map} +2 -2
- package/dist/{chunk-1kamz6j0.js → chunk-vsj3mdfj.js} +8 -8
- package/dist/{chunk-1kamz6j0.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-8tsf6dmc.js → chunk-x57ycxq0.js} +204 -204
- package/dist/{chunk-8tsf6dmc.js.map → chunk-x57ycxq0.js.map} +2 -2
- package/dist/chunk-x9v4cx1d.js +139 -0
- package/dist/chunk-x9v4cx1d.js.map +10 -0
- package/dist/{chunk-kt81c11h.js → chunk-xfbydgzy.js} +27 -27
- package/dist/{chunk-kt81c11h.js.map → chunk-xfbydgzy.js.map} +2 -2
- package/dist/{chunk-vjjv9mrb.js → chunk-xyr8kppc.js} +22 -22
- package/dist/{chunk-vjjv9mrb.js.map → chunk-xyr8kppc.js.map} +3 -3
- package/dist/chunk-ypbtykv6.js +1537 -0
- package/dist/chunk-ypbtykv6.js.map +19 -0
- 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-xc7hq65b.js → chunk-z30bv4ga.js} +80 -33
- package/dist/chunk-z30bv4ga.js.map +11 -0
- 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-z8fx5cgb.js +159 -0
- package/dist/chunk-z8fx5cgb.js.map +11 -0
- package/dist/{chunk-xhy826cz.js → chunk-zcnq6105.js} +7 -7
- package/dist/{chunk-xhy826cz.js.map → chunk-zcnq6105.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/internal.js +9 -10
- package/dist/connectors/connections/internal.js.map +1 -1
- package/dist/datasets/builders.d.ts +11 -2
- package/dist/datasets/builders.d.ts.map +1 -1
- package/dist/datasets/changes.d.ts +14 -4
- package/dist/datasets/changes.d.ts.map +1 -1
- package/dist/datasets/execution.d.ts +15 -1
- package/dist/datasets/execution.d.ts.map +1 -1
- package/dist/datasets/index.d.ts +1 -0
- package/dist/datasets/index.d.ts.map +1 -1
- package/dist/datasets/sequence.d.ts +7 -0
- package/dist/datasets/sequence.d.ts.map +1 -0
- package/dist/datasets/types.d.ts +1 -0
- package/dist/datasets/types.d.ts.map +1 -1
- package/dist/datasets/validation.d.ts.map +1 -1
- package/dist/datasets/write.d.ts +37 -0
- package/dist/datasets/write.d.ts.map +1 -0
- package/dist/datasets/write.js +13 -0
- package/dist/datasets/write.js.map +9 -0
- 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.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/types/datasets.d.ts +2 -6
- package/dist/events/types/datasets.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 +70 -75
- package/dist/execution/agent.js.map +1 -1
- package/dist/execution/authorization.d.ts +58 -20
- package/dist/execution/authorization.d.ts.map +1 -1
- package/dist/execution/authorized-object-reader.d.ts +69 -0
- package/dist/execution/authorized-object-reader.d.ts.map +1 -0
- package/dist/execution/durable.d.ts +1 -0
- package/dist/execution/durable.d.ts.map +1 -1
- package/dist/execution/index.d.ts +1 -1
- package/dist/execution/index.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 +63 -64
- package/dist/execution/primitive.js.map +3 -3
- package/dist/execution/request.d.ts +12 -0
- package/dist/execution/request.d.ts.map +1 -1
- package/dist/execution/request.js +97 -71
- package/dist/execution/request.js.map +3 -3
- package/dist/execution/scopes.d.ts +16 -0
- package/dist/execution/scopes.d.ts.map +1 -1
- package/dist/execution/types.d.ts +9 -0
- package/dist/execution/types.d.ts.map +1 -1
- package/dist/http/api-routes.d.ts +2 -0
- package/dist/http/api-routes.d.ts.map +1 -1
- package/dist/http/index.js +10 -11
- package/dist/http/index.js.map +1 -1
- package/dist/index.d.ts +21 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +455 -463
- package/dist/index.js.map +1 -1
- package/dist/lake-storage/definition-updates.d.ts.map +1 -1
- package/dist/lake-storage/errors.d.ts +5 -1
- package/dist/lake-storage/errors.d.ts.map +1 -1
- package/dist/lake-storage/in-memory.d.ts +1 -0
- package/dist/lake-storage/in-memory.d.ts.map +1 -1
- package/dist/lake-storage/index.d.ts +6 -1
- package/dist/lake-storage/index.d.ts.map +1 -1
- package/dist/lake-storage/index.js +40 -27
- package/dist/lake-storage/index.js.map +1 -1
- package/dist/lake-storage/merge-validation.d.ts.map +1 -1
- package/dist/lake-storage/merge.d.ts +13 -2
- package/dist/lake-storage/merge.d.ts.map +1 -1
- package/dist/lake-storage/source-ordering.d.ts +19 -0
- package/dist/lake-storage/source-ordering.d.ts.map +1 -0
- package/dist/lake-storage/sql-transforms.d.ts +2 -1
- package/dist/lake-storage/sql-transforms.d.ts.map +1 -1
- package/dist/lake-storage/types.d.ts +10 -5
- package/dist/lake-storage/types.d.ts.map +1 -1
- package/dist/lake-storage/version-inputs.d.ts +4 -0
- package/dist/lake-storage/version-inputs.d.ts.map +1 -0
- 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.js +46 -49
- package/dist/materialization/index.js.map +1 -1
- package/dist/materializer/index.js +137 -142
- package/dist/materializer/index.js.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/authorized-ontology-view.d.ts +25 -0
- package/dist/objects/authorized-ontology-view.d.ts.map +1 -0
- package/dist/objects/execution.d.ts +1 -1
- package/dist/objects/execution.d.ts.map +1 -1
- package/dist/objects/index.js +75 -84
- package/dist/objects/index.js.map +1 -1
- package/dist/objects/link/authorization.d.ts +2 -7
- package/dist/objects/link/authorization.d.ts.map +1 -1
- package/dist/objects/query/executor.d.ts +4 -2
- package/dist/objects/query/executor.d.ts.map +1 -1
- package/dist/objects/query/index.js +67 -73
- package/dist/objects/query/index.js.map +1 -1
- package/dist/objects/query/links.d.ts +22 -1
- package/dist/objects/query/links.d.ts.map +1 -1
- package/dist/objects/query/selected-read-admission.d.ts +27 -0
- package/dist/objects/query/selected-read-admission.d.ts.map +1 -0
- package/dist/objects/query/validate.d.ts +60 -2
- package/dist/objects/query/validate.d.ts.map +1 -1
- package/dist/objects/sdk/object-handle.d.ts.map +1 -1
- package/dist/objects/sdk/object-set.d.ts.map +1 -1
- package/dist/objects/sdk/runtime-query-executor.d.ts +2 -7
- package/dist/objects/sdk/runtime-query-executor.d.ts.map +1 -1
- package/dist/objects/sdk/telemetry-channel.d.ts.map +1 -1
- package/dist/objects/service/list-service.d.ts +2 -3
- package/dist/objects/service/list-service.d.ts.map +1 -1
- package/dist/objects/telemetry/history.d.ts +8 -6
- package/dist/objects/telemetry/history.d.ts.map +1 -1
- package/dist/objects/telemetry/index.d.ts +2 -2
- package/dist/objects/telemetry/index.d.ts.map +1 -1
- package/dist/objects/telemetry/workload.d.ts +11 -0
- package/dist/objects/telemetry/workload.d.ts.map +1 -0
- package/dist/ontology/index.d.ts +2 -2
- package/dist/ontology/index.d.ts.map +1 -1
- package/dist/ontology/index.js +61 -111
- package/dist/ontology/index.js.map +1 -1
- package/dist/ontology/inference/index.d.ts +2 -1
- package/dist/ontology/inference/index.d.ts.map +1 -1
- package/dist/ontology/internal.d.ts +7 -1
- package/dist/ontology/internal.d.ts.map +1 -1
- package/dist/ontology/internal.js +65 -121
- package/dist/ontology/internal.js.map +3 -4
- package/dist/ontology/json-schema.d.ts +10 -6
- package/dist/ontology/json-schema.d.ts.map +1 -1
- package/dist/ontology/link-path-selection.d.ts +35 -0
- package/dist/ontology/link-path-selection.d.ts.map +1 -0
- package/dist/ontology/refs.d.ts +2 -0
- package/dist/ontology/refs.d.ts.map +1 -1
- package/dist/ontology/tokens.d.ts +2 -1
- package/dist/ontology/tokens.d.ts.map +1 -1
- package/dist/pipelines/execution.d.ts.map +1 -1
- package/dist/pipelines/index.js +57 -63
- package/dist/pipelines/index.js.map +1 -1
- package/dist/pipelines/request.d.ts.map +1 -1
- package/dist/projections/execution.d.ts.map +1 -1
- package/dist/projections/internal.js +58 -64
- 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/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/types.d.ts +3 -20
- package/dist/queues/types.d.ts.map +1 -1
- package/dist/rules/execution.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 +6 -2
- package/dist/runtime/create.d.ts.map +1 -1
- package/dist/runtime/definitions.d.ts +2 -0
- package/dist/runtime/definitions.d.ts.map +1 -1
- package/dist/runtime/host.d.ts +4 -1
- package/dist/runtime/host.d.ts.map +1 -1
- package/dist/runtime/internal.d.ts +1 -0
- package/dist/runtime/internal.d.ts.map +1 -1
- package/dist/runtime/internal.js +13 -14
- package/dist/runtime/internal.js.map +1 -1
- package/dist/runtime/resolve-definitions.d.ts +2 -0
- package/dist/runtime/resolve-definitions.d.ts.map +1 -1
- package/dist/runtime/sixb.d.ts +6 -0
- package/dist/runtime/sixb.d.ts.map +1 -1
- package/dist/runtime/types.d.ts +3 -0
- package/dist/runtime/types.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/execution.d.ts +2 -1
- package/dist/schedules/execution.d.ts.map +1 -1
- package/dist/schedules/index.js +31 -33
- package/dist/schedules/index.js.map +1 -1
- package/dist/security/every.d.ts +4 -1
- package/dist/security/every.d.ts.map +1 -1
- package/dist/security/grants.d.ts +7 -2
- package/dist/security/grants.d.ts.map +1 -1
- package/dist/security/index.d.ts +1 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/registry.d.ts +1 -0
- package/dist/security/registry.d.ts.map +1 -1
- package/dist/security/types.d.ts +7 -1
- package/dist/security/types.d.ts.map +1 -1
- package/dist/security/validation.d.ts +2 -0
- package/dist/security/validation.d.ts.map +1 -1
- package/dist/shares/access-plan.d.ts +22 -0
- package/dist/shares/access-plan.d.ts.map +1 -0
- package/dist/shares/builders.d.ts +14 -0
- package/dist/shares/builders.d.ts.map +1 -0
- package/dist/shares/compiler.d.ts +14 -0
- package/dist/shares/compiler.d.ts.map +1 -0
- package/dist/shares/errors.d.ts +4 -0
- package/dist/shares/errors.d.ts.map +1 -0
- package/dist/shares/execution.d.ts +57 -0
- package/dist/shares/execution.d.ts.map +1 -0
- package/dist/shares/index.d.ts +10 -0
- package/dist/shares/index.d.ts.map +1 -0
- package/dist/shares/internal.d.ts +3 -0
- package/dist/shares/internal.d.ts.map +1 -0
- package/dist/shares/internal.js +231 -0
- package/dist/shares/internal.js.map +10 -0
- package/dist/shares/intersection.d.ts +9 -0
- package/dist/shares/intersection.d.ts.map +1 -0
- package/dist/shares/session-protocol.d.ts +41 -0
- package/dist/shares/session-protocol.d.ts.map +1 -0
- package/dist/shares/types.d.ts +51 -0
- package/dist/shares/types.d.ts.map +1 -0
- package/dist/shares/validation.d.ts +11 -0
- package/dist/shares/validation.d.ts.map +1 -0
- 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/provider.js +34 -36
- package/dist/storage/connector-connections/provider.js.map +2 -2
- package/dist/storage/executions/in-memory.d.ts +3 -0
- package/dist/storage/executions/in-memory.d.ts.map +1 -1
- package/dist/storage/executions/provider.d.ts +6 -2
- package/dist/storage/executions/provider.d.ts.map +1 -1
- package/dist/storage/executions/provider.js +35 -12
- package/dist/storage/executions/provider.js.map +3 -3
- package/dist/storage/executions/run-link.d.ts +7 -0
- package/dist/storage/executions/run-link.d.ts.map +1 -1
- 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 +8 -0
- package/dist/storage/executions/validation.d.ts.map +1 -1
- package/dist/storage/in-memory/index.d.ts +8 -0
- package/dist/storage/in-memory/index.d.ts.map +1 -1
- package/dist/storage/index.d.ts +14 -9
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +221 -227
- 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/objects/execution-limits.d.ts +25 -0
- package/dist/storage/objects/execution-limits.d.ts.map +1 -0
- package/dist/storage/objects/guard.d.ts +16 -0
- package/dist/storage/objects/guard.d.ts.map +1 -0
- package/dist/storage/objects/in-memory/index.d.ts +3 -0
- package/dist/storage/objects/in-memory/index.d.ts.map +1 -0
- package/dist/storage/objects/in-memory/keys.d.ts +10 -0
- package/dist/storage/objects/in-memory/keys.d.ts.map +1 -0
- package/dist/storage/objects/in-memory/query.d.ts +31 -0
- package/dist/storage/objects/in-memory/query.d.ts.map +1 -0
- package/dist/storage/objects/in-memory/read-scope.d.ts +18 -0
- package/dist/storage/objects/in-memory/read-scope.d.ts.map +1 -0
- package/dist/storage/objects/in-memory/read-source.d.ts +10 -0
- package/dist/storage/objects/in-memory/read-source.d.ts.map +1 -0
- package/dist/storage/objects/in-memory/selected-reader.d.ts +9 -0
- package/dist/storage/objects/in-memory/selected-reader.d.ts.map +1 -0
- package/dist/storage/objects/{in-memory.d.ts → in-memory/storage.d.ts} +13 -10
- package/dist/storage/objects/in-memory/storage.d.ts.map +1 -0
- package/dist/storage/objects/index.d.ts +4 -1
- package/dist/storage/objects/index.d.ts.map +1 -1
- package/dist/storage/objects/keys.d.ts +1 -1
- package/dist/storage/objects/keys.d.ts.map +1 -1
- package/dist/storage/objects/read-scope.d.ts +25 -0
- package/dist/storage/objects/read-scope.d.ts.map +1 -0
- package/dist/storage/objects/types.d.ts +114 -22
- package/dist/storage/objects/types.d.ts.map +1 -1
- package/dist/storage/ontology/provider.js +105 -109
- package/dist/storage/ontology/provider.js.map +1 -1
- package/dist/storage/operation-scope.d.ts +3 -0
- package/dist/storage/operation-scope.d.ts.map +1 -1
- package/dist/storage/operation-scope.js +18 -17
- 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/provider.js +66 -70
- package/dist/storage/projection-runs/provider.js.map +1 -1
- package/dist/storage/share-grants/errors.d.ts +8 -0
- package/dist/storage/share-grants/errors.d.ts.map +1 -0
- package/dist/storage/share-grants/in-memory.d.ts +11 -0
- package/dist/storage/share-grants/in-memory.d.ts.map +1 -0
- package/dist/storage/share-grants/index.d.ts +5 -0
- package/dist/storage/share-grants/index.d.ts.map +1 -0
- package/dist/storage/share-grants/provider.d.ts +4 -0
- package/dist/storage/share-grants/provider.d.ts.map +1 -0
- package/dist/storage/share-grants/provider.js +22 -0
- package/dist/storage/share-grants/provider.js.map +9 -0
- package/dist/storage/share-grants/record.d.ts +11 -0
- package/dist/storage/share-grants/record.d.ts.map +1 -0
- package/dist/storage/share-grants/types.d.ts +97 -0
- package/dist/storage/share-grants/types.d.ts.map +1 -0
- package/dist/storage/share-sessions/errors.d.ts +8 -0
- package/dist/storage/share-sessions/errors.d.ts.map +1 -0
- package/dist/storage/share-sessions/in-memory.d.ts +14 -0
- package/dist/storage/share-sessions/in-memory.d.ts.map +1 -0
- package/dist/storage/share-sessions/index.d.ts +5 -0
- package/dist/storage/share-sessions/index.d.ts.map +1 -0
- package/dist/storage/share-sessions/provider.d.ts +3 -0
- package/dist/storage/share-sessions/provider.d.ts.map +1 -0
- package/dist/storage/share-sessions/provider.js +19 -0
- package/dist/storage/share-sessions/provider.js.map +9 -0
- package/dist/storage/share-sessions/record.d.ts +8 -0
- package/dist/storage/share-sessions/record.d.ts.map +1 -0
- package/dist/storage/share-sessions/types.d.ts +50 -0
- package/dist/storage/share-sessions/types.d.ts.map +1 -0
- package/dist/storage/sync-runs/provider.js +4 -6
- package/dist/storage/sync-runs/provider.js.map +1 -1
- package/dist/storage/transaction.d.ts +2 -1
- package/dist/storage/transaction.d.ts.map +1 -1
- package/dist/storage/types.d.ts +8 -0
- package/dist/storage/types.d.ts.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 -18
- 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/execution.d.ts.map +1 -1
- package/dist/syncs/index.js +55 -62
- package/dist/syncs/index.js.map +1 -1
- package/dist/syncs/request.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/dataset-sequence-contract.d.ts +4 -0
- package/dist/testing/dataset-sequence-contract.d.ts.map +1 -0
- package/dist/testing/effective-storage-contract.d.ts.map +1 -1
- package/dist/testing/execution-storage-contract.d.ts +4 -0
- 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 +3 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +3087 -1328
- package/dist/testing/index.js.map +17 -13
- package/dist/testing/lake-merge-storage-contract.d.ts +1 -0
- package/dist/testing/lake-merge-storage-contract.d.ts.map +1 -1
- package/dist/testing/lake-storage-contract.d.ts.map +1 -1
- package/dist/testing/object-read-scope-contract.d.ts +22 -0
- package/dist/testing/object-read-scope-contract.d.ts.map +1 -0
- package/dist/testing/share-grant-storage-contract.d.ts +10 -0
- package/dist/testing/share-grant-storage-contract.d.ts.map +1 -0
- package/dist/testing/share-session-storage-contract.d.ts +9 -0
- package/dist/testing/share-session-storage-contract.d.ts.map +1 -0
- package/dist/testing/workflow-execution.d.ts +1 -0
- package/dist/testing/workflow-execution.d.ts.map +1 -1
- package/dist/webhooks/internal.js +51 -56
- package/dist/webhooks/internal.js.map +2 -2
- package/dist/workers/index.js +11 -13
- package/dist/workers/index.js.map +2 -2
- package/dist/workflows/execution.d.ts.map +1 -1
- package/dist/workflows/failure.d.ts +2 -0
- package/dist/workflows/failure.d.ts.map +1 -1
- package/dist/workflows/index.js +135 -140
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/request.d.ts.map +1 -1
- package/dist/workflows/run-dispatch.d.ts +0 -1
- 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 +72 -30
- package/src/actions/delegated-admission.ts +72 -0
- package/src/actions/descriptor.ts +58 -0
- package/src/actions/execution.ts +99 -24
- package/src/actions/request.ts +136 -19
- package/src/actions/run-authorization.ts +53 -0
- package/src/actions/run-dispatch.ts +10 -7
- package/src/actions/types/context.ts +2 -0
- package/src/actions/validation.ts +2 -1
- package/src/agents/adapters.ts +34 -429
- package/src/agents/authority.ts +3 -4
- 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 +2 -5
- package/src/agents/errors.ts +0 -10
- package/src/agents/execution.ts +13 -5
- package/src/agents/identity.ts +4 -0
- package/src/agents/index.ts +5 -24
- package/src/agents/message.ts +5 -6
- package/src/agents/model-loop.ts +62 -6
- package/src/agents/request.ts +27 -29
- 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/tool-definition.ts +0 -19
- package/src/agents/types.ts +1 -1
- package/src/agents/validation.ts +9 -72
- package/src/ai-usage/execution.ts +4 -11
- package/src/auth/index.ts +0 -1
- package/src/authorization/decision.ts +29 -14
- package/src/authorization/grant-kinds.ts +10 -0
- package/src/authorization/index.ts +1 -0
- package/src/bootstrap/discovery.ts +84 -24
- package/src/bootstrap/index.ts +8 -1
- package/src/bootstrap/ontology-type-manifest.ts +12 -6
- package/src/datasets/builders.ts +23 -2
- package/src/datasets/changes.ts +16 -4
- package/src/datasets/execution.ts +76 -5
- package/src/datasets/index.ts +1 -0
- package/src/datasets/sequence.ts +77 -0
- package/src/datasets/types.ts +1 -0
- package/src/datasets/validation.ts +26 -0
- package/src/datasets/write.ts +240 -0
- 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 +57 -7
- package/src/events/types/datasets.ts +2 -6
- package/src/execution/agent.ts +6 -7
- package/src/execution/authorization.ts +470 -90
- package/src/execution/authorized-object-reader.ts +695 -0
- package/src/execution/durable.ts +21 -3
- package/src/execution/index.ts +1 -0
- package/src/execution/primitive.ts +5 -1
- package/src/execution/request.ts +66 -13
- package/src/execution/scopes.ts +36 -6
- package/src/execution/types.ts +8 -0
- package/src/http/api-routes.ts +45 -0
- package/src/index.ts +56 -33
- package/src/lake-storage/definition-updates.ts +9 -0
- package/src/lake-storage/errors.ts +6 -1
- package/src/lake-storage/in-memory.ts +53 -17
- package/src/lake-storage/index.ts +10 -1
- package/src/lake-storage/merge-validation.ts +12 -2
- package/src/lake-storage/merge.ts +40 -2
- package/src/lake-storage/source-ordering.ts +95 -0
- package/src/lake-storage/sql-transforms.ts +2 -1
- package/src/lake-storage/types.ts +10 -5
- package/src/lake-storage/version-inputs.ts +14 -0
- package/src/logging/index.ts +2 -33
- package/src/logging/internal.ts +43 -0
- 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/authorized-ontology-view.ts +512 -0
- package/src/objects/execution.ts +99 -144
- package/src/objects/link/authorization.ts +3 -2
- package/src/objects/query/executor.ts +45 -34
- package/src/objects/query/links.ts +84 -25
- package/src/objects/query/selected-read-admission.ts +310 -0
- package/src/objects/query/validate.ts +353 -36
- package/src/objects/sdk/object-handle.ts +2 -8
- package/src/objects/sdk/object-set.ts +10 -11
- package/src/objects/sdk/runtime-query-executor.ts +8 -28
- package/src/objects/sdk/telemetry-channel.ts +11 -7
- package/src/objects/service/list-service.ts +15 -29
- package/src/objects/telemetry/history.ts +297 -17
- package/src/objects/telemetry/index.ts +2 -2
- package/src/objects/telemetry/workload.ts +79 -0
- package/src/ontology/index.ts +7 -2
- package/src/ontology/inference/index.ts +4 -1
- package/src/ontology/internal.ts +35 -1
- package/src/ontology/json-schema.ts +13 -12
- package/src/ontology/link-path-selection.ts +193 -0
- package/src/ontology/refs.ts +19 -0
- package/src/ontology/tokens.ts +15 -8
- package/src/pipelines/execution.ts +30 -7
- package/src/pipelines/request.ts +5 -0
- package/src/projections/execution.ts +72 -11
- package/src/projections/run-dispatch.ts +7 -12
- package/src/query.ts +0 -1
- package/src/queues/index.ts +4 -2
- package/src/queues/types.ts +6 -25
- package/src/rules/execution.ts +20 -8
- package/src/runtime/create.ts +7 -2
- package/src/runtime/definitions.ts +2 -0
- package/src/runtime/host.ts +27 -7
- package/src/runtime/internal.ts +1 -0
- package/src/runtime/resolve-definitions.ts +9 -0
- package/src/runtime/sixb.ts +27 -2
- package/src/runtime/types.ts +3 -0
- package/src/sandboxes/errors.ts +5 -0
- package/src/sandboxes/index.ts +3 -0
- package/src/sandboxes/sandbox.ts +35 -7
- package/src/schedules/execution.ts +24 -2
- package/src/security/every.ts +4 -0
- package/src/security/grants.ts +45 -3
- package/src/security/index.ts +1 -0
- package/src/security/registry.ts +3 -0
- package/src/security/types.ts +8 -0
- package/src/security/validation.ts +3 -0
- package/src/shares/access-plan.ts +225 -0
- package/src/shares/builders.ts +381 -0
- package/src/shares/compiler.ts +359 -0
- package/src/shares/errors.ts +3 -0
- package/src/shares/execution.ts +394 -0
- package/src/shares/index.ts +28 -0
- package/src/shares/internal.ts +9 -0
- package/src/shares/intersection.ts +178 -0
- package/src/shares/session-protocol.ts +258 -0
- package/src/shares/types.ts +76 -0
- package/src/shares/validation.ts +40 -0
- 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/executions/in-memory.ts +13 -10
- package/src/storage/executions/provider.ts +34 -1
- package/src/storage/executions/run-link.ts +29 -0
- package/src/storage/executions/types.ts +6 -2
- package/src/storage/executions/validation.ts +78 -1
- package/src/storage/in-memory/index.ts +37 -3
- package/src/storage/index.ts +54 -29
- package/src/storage/internal.ts +20 -0
- package/src/storage/objects/execution-limits.ts +283 -0
- package/src/storage/objects/guard.ts +55 -0
- package/src/storage/objects/in-memory/index.ts +2 -0
- package/src/storage/objects/in-memory/keys.ts +46 -0
- package/src/storage/objects/in-memory/query.ts +754 -0
- package/src/storage/objects/in-memory/read-scope.ts +211 -0
- package/src/storage/objects/in-memory/read-source.ts +10 -0
- package/src/storage/objects/in-memory/selected-reader.ts +252 -0
- package/src/storage/objects/in-memory/storage.ts +589 -0
- package/src/storage/objects/index.ts +21 -0
- package/src/storage/objects/keys.ts +1 -1
- package/src/storage/objects/read-scope.ts +672 -0
- package/src/storage/objects/types.ts +123 -19
- package/src/storage/operation-scope.ts +16 -0
- package/src/storage/share-grants/errors.ts +14 -0
- package/src/storage/share-grants/in-memory.ts +107 -0
- package/src/storage/share-grants/index.ts +14 -0
- package/src/storage/share-grants/provider.ts +11 -0
- package/src/storage/share-grants/record.ts +347 -0
- package/src/storage/share-grants/types.ts +112 -0
- package/src/storage/share-sessions/errors.ts +14 -0
- package/src/storage/share-sessions/in-memory.ts +105 -0
- package/src/storage/share-sessions/index.ts +11 -0
- package/src/storage/share-sessions/provider.ts +9 -0
- package/src/storage/share-sessions/record.ts +176 -0
- package/src/storage/share-sessions/types.ts +57 -0
- package/src/storage/transaction.ts +14 -2
- package/src/storage/types.ts +27 -0
- package/src/storage/workflow-runs/in-memory.ts +0 -2
- package/src/storage/workflow-runs/types.ts +0 -3
- package/src/syncs/execution.ts +25 -5
- package/src/syncs/request.ts +5 -0
- 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/dataset-sequence-contract.ts +373 -0
- package/src/testing/effective-storage-contract.ts +34 -0
- package/src/testing/execution-storage-contract.ts +138 -1
- package/src/testing/execution.ts +6 -0
- package/src/testing/index.ts +16 -0
- package/src/testing/lake-merge-storage-contract.ts +3 -0
- package/src/testing/lake-storage-contract.ts +58 -0
- package/src/testing/object-read-scope-contract.ts +939 -0
- package/src/testing/share-grant-storage-contract.ts +325 -0
- package/src/testing/share-session-storage-contract.ts +235 -0
- package/src/testing/workflow-execution.ts +4 -0
- package/src/workflows/execution.ts +53 -14
- package/src/workflows/failure.ts +62 -1
- package/src/workflows/request.ts +5 -9
- package/src/workflows/run-dispatch.ts +0 -3
- 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-08twe8m6.js +0 -218
- package/dist/chunk-2b5qtban.js.map +0 -14
- package/dist/chunk-2xns679x.js.map +0 -11
- package/dist/chunk-37wk412q.js +0 -1370
- package/dist/chunk-37wk412q.js.map +0 -23
- package/dist/chunk-3fqt22c4.js.map +0 -14
- package/dist/chunk-3kv70xwp.js.map +0 -10
- package/dist/chunk-407j3msh.js +0 -60
- package/dist/chunk-64sr682n.js.map +0 -12
- package/dist/chunk-6ed5bwnd.js.map +0 -57
- package/dist/chunk-7ds9620f.js.map +0 -10
- package/dist/chunk-7y0f6rf1.js.map +0 -10
- package/dist/chunk-atmkaf60.js.map +0 -11
- package/dist/chunk-c15dr03f.js +0 -43
- package/dist/chunk-d8qkxt2v.js.map +0 -10
- package/dist/chunk-dqn23610.js +0 -72
- package/dist/chunk-dqn23610.js.map +0 -11
- package/dist/chunk-e4rvtvpw.js.map +0 -34
- package/dist/chunk-gbrpsx4m.js.map +0 -11
- package/dist/chunk-h0knpbz5.js +0 -2486
- package/dist/chunk-h0knpbz5.js.map +0 -38
- package/dist/chunk-hdz94br2.js.map +0 -10
- package/dist/chunk-jq43kdvk.js +0 -50
- package/dist/chunk-n2arzn6e.js +0 -1745
- package/dist/chunk-n2arzn6e.js.map +0 -20
- package/dist/chunk-p03r0h5s.js.map +0 -16
- package/dist/chunk-qjzp9xyb.js.map +0 -12
- package/dist/chunk-tn7xcs2n.js.map +0 -13
- package/dist/chunk-wjgm6jjt.js.map +0 -13
- package/dist/chunk-xc7hq65b.js.map +0 -10
- package/dist/chunk-y35ma3mj.js +0 -551
- package/dist/chunk-y35ma3mj.js.map +0 -15
- package/dist/chunk-y64skrwp.js +0 -19
- package/dist/chunk-z2sery1b.js.map +0 -11
- package/dist/chunk-zcnhxkvd.js +0 -7
- package/dist/logging/types.js +0 -27
- package/dist/logging/types.js.map +0 -9
- package/dist/storage/objects/in-memory.d.ts.map +0 -1
- package/src/storage/objects/in-memory.ts +0 -1241
- /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
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/storage/ai-usage/errors.ts", "../src/storage/ai-usage/usage.ts", "../src/storage/ai-usage/record.ts", "../src/storage/ai-usage/in-memory.ts", "../src/storage/ai-cost/analytics.ts", "../src/storage/ai-cost/groups.ts", "../src/storage/ai-cost/validation.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"export type AiUsageStorageErrorCode = \"duplicate_id\" | \"missing_execution\"\n\n/** Storage failure specific to the AI model-call usage ledger. */\nexport class AiUsageStorageError extends Error {\n readonly name = \"AiUsageStorageError\"\n\n constructor(\n readonly code: AiUsageStorageErrorCode,\n message: string\n ) {\n super(message)\n }\n}\n",
|
|
6
|
-
"import type { AiModelCallUsage, AiModelCallUsageInput } from \"./types\"\n\nconst USAGE_FIELDS = [\n \"inputTokens\",\n \"outputTokens\",\n \"uncachedInputTokens\",\n \"cacheReadInputTokens\",\n \"cacheWriteInputTokens\",\n \"textOutputTokens\",\n \"reasoningOutputTokens\",\n] as const\n\ntype AiUsageField = (typeof USAGE_FIELDS)[number]\n\n/** Validate provider-neutral counts and derive total/reporting fields without inventing zeroes. */\nexport function normalizeAiModelCallUsage(input: AiModelCallUsageInput): AiModelCallUsage {\n for (const field of USAGE_FIELDS) {\n assertUsageCount(input[field], field)\n }\n\n const totalTokens =\n input.inputTokens === undefined || input.outputTokens === undefined\n ? undefined\n : addUsageCounts(input.inputTokens, input.outputTokens, \"totalTokens\")\n const reportingStatus =\n input.inputTokens !== undefined && input.outputTokens !== undefined\n ? \"complete\"\n : USAGE_FIELDS.some((field) => input[field] !== undefined)\n ? \"partial\"\n : \"unavailable\"\n\n return {\n ...(input.inputTokens === undefined ? {} : { inputTokens: input.inputTokens }),\n ...(input.outputTokens === undefined ? {} : { outputTokens: input.outputTokens }),\n ...(totalTokens === undefined ? {} : { totalTokens }),\n ...(input.uncachedInputTokens === undefined\n ? {}\n : { uncachedInputTokens: input.uncachedInputTokens }),\n ...(input.cacheReadInputTokens === undefined\n ? {}\n : { cacheReadInputTokens: input.cacheReadInputTokens }),\n ...(input.cacheWriteInputTokens === undefined\n ? {}\n : { cacheWriteInputTokens: input.cacheWriteInputTokens }),\n ...(input.textOutputTokens === undefined ? {} : { textOutputTokens: input.textOutputTokens }),\n ...(input.reasoningOutputTokens === undefined\n ? {}\n : { reasoningOutputTokens: input.reasoningOutputTokens }),\n reportingStatus,\n }\n}\n\n/**\n * Aggregate model-call usage without treating a missing count as zero.\n *\n * A field is present only when every call reported it. This prevents a partial provider response\n * from becoming an apparently complete execution total. Zero remains a reported value.\n */\nexport function aggregateAiModelCallUsage(\n usages: Iterable<AiModelCallUsageInput>\n): AiModelCallUsage {\n const normalized = Array.from(usages, normalizeAiModelCallUsage)\n const fields = Object.fromEntries(\n USAGE_FIELDS.map((field) => [field, sumUsageField(normalized, field)])\n ) as Record<AiUsageField, number | undefined>\n const aggregate = normalizeAiModelCallUsage(fields)\n\n if (\n aggregate.reportingStatus === \"unavailable\" &&\n normalized.some((usage) => usage.reportingStatus !== \"unavailable\")\n ) {\n return { ...aggregate, reportingStatus: \"partial\" }\n }\n return aggregate\n}\n\nfunction sumUsageField(\n usages: readonly AiModelCallUsage[],\n field: AiUsageField\n): number | undefined {\n if (usages.length === 0) return undefined\n\n let total = 0\n for (const usage of usages) {\n const value = usage[field]\n if (value === undefined) return undefined\n total = addUsageCounts(total, value, `aggregate ${field}`)\n }\n return total\n}\n\nfunction assertUsageCount(value: number | undefined, field: AiUsageField): void {\n if (value !== undefined && (!Number.isSafeInteger(value) || value < 0)) {\n throw new TypeError(`[Sixb] AI model-call usage ${field} must be a non-negative safe integer.`)\n }\n}\n\nfunction addUsageCounts(left: number, right: number, field: string): number {\n const result = left + right\n if (!Number.isSafeInteger(result)) {\n throw new TypeError(`[Sixb] AI model-call usage ${field} exceeds the safe integer range.`)\n }\n return result\n}\n",
|
|
7
|
-
"import { normalizeRequesterGroupIds } from \"../../auth/attribution\"\nimport { assertJsonValue, isPlainRecord } from \"../../json\"\nimport { normalizeModelProviderIds } from \"../../models/events\"\nimport { isModelReasoning } from \"../../models/language-model\"\nimport type { AiModelCallUsageRecord, RecordAiModelCallInput } from \"./types\"\nimport { normalizeAiModelCallUsage } from \"./usage\"\n\n/** Validate and defensively snapshot one provider-neutral model-call ledger input. */\nexport function normalizeAiModelCallRecord(input: RecordAiModelCallInput): AiModelCallUsageRecord {\n assertNonBlank(input.id, \"id\")\n assertNonBlank(input.projectId, \"projectId\")\n assertAiUsageExecutionId(input.executionId)\n assertPositiveSafeInteger(input.attempt, \"attempt\")\n assertNonBlank(input.callId, \"callId\")\n assertNonBlank(input.providerId, \"providerId\")\n assertNonBlank(input.requestedModelId, \"requestedModelId\")\n if (input.responseModelId !== undefined) {\n assertNonBlank(input.responseModelId, \"responseModelId\")\n }\n assertNonBlank(input.responseId, \"responseId\")\n\n const occurredAt = cloneValidDate(input.occurredAt, \"occurredAt\")\n const recordedAt = cloneValidDate(input.recordedAt ?? new Date(), \"recordedAt\")\n const requesterGroupIds = normalizeRequesterGroupIds(input.requesterGroupIds)\n const requestedReasoning = cloneRequestedReasoning(input.requestedReasoning)\n const rawUsage = cloneRawUsage(input.rawUsage)\n\n return {\n id: input.id,\n projectId: input.projectId,\n executionId: input.executionId,\n attempt: input.attempt,\n callId: input.callId,\n requesterGroupIds,\n providerId: input.providerId,\n ...(input.providerIds === undefined\n ? {}\n : { providerIds: normalizeModelProviderIds(input.providerIds) }),\n requestedModelId: input.requestedModelId,\n ...(requestedReasoning === undefined ? {} : { requestedReasoning }),\n ...(input.responseModelId === undefined ? {} : { responseModelId: input.responseModelId }),\n responseId: input.responseId,\n usage: normalizeAiModelCallUsage(input.usage),\n ...(rawUsage === undefined ? {} : { rawUsage }),\n occurredAt,\n recordedAt,\n }\n}\n\nfunction cloneRequestedReasoning(\n reasoning: RecordAiModelCallInput[\"requestedReasoning\"]\n): RecordAiModelCallInput[\"requestedReasoning\"] {\n if (reasoning === undefined) return undefined\n if (!isModelReasoning(reasoning)) {\n throw new TypeError(\"[Sixb] AI usage requestedReasoning is invalid.\")\n }\n return typeof reasoning === \"string\" ? reasoning : { budgetTokens: reasoning.budgetTokens }\n}\n\n/** Validate a durable execution reference at storage and query boundaries. */\nexport function assertAiUsageExecutionId(executionId: string): void {\n assertNonBlank(executionId, \"executionId\")\n}\n\nfunction cloneRawUsage(rawUsage: RecordAiModelCallInput[\"rawUsage\"]) {\n if (rawUsage === undefined) return undefined\n if (!isPlainRecord(rawUsage)) {\n throw new TypeError(\"[Sixb] AI usage rawUsage must be a JSON object.\")\n }\n assertJsonValue(rawUsage, \"AI usage rawUsage\")\n return structuredClone(rawUsage)\n}\n\nfunction assertNonBlank(value: string, field: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`[Sixb] AI usage ${field} must be nonblank.`)\n }\n}\n\nfunction assertPositiveSafeInteger(value: number, field: string): void {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new TypeError(`[Sixb] AI usage ${field} must be a positive safe integer.`)\n }\n}\n\nfunction cloneValidDate(value: Date, field: string): Date {\n if (!(value instanceof Date) || !Number.isFinite(value.getTime())) {\n throw new TypeError(`[Sixb] AI usage ${field} must be a valid Date.`)\n }\n return new Date(value)\n}\n",
|
|
8
|
-
"import type { ExecutionStorage } from \"../executions\"\nimport { AiUsageStorageError } from \"./errors\"\nimport { assertAiUsageExecutionId, normalizeAiModelCallRecord } from \"./record\"\nimport type {\n AiModelCallUsageRecord,\n AiUsageExecutionSummary,\n AiUsageStorage,\n GetLatestAiModelCallForExecutionInput,\n RecordAiModelCallInput,\n RecordAiModelCallResult,\n SummarizeAiUsageExecutionInput,\n SummarizeAiUsageExecutionsInput,\n} from \"./types\"\nimport { aggregateAiModelCallUsage } from \"./usage\"\n\nexport interface InMemoryAiUsageGroupRow {\n readonly projectId: string\n readonly usageRecordId: string\n readonly groupId: string\n readonly occurredAt: Date\n}\n\nexport interface InMemoryAiUsageStorageSnapshot {\n readonly records: Map<string, AiModelCallUsageRecord>\n readonly recordKeysByIdempotencyKey: Map<string, string>\n readonly groupRows: Map<string, InMemoryAiUsageGroupRow>\n}\n\n/** In-memory model-call ledger used by development runtimes and storage contract tests. */\nexport class InMemoryAiUsageStorage implements AiUsageStorage {\n private readonly records = new Map<string, AiModelCallUsageRecord>()\n private readonly recordKeysByIdempotencyKey = new Map<string, string>()\n private readonly groupRows = new Map<string, InMemoryAiUsageGroupRow>()\n\n constructor(private readonly executions: Pick<ExecutionStorage, \"getById\">) {}\n\n async recordModelCall(input: RecordAiModelCallInput): Promise<RecordAiModelCallResult> {\n const record = normalizeAiModelCallRecord(input)\n await this.assertExecutionExists(record.projectId, record.executionId)\n const idempotencyKey = modelCallIdempotencyKey(record)\n const existingRecordKey = this.recordKeysByIdempotencyKey.get(idempotencyKey)\n if (existingRecordKey !== undefined) {\n const existing = this.records.get(existingRecordKey)\n if (!existing) {\n throw new Error(\"[Sixb] In-memory AI usage idempotency index is inconsistent.\")\n }\n return { record: structuredClone(existing), created: false }\n }\n\n const recordKey = modelCallRecordKey(record.projectId, record.id)\n if (this.records.has(recordKey)) {\n throw new AiUsageStorageError(\n \"duplicate_id\",\n `[Sixb] AI usage record '${record.id}' already exists for project '${record.projectId}'.`\n )\n }\n\n this.records.set(recordKey, structuredClone(record))\n this.recordKeysByIdempotencyKey.set(idempotencyKey, recordKey)\n for (const groupId of record.requesterGroupIds) {\n const row: InMemoryAiUsageGroupRow = {\n projectId: record.projectId,\n usageRecordId: record.id,\n groupId,\n occurredAt: record.occurredAt,\n }\n this.groupRows.set(groupRowKey(row), row)\n }\n\n return { record: structuredClone(record), created: true }\n }\n\n async getLatestForExecution(\n input: GetLatestAiModelCallForExecutionInput\n ): Promise<AiModelCallUsageRecord | null> {\n assertAiUsageExecutionId(input.executionId)\n if (typeof input.projectId !== \"string\" || input.projectId.trim().length === 0) {\n throw new TypeError(\"[Sixb] AI usage projectId must be nonblank.\")\n }\n\n let latest: AiModelCallUsageRecord | null = null\n for (const record of this.records.values()) {\n if (record.projectId !== input.projectId || record.executionId !== input.executionId) continue\n if (\n !latest ||\n record.occurredAt.getTime() > latest.occurredAt.getTime() ||\n (record.occurredAt.getTime() === latest.occurredAt.getTime() && record.id > latest.id)\n ) {\n latest = record\n }\n }\n return latest ? structuredClone(latest) : null\n }\n\n async summarizeExecution(\n input: SummarizeAiUsageExecutionInput\n ): Promise<AiUsageExecutionSummary> {\n const [summary] = await this.summarizeExecutions({\n projectId: input.projectId,\n executionIds: [input.executionId],\n })\n return summary!\n }\n\n async summarizeExecutions(\n input: SummarizeAiUsageExecutionsInput\n ): Promise<readonly AiUsageExecutionSummary[]> {\n if (typeof input.projectId !== \"string\" || input.projectId.trim().length === 0) {\n throw new TypeError(\"[Sixb] AI usage projectId must be nonblank.\")\n }\n\n const usageByExecutionId = new Map<string, AiModelCallUsageRecord[\"usage\"][]>()\n for (const executionId of input.executionIds) {\n assertAiUsageExecutionId(executionId)\n usageByExecutionId.set(executionId, [])\n }\n if (usageByExecutionId.size === 0) return []\n\n for (const record of this.records.values()) {\n if (record.projectId !== input.projectId) continue\n usageByExecutionId.get(record.executionId)?.push(record.usage)\n }\n\n return input.executionIds.map((executionId) => {\n const usages = usageByExecutionId.get(executionId) ?? []\n return {\n modelCallCount: usages.length,\n usage: aggregateAiModelCallUsage(usages),\n }\n })\n }\n\n snapshot(): InMemoryAiUsageStorageSnapshot {\n return structuredClone({\n records: this.records,\n recordKeysByIdempotencyKey: this.recordKeysByIdempotencyKey,\n groupRows: this.groupRows,\n })\n }\n\n restore(snapshot: InMemoryAiUsageStorageSnapshot): void {\n replaceMap(this.records, snapshot.records)\n replaceMap(this.recordKeysByIdempotencyKey, snapshot.recordKeysByIdempotencyKey)\n replaceMap(this.groupRows, snapshot.groupRows)\n }\n\n /** @internal Immutable accounting source used by in-memory AI limit enforcement. */\n getRecord(projectId: string, id: string): AiModelCallUsageRecord | null {\n const record = this.records.get(modelCallRecordKey(projectId, id))\n return record ? structuredClone(record) : null\n }\n\n /** @internal Immutable accounting source used by in-memory AI limit status reads. */\n listRecords(projectId: string): readonly AiModelCallUsageRecord[] {\n return [...this.records.values()]\n .filter((record) => record.projectId === projectId)\n .map((record) => structuredClone(record))\n }\n\n private async assertExecutionExists(projectId: string, executionId: string): Promise<void> {\n const execution = await this.executions.getById({ projectId, id: executionId })\n if (execution) return\n throw new AiUsageStorageError(\n \"missing_execution\",\n `[Sixb] AI usage execution '${executionId}' does not exist in project '${projectId}'.`\n )\n }\n}\n\nfunction modelCallRecordKey(projectId: string, id: string): string {\n return JSON.stringify([projectId, id])\n}\n\nfunction modelCallIdempotencyKey(\n record: Pick<\n AiModelCallUsageRecord,\n \"projectId\" | \"executionId\" | \"attempt\" | \"callId\" | \"responseId\"\n >\n): string {\n return JSON.stringify([\n record.projectId,\n record.executionId,\n record.attempt,\n record.callId,\n record.responseId,\n ])\n}\n\nfunction groupRowKey(row: InMemoryAiUsageGroupRow): string {\n return JSON.stringify([row.projectId, row.usageRecordId, row.groupId])\n}\n\nfunction replaceMap<TKey, TValue>(target: Map<TKey, TValue>, source: Map<TKey, TValue>): void {\n target.clear()\n for (const [key, value] of structuredClone(source)) {\n target.set(key, value)\n }\n}\n",
|
|
9
|
-
"import {\n type AiModelCallUsage,\n type AiModelCallUsageRecord,\n aggregateAiModelCallUsage,\n normalizeAiModelCallUsage,\n} from \"../ai-usage\"\nimport type {\n AiAccountingAgentBreakdown,\n AiAccountingAggregate,\n AiAccountingAttribution,\n AiAccountingBucket,\n AiAccountingModelBreakdown,\n AiAccountingOverview,\n AiAccountingTimeBucket,\n AiAccountingWorkflowBreakdown,\n AiCostSummary,\n AiModelCallAccountingItem,\n AiModelCallCostRecord,\n AiMoney,\n ListAiModelCallAccountingInput,\n ListAiModelCallAccountingResult,\n QueryAiAccountingOverviewInput,\n} from \"./types\"\n\nconst DEFAULT_MODEL_CALL_PAGE_SIZE = 50\nconst MAX_MODEL_CALL_PAGE_SIZE = 200\nconst MAX_CHART_BUCKETS = 10_000\n\n/** One joined immutable model-call row used by in-memory analytics and bounded SQL pages. */\nexport interface AiAccountingRecordSetItem {\n readonly usage: AiModelCallUsageRecord\n readonly attribution?: AiAccountingAttribution\n readonly cost?: AiModelCallCostRecord\n}\n\nexport interface NormalizedAiAccountingQuery {\n readonly projectId: string\n readonly from: Date\n readonly to: Date\n readonly providerId?: string\n readonly modelId?: string\n}\n\nexport interface NormalizedAiModelCallAccountingQuery extends NormalizedAiAccountingQuery {\n readonly executionId?: string\n readonly valuationStatus?: ListAiModelCallAccountingInput[\"valuationStatus\"]\n readonly limit: number\n readonly offset: number\n}\n\ninterface AiAccountingUsageMeterFragment {\n readonly presentCallCount: string\n readonly total: string | null\n}\n\n/** One SQL-aggregated currency fragment; providers merge fragments without loading model calls. */\nexport interface AiAccountingAggregateFragment {\n readonly dimension: \"totals\" | \"series\" | \"model\" | \"agent\" | \"workflow\"\n readonly start?: Date\n readonly providerId?: string\n readonly modelId?: string\n readonly agentKind?: \"agent\" | \"workflowAgent\"\n readonly agentStepId?: string\n readonly workflowId?: string\n readonly modelCallCount: string\n readonly usage: {\n readonly reportedCallCount: string\n readonly inputTokens: AiAccountingUsageMeterFragment\n readonly outputTokens: AiAccountingUsageMeterFragment\n readonly uncachedInputTokens: AiAccountingUsageMeterFragment\n readonly cacheReadInputTokens: AiAccountingUsageMeterFragment\n readonly cacheWriteInputTokens: AiAccountingUsageMeterFragment\n readonly textOutputTokens: AiAccountingUsageMeterFragment\n readonly reasoningOutputTokens: AiAccountingUsageMeterFragment\n }\n readonly costs: {\n readonly amount?: AiMoney\n readonly ratedCallCount: string\n readonly unpriceableCallCount: string\n readonly unvaluedCallCount: string\n }\n}\n\nexport function normalizeAiAccountingQuery(\n input: Omit<QueryAiAccountingOverviewInput, \"bucket\"> | ListAiModelCallAccountingInput\n): NormalizedAiAccountingQuery {\n assertNonBlank(input.projectId, \"accounting projectId\")\n assertDate(input.from, \"accounting from\")\n assertDate(input.to, \"accounting to\")\n if (input.from.getTime() >= input.to.getTime()) {\n throw new TypeError(\"[Sixb] AI accounting from must be before to.\")\n }\n if (input.providerId !== undefined) assertNonBlank(input.providerId, \"accounting providerId\")\n if (input.modelId !== undefined) assertNonBlank(input.modelId, \"accounting modelId\")\n return {\n projectId: input.projectId,\n from: new Date(input.from),\n to: new Date(input.to),\n ...(input.providerId === undefined ? {} : { providerId: input.providerId }),\n ...(input.modelId === undefined ? {} : { modelId: input.modelId }),\n }\n}\n\nexport function normalizeAiModelCallAccountingQuery(\n input: ListAiModelCallAccountingInput\n): NormalizedAiModelCallAccountingQuery {\n const query = normalizeAiAccountingQuery(input)\n if (input.executionId !== undefined) {\n assertNonBlank(input.executionId, \"accounting executionId\")\n }\n const { limit, offset } = normalizePage(input.limit, input.offset)\n return {\n ...query,\n ...(input.executionId === undefined ? {} : { executionId: input.executionId }),\n ...(input.valuationStatus === undefined ? {} : { valuationStatus: input.valuationStatus }),\n limit,\n offset,\n }\n}\n\nexport function aiAccountingItemMatchesQuery(\n item: AiAccountingRecordSetItem,\n query: NormalizedAiAccountingQuery\n): boolean {\n const occurredAt = item.usage.occurredAt.getTime()\n return (\n item.usage.projectId === query.projectId &&\n occurredAt >= query.from.getTime() &&\n occurredAt < query.to.getTime() &&\n (query.providerId === undefined || item.usage.providerId === query.providerId) &&\n (query.modelId === undefined || item.usage.requestedModelId === query.modelId)\n )\n}\n\nexport function buildAiAccountingOverview(\n input: QueryAiAccountingOverviewInput,\n source: Iterable<AiAccountingRecordSetItem>\n): AiAccountingOverview {\n const query = normalizeAiAccountingQuery(input)\n assertAiAccountingBucket(input.bucket)\n const items = Array.from(source).filter((item) => aiAccountingItemMatchesQuery(item, query))\n const periods = accountingPeriods(query.from, query.to, input.bucket)\n const periodItems = new Map<number, AiAccountingRecordSetItem[]>(\n periods.map((period) => [period.start.getTime(), []])\n )\n const modelItems = new Map<string, AiAccountingRecordSetItem[]>()\n const agentItems = new Map<string, AiAccountingRecordSetItem[]>()\n const workflowItems = new Map<string, AiAccountingRecordSetItem[]>()\n\n for (const item of items) {\n const periodStart = aiAccountingBucketStart(item.usage.occurredAt, input.bucket).getTime()\n periodItems.get(periodStart)?.push(item)\n appendGrouped(\n modelItems,\n JSON.stringify([item.usage.providerId, item.usage.requestedModelId]),\n item\n )\n if (item.attribution?.kind === \"agent\") {\n appendGrouped(agentItems, JSON.stringify([\"agent\"]), item)\n } else if (item.attribution?.kind === \"workflowAgent\") {\n appendGrouped(\n agentItems,\n JSON.stringify([\n \"workflowAgent\",\n item.attribution.workflowId,\n item.attribution.agentStepId,\n ]),\n item\n )\n }\n if (item.attribution?.kind === \"workflowAgent\") {\n appendGrouped(workflowItems, item.attribution.workflowId, item)\n }\n }\n\n const series: AiAccountingTimeBucket[] = periods.map((period) => ({\n ...period,\n ...aggregateAccountingItems(periodItems.get(period.start.getTime()) ?? []),\n }))\n const models: AiAccountingModelBreakdown[] = [...modelItems]\n .map(([key, grouped]) => {\n const [providerId, modelId] = JSON.parse(key) as [string, string]\n return { providerId, modelId, ...aggregateAccountingItems(grouped) }\n })\n .sort(compareModelBreakdowns)\n const agents: AiAccountingAgentBreakdown[] = [...agentItems]\n .map(([key, grouped]) => {\n const [kind, workflowId, agentStepId] = JSON.parse(key) as [\n \"agent\" | \"workflowAgent\",\n string?,\n string?,\n ]\n return kind === \"agent\"\n ? { kind, ...aggregateAccountingItems(grouped) }\n : {\n kind,\n workflowId: requiredFragmentString(workflowId, \"workflowId\"),\n agentStepId: requiredFragmentString(agentStepId, \"agentStepId\"),\n ...aggregateAccountingItems(grouped),\n }\n })\n .sort(compareAgentBreakdowns)\n const workflows: AiAccountingWorkflowBreakdown[] = [...workflowItems]\n .map(([workflowId, grouped]) => ({ workflowId, ...aggregateAccountingItems(grouped) }))\n .sort(compareWorkflowBreakdowns)\n\n return structuredClone({\n range: { from: query.from, to: query.to },\n bucket: input.bucket,\n totals: aggregateAccountingItems(items),\n series,\n models,\n agents,\n workflows,\n })\n}\n\nexport function buildAiAccountingOverviewFromFragments(\n input: QueryAiAccountingOverviewInput,\n fragments: Iterable<AiAccountingAggregateFragment>\n): AiAccountingOverview {\n const query = normalizeAiAccountingQuery(input)\n const periods = accountingPeriods(query.from, query.to, input.bucket)\n const totals = aggregateFragmentAccumulator()\n const series = new Map<number, AggregateFragmentAccumulator>(\n periods.map((period) => [period.start.getTime(), aggregateFragmentAccumulator()])\n )\n const models = new Map<string, AggregateFragmentAccumulator>()\n const agents = new Map<string, AggregateFragmentAccumulator>()\n const workflows = new Map<string, AggregateFragmentAccumulator>()\n\n for (const fragment of fragments) {\n let target: AggregateFragmentAccumulator\n switch (fragment.dimension) {\n case \"totals\":\n target = totals\n break\n case \"series\": {\n const start = requiredFragmentDate(fragment.start, \"series start\")\n const existing = series.get(start.getTime())\n if (!existing) {\n throw new TypeError(\"[Sixb] AI accounting SQL series returned an unexpected bucket.\")\n }\n target = existing\n break\n }\n case \"model\":\n target = getFragmentAccumulator(\n models,\n JSON.stringify([\n requiredFragmentString(fragment.providerId, \"providerId\"),\n requiredFragmentString(fragment.modelId, \"modelId\"),\n ])\n )\n break\n case \"agent\":\n target = getFragmentAccumulator(\n agents,\n JSON.stringify([\n requiredFragmentString(fragment.agentKind, \"agentKind\"),\n fragment.workflowId,\n fragment.agentStepId,\n ])\n )\n break\n case \"workflow\":\n target = getFragmentAccumulator(\n workflows,\n requiredFragmentString(fragment.workflowId, \"workflowId\")\n )\n break\n }\n appendAggregateFragment(target, fragment)\n }\n\n return structuredClone({\n range: { from: query.from, to: query.to },\n bucket: input.bucket,\n totals: finishAggregateFragment(totals),\n series: periods.map((period) => ({\n ...period,\n ...finishAggregateFragment(series.get(period.start.getTime())!),\n })),\n models: [...models]\n .map(([key, value]) => {\n const [providerId, modelId] = JSON.parse(key) as [string, string]\n return { providerId, modelId, ...finishAggregateFragment(value) }\n })\n .sort(compareModelBreakdowns),\n agents: [...agents]\n .map(([key, value]) => {\n const [kind, workflowId, agentStepId] = JSON.parse(key) as [\n \"agent\" | \"workflowAgent\",\n string?,\n string?,\n ]\n return kind === \"agent\"\n ? { kind, ...finishAggregateFragment(value) }\n : {\n kind,\n workflowId: requiredFragmentString(workflowId, \"workflowId\"),\n agentStepId: requiredFragmentString(agentStepId, \"agentStepId\"),\n ...finishAggregateFragment(value),\n }\n })\n .sort(compareAgentBreakdowns),\n workflows: [...workflows]\n .map(([workflowId, value]) => ({ workflowId, ...finishAggregateFragment(value) }))\n .sort(compareWorkflowBreakdowns),\n })\n}\n\nexport function buildAiModelCallAccountingList(\n input: ListAiModelCallAccountingInput,\n source: Iterable<AiAccountingRecordSetItem>\n): ListAiModelCallAccountingResult {\n const query = normalizeAiModelCallAccountingQuery(input)\n const { limit, offset } = query\n const items = Array.from(source)\n .filter((item) => aiAccountingItemMatchesQuery(item, query))\n .map(toAccountingItem)\n .filter(\n (item) =>\n (input.executionId === undefined || item.usage.executionId === input.executionId) &&\n (input.valuationStatus === undefined || item.valuationStatus === input.valuationStatus)\n )\n .sort(compareAccountingItems)\n const page = items.slice(offset, offset + limit)\n return structuredClone({\n items: page,\n hasMore: offset + page.length < items.length,\n total: items.length,\n })\n}\n\nexport function toAccountingItem(item: AiAccountingRecordSetItem): AiModelCallAccountingItem {\n return {\n usage: item.usage,\n ...(item.attribution === undefined ? {} : { attribution: item.attribution }),\n ...(item.cost === undefined ? {} : { cost: item.cost }),\n valuationStatus: item.cost?.status ?? \"unvalued\",\n }\n}\n\nexport function aiAccountingBucketStart(at: Date, bucket: AiAccountingBucket): Date {\n assertDate(at, \"accounting bucket timestamp\")\n assertAiAccountingBucket(bucket)\n const start = new Date(at)\n start.setUTCMinutes(0, 0, 0)\n if (bucket === \"hour\") return start\n start.setUTCHours(0)\n if (bucket === \"day\") return start\n const mondayOffset = (start.getUTCDay() + 6) % 7\n start.setUTCDate(start.getUTCDate() - mondayOffset)\n return start\n}\n\nfunction aggregateAccountingItems(\n items: readonly AiAccountingRecordSetItem[]\n): AiAccountingAggregate {\n return {\n modelCallCount: items.length,\n usage: aggregateAiModelCallUsage(items.map((item) => item.usage.usage)),\n costs: aggregateCosts(items),\n }\n}\n\nfunction aggregateCosts(items: readonly AiAccountingRecordSetItem[]): AiCostSummary {\n const amounts = new Map<string, bigint>()\n let ratedCallCount = 0\n let unpriceableCallCount = 0\n let unvaluedCallCount = 0\n for (const item of items) {\n if (item.cost?.status === \"rated\") {\n ratedCallCount += 1\n addAmount(amounts, item.cost.money.currency, item.cost.money.amountNanos)\n } else if (item.cost?.status === \"unpriceable\") {\n unpriceableCallCount += 1\n } else {\n unvaluedCallCount += 1\n }\n }\n return {\n amounts: [...amounts]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([currency, amountNanos]) => ({ currency, amountNanos: amountNanos.toString() })),\n ratedCallCount,\n unpriceableCallCount,\n unvaluedCallCount,\n }\n}\n\nconst AGGREGATE_USAGE_FIELDS = [\n \"inputTokens\",\n \"outputTokens\",\n \"uncachedInputTokens\",\n \"cacheReadInputTokens\",\n \"cacheWriteInputTokens\",\n \"textOutputTokens\",\n \"reasoningOutputTokens\",\n] as const\n\ntype AggregateUsageField = (typeof AGGREGATE_USAGE_FIELDS)[number]\n\ninterface AggregateFragmentAccumulator {\n modelCallCount: bigint\n reportedUsageCallCount: bigint\n usage: Record<AggregateUsageField, { presentCallCount: bigint; total: bigint }>\n amounts: Map<string, bigint>\n ratedCallCount: bigint\n unpriceableCallCount: bigint\n unvaluedCallCount: bigint\n}\n\nfunction aggregateFragmentAccumulator(): AggregateFragmentAccumulator {\n return {\n modelCallCount: 0n,\n reportedUsageCallCount: 0n,\n usage: Object.fromEntries(\n AGGREGATE_USAGE_FIELDS.map((field) => [field, { presentCallCount: 0n, total: 0n }])\n ) as AggregateFragmentAccumulator[\"usage\"],\n amounts: new Map(),\n ratedCallCount: 0n,\n unpriceableCallCount: 0n,\n unvaluedCallCount: 0n,\n }\n}\n\nfunction getFragmentAccumulator(\n values: Map<string, AggregateFragmentAccumulator>,\n key: string\n): AggregateFragmentAccumulator {\n const existing = values.get(key)\n if (existing) return existing\n const created = aggregateFragmentAccumulator()\n values.set(key, created)\n return created\n}\n\nfunction appendAggregateFragment(\n target: AggregateFragmentAccumulator,\n fragment: AiAccountingAggregateFragment\n): void {\n target.modelCallCount += naturalBigInt(fragment.modelCallCount, \"modelCallCount\")\n target.reportedUsageCallCount += naturalBigInt(\n fragment.usage.reportedCallCount,\n \"reported usage call count\"\n )\n for (const field of AGGREGATE_USAGE_FIELDS) {\n const source = fragment.usage[field]\n const presentCallCount = naturalBigInt(source.presentCallCount, `${field} call count`)\n target.usage[field].presentCallCount += presentCallCount\n if (source.total !== null) {\n target.usage[field].total += naturalBigInt(source.total, `${field} total`)\n } else if (presentCallCount !== 0n) {\n throw new TypeError(`[Sixb] AI accounting SQL ${field} total is missing.`)\n }\n }\n target.ratedCallCount += naturalBigInt(fragment.costs.ratedCallCount, \"rated call count\")\n target.unpriceableCallCount += naturalBigInt(\n fragment.costs.unpriceableCallCount,\n \"unpriceable call count\"\n )\n target.unvaluedCallCount += naturalBigInt(fragment.costs.unvaluedCallCount, \"unvalued call count\")\n if (fragment.costs.amount) {\n addAmount(target.amounts, fragment.costs.amount.currency, fragment.costs.amount.amountNanos)\n }\n}\n\nfunction finishAggregateFragment(value: AggregateFragmentAccumulator): AiAccountingAggregate {\n const classifiedCallCount =\n value.ratedCallCount + value.unpriceableCallCount + value.unvaluedCallCount\n if (\n classifiedCallCount !== value.modelCallCount ||\n value.reportedUsageCallCount > value.modelCallCount ||\n AGGREGATE_USAGE_FIELDS.some(\n (field) => value.usage[field].presentCallCount > value.modelCallCount\n )\n ) {\n throw new TypeError(\"[Sixb] AI accounting SQL aggregate counts are inconsistent.\")\n }\n const modelCallCount = safeAggregateNumber(value.modelCallCount, \"model-call count\")\n const usageInput: Partial<Record<AggregateUsageField, number>> = {}\n if (value.modelCallCount > 0n) {\n for (const field of AGGREGATE_USAGE_FIELDS) {\n const aggregate = value.usage[field]\n if (aggregate.presentCallCount === value.modelCallCount) {\n usageInput[field] = safeAggregateNumber(aggregate.total, field)\n }\n }\n }\n let usage: AiModelCallUsage = normalizeAiModelCallUsage(usageInput)\n if (usage.reportingStatus === \"unavailable\" && value.reportedUsageCallCount > 0n) {\n usage = { ...usage, reportingStatus: \"partial\" }\n }\n return {\n modelCallCount,\n usage,\n costs: {\n amounts: [...value.amounts]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([currency, amountNanos]) => ({ currency, amountNanos: amountNanos.toString() })),\n ratedCallCount: safeAggregateNumber(value.ratedCallCount, \"rated call count\"),\n unpriceableCallCount: safeAggregateNumber(\n value.unpriceableCallCount,\n \"unpriceable call count\"\n ),\n unvaluedCallCount: safeAggregateNumber(value.unvaluedCallCount, \"unvalued call count\"),\n },\n }\n}\n\nfunction naturalBigInt(value: string, field: string): bigint {\n if (!/^(0|[1-9]\\d*)$/.test(value)) {\n throw new TypeError(`[Sixb] AI accounting SQL ${field} must be a natural integer.`)\n }\n return BigInt(value)\n}\n\nfunction safeAggregateNumber(value: bigint, field: string): number {\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new TypeError(`[Sixb] AI accounting ${field} exceeds the safe integer range.`)\n }\n return Number(value)\n}\n\nfunction requiredFragmentString(value: string | undefined, field: string): string {\n if (value === undefined || value.length === 0) {\n throw new TypeError(`[Sixb] AI accounting SQL ${field} is missing.`)\n }\n return value\n}\n\nfunction requiredFragmentDate(value: Date | undefined, field: string): Date {\n if (value === undefined) throw new TypeError(`[Sixb] AI accounting SQL ${field} is missing.`)\n assertDate(value, field)\n return value\n}\n\nfunction accountingPeriods(\n from: Date,\n to: Date,\n bucket: AiAccountingBucket\n): Array<{ start: Date; end: Date }> {\n const result: Array<{ start: Date; end: Date }> = []\n let cursor = aiAccountingBucketStart(from, bucket)\n while (cursor.getTime() < to.getTime()) {\n if (result.length >= MAX_CHART_BUCKETS) {\n throw new RangeError(`[Sixb] AI accounting query exceeds ${MAX_CHART_BUCKETS} chart buckets.`)\n }\n const next = nextBucket(cursor, bucket)\n result.push({ start: new Date(cursor), end: next })\n cursor = next\n }\n return result\n}\n\nfunction nextBucket(start: Date, bucket: AiAccountingBucket): Date {\n const next = new Date(start)\n if (bucket === \"hour\") next.setUTCHours(next.getUTCHours() + 1)\n else if (bucket === \"day\") next.setUTCDate(next.getUTCDate() + 1)\n else next.setUTCDate(next.getUTCDate() + 7)\n return next\n}\n\nfunction appendGrouped(\n groups: Map<string, AiAccountingRecordSetItem[]>,\n key: string,\n item: AiAccountingRecordSetItem\n): void {\n const existing = groups.get(key)\n if (existing) existing.push(item)\n else groups.set(key, [item])\n}\n\nfunction addAmount(amounts: Map<string, bigint>, currency: string, amountNanos: string): void {\n amounts.set(currency, (amounts.get(currency) ?? 0n) + BigInt(amountNanos))\n}\n\nfunction normalizePage(\n requestedLimit: number | undefined,\n requestedOffset: number | undefined\n): { limit: number; offset: number } {\n const limit = requestedLimit ?? DEFAULT_MODEL_CALL_PAGE_SIZE\n const offset = requestedOffset ?? 0\n if (!Number.isSafeInteger(limit) || limit < 1 || limit > MAX_MODEL_CALL_PAGE_SIZE) {\n throw new TypeError(\n `[Sixb] AI accounting list limit must be an integer between 1 and ${MAX_MODEL_CALL_PAGE_SIZE}.`\n )\n }\n if (!Number.isSafeInteger(offset) || offset < 0) {\n throw new TypeError(\"[Sixb] AI accounting list offset must be a non-negative integer.\")\n }\n return { limit, offset }\n}\n\nfunction compareAccountingItems(\n left: AiModelCallAccountingItem,\n right: AiModelCallAccountingItem\n): number {\n return (\n right.usage.occurredAt.getTime() - left.usage.occurredAt.getTime() ||\n left.usage.id.localeCompare(right.usage.id)\n )\n}\n\nfunction compareAgentBreakdowns(\n left: AiAccountingAgentBreakdown,\n right: AiAccountingAgentBreakdown\n): number {\n return (\n right.modelCallCount - left.modelCallCount ||\n agentBreakdownKey(left).localeCompare(agentBreakdownKey(right))\n )\n}\n\nfunction agentBreakdownKey(value: AiAccountingAgentBreakdown): string {\n return value.kind === \"agent\"\n ? \"agent\"\n : JSON.stringify([\"workflowAgent\", value.workflowId, value.agentStepId])\n}\n\nfunction compareWorkflowBreakdowns(\n left: AiAccountingWorkflowBreakdown,\n right: AiAccountingWorkflowBreakdown\n): number {\n return (\n right.modelCallCount - left.modelCallCount || left.workflowId.localeCompare(right.workflowId)\n )\n}\n\nfunction compareModelBreakdowns(\n left: AiAccountingModelBreakdown,\n right: AiAccountingModelBreakdown\n): number {\n return (\n right.modelCallCount - left.modelCallCount ||\n left.providerId.localeCompare(right.providerId) ||\n left.modelId.localeCompare(right.modelId)\n )\n}\n\nfunction assertAiAccountingBucket(bucket: AiAccountingBucket): void {\n if (bucket !== \"hour\" && bucket !== \"day\" && bucket !== \"week\") {\n throw new TypeError(\"[Sixb] AI accounting bucket must be hour, day, or week.\")\n }\n}\n\nfunction assertDate(value: Date, label: string): void {\n if (!(value instanceof Date) || !Number.isFinite(value.getTime())) {\n throw new TypeError(`[Sixb] AI ${label} must be a valid Date.`)\n }\n}\n\nfunction assertNonBlank(value: string, label: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`[Sixb] AI ${label} must be nonblank.`)\n }\n}\n",
|
|
10
|
-
"import type { AiAccountingRecordSetItem } from \"./analytics\"\nimport { aiAccountingItemMatchesQuery, normalizeAiModelCallAccountingQuery } from \"./analytics\"\nimport type {\n AiAccountingAttribution,\n AiBillingIdentity,\n AiCostSummary,\n AiModelCallExecutionSummary,\n AiModelCallGroup,\n AiModelCallGroupSummary,\n AiMoney,\n ListAiModelCallGroupsInput,\n ListAiModelCallGroupsResult,\n} from \"./types\"\n\nexport interface AiAccountingGroupIdentity {\n readonly executionId: string\n readonly attribution?: AiAccountingAttribution\n}\n\n/** A compact SQL aggregate, never the raw provider response or a page of individual calls. */\nexport interface AiModelCallGroupFragment {\n readonly root: AiAccountingGroupIdentity\n readonly execution: AiAccountingGroupIdentity\n readonly model: AiBillingIdentity\n readonly firstCallAt: Date\n readonly lastCallAt: Date\n readonly callCount: string\n readonly tokenCount: string\n readonly totalTokens: string | null\n readonly valuationStatus: \"rated\" | \"unpriceable\" | \"unvalued\"\n readonly money?: AiMoney\n}\n\n/** Common provider projection; SQL groups meters before returning rows to the runtime. */\nexport interface AiModelCallGroupRow {\n readonly root_execution_id: string\n readonly execution_id: string\n readonly provider_id: string\n readonly requested_model_id: string\n readonly first_call_at: Date | string\n readonly last_call_at: Date | string\n readonly call_count: string\n readonly token_count: string\n readonly total_tokens: string | null\n readonly valuation_status: AiModelCallGroupFragment[\"valuationStatus\"]\n readonly amount_currency: string | null\n readonly amount_high: string | null\n readonly amount_middle: string | null\n readonly amount_low: string | null\n readonly root_agent_run_id: string | null\n readonly root_thread_id: string | null\n readonly direct_kind: string | null\n readonly direct_run_id: string | null\n readonly parent_run_id: string | null\n readonly workflow_agent_step_id: string | null\n readonly workflow_node_run_id: string | null\n readonly workflow_id: string | null\n readonly workflow_run_id: string | null\n}\n\nexport function aiModelCallGroupFragmentFromRow(\n row: AiModelCallGroupRow\n): AiModelCallGroupFragment {\n let attribution: AiAccountingAttribution | undefined\n if (row.root_agent_run_id && row.root_thread_id) {\n attribution = {\n kind: \"agent\",\n agentRunId: row.root_agent_run_id,\n threadId: row.root_thread_id,\n }\n } else if (\n row.workflow_agent_step_id &&\n row.workflow_node_run_id &&\n row.workflow_id &&\n row.workflow_run_id\n ) {\n attribution = {\n kind: \"workflowAgent\",\n agentStepId: row.workflow_agent_step_id,\n nodeRunId: row.workflow_node_run_id,\n workflowId: row.workflow_id,\n workflowRunId: row.workflow_run_id,\n }\n }\n const executionAttribution: AiAccountingAttribution | undefined =\n row.direct_kind === \"subagent\" && row.direct_run_id && row.parent_run_id\n ? { kind: \"subagent\", subagentRunId: row.direct_run_id, parentRunId: row.parent_run_id }\n : attribution\n return {\n root: { executionId: row.root_execution_id, attribution },\n execution: { executionId: row.execution_id, attribution: executionAttribution },\n model: { providerId: row.provider_id, modelId: row.requested_model_id },\n firstCallAt: new Date(row.first_call_at),\n lastCallAt: new Date(row.last_call_at),\n callCount: row.call_count,\n tokenCount: row.token_count,\n totalTokens: row.total_tokens,\n valuationStatus: row.valuation_status,\n ...(row.amount_currency === null\n ? {}\n : {\n money: {\n currency: row.amount_currency,\n amountNanos: (\n BigInt(row.amount_high ?? \"0\") * 1_000_000_000_000n +\n BigInt(row.amount_middle ?? \"0\") * 1_000_000n +\n BigInt(row.amount_low ?? \"0\")\n ).toString(),\n },\n }),\n }\n}\n\nexport function buildAiModelCallGroupsFromFragments(\n fragments: readonly AiModelCallGroupFragment[]\n): readonly AiModelCallGroup[] {\n const roots = new Map<string, AiModelCallGroupFragment[]>()\n for (const fragment of fragments) append(roots, fragment.root.executionId, fragment)\n return [...roots.values()]\n .map((rootFragments): AiModelCallGroup => {\n const first = rootFragments[0]!\n const executions = new Map<string, AiModelCallGroupFragment[]>()\n for (const fragment of rootFragments)\n append(executions, fragment.execution.executionId, fragment)\n return {\n ...first.root,\n ...summarize(rootFragments),\n ...timeRange(rootFragments),\n executions: [...executions.values()]\n .map(\n (items): AiModelCallExecutionSummary => ({\n ...items[0]!.execution,\n ...summarize(items),\n ...timeRange(items),\n models: [\n ...new Map(items.map(({ model }) => [JSON.stringify(model), model])).values(),\n ].sort(\n (a, b) =>\n compareText(a.providerId, b.providerId) || compareText(a.modelId, b.modelId)\n ),\n })\n )\n .sort(\n (a, b) =>\n a.firstCallAt.getTime() - b.firstCallAt.getTime() ||\n compareText(a.executionId, b.executionId)\n ),\n }\n })\n .sort(\n (a, b) =>\n b.lastCallAt.getTime() - a.lastCallAt.getTime() || compareText(a.executionId, b.executionId)\n )\n}\n\nexport function buildAiModelCallGroups(\n input: ListAiModelCallGroupsInput,\n source: readonly (AiAccountingRecordSetItem & { readonly root: AiAccountingGroupIdentity })[]\n): ListAiModelCallGroupsResult {\n const query = normalizeAiModelCallAccountingQuery(input)\n const fragments = source\n .filter(\n (item) =>\n aiAccountingItemMatchesQuery(item, query) &&\n (query.valuationStatus === undefined ||\n (item.cost?.status ?? \"unvalued\") === query.valuationStatus)\n )\n .map(\n (item): AiModelCallGroupFragment => ({\n root: item.root,\n execution: { executionId: item.usage.executionId, attribution: item.attribution },\n model: { providerId: item.usage.providerId, modelId: item.usage.requestedModelId },\n firstCallAt: item.usage.occurredAt,\n lastCallAt: item.usage.occurredAt,\n callCount: \"1\",\n tokenCount: item.usage.usage.totalTokens === undefined ? \"0\" : \"1\",\n totalTokens: item.usage.usage.totalTokens?.toString() ?? null,\n valuationStatus: item.cost?.status ?? \"unvalued\",\n ...(item.cost && item.cost.status !== \"unpriceable\" ? { money: item.cost.money } : {}),\n })\n )\n const groups = buildAiModelCallGroupsFromFragments(fragments)\n const items = groups.slice(query.offset, query.offset + query.limit)\n return structuredClone({\n items,\n total: groups.length,\n hasMore: query.offset + items.length < groups.length,\n })\n}\n\nfunction summarize(items: readonly AiModelCallGroupFragment[]): AiModelCallGroupSummary {\n let calls = 0n\n let tokenCount = 0n\n let tokens = 0n\n const counts = { rated: 0n, unpriceable: 0n, unvalued: 0n }\n const money = new Map<string, bigint>()\n for (const item of items) {\n const count = BigInt(item.callCount)\n calls += count\n tokenCount += BigInt(item.tokenCount)\n tokens += BigInt(item.totalTokens ?? \"0\")\n counts[item.valuationStatus] += count\n if (item.money)\n money.set(\n item.money.currency,\n (money.get(item.money.currency) ?? 0n) + BigInt(item.money.amountNanos)\n )\n }\n const costs: AiCostSummary = {\n amounts: [...money]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([currency, amount]) => ({ currency, amountNanos: amount.toString() })),\n ratedCallCount: safeCount(counts.rated),\n unpriceableCallCount: safeCount(counts.unpriceable),\n unvaluedCallCount: safeCount(counts.unvalued),\n }\n return {\n modelCallCount: safeCount(calls),\n ...(calls === tokenCount ? { totalTokens: safeCount(tokens) } : {}),\n costs,\n }\n}\n\nfunction timeRange(items: readonly AiModelCallGroupFragment[]) {\n let first = items[0]!.firstCallAt.getTime()\n let last = items[0]!.lastCallAt.getTime()\n for (const item of items) {\n first = Math.min(first, item.firstCallAt.getTime())\n last = Math.max(last, item.lastCallAt.getTime())\n }\n return { firstCallAt: new Date(first), lastCallAt: new Date(last) }\n}\n\nfunction compareText(a: string, b: string): number {\n return a === b ? 0 : a < b ? -1 : 1\n}\n\nfunction safeCount(value: bigint): number {\n if (value < 0n || value > BigInt(Number.MAX_SAFE_INTEGER))\n throw new RangeError(\"[Sixb] AI accounting group count exceeds the safe integer range.\")\n return Number(value)\n}\n\nfunction append<T>(map: Map<string, T[]>, key: string, item: T): void {\n const items = map.get(key)\n if (items) items.push(item)\n else map.set(key, [item])\n}\n",
|
|
11
|
-
"import { assertJsonObject } from \"../../json\"\nimport type { AiModelCallUsage, AiModelCallUsageRecord } from \"../ai-usage\"\nimport { normalizeAiModelCallUsage } from \"../ai-usage\"\nimport type {\n AiBillableMeter,\n AiBillingIdentity,\n AiCostComponent,\n AiCostEstimate,\n AiModelCallCostRecord,\n AiPriceSource,\n AiPricingContext,\n AiRatedModelCallCostRecord,\n AiUnpriceableModelCallCostRecord,\n AiUnpriceableReason,\n} from \"./types\"\n\nconst SIGNED_INT64_MAX = 9_223_372_036_854_775_807n\nconst TOKENS_PER_MILLION = 1_000_000n\nconst HALF_MILLION = TOKENS_PER_MILLION / 2n\nconst MAX_NUMERIC_TEXT_LENGTH = 128\nconst METER_ORDER: Readonly<Record<AiBillableMeter, number>> = {\n \"tokens.input.total\": 0,\n \"tokens.input.uncached\": 1,\n \"tokens.input.cacheRead\": 2,\n \"tokens.input.cacheWrite\": 3,\n \"tokens.input.cacheWrite5m\": 4,\n \"tokens.input.cacheWrite1h\": 5,\n \"tokens.output.total\": 6,\n \"tokens.output.text\": 7,\n \"tokens.output.reasoning\": 8,\n}\nconst METERS = new Set(Object.keys(METER_ORDER) as AiBillableMeter[])\nconst UNPRICEABLE_REASONS = new Set<AiUnpriceableReason>([\n \"missingBillingIdentity\",\n \"missingRateCard\",\n \"missingUsageMeter\",\n \"unsupportedPricingDimension\",\n \"invalidUsageForFormula\",\n])\nconst CONTEXT_STRING_FIELDS = [\n \"serviceTier\",\n \"region\",\n \"inferenceGeo\",\n \"routedProviderId\",\n \"routedModelId\",\n \"deploymentId\",\n \"inferenceProfileId\",\n \"mode\",\n] as const\n\nexport function normalizeAiPricingContext(input: AiPricingContext): AiPricingContext {\n if (typeof input !== \"object\" || input === null || Array.isArray(input)) {\n throw new TypeError(\"[Sixb] AI pricing context must be an object.\")\n }\n const result: Record<string, string | boolean | number> = {}\n for (const field of CONTEXT_STRING_FIELDS) {\n const value = input[field]\n if (value !== undefined) {\n assertNonBlank(value, `pricingContext.${field}`)\n result[field] = value\n }\n }\n if (input.batch !== undefined) {\n if (typeof input.batch !== \"boolean\") {\n throw new TypeError(\"[Sixb] AI pricingContext.batch must be boolean.\")\n }\n result.batch = input.batch\n }\n if (input.cacheWriteTtlSeconds !== undefined) {\n if (!Number.isSafeInteger(input.cacheWriteTtlSeconds) || input.cacheWriteTtlSeconds <= 0) {\n throw new TypeError(\n \"[Sixb] AI pricingContext.cacheWriteTtlSeconds must be a positive safe integer.\"\n )\n }\n result.cacheWriteTtlSeconds = input.cacheWriteTtlSeconds\n }\n return result\n}\n\nexport function normalizeAiModelCallCostRecord(\n input: AiModelCallCostRecord\n): AiModelCallCostRecord {\n assertNonBlank(input.projectId, \"cost record projectId\")\n assertNonBlank(input.usageRecordId, \"cost record usageRecordId\")\n const base = {\n ...(input.estimate === undefined ? {} : { estimate: normalizeAiCostEstimate(input.estimate) }),\n projectId: input.projectId,\n usageRecordId: input.usageRecordId,\n pricingContext: normalizeAiPricingContext(input.pricingContext),\n ratedAt: cloneDate(input.ratedAt, \"cost record ratedAt\"),\n }\n\n if (input.status === \"rated\") {\n return normalizeRatedCost(input, {\n ...base,\n priceSource: normalizePriceSource(input.priceSource),\n })\n }\n if (input.status === \"unpriceable\") {\n return normalizeUnpriceableCost(input, {\n ...base,\n ...(input.priceSource === undefined\n ? {}\n : { priceSource: normalizePriceSource(input.priceSource) }),\n })\n }\n throw new TypeError(\"[Sixb] AI cost status is invalid.\")\n}\n\n/** Verify that a normalized valuation's billed quantities describe its usage record. */\nexport function aiModelCallCostMatchesUsage(\n record: AiModelCallCostRecord,\n usageRecord: AiModelCallUsageRecord\n): boolean {\n if (record.projectId !== usageRecord.projectId || record.usageRecordId !== usageRecord.id) {\n return false\n }\n if (record.estimate?.status === \"rated\") {\n const usage = normalizeAiModelCallUsage(usageRecord.usage)\n const components = new Map(\n record.estimate.components.map((component) => [component.meter, component])\n )\n if (\n !inputComponentsMatchUsage(components, usage) ||\n !outputComponentsMatchUsage(components, usage)\n )\n return false\n }\n if (record.status === \"unpriceable\") return true\n if (record.components.length === 0 && isExternalValuationSource(record.priceSource.sourceId)) {\n return true\n }\n\n const usage = normalizeAiModelCallUsage(usageRecord.usage)\n const components = new Map(record.components.map((component) => [component.meter, component]))\n return (\n inputComponentsMatchUsage(components, usage) && outputComponentsMatchUsage(components, usage)\n )\n}\n\nfunction inputComponentsMatchUsage(\n components: ReadonlyMap<AiBillableMeter, AiCostComponent>,\n usage: AiModelCallUsage\n): boolean {\n if (usage.inputTokens === undefined) return false\n const total = components.get(\"tokens.input.total\")\n const directPartitions = [\n [\"tokens.input.uncached\", usage.uncachedInputTokens],\n [\"tokens.input.cacheRead\", usage.cacheReadInputTokens],\n [\"tokens.input.cacheWrite\", usage.cacheWriteInputTokens],\n ] as const\n const presentDirect = directPartitions.filter(([meter]) => components.has(meter))\n const specificWrites = [\n components.get(\"tokens.input.cacheWrite5m\"),\n components.get(\"tokens.input.cacheWrite1h\"),\n ].filter((component): component is AiCostComponent => component !== undefined)\n\n if (total) {\n return (\n presentDirect.length === 0 &&\n specificWrites.length === 0 &&\n BigInt(total.quantity) === BigInt(usage.inputTokens)\n )\n }\n if (presentDirect.length === 0 && specificWrites.length === 0) return false\n if (components.has(\"tokens.input.cacheWrite\") && specificWrites.length > 0) return false\n\n let quantity = 0n\n for (const [meter, expected] of presentDirect) {\n if (expected === undefined) return false\n const component = components.get(meter)!\n if (BigInt(component.quantity) !== BigInt(expected)) return false\n quantity += BigInt(component.quantity)\n }\n if (specificWrites.length > 0) {\n if (usage.cacheWriteInputTokens === undefined) return false\n const specificWriteQuantity = specificWrites.reduce(\n (sum, component) => sum + BigInt(component.quantity),\n 0n\n )\n if (specificWriteQuantity !== BigInt(usage.cacheWriteInputTokens)) return false\n quantity += specificWriteQuantity\n }\n return quantity === BigInt(usage.inputTokens)\n}\n\nfunction outputComponentsMatchUsage(\n components: ReadonlyMap<AiBillableMeter, AiCostComponent>,\n usage: AiModelCallUsage\n): boolean {\n if (usage.outputTokens === undefined) return false\n const total = components.get(\"tokens.output.total\")\n const partitions = [\n [\"tokens.output.text\", usage.textOutputTokens],\n [\"tokens.output.reasoning\", usage.reasoningOutputTokens],\n ] as const\n const presentPartitions = partitions.filter(([meter]) => components.has(meter))\n\n if (total) {\n return presentPartitions.length === 0 && BigInt(total.quantity) === BigInt(usage.outputTokens)\n }\n if (presentPartitions.length === 0) return false\n\n let quantity = 0n\n for (const [meter, expected] of presentPartitions) {\n if (expected === undefined) return false\n const component = components.get(meter)!\n if (BigInt(component.quantity) !== BigInt(expected)) return false\n quantity += BigInt(component.quantity)\n }\n return quantity === BigInt(usage.outputTokens)\n}\n\nfunction normalizeRatedCost(\n input: AiRatedModelCallCostRecord,\n base: Pick<\n AiRatedModelCallCostRecord,\n \"projectId\" | \"usageRecordId\" | \"pricingContext\" | \"priceSource\" | \"ratedAt\"\n >\n): AiRatedModelCallCostRecord {\n const billingIdentity = normalizeBillingIdentity(input.billingIdentity)\n const components = input.components.map(normalizeCostComponent).sort(compareComponents)\n if (components.length === 0 && !isExternalValuationSource(base.priceSource.sourceId)) {\n throw new TypeError(\"[Sixb] AI rated cost requires components.\")\n }\n if (new Set(components.map((component) => component.meter)).size !== components.length) {\n throw new TypeError(\"[Sixb] AI rated cost cannot contain duplicate meters.\")\n }\n const amountNanos = parseNonnegativeInt64(input.money.amountNanos, \"money amountNanos\").toString()\n if (components.length > 0 && amountNanos !== sumComponents(components)) {\n throw new TypeError(\"[Sixb] AI cost total does not equal its component charges.\")\n }\n return {\n ...base,\n status: \"rated\",\n billingIdentity,\n money: { currency: normalizeCurrency(input.money.currency), amountNanos },\n components,\n }\n}\n\nexport function normalizeAiCostEstimate(value: unknown): AiCostEstimate {\n assertJsonObject(value, \"AI cost estimate\")\n if (value.status === \"rated\") {\n assertJsonObject(value.money, \"estimate money\")\n const { currency, amountNanos } = value.money\n if (\n typeof currency !== \"string\" ||\n typeof amountNanos !== \"string\" ||\n !Array.isArray(value.components)\n )\n throw new TypeError(\"[Sixb] Invalid cost estimate money or components.\")\n const components = value.components\n .map((component) => {\n assertJsonObject(component, \"estimate component\")\n const meter = [...METERS].find((meter) => meter === component.meter)\n if (\n !meter ||\n typeof component.quantity !== \"string\" ||\n typeof component.rateAmountNanosPerMillion !== \"string\" ||\n typeof component.chargeAmountNanos !== \"string\"\n )\n throw new TypeError(\"[Sixb] Invalid cost estimate component.\")\n return normalizeCostComponent({\n meter,\n quantity: component.quantity,\n rateAmountNanosPerMillion: component.rateAmountNanosPerMillion,\n chargeAmountNanos: component.chargeAmountNanos,\n })\n })\n .sort(compareComponents)\n if (\n !components.length ||\n new Set(components.map((c) => c.meter)).size !== components.length ||\n parseNonnegativeInt64(amountNanos, \"estimate amountNanos\").toString() !==\n sumComponents(components)\n )\n throw new TypeError(\n \"[Sixb] Estimate must contain unique meters whose charges equal its total.\"\n )\n return {\n status: \"rated\",\n money: { currency: normalizeCurrency(currency), amountNanos },\n components,\n }\n }\n const reason = [...UNPRICEABLE_REASONS].find((reason) => reason === value.reason)\n if (value.status !== \"unpriceable\" || !reason)\n throw new TypeError(\"[Sixb] Invalid cost estimate status or reason.\")\n let missingMeters: readonly AiBillableMeter[] | undefined\n if (value.missingMeters !== undefined) {\n if (!Array.isArray(value.missingMeters))\n throw new TypeError(\"[Sixb] Invalid estimate missing meters.\")\n missingMeters = normalizeMissingMeters(\n value.missingMeters.map((input) => {\n const meter = [...METERS].find((meter) => meter === input)\n if (!meter) throw new TypeError(\"[Sixb] Invalid estimate missing meter.\")\n return meter\n })\n )\n }\n if (reason === \"missingUsageMeter\" && !missingMeters)\n throw new TypeError(\"[Sixb] Missing usage estimate requires missingMeters.\")\n return {\n status: \"unpriceable\",\n reason,\n ...(missingMeters === undefined ? {} : { missingMeters }),\n }\n}\n\nfunction isExternalValuationSource(sourceId: string): boolean {\n return sourceId === \"provider-reported\"\n}\n\nfunction normalizeUnpriceableCost(\n input: AiUnpriceableModelCallCostRecord,\n base: Pick<\n AiUnpriceableModelCallCostRecord,\n \"projectId\" | \"usageRecordId\" | \"pricingContext\" | \"priceSource\" | \"ratedAt\"\n >\n): AiUnpriceableModelCallCostRecord {\n if (!UNPRICEABLE_REASONS.has(input.reason)) {\n throw new TypeError(`[Sixb] AI unpriceable reason '${String(input.reason)}' is invalid.`)\n }\n const billingIdentity = input.billingIdentity\n ? normalizeBillingIdentity(input.billingIdentity)\n : undefined\n if (input.reason === \"missingBillingIdentity\" && billingIdentity !== undefined) {\n throw new TypeError(\"[Sixb] AI missingBillingIdentity cannot contain a billing identity.\")\n }\n if (input.reason !== \"missingBillingIdentity\" && billingIdentity === undefined) {\n throw new TypeError(`[Sixb] AI ${input.reason} requires a billing identity.`)\n }\n const missingMeters = normalizeMissingMeters(input.missingMeters)\n if (input.reason === \"missingUsageMeter\" && !missingMeters) {\n throw new TypeError(\"[Sixb] AI missingUsageMeter requires missingMeters.\")\n }\n return {\n ...base,\n status: \"unpriceable\",\n ...(billingIdentity ? { billingIdentity } : {}),\n reason: input.reason,\n ...(missingMeters ? { missingMeters } : {}),\n }\n}\n\nfunction normalizeCostComponent(input: AiCostComponent): AiCostComponent {\n if (!METERS.has(input.meter)) {\n throw new TypeError(`[Sixb] AI cost meter '${String(input.meter)}' is invalid.`)\n }\n const expected = calculateComponent(input.meter, input.quantity, input.rateAmountNanosPerMillion)\n if (expected.chargeAmountNanos !== input.chargeAmountNanos) {\n throw new TypeError(`[Sixb] AI cost component '${input.meter}' charge is invalid.`)\n }\n return expected\n}\n\nfunction calculateComponent(\n meter: AiBillableMeter,\n quantity: number | string,\n rateAmountNanosPerMillion: string\n): AiCostComponent {\n const normalizedQuantity = parseQuantity(quantity, `${meter} quantity`)\n const rate = parseNonnegativeInt64(rateAmountNanosPerMillion, `${meter} rate`)\n const charge = (normalizedQuantity * rate + HALF_MILLION) / TOKENS_PER_MILLION\n assertSignedInt64(charge, `${meter} charge`)\n return {\n meter,\n quantity: normalizedQuantity.toString(),\n rateAmountNanosPerMillion: rate.toString(),\n chargeAmountNanos: charge.toString(),\n }\n}\n\nfunction normalizePriceSource(input: AiPriceSource): AiPriceSource {\n assertNonBlank(input.sourceId, \"price sourceId\")\n assertNonBlank(input.sourceEntryId, \"price sourceEntryId\")\n assertNonBlank(input.sourceVersion, \"price sourceVersion\")\n if (input.sourceUrl !== undefined) assertNonBlank(input.sourceUrl, \"price sourceUrl\")\n return {\n sourceId: input.sourceId,\n sourceEntryId: input.sourceEntryId,\n sourceVersion: input.sourceVersion,\n ...(input.sourceUrl === undefined ? {} : { sourceUrl: input.sourceUrl }),\n observedAt: cloneDate(input.observedAt, \"price source observedAt\"),\n }\n}\n\nfunction normalizeBillingIdentity(input: AiBillingIdentity): AiBillingIdentity {\n assertNonBlank(input.providerId, \"billingIdentity.providerId\")\n assertNonBlank(input.modelId, \"billingIdentity.modelId\")\n return { providerId: input.providerId, modelId: input.modelId }\n}\n\nfunction normalizeMissingMeters(\n input: readonly AiBillableMeter[] | undefined\n): readonly AiBillableMeter[] | undefined {\n if (!input?.length) return undefined\n const result = [...new Set(input)]\n for (const meter of result) {\n if (!METERS.has(meter)) throw new TypeError(`[Sixb] AI missing meter '${meter}' is invalid.`)\n }\n return result.sort((left, right) => METER_ORDER[left] - METER_ORDER[right])\n}\n\nfunction sumComponents(components: readonly AiCostComponent[]): string {\n let total = 0n\n for (const component of components) {\n total += parseNonnegativeInt64(component.chargeAmountNanos, \"component charge\")\n assertSignedInt64(total, \"cost total\")\n }\n return total.toString()\n}\n\nfunction parseQuantity(value: number | string, field: string): bigint {\n if (typeof value === \"number\") {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new TypeError(`[Sixb] AI ${field} must be a non-negative safe integer.`)\n }\n return BigInt(value)\n }\n return parseNonnegativeInt64(value, field)\n}\n\nfunction parseNonnegativeInt64(value: string, field: string): bigint {\n if (\n typeof value !== \"string\" ||\n value.length === 0 ||\n value.length > MAX_NUMERIC_TEXT_LENGTH ||\n !/^\\d+$/.test(value)\n ) {\n throw new TypeError(`[Sixb] AI ${field} must be a non-negative integer string.`)\n }\n const parsed = BigInt(value)\n assertSignedInt64(parsed, field)\n return parsed\n}\n\nfunction compareComponents(left: AiCostComponent, right: AiCostComponent): number {\n return METER_ORDER[left.meter] - METER_ORDER[right.meter]\n}\n\nfunction normalizeCurrency(value: string): string {\n if (!/^[A-Z]{3}$/.test(value)) {\n throw new TypeError(\"[Sixb] AI currency must be a three-letter uppercase code.\")\n }\n return value\n}\n\nfunction assertSignedInt64(value: bigint, field: string): void {\n if (value < 0n || value > SIGNED_INT64_MAX) {\n throw new TypeError(`[Sixb] AI ${field} exceeds the signed 64-bit range.`)\n }\n}\n\nfunction assertNonBlank(value: string, field: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`[Sixb] AI ${field} must be nonblank.`)\n }\n}\n\nfunction cloneDate(value: Date, field: string): Date {\n if (!(value instanceof Date) || !Number.isFinite(value.getTime())) {\n throw new TypeError(`[Sixb] AI ${field} must be a valid Date.`)\n }\n return new Date(value)\n}\n"
|
|
12
|
-
],
|
|
13
|
-
"mappings": "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",
|
|
14
|
-
"debugId": "EFFF98F246C92D1864756E2164756E21",
|
|
15
|
-
"names": []
|
|
16
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/agents/authority.ts", "../src/storage/workflow-runs/errors.ts", "../src/storage/workflow-runs/provider.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"import { principalsEqual, SYSTEM_PRINCIPAL } from \"../auth\"\nimport type { AuthorizationContext } from \"../authorization\"\nimport { resolveAuthorizationContext } from \"../authorization\"\nimport { createSixbError } from \"../errors/internal\"\nimport type { AuthorizablePrincipal, AuthorizationRef } from \"../execution\"\nimport type { SecurityDefinitionCatalog } from \"../security\"\nimport type {\n AccessTokenRecord,\n AuthStorage,\n ServiceAccountGroupMembershipRecord,\n ServiceAccountRecord,\n SessionRecord,\n UserRecord,\n} from \"../storage/auth\"\nimport { AuthStorageError } from \"../storage/auth\"\n\nexport type AgentExecutionAuthorization =\n | { readonly type: \"principal\"; readonly context: AuthorizationContext }\n | { readonly type: \"disabled\" }\n\ntype UserCredentialRef = NonNullable<\n Extract<AuthorizationRef, { readonly type: \"principal\" }>[\"credential\"]\n>\n\ninterface CredentialedUserAuthorizationRef {\n readonly type: \"principal\"\n readonly principal: Extract<AuthorizablePrincipal, { readonly type: \"user\" }>\n readonly credential: UserCredentialRef\n}\n\nexport interface AgentExecutionIdentity {\n readonly serviceAccount: ServiceAccountRecord\n readonly principal: Extract<AuthorizablePrincipal, { readonly type: \"serviceAccount\" }>\n readonly groupMemberships: readonly ServiceAccountGroupMembershipRecord[]\n}\n\nexport function agentServiceAccountId(actorId: string): string {\n return `svc_agent_${actorId}`\n}\n\n/** Ensure a framework-managed Agent actor exists with exactly its declared group memberships. */\nexport async function ensureManagedAgentExecutionIdentity(input: {\n readonly auth: AuthStorage | undefined\n readonly projectId: string\n readonly actorId: string\n readonly name: string\n readonly description: string\n readonly groupIds: readonly string[]\n}): Promise<AgentExecutionIdentity> {\n const auth = requireAuthStorage(input.auth)\n const id = agentServiceAccountId(input.actorId)\n const now = new Date()\n const loaded = await loadOrCreateAgentServiceAccount(auth, {\n id,\n projectId: input.projectId,\n name: input.name,\n description: input.description,\n updatedAt: now,\n })\n assertFrameworkManagedAgentServiceAccount(input.actorId, loaded)\n assertActiveAgentServiceAccount(input.actorId, loaded)\n const serviceAccount = await updateAgentServiceAccountMetadata(auth, {\n existing: loaded,\n name: input.name,\n description: input.description,\n updatedAt: now,\n })\n assertActiveAgentServiceAccount(input.actorId, serviceAccount)\n\n const groupMemberships = requireDefinitionOwnedGroupMemberships(\n input.actorId,\n await auth.serviceAccountGroupMemberships.reconcileForServiceAccount({\n projectId: input.projectId,\n serviceAccountId: id,\n groupIds: input.groupIds,\n source: \"agent\",\n updatedAt: now,\n })\n )\n\n return {\n serviceAccount,\n principal: { type: \"serviceAccount\", id },\n groupMemberships,\n }\n}\n\n/** Load the managed identity, recovering only the expected concurrent-create race. */\nasync function loadOrCreateAgentServiceAccount(\n auth: AuthStorage,\n input: {\n readonly id: string\n readonly projectId: string\n readonly name: string\n readonly description: string\n readonly updatedAt: Date\n }\n): Promise<ServiceAccountRecord> {\n const existing = await auth.serviceAccounts.getById({\n projectId: input.projectId,\n id: input.id,\n })\n if (existing) return existing\n\n try {\n return await auth.serviceAccounts.create({\n id: input.id,\n projectId: input.projectId,\n name: input.name,\n description: input.description,\n status: \"active\",\n createdByPrincipal: SYSTEM_PRINCIPAL,\n createdAt: input.updatedAt,\n updatedAt: input.updatedAt,\n })\n } catch (error) {\n if (!(error instanceof AuthStorageError) || error.code !== \"duplicate_service_account\") {\n throw error\n }\n const concurrent = await auth.serviceAccounts.getById({\n projectId: input.projectId,\n id: input.id,\n })\n if (!concurrent) throw error\n return concurrent\n }\n}\n\nfunction assertActiveAgentServiceAccount(\n actorId: string,\n serviceAccount: ServiceAccountRecord\n): void {\n if (serviceAccount.status === \"suspended\") {\n throw new Error(\n `[Sixb] Agent '${actorId}' service account '${serviceAccount.id}' is suspended.`\n )\n }\n}\n\nfunction assertFrameworkManagedAgentServiceAccount(\n actorId: string,\n serviceAccount: ServiceAccountRecord\n): void {\n if (\n serviceAccount.createdByPrincipal === undefined ||\n !principalsEqual(serviceAccount.createdByPrincipal, SYSTEM_PRINCIPAL)\n ) {\n throw createSixbError(\n \"agent.execution_failed\",\n `[Sixb] Agent '${actorId}' cannot use service account '${serviceAccount.id}' because it is not managed by Sixb.`,\n { details: { actorId, serviceAccountId: serviceAccount.id } }\n )\n }\n}\n\nfunction requireDefinitionOwnedGroupMemberships(\n actorId: string,\n memberships: readonly ServiceAccountGroupMembershipRecord[]\n): readonly ServiceAccountGroupMembershipRecord[] {\n const externalGroupIds = memberships\n .filter((membership) => membership.source !== \"agent\")\n .map((membership) => membership.groupId)\n if (externalGroupIds.length > 0) {\n throw createSixbError(\n \"agent.execution_failed\",\n `[Sixb] Agent '${actorId}' service account has group memberships not managed by its definition: ${externalGroupIds.join(\", \")}.`,\n { details: { actorId, externalGroupIds } }\n )\n }\n return memberships\n}\n\n/** Resolve current grants for the service account referenced by a durable Agent execution. */\nexport async function resolveAgentExecutionAuthorization(input: {\n readonly auth: AuthStorage | undefined\n readonly projectId: string\n readonly actorId: string\n readonly authorizationRef: AuthorizationRef\n readonly security: SecurityDefinitionCatalog\n}): Promise<{ readonly identity: AgentExecutionIdentity; readonly context: AuthorizationContext }> {\n const auth = requireAuthStorage(input.auth)\n const expectedId = agentServiceAccountId(input.actorId)\n const principal =\n input.authorizationRef.type === \"principal\" ? input.authorizationRef.principal : null\n if (principal?.type !== \"serviceAccount\" || principal.id !== expectedId) {\n throw new Error(\n `[Sixb] Agent '${input.actorId}' execution authority must reference service account '${expectedId}'.`\n )\n }\n\n const serviceAccount = await auth.serviceAccounts.getById({\n projectId: input.projectId,\n id: principal.id,\n })\n if (!serviceAccount || serviceAccount.status !== \"active\") {\n throw new Error(`[Sixb] Agent service account '${principal.id}' is not active.`)\n }\n assertFrameworkManagedAgentServiceAccount(input.actorId, serviceAccount)\n\n const groupMemberships = requireDefinitionOwnedGroupMemberships(\n input.actorId,\n await auth.serviceAccountGroupMemberships.listForServiceAccount({\n projectId: input.projectId,\n serviceAccountId: principal.id,\n })\n )\n const identity: AgentExecutionIdentity = {\n serviceAccount,\n principal: { type: \"serviceAccount\", id: principal.id },\n groupMemberships,\n }\n return {\n identity,\n context: resolveAuthorizationContext({\n principal: identity.principal,\n groupIds: groupMemberships.map((membership) => membership.groupId),\n roles: input.security.listResolvedRoles(),\n }),\n }\n}\n\n/** Revalidate the durable user authority inherited by a conversational or child Agent. */\nexport async function resolveInheritedAgentExecutionAuthorization(input: {\n readonly auth: AuthStorage | undefined\n readonly projectId: string\n readonly authorizationRef: AuthorizationRef\n readonly security: SecurityDefinitionCatalog\n readonly now?: Date\n}): Promise<AgentExecutionAuthorization> {\n if (input.authorizationRef.type === \"disabled\") return { type: \"disabled\" }\n\n const ref = requireCredentialedUserAuthority(input.authorizationRef)\n const auth = requireAuthStorage(input.auth)\n const now = input.now ?? new Date()\n const user = await requireActiveUser(auth, input.projectId, ref.principal.id)\n const memberships = await auth.groupMemberships.listForUser({\n projectId: input.projectId,\n userId: user.id,\n })\n const credential = await revalidateUserCredential({\n auth,\n projectId: input.projectId,\n userId: user.id,\n credential: ref.credential,\n currentGroupIds: memberships.map((membership) => membership.groupId),\n now,\n })\n\n return {\n type: \"principal\",\n context: resolveAuthorizationContext({\n principal: ref.principal,\n groupIds: credential.groupIds,\n roles: input.security.listResolvedRoles(),\n ...(credential.sessionId === undefined ? {} : { sessionId: credential.sessionId }),\n }),\n }\n}\n\nfunction requireCredentialedUserAuthority(ref: AuthorizationRef): CredentialedUserAuthorizationRef {\n if (ref.type !== \"principal\" || ref.principal.type !== \"user\" || ref.credential === undefined) {\n throw invalidInheritedAuthority(\"the durable reference is not a credentialed user\")\n }\n return {\n type: \"principal\",\n principal: { type: \"user\", id: ref.principal.id },\n credential: { type: ref.credential.type, id: ref.credential.id },\n }\n}\n\nasync function requireActiveUser(\n auth: AuthStorage,\n projectId: string,\n userId: string\n): Promise<UserRecord> {\n const user = await auth.users.getById({ projectId, id: userId })\n if (!user || user.status !== \"active\") {\n throw invalidInheritedAuthority(`user '${userId}' is not active`)\n }\n return user\n}\n\nasync function revalidateUserCredential(input: {\n readonly auth: AuthStorage\n readonly projectId: string\n readonly userId: string\n readonly credential: UserCredentialRef\n readonly currentGroupIds: readonly string[]\n readonly now: Date\n}): Promise<{ readonly groupIds: readonly string[]; readonly sessionId?: string }> {\n if (input.credential.type === \"session\") {\n const session = await input.auth.sessions.getById({\n projectId: input.projectId,\n id: input.credential.id,\n })\n if (!isUsableUserSession(session, input.userId, input.now)) {\n throw invalidInheritedAuthority(\"the inherited session is no longer valid\")\n }\n return { groupIds: input.currentGroupIds, sessionId: session.id }\n }\n\n const accessToken = await input.auth.accessTokens.getById({\n projectId: input.projectId,\n id: input.credential.id,\n })\n if (!isUsableUserAccessToken(accessToken, input.userId, input.now)) {\n throw invalidInheritedAuthority(\"the inherited access token is no longer valid\")\n }\n if (accessToken.groupIds === undefined) return { groupIds: input.currentGroupIds }\n\n const allowedGroupIds = new Set(accessToken.groupIds)\n return {\n groupIds: input.currentGroupIds.filter((groupId) => allowedGroupIds.has(groupId)),\n }\n}\n\nfunction isUsableUserSession(\n session: SessionRecord | null,\n userId: string,\n now: Date\n): session is SessionRecord {\n if (!session || session.userId !== userId || session.revokedAt !== undefined) return false\n if (session.expiresAt.getTime() <= now.getTime()) return false\n return (\n session.absoluteExpiresAt === undefined || session.absoluteExpiresAt.getTime() > now.getTime()\n )\n}\n\nfunction isUsableUserAccessToken(\n token: AccessTokenRecord | null,\n userId: string,\n now: Date\n): token is AccessTokenRecord {\n if (!token || token.subjectType !== \"user\" || token.subjectId !== userId) return false\n return token.revokedAt === undefined && token.expiresAt.getTime() > now.getTime()\n}\n\nfunction invalidInheritedAuthority(reason: string): Error {\n return createSixbError(\n \"agent.execution_failed\",\n `[Sixb] The Agent execution cannot restore its inherited authority: ${reason}.`\n )\n}\n\nfunction requireAuthStorage(auth: AuthStorage | undefined): AuthStorage {\n if (!auth) {\n throw new Error(\"[Sixb] Agent executions require auth storage.\")\n }\n return auth\n}\n\nasync function updateAgentServiceAccountMetadata(\n auth: AuthStorage,\n input: {\n readonly existing: ServiceAccountRecord\n readonly name: string\n readonly description: string\n readonly updatedAt: Date\n }\n): Promise<ServiceAccountRecord> {\n if (input.existing.name === input.name && input.existing.description === input.description) {\n return input.existing\n }\n return auth.serviceAccounts.update({\n projectId: input.existing.projectId,\n id: input.existing.id,\n name: input.name,\n description: input.description,\n updatedAt: input.updatedAt,\n })\n}\n",
|
|
6
|
-
"/**\n * Base error for workflow-run storage operations.\n */\nexport class WorkflowRunError extends Error {\n readonly name = \"WorkflowRunError\"\n}\n",
|
|
7
|
-
"import { agentServiceAccountId } from \"../../agents/authority\"\nimport type { ExecutionStorage } from \"../executions\"\nimport { findAgentRunExecution, findPrimitiveRunExecution } from \"../executions/run-link\"\nimport { WorkflowRunError } from \"./errors\"\n\n/** Validate the semantic link between a durable workflow run and its immutable execution. */\nexport async function assertWorkflowRunExecution(input: {\n readonly executions: ExecutionStorage\n readonly projectId: string\n readonly executionId: string\n readonly runId: string\n readonly workflowId: string\n}): Promise<void> {\n const execution = await findPrimitiveRunExecution({\n executions: input.executions,\n projectId: input.projectId,\n executionId: input.executionId,\n primitive: { kind: \"workflow\", id: input.workflowId, runId: input.runId },\n sourceTypes: [\"execution\", \"schedule\", \"event\"],\n })\n if (!execution) {\n invalidExecution(input.executionId, input.runId)\n }\n\n if (execution.source.type === \"schedule\" || execution.source.type === \"event\") {\n if (execution.requestedBy !== undefined) {\n invalidExecution(input.executionId, input.runId)\n }\n return\n }\n\n // ExecutionStorage already validates the immutable parent reference, correlation id, and\n // requested-by propagation. This boundary only owns the workflow-specific source restriction.\n if (execution.source.type !== \"execution\") {\n invalidExecution(input.executionId, input.runId)\n }\n}\n\n/** Validate the semantic link between a Workflow Agent-node run and its child execution. */\nexport async function assertWorkflowAgentNodeRunExecution(input: {\n readonly executions: ExecutionStorage\n readonly projectId: string\n readonly executionId: string\n readonly nodeRunId: string\n readonly actorId: string\n readonly workflowExecutionId: string\n}): Promise<void> {\n const execution = await findAgentRunExecution({\n executions: input.executions,\n projectId: input.projectId,\n executionId: input.executionId,\n runId: input.nodeRunId,\n authority: { type: \"managed\", serviceAccountId: agentServiceAccountId(input.actorId) },\n })\n if (\n !execution ||\n execution.source.type !== \"execution\" ||\n execution.source.executionId !== input.workflowExecutionId\n ) {\n throw new WorkflowRunError(\n `[Sixb] Execution '${input.executionId}' does not authorize Workflow Agent-node run '${input.nodeRunId}'.`\n )\n }\n}\n\nfunction invalidExecution(executionId: string, runId: string): never {\n throw new WorkflowRunError(\n `[Sixb] Execution '${executionId}' does not authorize workflow run '${runId}'.`\n )\n}\n"
|
|
8
|
-
],
|
|
9
|
-
"mappings": "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",
|
|
10
|
-
"debugId": "77624CF2336F235864756E2164756E21",
|
|
11
|
-
"names": []
|
|
12
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/datasets/errors.ts", "../src/datasets/validation.ts", "../src/datasets/builders.ts", "../src/datasets/changes.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"export class DatasetValidationError extends Error {\n readonly name = \"DatasetValidationError\"\n}\n",
|
|
6
|
-
"import { isFileRef } from \"../blob-storage\"\nimport { isJsonValue, isPlainRecord } from \"../json\"\nimport { isDecimalString } from \"../ontology/decimal\"\nimport { DatasetValidationError } from \"./errors\"\nimport type {\n DatasetColumnDefinition,\n DatasetColumnType,\n DatasetDefinition,\n DatasetSchema,\n} from \"./types\"\n\nconst datasetColumnTypes = new Set<DatasetColumnType>([\n \"string\",\n \"boolean\",\n \"int64\",\n \"float64\",\n \"decimal\",\n \"date\",\n \"timestamp\",\n \"json\",\n \"fileRef\",\n])\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction isValidDateValue(value: unknown): boolean {\n return value instanceof Date && !Number.isNaN(value.getTime())\n}\n\nfunction isDateString(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n /^\\d{4}-\\d{2}-\\d{2}$/.test(value) &&\n !Number.isNaN(Date.parse(value))\n )\n}\n\nfunction isTimestampString(value: unknown): value is string {\n return typeof value === \"string\" && !Number.isNaN(Date.parse(value))\n}\n\nfunction matchesColumnType(value: unknown, type: DatasetColumnType): boolean {\n switch (type) {\n case \"string\":\n return typeof value === \"string\"\n case \"boolean\":\n return typeof value === \"boolean\"\n case \"int64\":\n return (\n (typeof value === \"number\" && Number.isInteger(value)) ||\n (typeof value === \"string\" && /^-?\\d+$/.test(value))\n )\n case \"float64\":\n return typeof value === \"number\" && Number.isFinite(value)\n case \"decimal\":\n return isDecimalString(value)\n case \"date\":\n return isValidDateValue(value) || isDateString(value)\n case \"timestamp\":\n return isValidDateValue(value) || isTimestampString(value)\n case \"json\":\n return isJsonValue(value)\n case \"fileRef\":\n return isFileRef(value)\n }\n}\n\nfunction assertNonEmptyString(\n value: unknown,\n field: string,\n createError: (message: string) => Error\n): asserts value is string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw createError(`${field} must not be empty.`)\n }\n}\n\nexport function assertDatasetColumnDefinition(\n column: unknown,\n createError: (message: string) => Error,\n fieldPrefix = \"Dataset column\"\n): asserts column is DatasetColumnDefinition {\n if (!isRecord(column)) {\n throw createError(`${fieldPrefix} must be an object.`)\n }\n\n assertNonEmptyString(column.name, `${fieldPrefix} name`, createError)\n\n if (!datasetColumnTypes.has(column.type as DatasetColumnType)) {\n throw createError(\n `${fieldPrefix} '${column.name}' has an invalid type '${String(column.type)}'.`\n )\n }\n\n if (column.nullable !== undefined && typeof column.nullable !== \"boolean\") {\n throw createError(`${fieldPrefix} '${column.name}' nullable must be a boolean.`)\n }\n}\n\nfunction assertDatasetSchema(\n schema: unknown,\n createError: (message: string) => Error\n): asserts schema is DatasetSchema {\n if (!isRecord(schema) || !Array.isArray(schema.columns)) {\n throw createError(\"Dataset definitions must declare a schema.\")\n }\n\n const seenColumnNames = new Set<string>()\n for (const column of schema.columns) {\n assertDatasetColumnDefinition(column, createError)\n\n if (seenColumnNames.has(column.name)) {\n throw createError(`Dataset schema contains a duplicate column '${column.name}'.`)\n }\n\n seenColumnNames.add(column.name)\n }\n}\n\nfunction assertDatasetPrimaryKey(\n primaryKey: unknown,\n schema: DatasetSchema,\n createError: (message: string) => Error\n): void {\n let keyColumns: readonly unknown[]\n if (typeof primaryKey === \"string\") {\n keyColumns = [primaryKey]\n } else if (Array.isArray(primaryKey)) {\n if (primaryKey.length < 2) {\n throw createError(\n \"Dataset primaryKey arrays must contain at least two column names. Use a string for a single-column key.\"\n )\n }\n keyColumns = primaryKey\n } else {\n throw createError(\n \"Dataset primaryKey must be a column name or an array of at least two column names.\"\n )\n }\n\n const columnsByName = new Map(schema.columns.map((column) => [column.name, column] as const))\n const seenColumnNames = new Set<string>()\n\n for (const columnName of keyColumns) {\n if (typeof columnName !== \"string\" || columnName.trim().length === 0) {\n throw createError(\"Dataset primaryKey columns must be non-empty strings.\")\n }\n\n if (seenColumnNames.has(columnName)) {\n throw createError(`Dataset primaryKey contains duplicate column '${columnName}'.`)\n }\n seenColumnNames.add(columnName)\n\n const column = columnsByName.get(columnName)\n if (column === undefined) {\n throw createError(`Dataset primaryKey column '${columnName}' is not declared in the schema.`)\n }\n if (column.type !== \"string\") {\n throw createError(`Dataset primaryKey column '${columnName}' must have type 'string'.`)\n }\n if (column.nullable === true) {\n throw createError(`Dataset primaryKey column '${columnName}' must not be nullable.`)\n }\n }\n}\n\nexport function assertDatasetDefinition(\n definition: unknown,\n createError: (message: string) => Error = (message) => new DatasetValidationError(message)\n): asserts definition is DatasetDefinition {\n if (!isRecord(definition)) {\n throw createError(\"Dataset definition must be an object.\")\n }\n\n if (definition.kind !== \"dataset\") {\n throw createError(\"Dataset definition kind must be 'dataset'.\")\n }\n\n assertNonEmptyString(definition.id, \"Dataset id\", createError)\n assertDatasetSchema(definition.schema, createError)\n\n if (definition.primaryKey !== undefined) {\n assertDatasetPrimaryKey(definition.primaryKey, definition.schema, createError)\n }\n\n if (definition.partitionBy !== undefined) {\n if (!Array.isArray(definition.partitionBy)) {\n throw createError(\"Dataset partitionBy must be an array of column names.\")\n }\n\n const columnNames = new Set(definition.schema.columns.map((column) => column.name))\n for (const columnName of definition.partitionBy) {\n assertNonEmptyString(columnName, \"Dataset partition column\", createError)\n if (!columnNames.has(columnName)) {\n throw createError(`Dataset partition column '${columnName}' is not declared in the schema.`)\n }\n }\n }\n\n if (definition.description !== undefined && typeof definition.description !== \"string\") {\n throw createError(\"Dataset description must be a string.\")\n }\n}\n\nexport function isDatasetDefinition(value: unknown): value is DatasetDefinition {\n try {\n assertDatasetDefinition(value, (message) => new Error(message))\n return true\n } catch {\n return false\n }\n}\n\nexport function getDatasetRowValidationError(\n row: unknown,\n dataset: DatasetDefinition,\n options?: { readonly columns?: Iterable<string> }\n): string | null {\n if (!isPlainRecord(row)) {\n return `Dataset '${dataset.id}' rows must be plain objects.`\n }\n\n const columnsByName = new Map(\n dataset.schema.columns.map((column) => [column.name, column] as const)\n )\n\n // When `columns` is provided, validate only that subset (e.g. the columns a\n // projection actually maps). Projection reads are column-pruned, so the row\n // never carries unmapped columns and must not be checked against them.\n if (options?.columns !== undefined) {\n const columnsToValidate = new Set(options.columns)\n for (const column of dataset.schema.columns) {\n if (!columnsToValidate.has(column.name)) {\n continue\n }\n\n const error = getColumnValidationError(row, column, dataset)\n if (error) {\n return error\n }\n }\n\n return null\n }\n\n for (const columnName of Object.keys(row)) {\n if (!columnsByName.has(columnName)) {\n return `Dataset '${dataset.id}' row contains unknown column '${columnName}'.`\n }\n }\n\n for (const column of dataset.schema.columns) {\n const error = getColumnValidationError(row, column, dataset)\n if (error) {\n return error\n }\n }\n\n return null\n}\n\nfunction getColumnValidationError(\n row: Record<string, unknown>,\n column: DatasetColumnDefinition,\n dataset: DatasetDefinition\n): string | null {\n const hasValue = Object.hasOwn(row, column.name)\n const value = row[column.name]\n\n // Treat `undefined` the same as an omitted field so callers either send a real\n // value or use `null` explicitly on nullable columns.\n if (!hasValue || value === undefined) {\n if (!column.nullable) {\n return `Dataset '${dataset.id}' row is missing required column '${column.name}'.`\n }\n return null\n }\n\n if (value === null) {\n if (!column.nullable) {\n return `Dataset '${dataset.id}' column '${column.name}' does not allow null values.`\n }\n return null\n }\n\n if (!matchesColumnType(value, column.type)) {\n return `Dataset '${dataset.id}' column '${column.name}' must match type '${column.type}'.`\n }\n\n return null\n}\n",
|
|
7
|
-
"import { DatasetValidationError } from \"./errors\"\nimport type {\n DatasetColumnDefinition,\n DatasetColumnNameOf,\n DatasetColumnType,\n DatasetDefinition,\n DatasetPrimaryKey,\n} from \"./types\"\nimport { assertDatasetColumnDefinition, assertDatasetDefinition } from \"./validation\"\n\ntype DatasetColumnOptions = {\n readonly nullable?: boolean\n}\n\ntype DefineDatasetOptions = {\n readonly schema: readonly DatasetColumnDefinition[]\n readonly primaryKey?: DatasetPrimaryKey\n readonly partitionBy?: readonly string[]\n readonly description?: string\n}\n\ntype DeriveDatasetOptions<TParent extends DatasetDefinition> = {\n readonly pick?: readonly DatasetColumnNameOf<TParent>[]\n readonly add?: readonly DatasetColumnDefinition[]\n readonly primaryKey?: DatasetPrimaryKey\n readonly partitionBy?: readonly string[]\n readonly description?: string\n}\n\ntype FieldFromOptions<TOptions, TKey extends string, TFallback> = TOptions extends {\n readonly [K in TKey]: infer TValue\n}\n ? TValue extends TFallback\n ? { readonly [K in TKey]: TValue }\n : { readonly [K in TKey]?: TFallback }\n : { readonly [K in TKey]?: TFallback }\n\ntype ColumnNameOf<TColumns extends readonly DatasetColumnDefinition[]> = TColumns[number][\"name\"]\n\ntype ColumnDefinitionOf<\n TColumns extends readonly DatasetColumnDefinition[],\n TName extends ColumnNameOf<TColumns>,\n> = Extract<TColumns[number], { readonly name: TName }>\n\ntype PrimaryKeyColumnNameOf<TColumns extends readonly DatasetColumnDefinition[]> =\n string extends ColumnNameOf<TColumns>\n ? string\n : {\n [TName in ColumnNameOf<TColumns>]: ColumnDefinitionOf<\n TColumns,\n TName\n >[\"type\"] extends \"string\"\n ? ColumnDefinitionOf<TColumns, TName> extends { readonly nullable: true }\n ? never\n : TName\n : never\n }[ColumnNameOf<TColumns>]\n\ntype CheckedDefineDatasetOptions<TOptions extends DefineDatasetOptions> = TOptions & {\n readonly primaryKey?: DatasetPrimaryKey<PrimaryKeyColumnNameOf<TOptions[\"schema\"]>>\n}\n\ntype PickColumns<\n TColumns extends readonly DatasetColumnDefinition[],\n TNames extends readonly ColumnNameOf<TColumns>[],\n> = TNames extends readonly [infer THead, ...infer TTail]\n ? THead extends ColumnNameOf<TColumns>\n ? TTail extends readonly ColumnNameOf<TColumns>[]\n ? readonly [ColumnDefinitionOf<TColumns, THead>, ...PickColumns<TColumns, TTail>]\n : never\n : never\n : TNames extends readonly []\n ? readonly []\n : readonly ColumnDefinitionOf<TColumns, TNames[number]>[]\n\ntype AddColumns<\n TColumns extends readonly DatasetColumnDefinition[],\n TAdd extends readonly DatasetColumnDefinition[],\n> = readonly [...TColumns, ...TAdd]\n\ntype DerivedBaseColumns<\n TParent extends DatasetDefinition,\n TOptions extends DeriveDatasetOptions<TParent> | undefined,\n> = TOptions extends { readonly pick: infer TPick }\n ? TPick extends readonly DatasetColumnNameOf<TParent>[]\n ? PickColumns<TParent[\"schema\"][\"columns\"], TPick>\n : TParent[\"schema\"][\"columns\"]\n : TParent[\"schema\"][\"columns\"]\n\ntype DerivedColumns<\n TParent extends DatasetDefinition,\n TOptions extends DeriveDatasetOptions<TParent> | undefined,\n> = TOptions extends { readonly add: infer TAdd }\n ? TAdd extends readonly DatasetColumnDefinition[]\n ? AddColumns<DerivedBaseColumns<TParent, TOptions>, TAdd>\n : DerivedBaseColumns<TParent, TOptions>\n : DerivedBaseColumns<TParent, TOptions>\n\ntype DatasetColumnResult<\n TName extends string,\n TType extends DatasetColumnType,\n TOptions extends DatasetColumnOptions | undefined,\n> = {\n readonly name: TName\n readonly type: TType\n} & FieldFromOptions<TOptions, \"nullable\", boolean>\n\ntype DatasetDefinitionResult<TId extends string, TOptions extends DefineDatasetOptions> = Omit<\n DatasetDefinition<TId, TOptions[\"schema\"]>,\n \"primaryKey\" | \"partitionBy\" | \"description\"\n> &\n FieldFromOptions<TOptions, \"primaryKey\", DatasetPrimaryKey> &\n FieldFromOptions<TOptions, \"partitionBy\", readonly string[]> &\n FieldFromOptions<TOptions, \"description\", string>\n\ntype DerivedDatasetDefinitionResult<\n TId extends string,\n TParent extends DatasetDefinition,\n TOptions extends DeriveDatasetOptions<TParent> | undefined,\n> = Omit<\n DatasetDefinition<TId, DerivedColumns<TParent, TOptions>>,\n \"primaryKey\" | \"partitionBy\" | \"description\"\n> &\n FieldFromOptions<TOptions, \"primaryKey\", DatasetPrimaryKey> &\n FieldFromOptions<TOptions, \"partitionBy\", readonly string[]> &\n FieldFromOptions<TOptions, \"description\", string>\n\ntype CheckedDeriveDatasetOptions<\n TParent extends DatasetDefinition,\n TOptions extends DeriveDatasetOptions<TParent>,\n> = TOptions & {\n readonly primaryKey?: DatasetPrimaryKey<PrimaryKeyColumnNameOf<DerivedColumns<TParent, TOptions>>>\n}\n\nexport function col<const TName extends string, const TType extends DatasetColumnType>(\n name: TName,\n type: TType\n): DatasetColumnResult<TName, TType, undefined>\nexport function col<\n const TName extends string,\n const TType extends DatasetColumnType,\n const TOptions extends DatasetColumnOptions,\n>(name: TName, type: TType, options: TOptions): DatasetColumnResult<TName, TType, TOptions>\nexport function col(\n name: string,\n type: DatasetColumnType,\n options?: DatasetColumnOptions\n): DatasetColumnDefinition {\n const column: DatasetColumnDefinition = {\n name,\n type,\n ...(options?.nullable !== undefined ? { nullable: options.nullable } : {}),\n }\n\n assertDatasetColumnDefinition(column, (message) => new DatasetValidationError(message))\n return column\n}\n\nfunction assertDatasetId(id: string): void {\n if (!id.trim()) {\n throw new DatasetValidationError(\"Dataset id must not be empty.\")\n }\n}\n\nfunction createDatasetDefinition(id: string, options: DefineDatasetOptions): DatasetDefinition {\n const definition: unknown = {\n kind: \"dataset\",\n id,\n schema: {\n columns: [...options.schema],\n },\n ...(options.primaryKey !== undefined\n ? {\n primaryKey: Array.isArray(options.primaryKey)\n ? [...options.primaryKey]\n : options.primaryKey,\n }\n : {}),\n ...(options.partitionBy !== undefined ? { partitionBy: [...options.partitionBy] } : {}),\n ...(options.description !== undefined ? { description: options.description } : {}),\n }\n\n assertDatasetDefinition(definition, (message) => new DatasetValidationError(message))\n return definition\n}\n\nfunction assertStringArray(value: unknown, field: string): asserts value is readonly string[] {\n if (!Array.isArray(value)) {\n throw new DatasetValidationError(`${field} must be an array of column names.`)\n }\n\n for (const item of value) {\n if (typeof item !== \"string\" || !item.trim()) {\n throw new DatasetValidationError(`${field} must contain only non-empty column names.`)\n }\n }\n}\n\nfunction deriveDatasetDefinition(\n id: string,\n parent: DatasetDefinition,\n options: DeriveDatasetOptions<DatasetDefinition> = {}\n): DatasetDefinition {\n assertDatasetDefinition(parent, (message) => new DatasetValidationError(message))\n\n if (options.pick !== undefined) {\n assertStringArray(options.pick, \"Dataset derive pick\")\n }\n\n if (options.add !== undefined && !Array.isArray(options.add)) {\n throw new DatasetValidationError(\"Dataset derive add must be an array of columns.\")\n }\n\n const parentColumnsByName = new Map(\n parent.schema.columns.map((column) => [column.name, column] as const)\n )\n const pickedColumns =\n options.pick === undefined\n ? parent.schema.columns\n : options.pick.map((columnName) => {\n const column = parentColumnsByName.get(columnName)\n if (column === undefined) {\n throw new DatasetValidationError(\n `Dataset derive pick column '${columnName}' is not declared on parent dataset '${parent.id}'.`\n )\n }\n return column\n })\n\n return createDatasetDefinition(id, {\n schema: [...pickedColumns, ...(options.add ?? [])],\n ...(options.primaryKey !== undefined ? { primaryKey: options.primaryKey } : {}),\n ...(options.partitionBy !== undefined ? { partitionBy: options.partitionBy } : {}),\n ...(options.description !== undefined ? { description: options.description } : {}),\n })\n}\n\nfunction createDatasetDeriveBuilder<TId extends string>(id: TId) {\n assertDatasetId(id)\n\n function derive<const TParent extends DatasetDefinition>(\n parent: TParent\n ): DerivedDatasetDefinitionResult<TId, TParent, undefined>\n function derive<\n const TParent extends DatasetDefinition,\n const TOptions extends DeriveDatasetOptions<TParent>,\n >(\n parent: TParent,\n options: CheckedDeriveDatasetOptions<TParent, TOptions>\n ): DerivedDatasetDefinitionResult<TId, TParent, TOptions>\n function derive(\n parent: DatasetDefinition,\n options?: DeriveDatasetOptions<DatasetDefinition>\n ): DatasetDefinition {\n return deriveDatasetDefinition(id, parent, options)\n }\n\n return { derive }\n}\n\nexport function defineDataset<const TId extends string>(\n id: TId\n): ReturnType<typeof createDatasetDeriveBuilder<TId>>\nexport function defineDataset<\n const TId extends string,\n const TOptions extends DefineDatasetOptions,\n>(id: TId, options: CheckedDefineDatasetOptions<TOptions>): DatasetDefinitionResult<TId, TOptions>\nexport function defineDataset(\n id: string,\n options?: DefineDatasetOptions\n): DatasetDefinition | ReturnType<typeof createDatasetDeriveBuilder<string>> {\n if (options === undefined) {\n return createDatasetDeriveBuilder(id)\n }\n\n return createDatasetDefinition(id, options)\n}\n",
|
|
8
|
-
"export type MergeChange<Row, Key> =\n | { readonly kind: \"upsert\"; readonly row: Row }\n | { readonly kind: \"delete\"; readonly key: Key }\n\nexport const change = {\n upsert<const Row extends object>(row: Row): { readonly kind: \"upsert\"; readonly row: Row } {\n return { kind: \"upsert\", row }\n },\n\n delete<const Key extends object>(key: Key): { readonly kind: \"delete\"; readonly key: Key } {\n return { kind: \"delete\", key }\n },\n}\n"
|
|
9
|
-
],
|
|
10
|
-
"mappings": "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",
|
|
11
|
-
"debugId": "5BD3A97C32D4B31E64756E2164756E21",
|
|
12
|
-
"names": []
|
|
13
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/lake-storage/errors.ts", "../src/lake-storage/definition-updates.ts", "../src/lake-storage/in-memory.ts", "../src/lake-storage/merge-validation.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/**\n * Error for lake-storage invariants and invalid lake operations.\n */\nexport class LakeStorageError extends Error {\n readonly name = \"LakeStorageError\"\n}\n",
|
|
6
|
-
"import type { DatasetColumnDefinition, DatasetDefinition } from \"../datasets\"\nimport { LakeStorageError } from \"./errors\"\nimport type { LakeStorage } from \"./types\"\n\nexport type DatasetSchemaUpdatePlan =\n | { readonly kind: \"none\" }\n | {\n readonly kind: \"addNullableColumns\"\n readonly columns: readonly DatasetColumnDefinition[]\n }\n\nexport interface DatasetMetadataUpdatePlan {\n readonly descriptionChanged: boolean\n readonly partitionByChanged: boolean\n}\n\nexport interface DatasetDefinitionUpdatePlan {\n readonly existing: DatasetDefinition\n readonly requested: DatasetDefinition\n readonly definition: DatasetDefinition\n readonly schema: DatasetSchemaUpdatePlan\n readonly metadata: DatasetMetadataUpdatePlan\n readonly changed: boolean\n}\n\nconst SCHEMA_UPDATE_V1_POLICY =\n \"Dataset definition updates V1 support only adding nullable columns.\"\n\n/**\n * Build a provider-neutral update plan for two versions of the same dataset\n * definition. Core owns the definition diff; storage providers own how much of\n * the plan they can apply.\n */\nexport function planDatasetDefinitionUpdate(\n existing: DatasetDefinition,\n requested: DatasetDefinition\n): DatasetDefinitionUpdatePlan {\n assertSameDataset(existing, requested)\n assertPrimaryKeyUnchanged(existing, requested)\n\n const addedColumns = getAddedColumnsAfterValidatingExistingColumns(existing, requested)\n assertAddedColumnsAreNullable(requested.id, addedColumns)\n\n const schema = toSchemaUpdatePlan(addedColumns)\n const definition = mergeDatasetDefinition(existing, requested, addedColumns)\n const metadata: DatasetMetadataUpdatePlan = {\n descriptionChanged: existing.description !== definition.description,\n partitionByChanged: !areStringArraysEqual(existing.partitionBy, definition.partitionBy),\n }\n\n return {\n existing: structuredClone(existing),\n requested: structuredClone(requested),\n definition,\n schema,\n metadata,\n changed: schema.kind !== \"none\" || metadata.descriptionChanged || metadata.partitionByChanged,\n }\n}\n\n/**\n * Strict providers can use this helper when they do not support schema\n * evolution. Metadata-only compatible additions are still merged.\n */\nexport function mergeStrictDatasetDefinition(options: {\n readonly existing?: DatasetDefinition | null\n readonly next: DatasetDefinition\n}): DatasetDefinition {\n if (!options.existing) {\n return structuredClone(options.next)\n }\n\n const plan = planDatasetDefinitionUpdate(options.existing, options.next)\n if (plan.schema.kind !== \"none\") {\n throw new LakeStorageError(\n `[SixbLake] Dataset '${options.next.id}' cannot be redefined with an incompatible schema.`\n )\n }\n\n return structuredClone(plan.definition)\n}\n\nexport interface AssertLakeDatasetDefinitionsCompatibleOptions {\n readonly lakeStorage: LakeStorage\n readonly definitions: readonly DatasetDefinition[]\n}\n\nexport async function assertLakeDatasetDefinitionsCompatible(\n options: AssertLakeDatasetDefinitionsCompatibleOptions\n): Promise<void> {\n await options.lakeStorage.assertDatasetDefinitionsCompatible(options.definitions)\n}\n\nfunction assertSameDataset(existing: DatasetDefinition, requested: DatasetDefinition): void {\n if (existing.id !== requested.id) {\n throw new LakeStorageError(\n `[SixbLake] Cannot update dataset '${existing.id}' with definition for '${requested.id}'.`\n )\n }\n}\n\nfunction assertPrimaryKeyUnchanged(\n existing: DatasetDefinition,\n requested: DatasetDefinition\n): void {\n const existingPrimaryKey = existing.primaryKey\n const requestedPrimaryKey = requested.primaryKey\n const unchanged =\n existingPrimaryKey === undefined || requestedPrimaryKey === undefined\n ? existingPrimaryKey === requestedPrimaryKey\n : areDefinitionValuesEqual(existingPrimaryKey, requestedPrimaryKey)\n\n if (!unchanged) {\n throw new LakeStorageError(\n `[SixbLake] Dataset '${requested.id}' cannot be redefined with an incompatible primaryKey. Primary keys are immutable.`\n )\n }\n}\n\nfunction getAddedColumnsAfterValidatingExistingColumns(\n existing: DatasetDefinition,\n requested: DatasetDefinition\n): readonly DatasetColumnDefinition[] {\n const existingColumns = existing.schema.columns\n const requestedColumnsByName = new Map(\n requested.schema.columns.map((column) => [column.name, column])\n )\n\n // Existing columns are matched by name, not position. Developers can reorder\n // declarations for readability without implying a storage-level schema change.\n for (const existingColumn of existingColumns) {\n const requestedColumn = requestedColumnsByName.get(existingColumn.name)\n if (requestedColumn === undefined) {\n throwUnsupportedSchemaUpdate(\n requested.id,\n `dropping column '${existingColumn.name}' is not supported`\n )\n }\n\n assertExistingColumnUnchanged(requested.id, existingColumn, requestedColumn)\n }\n\n const existingColumnNames = new Set(existingColumns.map((column) => column.name))\n return requested.schema.columns.filter((column) => !existingColumnNames.has(column.name))\n}\n\nfunction assertAddedColumnsAreNullable(\n datasetId: string,\n addedColumns: readonly DatasetColumnDefinition[]\n): void {\n for (const column of addedColumns) {\n // Existing rows have no value for a new column. Until DatasetDefinition\n // supports defaults or backfills, only nullable columns are safe to add.\n if (!isNullable(column)) {\n throwUnsupportedSchemaUpdate(\n datasetId,\n `adding required column '${column.name}' is not supported`\n )\n }\n }\n}\n\nfunction assertExistingColumnUnchanged(\n datasetId: string,\n existing: DatasetColumnDefinition,\n requested: DatasetColumnDefinition\n): void {\n if (existing.type !== requested.type) {\n throwUnsupportedSchemaUpdate(\n datasetId,\n `changing column '${existing.name}' type from '${existing.type}' to '${requested.type}' is not supported`\n )\n }\n\n if (isNullable(existing) !== isNullable(requested)) {\n throwUnsupportedSchemaUpdate(\n datasetId,\n `changing column '${existing.name}' nullability is not supported`\n )\n }\n}\n\nfunction toSchemaUpdatePlan(\n addedColumns: readonly DatasetColumnDefinition[]\n): DatasetSchemaUpdatePlan {\n if (addedColumns.length === 0) {\n return { kind: \"none\" }\n }\n\n return {\n kind: \"addNullableColumns\",\n columns: cloneColumns(addedColumns),\n }\n}\n\nfunction mergeDatasetDefinition(\n existing: DatasetDefinition,\n requested: DatasetDefinition,\n addedColumns: readonly DatasetColumnDefinition[]\n): DatasetDefinition {\n assertCompatibleMetadataField(\n requested.id,\n \"description\",\n existing.description,\n requested.description\n )\n assertCompatibleMetadataField(\n requested.id,\n \"partitionBy\",\n existing.partitionBy,\n requested.partitionBy\n )\n\n const columns = [...cloneColumns(existing.schema.columns), ...cloneColumns(addedColumns)]\n const primaryKey = existing.primaryKey\n const partitionBy = requested.partitionBy ?? existing.partitionBy\n const description = requested.description ?? existing.description\n\n return {\n kind: \"dataset\",\n id: requested.id,\n schema: { columns },\n ...(primaryKey !== undefined ? { primaryKey: structuredClone(primaryKey) } : {}),\n ...(partitionBy !== undefined ? { partitionBy: [...partitionBy] } : {}),\n ...(description !== undefined ? { description } : {}),\n }\n}\n\nfunction assertCompatibleMetadataField(\n datasetId: string,\n field: \"description\" | \"partitionBy\",\n existing: string | readonly string[] | undefined,\n requested: string | readonly string[] | undefined\n): void {\n if (\n existing === undefined ||\n requested === undefined ||\n areDefinitionValuesEqual(existing, requested)\n ) {\n return\n }\n\n throw new LakeStorageError(\n `[SixbLake] Dataset '${datasetId}' cannot be redefined with an incompatible ${field}.`\n )\n}\n\nfunction areStringArraysEqual(\n left: readonly string[] | undefined,\n right: readonly string[] | undefined\n): boolean {\n if (left === undefined || right === undefined) {\n return left === right\n }\n\n return left.length === right.length && left.every((value, index) => value === right[index])\n}\n\nfunction areDefinitionValuesEqual(\n left: string | readonly string[],\n right: string | readonly string[]\n): boolean {\n if (typeof left === \"string\" || typeof right === \"string\") {\n return left === right\n }\n\n return areStringArraysEqual(left, right)\n}\n\nfunction isNullable(column: DatasetColumnDefinition): boolean {\n return column.nullable === true\n}\n\nfunction cloneColumns(\n columns: readonly DatasetColumnDefinition[]\n): readonly DatasetColumnDefinition[] {\n return columns.map((column) => ({ ...column }))\n}\n\nfunction throwUnsupportedSchemaUpdate(datasetId: string, detail: string): never {\n throw new LakeStorageError(\n `[SixbLake] Dataset '${datasetId}' cannot apply schema update because ${detail}. ${SCHEMA_UPDATE_V1_POLICY}`\n )\n}\n",
|
|
7
|
-
"import { randomUUID } from \"node:crypto\"\nimport type { DatasetDefinition, DatasetSchema, MergeChange } from \"../datasets\"\nimport { getDatasetRowValidationError } from \"../datasets/validation\"\nimport { mergeStrictDatasetDefinition } from \"./definition-updates\"\nimport { LakeStorageError } from \"./errors\"\nimport type {\n BeginDatasetMergeInput,\n CommitDatasetMergeInput,\n DatasetMergeCommitResult,\n LakeMergeSession,\n} from \"./merge\"\nimport {\n cloneDatasetMergeChange,\n encodeDatasetPrimaryKey,\n getDatasetMergeChangeValidationError,\n getDatasetPrimaryKeyColumns,\n} from \"./merge-validation\"\nimport type {\n BeginDatasetWriteInput,\n CommitDatasetWriteInput,\n DatasetCatalogState,\n DatasetRow,\n DatasetVersion,\n DatasetWriteCommitResult,\n DatasetWriteMode,\n LakeStorage,\n LakeWriteSession,\n ReadDatasetRowsInput,\n} from \"./types\"\n\nfunction cloneDatasetDefinition(definition: DatasetDefinition): DatasetDefinition {\n return structuredClone(definition)\n}\n\nfunction cloneDatasetVersion(version: DatasetVersion): DatasetVersion {\n return {\n ...structuredClone(version),\n createdAt: new Date(version.createdAt),\n }\n}\n\nfunction cloneRow(row: DatasetRow): DatasetRow {\n return structuredClone(row)\n}\n\nfunction selectColumns(row: DatasetRow, columns?: readonly string[]): DatasetRow {\n if (!columns || columns.length === 0) {\n return cloneRow(row)\n }\n\n const selected: Record<string, unknown> = {}\n for (const column of columns) {\n selected[column] = row[column]\n }\n return selected\n}\n\n// Canonical content key for unchanged-write detection. JSON.stringify\n// serializes Date values via toJSON, matching how rows persist as JSON;\n// missing and undefined nullable values normalize to null. The unchanged-write\n// semantics are pinned by the shared lake-storage contract suite.\nfunction rowContentKey(row: DatasetRow, schema: DatasetSchema): string {\n return JSON.stringify(schema.columns.map((column) => row[column.name] ?? null))\n}\n\n// Order-insensitive multiset equality over canonical row keys.\nfunction sameRowContent(left: readonly string[], right: readonly string[]): boolean {\n if (left.length !== right.length) {\n return false\n }\n\n const sortedLeft = [...left].sort()\n const sortedRight = [...right].sort()\n return sortedLeft.every((key, index) => key === sortedRight[index])\n}\n\nfunction assertDatasetId(datasetId: string): void {\n if (datasetId.trim().length === 0) {\n throw new LakeStorageError(\"[LakeStorage] Dataset id must not be empty\")\n }\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\nclass InMemoryLakeWriteSession implements LakeWriteSession {\n private readonly rows: DatasetRow[] = []\n private readonly primaryKeys = new Set<string>()\n private closed = false\n\n constructor(\n private readonly storage: InMemoryLakeStorage,\n private readonly input: BeginDatasetWriteInput\n ) {}\n\n async writeRows(rows: Iterable<DatasetRow> | AsyncIterable<DatasetRow>): Promise<void> {\n this.assertOpen()\n\n const stagedRows: DatasetRow[] = []\n const stagedPrimaryKeys = new Set<string>()\n for await (const row of rows) {\n const validationError = getDatasetRowValidationError(row, this.input.dataset)\n if (validationError) {\n throw new LakeStorageError(`[LakeStorage] ${validationError}`)\n }\n\n if (getDatasetPrimaryKeyColumns(this.input.dataset) !== null) {\n const primaryKey = encodeDatasetPrimaryKey(this.input.dataset, row)\n if (this.primaryKeys.has(primaryKey) || stagedPrimaryKeys.has(primaryKey)) {\n throw new LakeStorageError(\n `[LakeStorage] Dataset '${this.input.dataset.id}' write contains duplicate primary key ${primaryKey}.`\n )\n }\n stagedPrimaryKeys.add(primaryKey)\n }\n\n stagedRows.push(cloneRow(row))\n }\n\n this.rows.push(...stagedRows)\n for (const primaryKey of stagedPrimaryKeys) {\n this.primaryKeys.add(primaryKey)\n }\n }\n\n async commit(input?: CommitDatasetWriteInput): Promise<DatasetWriteCommitResult> {\n this.assertOpen()\n this.closed = true\n return this.storage.commitWrite({\n write: this.input,\n rows: this.rows,\n commit: input,\n })\n }\n\n async abort(): Promise<void> {\n this.closed = true\n this.rows.length = 0\n }\n\n private assertOpen(): void {\n if (this.closed) {\n throw new LakeStorageError(\"[LakeStorage] Write session is already closed\")\n }\n }\n}\n\nclass InMemoryLakeMergeSession implements LakeMergeSession {\n private readonly changes: MergeChange<DatasetRow, DatasetRow>[] = []\n private closed = false\n\n constructor(\n private readonly storage: InMemoryLakeStorage,\n private readonly input: BeginDatasetMergeInput,\n private readonly baseVersionId: string | null\n ) {}\n\n async writeChanges(\n changes:\n | Iterable<MergeChange<DatasetRow, DatasetRow>>\n | AsyncIterable<MergeChange<DatasetRow, DatasetRow>>\n ): Promise<void> {\n this.assertOpen()\n\n const stagedChanges: MergeChange<DatasetRow, DatasetRow>[] = []\n for await (const change of changes) {\n const validationError = getDatasetMergeChangeValidationError(change, this.input.dataset)\n if (validationError) {\n throw new LakeStorageError(`[LakeStorage] ${validationError}`)\n }\n stagedChanges.push(cloneDatasetMergeChange(change))\n }\n this.changes.push(...stagedChanges)\n }\n\n async commit(input?: CommitDatasetMergeInput): Promise<DatasetMergeCommitResult> {\n this.assertOpen()\n this.closed = true\n return this.storage.commitMerge({\n merge: this.input,\n baseVersionId: this.baseVersionId,\n changes: this.changes,\n commit: input,\n })\n }\n\n async abort(): Promise<void> {\n this.closed = true\n this.changes.length = 0\n }\n\n private assertOpen(): void {\n if (this.closed) {\n throw new LakeStorageError(\"[LakeStorage] Merge session is already closed\")\n }\n }\n}\n\nexport class InMemoryLakeStorage implements LakeStorage {\n private readonly datasets = new Map<string, DatasetDefinition>()\n private readonly versionsByDataset = new Map<string, DatasetVersion[]>()\n private readonly rowsByVersionId = new Map<string, readonly DatasetRow[]>()\n private readonly latestVersionIdByDataset = new Map<string, string>()\n private readonly commitLocks = new Map<string, Promise<void>>()\n\n async createDataset(definition: DatasetDefinition): Promise<DatasetDefinition> {\n assertDatasetId(definition.id)\n const existing = this.datasets.get(definition.id)\n const stored = mergeStrictDatasetDefinition({\n existing,\n next: definition,\n })\n this.datasets.set(definition.id, stored)\n return cloneDatasetDefinition(stored)\n }\n\n async assertDatasetDefinitionsCompatible(\n definitions: readonly DatasetDefinition[]\n ): Promise<void> {\n const failures: string[] = []\n\n for (const definition of definitions) {\n try {\n assertDatasetId(definition.id)\n const existing = this.datasets.get(definition.id)\n if (!existing) {\n continue\n }\n\n mergeStrictDatasetDefinition({\n existing,\n next: definition,\n })\n } catch (error) {\n failures.push(`- ${definition.id}: ${errorMessage(error)}`)\n }\n }\n\n if (failures.length > 0) {\n const details = failures.join(\"\\n\")\n throw new LakeStorageError(\n `[SixbLake] Lake dataset definition check failed for ${failures.length} dataset(s).\\n${details}`\n )\n }\n }\n\n async getDataset(datasetId: string): Promise<DatasetDefinition | null> {\n const definition = this.datasets.get(datasetId)\n return definition ? cloneDatasetDefinition(definition) : null\n }\n\n async listDatasets(): Promise<readonly DatasetDefinition[]> {\n return [...this.datasets.values()].map((definition) => cloneDatasetDefinition(definition))\n }\n\n async listDatasetCatalogState(\n datasetIds: readonly string[]\n ): Promise<readonly DatasetCatalogState[]> {\n return Promise.all(\n datasetIds.map(async (datasetId) => {\n if (!this.datasets.has(datasetId)) {\n return { datasetId, materialized: false, latestVersion: null }\n }\n\n const latest = await this.getLatestVersion(datasetId)\n return {\n datasetId,\n materialized: true,\n latestVersion: latest\n ? {\n datasetId: latest.datasetId,\n versionId: latest.versionId,\n mode: latest.mode,\n createdAt: latest.createdAt,\n ...(latest.rowCount !== undefined ? { rowCount: latest.rowCount } : {}),\n }\n : null,\n }\n })\n )\n }\n\n async listVersions(datasetId: string, limit?: number): Promise<readonly DatasetVersion[]> {\n const versions = [...(this.versionsByDataset.get(datasetId) ?? [])]\n .sort((left, right) => right.createdAt.getTime() - left.createdAt.getTime())\n .map((version) => cloneDatasetVersion(version))\n\n return limit === undefined ? versions : versions.slice(0, Math.max(0, limit))\n }\n\n async beginWrite(input: BeginDatasetWriteInput): Promise<LakeWriteSession> {\n const definition = await this.getDataset(input.dataset.id)\n if (!definition) {\n throw new LakeStorageError(`[LakeStorage] Unknown dataset '${input.dataset.id}'`)\n }\n\n return new InMemoryLakeWriteSession(this, {\n ...input,\n dataset: definition,\n mode: input.mode ?? \"snapshot\",\n })\n }\n\n async beginMerge(input: BeginDatasetMergeInput): Promise<LakeMergeSession> {\n const definition = await this.getDataset(input.dataset.id)\n if (!definition) {\n throw new LakeStorageError(`[LakeStorage] Unknown dataset '${input.dataset.id}'`)\n }\n if (getDatasetPrimaryKeyColumns(definition) === null) {\n throw new LakeStorageError(\n `[LakeStorage] Dataset '${definition.id}' must define a primaryKey before it can be merged.`\n )\n }\n\n const latestVersion = await this.getLatestVersion(definition.id)\n if (\n input.expectedLatestVersionId !== undefined &&\n latestVersion?.versionId !== input.expectedLatestVersionId\n ) {\n throw new LakeStorageError(\n `[LakeStorage] Optimistic merge start failed for dataset '${definition.id}': expected latest version '${input.expectedLatestVersionId}', found '${latestVersion?.versionId ?? \"none\"}'`\n )\n }\n return new InMemoryLakeMergeSession(\n this,\n {\n ...input,\n dataset: definition,\n },\n latestVersion?.versionId ?? null\n )\n }\n\n async getLatestVersion(datasetId: string): Promise<DatasetVersion | null> {\n const latestVersionId = this.latestVersionIdByDataset.get(datasetId)\n if (!latestVersionId) {\n return null\n }\n\n return this.getVersion(datasetId, latestVersionId)\n }\n\n async getVersion(datasetId: string, versionId: string): Promise<DatasetVersion | null> {\n const versions = this.versionsByDataset.get(datasetId) ?? []\n const version = versions.find((candidate) => candidate.versionId === versionId)\n return version ? cloneDatasetVersion(version) : null\n }\n\n async *readRows(input: ReadDatasetRowsInput): AsyncIterable<DatasetRow> {\n const definition = this.datasets.get(input.datasetId)\n if (!definition) {\n throw new LakeStorageError(`[LakeStorage] Unknown dataset '${input.datasetId}'`)\n }\n\n const version =\n input.versionId === undefined\n ? await this.getLatestVersion(input.datasetId)\n : await this.getVersion(input.datasetId, input.versionId)\n\n if (!version) {\n throw new LakeStorageError(\n `[LakeStorage] No committed version found for dataset '${input.datasetId}'`\n )\n }\n\n const offset = Math.max(0, input.offset ?? 0)\n const limit = input.limit === undefined ? undefined : Math.max(0, input.limit)\n const rows = this.rowsByVersionId\n .get(version.versionId)\n ?.slice(offset, limit === undefined ? undefined : offset + limit)\n\n for (const row of rows ?? []) {\n yield selectColumns(row, input.columns)\n }\n }\n\n async commitWrite(options: {\n write: BeginDatasetWriteInput\n rows: readonly DatasetRow[]\n commit?: CommitDatasetWriteInput\n }): Promise<DatasetWriteCommitResult> {\n return this.withDatasetCommitLock(options.write.dataset.id, () =>\n this.commitWriteUnlocked(options)\n )\n }\n\n async commitMerge(options: {\n merge: BeginDatasetMergeInput\n baseVersionId: string | null\n changes: readonly MergeChange<DatasetRow, DatasetRow>[]\n commit?: CommitDatasetMergeInput\n }): Promise<DatasetMergeCommitResult> {\n return this.withDatasetCommitLock(options.merge.dataset.id, async () => {\n const definition = this.datasets.get(options.merge.dataset.id)\n if (!definition) {\n throw new LakeStorageError(`[LakeStorage] Unknown dataset '${options.merge.dataset.id}'`)\n }\n\n const latestVersion = await this.getLatestVersion(options.merge.dataset.id)\n const actualVersionId = latestVersion?.versionId ?? null\n if (actualVersionId !== options.baseVersionId) {\n throw new LakeStorageError(\n `[LakeStorage] Optimistic merge commit failed for dataset '${options.merge.dataset.id}': expected latest version '${options.baseVersionId ?? \"none\"}', found '${actualVersionId ?? \"none\"}'`\n )\n }\n\n const previousRows = this.rowsByVersionId.get(latestVersion?.versionId ?? \"\") ?? []\n const previousByKey = this.rowsByPrimaryKey(previousRows, definition)\n const finalChanges = new Map<string, MergeChange<DatasetRow, DatasetRow>>()\n for (const change of options.changes) {\n const value = change.kind === \"upsert\" ? change.row : change.key\n finalChanges.set(encodeDatasetPrimaryKey(definition, value), change)\n }\n\n const nextByKey = new Map(previousByKey)\n for (const [primaryKey, change] of finalChanges) {\n if (change.kind === \"upsert\") {\n nextByKey.set(primaryKey, cloneRow(change.row))\n } else {\n nextByKey.delete(primaryKey)\n }\n }\n\n if (this.sameKeyedRowContent(previousByKey, nextByKey, definition.schema)) {\n return {\n outcome: \"unchanged\",\n version: latestVersion ? cloneDatasetVersion(latestVersion) : null,\n }\n }\n\n const visibleRows = [...nextByKey.values()]\n const versionId = `ver_${randomUUID()}`\n const version: DatasetVersion = {\n datasetId: options.merge.dataset.id,\n versionId,\n parentVersionId: latestVersion?.versionId,\n mode: \"merge\",\n createdAt: new Date(),\n schema: definition.schema,\n producer: options.merge.producer ? structuredClone(options.merge.producer) : undefined,\n inputs: options.merge.inputs ? structuredClone(options.merge.inputs) : undefined,\n rowCount: visibleRows.length,\n sizeBytes: new TextEncoder().encode(\n visibleRows.map((row) => JSON.stringify(row)).join(\"\\n\")\n ).byteLength,\n }\n\n const versions = this.versionsByDataset.get(options.merge.dataset.id) ?? []\n versions.push(version)\n this.versionsByDataset.set(options.merge.dataset.id, versions)\n this.rowsByVersionId.set(\n versionId,\n visibleRows.map((row) => cloneRow(row))\n )\n this.latestVersionIdByDataset.set(options.merge.dataset.id, versionId)\n\n return { outcome: \"created\", version: cloneDatasetVersion(version) }\n })\n }\n\n private async commitWriteUnlocked(options: {\n write: BeginDatasetWriteInput\n rows: readonly DatasetRow[]\n commit?: CommitDatasetWriteInput\n }): Promise<DatasetWriteCommitResult> {\n const definition = this.datasets.get(options.write.dataset.id)\n if (!definition) {\n throw new LakeStorageError(`[LakeStorage] Unknown dataset '${options.write.dataset.id}'`)\n }\n\n const mode = options.write.mode ?? \"snapshot\"\n const latestVersion = await this.getLatestVersion(options.write.dataset.id)\n\n if (options.commit?.expectedLatestVersionId !== undefined) {\n const actual = latestVersion?.versionId\n if (actual !== options.commit.expectedLatestVersionId) {\n throw new LakeStorageError(\n `[LakeStorage] Optimistic commit failed for dataset '${options.write.dataset.id}': expected latest version '${options.commit.expectedLatestVersionId}', found '${actual ?? \"none\"}'`\n )\n }\n }\n\n this.assertKeyedWriteIsUnique(mode, options.rows, latestVersion, definition)\n\n // Content-identical snapshots and empty appends reuse the latest version\n // instead of creating a new one.\n if (\n latestVersion &&\n this.isUnchangedWrite(mode, latestVersion, options.rows, definition.schema)\n ) {\n return { ...latestVersion, outcome: \"unchanged\" }\n }\n\n const versionId = `ver_${randomUUID()}`\n const visibleRows =\n mode === \"append\"\n ? [...(this.rowsByVersionId.get(latestVersion?.versionId ?? \"\") ?? []), ...options.rows]\n : [...options.rows]\n\n const sizeBytes = new TextEncoder().encode(\n visibleRows.map((row) => JSON.stringify(row)).join(\"\\n\")\n ).byteLength\n\n const version: DatasetVersion = {\n datasetId: options.write.dataset.id,\n versionId,\n parentVersionId: mode === \"append\" ? latestVersion?.versionId : undefined,\n mode,\n createdAt: new Date(),\n schema: definition.schema,\n producer: options.write.producer ? structuredClone(options.write.producer) : undefined,\n inputs: options.write.inputs ? structuredClone(options.write.inputs) : undefined,\n rowCount: visibleRows.length,\n sizeBytes,\n }\n\n const versions = this.versionsByDataset.get(options.write.dataset.id) ?? []\n versions.push(version)\n this.versionsByDataset.set(options.write.dataset.id, versions)\n this.rowsByVersionId.set(\n versionId,\n visibleRows.map((row) => cloneRow(row))\n )\n this.latestVersionIdByDataset.set(options.write.dataset.id, versionId)\n\n return { ...cloneDatasetVersion(version), outcome: \"created\" }\n }\n\n private isUnchangedWrite(\n mode: DatasetWriteMode,\n latestVersion: DatasetVersion,\n rows: readonly DatasetRow[],\n schema: DatasetSchema\n ): boolean {\n if (mode === \"append\") {\n return rows.length === 0\n }\n\n const previousRows = this.rowsByVersionId.get(latestVersion.versionId) ?? []\n return sameRowContent(\n rows.map((row) => rowContentKey(row, schema)),\n previousRows.map((row) => rowContentKey(row, schema))\n )\n }\n\n private assertKeyedWriteIsUnique(\n mode: DatasetWriteMode,\n rows: readonly DatasetRow[],\n latestVersion: DatasetVersion | null,\n definition: DatasetDefinition\n ): void {\n if (getDatasetPrimaryKeyColumns(definition) === null) {\n return\n }\n\n const stagedByKey = this.rowsByPrimaryKey(rows, definition)\n if (mode !== \"append\" || latestVersion === null) {\n return\n }\n\n const previousRows = this.rowsByVersionId.get(latestVersion.versionId) ?? []\n const previousByKey = this.rowsByPrimaryKey(previousRows, definition)\n for (const primaryKey of stagedByKey.keys()) {\n if (previousByKey.has(primaryKey)) {\n throw new LakeStorageError(\n `[LakeStorage] Dataset '${definition.id}' append contains duplicate primary key ${primaryKey}.`\n )\n }\n }\n }\n\n private rowsByPrimaryKey(\n rows: readonly DatasetRow[],\n definition: DatasetDefinition\n ): Map<string, DatasetRow> {\n const byKey = new Map<string, DatasetRow>()\n for (const row of rows) {\n const primaryKey = encodeDatasetPrimaryKey(definition, row)\n if (byKey.has(primaryKey)) {\n throw new LakeStorageError(\n `[LakeStorage] Dataset '${definition.id}' contains duplicate primary key ${primaryKey}.`\n )\n }\n byKey.set(primaryKey, row)\n }\n return byKey\n }\n\n private sameKeyedRowContent(\n left: ReadonlyMap<string, DatasetRow>,\n right: ReadonlyMap<string, DatasetRow>,\n schema: DatasetSchema\n ): boolean {\n if (left.size !== right.size) {\n return false\n }\n for (const [primaryKey, leftRow] of left) {\n const rightRow = right.get(primaryKey)\n if (\n rightRow === undefined ||\n rowContentKey(leftRow, schema) !== rowContentKey(rightRow, schema)\n ) {\n return false\n }\n }\n return true\n }\n\n private async withDatasetCommitLock<T>(datasetId: string, run: () => Promise<T>): Promise<T> {\n const previous = this.commitLocks.get(datasetId) ?? Promise.resolve()\n const ready = previous.catch(() => {})\n let release!: () => void\n const next = new Promise<void>((resolve) => {\n release = resolve\n })\n const current = ready.then(() => next)\n this.commitLocks.set(datasetId, current)\n\n await ready\n try {\n return await run()\n } finally {\n release()\n if (this.commitLocks.get(datasetId) === current) {\n this.commitLocks.delete(datasetId)\n }\n }\n }\n}\n",
|
|
8
|
-
"import type { DatasetDefinition, MergeChange } from \"../datasets\"\nimport { getDatasetRowValidationError } from \"../datasets\"\nimport { isPlainRecord } from \"../json\"\nimport { LakeStorageError } from \"./errors\"\nimport type { DatasetRow } from \"./types\"\n\n/** Return a new ordered primary-key column list, or `null` for an unkeyed dataset. */\nexport function getDatasetPrimaryKeyColumns(dataset: DatasetDefinition): readonly string[] | null {\n if (dataset.primaryKey === undefined) {\n return null\n }\n return typeof dataset.primaryKey === \"string\" ? [dataset.primaryKey] : [...dataset.primaryKey]\n}\n\n/** Collision-safe internal identity for a validated row or delete-key object. */\nexport function encodeDatasetPrimaryKey(dataset: DatasetDefinition, value: DatasetRow): string {\n const columns = getDatasetPrimaryKeyColumns(dataset)\n if (columns === null) {\n throw new LakeStorageError(\n `[SixbLake] Dataset '${dataset.id}' must define a primaryKey before rows can be keyed.`\n )\n }\n\n const values = columns.map((columnName) => {\n const columnValue = value[columnName]\n if (typeof columnValue !== \"string\") {\n throw new LakeStorageError(\n `[SixbLake] Dataset '${dataset.id}' primary-key column '${columnName}' must be a string.`\n )\n }\n return columnValue\n })\n return JSON.stringify(values)\n}\n\nexport function getDatasetMergeChangeValidationError(\n change: unknown,\n dataset: DatasetDefinition\n): string | null {\n const primaryKeyColumns = getDatasetPrimaryKeyColumns(dataset)\n if (primaryKeyColumns === null) {\n return `Dataset '${dataset.id}' must define a primaryKey before it can be merged.`\n }\n if (!isPlainRecord(change)) {\n return `Dataset '${dataset.id}' merge changes must be plain objects.`\n }\n\n if (change.kind === \"upsert\") {\n const shapeError = getChangeShapeError(change, dataset, \"row\")\n if (shapeError) {\n return shapeError\n }\n return getDatasetRowValidationError(change.row, dataset)\n }\n\n if (change.kind === \"delete\") {\n const shapeError = getChangeShapeError(change, dataset, \"key\")\n if (shapeError) {\n return shapeError\n }\n return getDeleteKeyValidationError(change.key, dataset, primaryKeyColumns)\n }\n\n return `Dataset '${dataset.id}' merge change kind must be 'upsert' or 'delete'.`\n}\n\n/** Clone a validated change before a provider stages it beyond the caller's ownership. */\nexport function cloneDatasetMergeChange(\n change: MergeChange<DatasetRow, DatasetRow>\n): MergeChange<DatasetRow, DatasetRow> {\n return change.kind === \"upsert\"\n ? { kind: \"upsert\", row: structuredClone(change.row) }\n : { kind: \"delete\", key: structuredClone(change.key) }\n}\n\nfunction getChangeShapeError(\n change: Record<string, unknown>,\n dataset: DatasetDefinition,\n payloadField: \"row\" | \"key\"\n): string | null {\n const allowedFields = new Set([\"kind\", payloadField])\n for (const field of Object.keys(change)) {\n if (!allowedFields.has(field)) {\n return `Dataset '${dataset.id}' ${change.kind as string} change contains unknown field '${field}'.`\n }\n }\n if (!Object.hasOwn(change, payloadField)) {\n return `Dataset '${dataset.id}' ${change.kind as string} change is missing '${payloadField}'.`\n }\n return null\n}\n\nfunction getDeleteKeyValidationError(\n key: unknown,\n dataset: DatasetDefinition,\n primaryKeyColumns: readonly string[]\n): string | null {\n if (!isPlainRecord(key)) {\n return `Dataset '${dataset.id}' delete keys must be plain objects.`\n }\n\n const expectedColumns = new Set(primaryKeyColumns)\n for (const columnName of Object.keys(key)) {\n if (!expectedColumns.has(columnName)) {\n return `Dataset '${dataset.id}' delete key contains unknown column '${columnName}'.`\n }\n }\n for (const columnName of primaryKeyColumns) {\n if (!Object.hasOwn(key, columnName)) {\n return `Dataset '${dataset.id}' delete key is missing primary-key column '${columnName}'.`\n }\n if (typeof key[columnName] !== \"string\") {\n return `Dataset '${dataset.id}' delete key column '${columnName}' must be a string.`\n }\n }\n return null\n}\n"
|
|
9
|
-
],
|
|
10
|
-
"mappings": "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",
|
|
11
|
-
"debugId": "E501E7BE29735B3664756E2164756E21",
|
|
12
|
-
"names": []
|
|
13
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/storage/operation-scope.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"import { AsyncLocalStorage } from \"node:async_hooks\"\nimport type { AgentStorage } from \"./agents\"\nimport type { AuthStorage } from \"./auth\"\nimport type { OntologyStorage } from \"./ontology\"\nimport type { WorkflowRunStorage } from \"./workflow-runs\"\n\nexport type StorageOperationRunner = <TResult>(\n run: () => Promise<TResult> | TResult\n) => Promise<TResult>\n\n/** Provider-owned execution boundary for root storage operations. */\nexport interface StorageOperationScope {\n assertAvailable(): void\n run<TResult>(operation: () => Promise<TResult> | TResult): Promise<TResult>\n}\n\nexport function createStorageOperationScope(\n run: StorageOperationRunner,\n assertAvailable: () => void = () => undefined\n): StorageOperationScope {\n const executions = new AsyncLocalStorage<{ active: boolean }>()\n return {\n assertAvailable,\n async run(operation) {\n const inherited = executions.getStore()\n if (inherited?.active) {\n assertAvailable()\n return operation()\n }\n\n const execution = { active: true }\n try {\n return await executions.run(execution, () => run(operation))\n } finally {\n execution.active = false\n }\n },\n }\n}\n\nconst operationScopeTargets = new WeakMap<object, object>()\n\n/**\n * Give every async operation exposed by a store one provider-owned execution scope.\n *\n * Storage contracts use `async` methods for I/O and reserve synchronous methods for local\n * capabilities such as `queryCapabilities()`. Discovering the former from their implementation\n * removes the second, manually synchronized method registry that previously coupled every storage\n * primitive to the SQLite/InMemory lock.\n */\nexport function createOperationScopedFacade<T extends object>(\n target: T,\n scope: StorageOperationScope,\n propertyOverrides: Partial<T> = {}\n): T {\n const methodKinds = discoverMethodKinds(target)\n const overrideKeys = new Set(Reflect.ownKeys(propertyOverrides))\n const methodCache = new Map<\n PropertyKey,\n { implementation: (...args: unknown[]) => unknown; exposed: (...args: unknown[]) => unknown }\n >()\n\n const facade = new Proxy(target, {\n get(current, property) {\n if (overrideKeys.has(property)) {\n return Reflect.get(propertyOverrides, property, propertyOverrides)\n }\n\n const value = Reflect.get(current, property, current)\n const kind = methodKinds.get(property)\n if (!kind || typeof value !== \"function\") return value\n const implementation = value as (...args: unknown[]) => unknown\n\n const cached = methodCache.get(property)\n if (cached?.implementation === implementation) return cached.exposed\n\n const exposed = scopeMethod(implementation, kind, current, scope)\n methodCache.set(property, { implementation, exposed })\n return exposed\n },\n set(current, property, value) {\n if (overrideKeys.has(property)) return false\n return Reflect.set(current, property, value, current)\n },\n defineProperty(current, property, attributes) {\n if (overrideKeys.has(property)) return false\n return Reflect.defineProperty(current, property, attributes)\n },\n deleteProperty(current, property) {\n if (overrideKeys.has(property)) return false\n return Reflect.deleteProperty(current, property)\n },\n })\n operationScopeTargets.set(facade, target)\n return facade\n}\n\ntype StorageMethod = (...args: never[]) => unknown\ntype StorageMethodKey<T> = {\n [TKey in keyof T]-?: T[TKey] extends StorageMethod ? TKey : never\n}[keyof T]\n\n/** Replace a provider method behind its scoped facade without exposing the raw provider. */\nexport function decorateOperationScopedMethodForTesting<\n T extends object,\n TKey extends StorageMethodKey<T>,\n>(\n facade: T,\n property: TKey,\n decorate: (implementation: Extract<T[TKey], StorageMethod>) => Extract<T[TKey], StorageMethod>\n): () => void {\n const target = operationScopeTargets.get(facade)\n if (!target) throw new Error(\"[Sixb] Expected an operation-scoped storage facade.\")\n\n const previousDescriptor = Reflect.getOwnPropertyDescriptor(target, property)\n const implementation = Reflect.get(target, property, target)\n if (typeof implementation !== \"function\") {\n throw new Error(`[Sixb] Storage property '${String(property)}' is not a method.`)\n }\n\n const boundImplementation = ((...args: never[]) =>\n Reflect.apply(implementation, target, args)) as Extract<T[TKey], StorageMethod>\n const decorated = decorate(boundImplementation)\n Reflect.defineProperty(target, property, {\n configurable: true,\n enumerable: previousDescriptor?.enumerable ?? false,\n writable: true,\n value: decorated,\n })\n\n return () => {\n if (previousDescriptor) {\n Reflect.defineProperty(target, property, previousDescriptor)\n } else {\n Reflect.deleteProperty(target, property)\n }\n }\n}\n\ntype StorageMethodKind = \"async\" | \"async-generator\" | \"sync\"\n\nfunction discoverMethodKinds(target: object): ReadonlyMap<PropertyKey, StorageMethodKind> {\n const methodKeys = new Set<PropertyKey>()\n for (\n let current: object | null = target;\n current && current !== Object.prototype;\n current = Object.getPrototypeOf(current)\n ) {\n for (const property of Reflect.ownKeys(current)) {\n if (property !== \"constructor\") methodKeys.add(property)\n }\n }\n\n const methodKinds = new Map<PropertyKey, StorageMethodKind>()\n for (const property of methodKeys) {\n const implementation = Reflect.get(target, property, target)\n if (typeof implementation !== \"function\") continue\n methodKinds.set(property, methodKind(implementation))\n }\n return methodKinds\n}\n\nfunction methodKind(implementation: (...args: unknown[]) => unknown): StorageMethodKind {\n if (isAsyncFunction(implementation)) return \"async\"\n if (isAsyncGeneratorFunction(implementation)) return \"async-generator\"\n return \"sync\"\n}\n\nfunction scopeMethod(\n implementation: (...args: unknown[]) => unknown,\n kind: StorageMethodKind,\n target: object,\n scope: StorageOperationScope\n): (...args: unknown[]) => unknown {\n if (kind === \"async\") {\n return (...args: unknown[]) => scope.run(() => Reflect.apply(implementation, target, args))\n }\n\n if (kind === \"async-generator\") {\n return (...args: unknown[]) => {\n scope.assertAvailable()\n return Reflect.apply(implementation, target, args)\n }\n }\n\n return implementation.bind(target)\n}\n\nexport function createAuthOperationScope<T extends AuthStorage>(\n target: T,\n scope: StorageOperationScope\n): T {\n return createOperationScopedFacade<AuthStorage>(target, scope, {\n users: createOperationScopedFacade(target.users, scope),\n identities: createOperationScopedFacade(target.identities, scope),\n serviceAccounts: createOperationScopedFacade(target.serviceAccounts, scope),\n serviceAccountGroupMemberships: createOperationScopedFacade(\n target.serviceAccountGroupMemberships,\n scope\n ),\n sessions: createOperationScopedFacade(target.sessions, scope),\n accessTokens: createOperationScopedFacade(target.accessTokens, scope),\n invitations: createOperationScopedFacade(target.invitations, scope),\n groupMemberships: createOperationScopedFacade(target.groupMemberships, scope),\n magicLinks: createOperationScopedFacade(target.magicLinks, scope),\n oidcAuthorizationAttempts: createOperationScopedFacade(target.oidcAuthorizationAttempts, scope),\n }) as T\n}\n\nexport function createAgentOperationScope<T extends AgentStorage>(\n target: T,\n scope: StorageOperationScope\n): T {\n return createOperationScopedFacade<AgentStorage>(target, scope, {\n threads: createOperationScopedFacade(target.threads, scope),\n runs: createOperationScopedFacade(target.runs, scope),\n messages: createOperationScopedFacade(target.messages, scope),\n checkpoints: createOperationScopedFacade(target.checkpoints, scope),\n }) as T\n}\n\nexport function createOntologyOperationScope<T extends OntologyStorage>(\n target: T,\n scope: StorageOperationScope\n): T {\n return createOperationScopedFacade<OntologyStorage>(target, scope, {\n commits: createOperationScopedFacade(target.commits, scope),\n sources: createOperationScopedFacade(target.sources, scope),\n materializations: createOperationScopedFacade(target.materializations, scope),\n outbox: createOperationScopedFacade(target.outbox, scope),\n }) as T\n}\n\nexport function createWorkflowRunOperationScope<T extends WorkflowRunStorage>(\n target: T,\n scope: StorageOperationScope\n): T {\n return createOperationScopedFacade<WorkflowRunStorage>(target, scope, {\n nodes: createOperationScopedFacade(target.nodes, scope),\n agentNodes: createOperationScopedFacade(target.agentNodes, scope),\n }) as T\n}\n\nfunction isAsyncFunction(value: unknown): value is (...args: unknown[]) => Promise<unknown> {\n return typeof value === \"function\" && value.constructor.name === \"AsyncFunction\"\n}\n\nfunction isAsyncGeneratorFunction(value: unknown): boolean {\n return typeof value === \"function\" && value.constructor.name === \"AsyncGeneratorFunction\"\n}\n"
|
|
6
|
-
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "199E470686426F9664756E2164756E21",
|
|
9
|
-
"names": []
|
|
10
|
-
}
|