@sixb/core 0.1.0 → 0.1.2
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/README.md +54 -23
- package/dist/actions/commit-edits.d.ts +0 -2
- package/dist/actions/commit-edits.d.ts.map +1 -1
- package/dist/actions/execution.d.ts +21 -0
- package/dist/actions/execution.d.ts.map +1 -0
- package/dist/actions/index.d.ts +1 -1
- package/dist/actions/index.d.ts.map +1 -1
- package/dist/actions/index.js +34 -23
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/registry.d.ts +16 -7
- package/dist/actions/registry.d.ts.map +1 -1
- package/dist/actions/request.d.ts +3 -2
- package/dist/actions/request.d.ts.map +1 -1
- package/dist/actions/run-dispatch.d.ts +21 -0
- package/dist/actions/run-dispatch.d.ts.map +1 -0
- package/dist/actions/types/context.d.ts +2 -2
- 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 +4 -4
- package/dist/actions/worker.js.map +1 -1
- package/dist/agents/adapters.d.ts +10 -0
- package/dist/agents/adapters.d.ts.map +1 -1
- package/dist/agents/authority.d.ts +31 -0
- package/dist/agents/authority.d.ts.map +1 -0
- package/dist/agents/builders.d.ts +8 -1
- package/dist/agents/builders.d.ts.map +1 -1
- package/dist/agents/context.js +2 -2
- package/dist/agents/dispatch.d.ts.map +1 -1
- package/dist/agents/errors.d.ts +16 -1
- package/dist/agents/errors.d.ts.map +1 -1
- package/dist/agents/execution.d.ts +45 -0
- package/dist/agents/execution.d.ts.map +1 -0
- package/dist/agents/index.d.ts +10 -10
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +81 -14
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/prompt.d.ts.map +1 -1
- package/dist/agents/request.d.ts +6 -2
- package/dist/agents/request.d.ts.map +1 -1
- package/dist/agents/streams.d.ts +29 -3
- package/dist/agents/streams.d.ts.map +1 -1
- package/dist/agents/streams.js +22 -3
- package/dist/agents/streams.js.map +1 -1
- package/dist/agents/tool-definition.d.ts +9 -0
- package/dist/agents/tool-definition.d.ts.map +1 -0
- package/dist/agents/types.d.ts +64 -0
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/agents/validation.d.ts +16 -3
- package/dist/agents/validation.d.ts.map +1 -1
- package/dist/auth/attribution.d.ts +17 -0
- package/dist/auth/attribution.d.ts.map +1 -0
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +9 -5
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/runtime.d.ts +4 -4
- package/dist/auth/runtime.d.ts.map +1 -1
- package/dist/authorization/decision.d.ts +24 -11
- 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 +8 -4
- package/dist/authorization/index.js.map +1 -1
- package/dist/blob-storage/browser.js +3 -2
- package/dist/blob-storage/browser.js.map +1 -1
- package/dist/blob-storage/execution.d.ts +16 -0
- package/dist/blob-storage/execution.d.ts.map +1 -0
- package/dist/blob-storage/index.js +4 -3
- package/dist/blob-storage/index.js.map +1 -1
- package/dist/blob-storage/validation.d.ts.map +1 -1
- package/dist/bootstrap/discovery.d.ts +90 -24
- package/dist/bootstrap/discovery.d.ts.map +1 -1
- package/dist/bootstrap/index.d.ts +2 -1
- package/dist/bootstrap/index.d.ts.map +1 -1
- package/dist/bootstrap/index.js +59 -59
- package/dist/bootstrap/index.js.map +1 -1
- package/dist/broker/in-memory.d.ts.map +1 -1
- package/dist/broker/index.js +2 -2
- package/dist/broker/types.d.ts +5 -0
- package/dist/broker/types.d.ts.map +1 -1
- package/dist/chunk-0172wgm9.js +333 -0
- package/dist/chunk-0172wgm9.js.map +11 -0
- package/dist/chunk-0k4avqr2.js +317 -0
- package/dist/chunk-0k4avqr2.js.map +11 -0
- package/dist/chunk-0mbx247x.js +2922 -0
- package/dist/chunk-0mbx247x.js.map +43 -0
- package/dist/chunk-34bqh420.js +1168 -0
- package/dist/chunk-34bqh420.js.map +23 -0
- package/dist/{chunk-mx84y05q.js → chunk-3j7573mj.js} +2 -2
- package/dist/{chunk-mx84y05q.js.map → chunk-3j7573mj.js.map} +2 -2
- package/dist/{chunk-45tw90k7.js → chunk-4gz41why.js} +1 -1
- package/dist/chunk-4x43bkbp.js +55 -0
- package/dist/chunk-4x43bkbp.js.map +11 -0
- package/dist/{chunk-xqbtf4wn.js → chunk-57r1cpxx.js} +3 -2
- package/dist/{chunk-xqbtf4wn.js.map → chunk-57r1cpxx.js.map} +3 -3
- package/dist/chunk-57zpb99z.js +194 -0
- package/dist/chunk-57zpb99z.js.map +10 -0
- package/dist/{chunk-dhmj53mx.js → chunk-5egfka8j.js} +13 -33
- package/dist/chunk-5egfka8j.js.map +15 -0
- package/dist/chunk-5gd7tpv6.js +28 -0
- package/dist/chunk-5gd7tpv6.js.map +11 -0
- package/dist/{chunk-867jxh7c.js → chunk-5sz8ta9r.js} +6 -295
- package/dist/chunk-5sz8ta9r.js.map +16 -0
- package/dist/chunk-62c7t4jc.js +27 -0
- package/dist/chunk-62c7t4jc.js.map +11 -0
- package/dist/{chunk-8r8cw2xw.js → chunk-63te770v.js} +40 -5
- package/dist/{chunk-8r8cw2xw.js.map → chunk-63te770v.js.map} +3 -3
- package/dist/chunk-663csy96.js +34 -0
- package/dist/chunk-663csy96.js.map +10 -0
- package/dist/{chunk-xz5g49bp.js → chunk-6gjqgd3d.js} +3 -1
- package/dist/chunk-6gjqgd3d.js.map +11 -0
- package/dist/chunk-7pc8b818.js +128 -0
- package/dist/chunk-7pc8b818.js.map +13 -0
- package/dist/{chunk-f2b5e2gf.js → chunk-85j5ybfj.js} +18 -3
- package/dist/{chunk-f2b5e2gf.js.map → chunk-85j5ybfj.js.map} +3 -3
- package/dist/{chunk-vj723r3p.js → chunk-8b55ygje.js} +1 -1
- package/dist/chunk-8m5ejdpn.js +33 -0
- package/dist/chunk-8m5ejdpn.js.map +10 -0
- package/dist/chunk-8ryen3p3.js +118 -0
- package/dist/chunk-8ryen3p3.js.map +10 -0
- package/dist/chunk-979ww6b3.js +298 -0
- package/dist/chunk-979ww6b3.js.map +12 -0
- package/dist/{chunk-ya6brh8a.js → chunk-9t8f5xfx.js} +10 -5
- package/dist/chunk-9t8f5xfx.js.map +11 -0
- package/dist/{chunk-r65yscvk.js → chunk-a31h57d5.js} +131 -13
- package/dist/chunk-a31h57d5.js.map +13 -0
- package/dist/chunk-bct7hmfc.js +402 -0
- package/dist/chunk-bct7hmfc.js.map +14 -0
- package/dist/chunk-bh6k3nc6.js +164 -0
- package/dist/chunk-bh6k3nc6.js.map +12 -0
- package/dist/{chunk-t72dvahb.js → chunk-bhxaq2nn.js} +61 -44
- package/dist/chunk-bhxaq2nn.js.map +12 -0
- package/dist/{chunk-jdwx7vzs.js → chunk-c6qd89g5.js} +240 -143
- package/dist/chunk-c6qd89g5.js.map +15 -0
- package/dist/{chunk-2s6sydsh.js → chunk-ckxfnx7f.js} +294 -4
- package/dist/chunk-ckxfnx7f.js.map +13 -0
- package/dist/chunk-cy0n5dms.js +27 -0
- package/dist/chunk-cy0n5dms.js.map +11 -0
- package/dist/chunk-dsrkgtnh.js +50 -0
- package/dist/chunk-dsrkgtnh.js.map +10 -0
- package/dist/{chunk-50kv63vj.js → chunk-dysw7nsm.js} +118 -26
- package/dist/chunk-dysw7nsm.js.map +14 -0
- package/dist/chunk-ezake7g1.js +32 -0
- package/dist/chunk-ezake7g1.js.map +11 -0
- package/dist/{chunk-yxss87qa.js → chunk-f2rt4vkh.js} +48 -29
- package/dist/chunk-f2rt4vkh.js.map +14 -0
- package/dist/{chunk-q4qzq0ea.js → chunk-fmx1sz2h.js} +117 -56
- package/dist/chunk-fmx1sz2h.js.map +15 -0
- package/dist/chunk-g9t3kdtx.js +90 -0
- package/dist/chunk-g9t3kdtx.js.map +10 -0
- package/dist/{chunk-c3zd880g.js → chunk-ghteq96b.js} +8 -8
- package/dist/{chunk-c3zd880g.js.map → chunk-ghteq96b.js.map} +4 -4
- package/dist/chunk-h9kxd41f.js +271 -0
- package/dist/chunk-h9kxd41f.js.map +11 -0
- package/dist/chunk-htq0qh7z.js +59 -0
- package/dist/chunk-htq0qh7z.js.map +11 -0
- package/dist/{chunk-dcgrzj1t.js → chunk-jaj13078.js} +121 -9
- package/dist/chunk-jaj13078.js.map +38 -0
- package/dist/{chunk-t358gywy.js → chunk-k9pts48t.js} +81 -58
- package/dist/chunk-k9pts48t.js.map +35 -0
- package/dist/chunk-n8herkry.js +3294 -0
- package/dist/chunk-n8herkry.js.map +35 -0
- package/dist/chunk-nf4r78r4.js +44 -0
- package/dist/chunk-nf4r78r4.js.map +10 -0
- package/dist/{chunk-2gpr6jsz.js → chunk-nnyp53zt.js} +14 -34
- package/dist/chunk-nnyp53zt.js.map +13 -0
- package/dist/chunk-nten49ta.js +404 -0
- package/dist/chunk-nten49ta.js.map +12 -0
- package/dist/chunk-qvybnnpe.js +137 -0
- package/dist/chunk-qvybnnpe.js.map +10 -0
- package/dist/{chunk-tsk2bxs3.js → chunk-rnshztfq.js} +13 -13
- package/dist/{chunk-tsk2bxs3.js.map → chunk-rnshztfq.js.map} +3 -3
- package/dist/chunk-sa4340y1.js +607 -0
- package/dist/chunk-sa4340y1.js.map +14 -0
- package/dist/{chunk-yvef9xwc.js → chunk-st4xgxey.js} +583 -251
- package/dist/chunk-st4xgxey.js.map +45 -0
- package/dist/{chunk-1vffvydj.js → chunk-t8t39h7v.js} +6 -6
- package/dist/chunk-t8t39h7v.js.map +10 -0
- package/dist/chunk-t9xghkva.js +28 -0
- package/dist/chunk-t9xghkva.js.map +10 -0
- package/dist/chunk-vp1vc6ee.js +35 -0
- package/dist/chunk-vp1vc6ee.js.map +11 -0
- package/dist/{chunk-p6r5g77m.js → chunk-vybf6pkp.js} +1 -1
- package/dist/{chunk-wj01s5hr.js → chunk-wtmzkcht.js} +4 -3
- package/dist/chunk-wtmzkcht.js.map +11 -0
- package/dist/{chunk-v5c085yp.js → chunk-xhy826cz.js} +3 -2
- package/dist/chunk-xhy826cz.js.map +10 -0
- package/dist/chunk-xkthy56g.js +33 -0
- package/dist/chunk-xkthy56g.js.map +11 -0
- package/dist/{chunk-aebzcsxr.js → chunk-ys1nse2v.js} +2178 -382
- package/dist/chunk-ys1nse2v.js.map +56 -0
- package/dist/{chunk-5yny9z0e.js → chunk-z3zp0bj1.js} +1 -1
- package/dist/chunk-zcnhxkvd.js +7 -0
- package/dist/chunk-zcnhxkvd.js.map +10 -0
- package/dist/chunk-zg9yryhz.js +252 -0
- package/dist/chunk-zg9yryhz.js.map +12 -0
- package/dist/chunk-zqqz8052.js +3 -0
- package/dist/{storage/projection-runs/lifecycle.js.map → chunk-zqqz8052.js.map} +1 -1
- package/dist/{chunk-4pycxcj3.js → chunk-zqysyfjt.js} +6 -9
- package/dist/{chunk-4pycxcj3.js.map → chunk-zqysyfjt.js.map} +3 -3
- package/dist/connectors/builders.d.ts +2 -1
- package/dist/connectors/builders.d.ts.map +1 -1
- package/dist/connectors/connections/authorizations.d.ts +64 -0
- package/dist/connectors/connections/authorizations.d.ts.map +1 -0
- package/dist/connectors/connections/capability.d.ts +7 -0
- package/dist/connectors/connections/capability.d.ts.map +1 -0
- package/dist/connectors/connections/command-context.d.ts +23 -0
- package/dist/connectors/connections/command-context.d.ts.map +1 -0
- package/dist/connectors/connections/contracts.d.ts +127 -0
- package/dist/connectors/connections/contracts.d.ts.map +1 -0
- package/dist/connectors/connections/credential-codec.d.ts +15 -0
- package/dist/connectors/connections/credential-codec.d.ts.map +1 -0
- package/dist/connectors/connections/credential-mutations.d.ts +63 -0
- package/dist/connectors/connections/credential-mutations.d.ts.map +1 -0
- package/dist/connectors/connections/execution.d.ts +20 -0
- package/dist/connectors/connections/execution.d.ts.map +1 -0
- package/dist/connectors/connections/internal.d.ts +5 -0
- package/dist/connectors/connections/internal.d.ts.map +1 -0
- package/dist/connectors/connections/internal.js +16 -0
- package/dist/connectors/connections/internal.js.map +9 -0
- package/dist/connectors/connections/provider-operation.d.ts +7 -0
- package/dist/connectors/connections/provider-operation.d.ts.map +1 -0
- package/dist/connectors/connections/request.d.ts +84 -0
- package/dist/connectors/connections/request.d.ts.map +1 -0
- package/dist/connectors/connections/runs.d.ts +51 -0
- package/dist/connectors/connections/runs.d.ts.map +1 -0
- package/dist/connectors/connections/service.d.ts +52 -0
- package/dist/connectors/connections/service.d.ts.map +1 -0
- package/dist/connectors/connections/storage-boundary.d.ts +3 -0
- package/dist/connectors/connections/storage-boundary.d.ts.map +1 -0
- package/dist/connectors/connections/tokens.d.ts +32 -0
- package/dist/connectors/connections/tokens.d.ts.map +1 -0
- package/dist/connectors/connections/validation.d.ts +27 -0
- package/dist/connectors/connections/validation.d.ts.map +1 -0
- package/dist/connectors/connections/views.d.ts +7 -0
- package/dist/connectors/connections/views.d.ts.map +1 -0
- package/dist/connectors/credentials.d.ts +25 -0
- package/dist/connectors/credentials.d.ts.map +1 -0
- package/dist/connectors/errors.d.ts +35 -3
- package/dist/connectors/errors.d.ts.map +1 -1
- package/dist/connectors/execution.d.ts +19 -0
- package/dist/connectors/execution.d.ts.map +1 -0
- package/dist/connectors/index.d.ts +5 -3
- package/dist/connectors/index.d.ts.map +1 -1
- package/dist/connectors/service.d.ts +23 -0
- package/dist/connectors/service.d.ts.map +1 -0
- package/dist/connectors/types.d.ts +94 -2
- package/dist/connectors/types.d.ts.map +1 -1
- package/dist/datasets/builders.d.ts +18 -5
- package/dist/datasets/builders.d.ts.map +1 -1
- package/dist/datasets/changes.d.ts +18 -0
- package/dist/datasets/changes.d.ts.map +1 -0
- package/dist/datasets/execution.d.ts +8 -0
- package/dist/datasets/execution.d.ts.map +1 -0
- package/dist/datasets/index.d.ts +3 -1
- package/dist/datasets/index.d.ts.map +1 -1
- package/dist/datasets/types.d.ts +2 -0
- package/dist/datasets/types.d.ts.map +1 -1
- package/dist/datasets/validation.d.ts.map +1 -1
- package/dist/error-reporting/capability.d.ts +4 -49
- package/dist/error-reporting/capability.d.ts.map +1 -1
- package/dist/error-reporting/internal.d.ts +2 -2
- package/dist/error-reporting/internal.d.ts.map +1 -1
- package/dist/error-reporting/internal.js +10 -4
- package/dist/error-reporting/internal.js.map +1 -1
- package/dist/error-reporting/reporter.d.ts +4 -1
- package/dist/error-reporting/reporter.d.ts.map +1 -1
- package/dist/error-reporting/reports.d.ts +64 -0
- package/dist/error-reporting/reports.d.ts.map +1 -0
- package/dist/error-reporting/types.d.ts +88 -34
- package/dist/error-reporting/types.d.ts.map +1 -1
- package/dist/errors/catalog.d.ts +141 -0
- package/dist/errors/catalog.d.ts.map +1 -0
- package/dist/errors/internal.d.ts +68 -0
- package/dist/errors/internal.d.ts.map +1 -0
- package/dist/errors/internal.js +29 -0
- package/dist/errors/internal.js.map +9 -0
- package/dist/errors/types.d.ts +20 -0
- package/dist/errors/types.d.ts.map +1 -0
- package/dist/events/definitions.d.ts +0 -1
- package/dist/events/definitions.d.ts.map +1 -1
- package/dist/events/execution.d.ts +13 -0
- package/dist/events/execution.d.ts.map +1 -0
- package/dist/events/index.d.ts +3 -2
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +10 -8
- package/dist/events/index.js.map +1 -1
- package/dist/events/outbox-dispatcher.d.ts +4 -2
- package/dist/events/outbox-dispatcher.d.ts.map +1 -1
- package/dist/events/{runtime.d.ts → service.d.ts} +13 -14
- package/dist/events/service.d.ts.map +1 -0
- package/dist/events/types/pipelines.d.ts +4 -1
- package/dist/events/types/pipelines.d.ts.map +1 -1
- package/dist/events/types/syncs.d.ts +3 -0
- package/dist/events/types/syncs.d.ts.map +1 -1
- package/dist/events/types/workflows.d.ts +4 -2
- package/dist/events/types/workflows.d.ts.map +1 -1
- package/dist/execution/agent.d.ts +42 -0
- package/dist/execution/agent.d.ts.map +1 -0
- package/dist/execution/agent.js +70 -0
- package/dist/execution/agent.js.map +9 -0
- package/dist/execution/authorization.d.ts +60 -0
- package/dist/execution/authorization.d.ts.map +1 -0
- package/dist/execution/dispatch.d.ts +8 -0
- package/dist/execution/dispatch.d.ts.map +1 -0
- package/dist/execution/durable.d.ts +37 -0
- package/dist/execution/durable.d.ts.map +1 -0
- package/dist/execution/index.d.ts +2 -0
- package/dist/execution/index.d.ts.map +1 -0
- package/dist/execution/primitive.d.ts +21 -0
- package/dist/execution/primitive.d.ts.map +1 -0
- package/dist/execution/primitive.js +88 -0
- package/dist/execution/primitive.js.map +10 -0
- package/dist/execution/request.d.ts +38 -0
- package/dist/execution/request.d.ts.map +1 -0
- package/dist/execution/request.js +97 -0
- package/dist/execution/request.js.map +10 -0
- package/dist/execution/scopes.d.ts +30 -0
- package/dist/execution/scopes.d.ts.map +1 -0
- package/dist/execution/types.d.ts +111 -0
- package/dist/execution/types.d.ts.map +1 -0
- package/dist/http/api-routes.d.ts.map +1 -1
- package/dist/http/index.js +1 -1
- package/dist/index.d.ts +35 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +142 -111
- package/dist/index.js.map +1 -1
- package/dist/json.d.ts +8 -2
- package/dist/json.d.ts.map +1 -1
- package/dist/lake-storage/definition-updates.d.ts.map +1 -1
- package/dist/lake-storage/in-memory.d.ts +15 -1
- package/dist/lake-storage/in-memory.d.ts.map +1 -1
- package/dist/lake-storage/index.d.ts +3 -1
- package/dist/lake-storage/index.d.ts.map +1 -1
- package/dist/lake-storage/index.js +15 -7
- package/dist/lake-storage/index.js.map +1 -1
- package/dist/lake-storage/merge-validation.d.ts +10 -0
- package/dist/lake-storage/merge-validation.d.ts.map +1 -0
- package/dist/lake-storage/merge.d.ts +32 -0
- package/dist/lake-storage/merge.d.ts.map +1 -0
- package/dist/lake-storage/types.d.ts +3 -1
- package/dist/lake-storage/types.d.ts.map +1 -1
- package/dist/logging/execution.d.ts +9 -0
- package/dist/logging/execution.d.ts.map +1 -0
- package/dist/logging/index.d.ts +1 -1
- package/dist/logging/index.d.ts.map +1 -1
- package/dist/logging/index.js +8 -8
- package/dist/logging/index.js.map +1 -1
- package/dist/logging/{runtime.d.ts → service.d.ts} +7 -7
- package/dist/logging/{runtime.d.ts.map → service.d.ts.map} +1 -1
- package/dist/logging/types.js +2 -2
- package/dist/materialization/events.d.ts +1 -0
- package/dist/materialization/events.d.ts.map +1 -1
- package/dist/materialization/index.d.ts +1 -1
- package/dist/materialization/index.d.ts.map +1 -1
- package/dist/materialization/index.js +2 -2
- package/dist/materialization/model.d.ts +26 -17
- package/dist/materialization/model.d.ts.map +1 -1
- package/dist/materializer/edits/commit.d.ts +2 -1
- package/dist/materializer/edits/commit.d.ts.map +1 -1
- package/dist/materializer/edits/load-state.d.ts +1 -1
- package/dist/materializer/edits/load-state.d.ts.map +1 -1
- package/dist/materializer/edits/operations.d.ts +1 -13
- package/dist/materializer/edits/operations.d.ts.map +1 -1
- package/dist/materializer/edits/plan.d.ts +2 -1
- package/dist/materializer/edits/plan.d.ts.map +1 -1
- package/dist/materializer/edits/working-state.d.ts +36 -8
- package/dist/materializer/edits/working-state.d.ts.map +1 -1
- package/dist/materializer/effective/build-events.d.ts +1 -0
- package/dist/materializer/effective/build-events.d.ts.map +1 -1
- package/dist/materializer/effective/diff.d.ts +7 -0
- package/dist/materializer/effective/diff.d.ts.map +1 -1
- package/dist/materializer/effective/load-state.d.ts +0 -2
- package/dist/materializer/effective/load-state.d.ts.map +1 -1
- package/dist/materializer/effective/resolve.d.ts +17 -2
- package/dist/materializer/effective/resolve.d.ts.map +1 -1
- package/dist/materializer/execution/commit-lifecycle.d.ts +2 -2
- package/dist/materializer/execution/commit-lifecycle.d.ts.map +1 -1
- package/dist/materializer/execution/plan-stream.d.ts.map +1 -1
- package/dist/materializer/execution/scope.d.ts +26 -0
- package/dist/materializer/execution/scope.d.ts.map +1 -0
- package/dist/materializer/execution/work-executor.d.ts.map +1 -1
- package/dist/materializer/execution/work-records.d.ts +6 -5
- package/dist/materializer/execution/work-records.d.ts.map +1 -1
- package/dist/materializer/index.d.ts +2 -2
- package/dist/materializer/index.d.ts.map +1 -1
- package/dist/materializer/index.js +30 -18
- package/dist/materializer/index.js.map +1 -1
- package/dist/materializer/materializer.d.ts +37 -5
- package/dist/materializer/materializer.d.ts.map +1 -1
- package/dist/materializer/projections/finish-run.d.ts +2 -1
- package/dist/materializer/projections/finish-run.d.ts.map +1 -1
- package/dist/materializer/projections/replace.d.ts +2 -1
- package/dist/materializer/projections/replace.d.ts.map +1 -1
- package/dist/materializer/projections/replacement-plan.d.ts +1 -0
- package/dist/materializer/projections/replacement-plan.d.ts.map +1 -1
- package/dist/materializer/shared/batching.d.ts.map +1 -1
- package/dist/materializer/shared/normalize.d.ts.map +1 -1
- package/dist/materializer/telemetry/append.d.ts +2 -1
- package/dist/materializer/telemetry/append.d.ts.map +1 -1
- package/dist/materializer/telemetry/plan.d.ts +7 -1
- package/dist/materializer/telemetry/plan.d.ts.map +1 -1
- package/dist/objects/action/request.d.ts +3 -3
- package/dist/objects/action/request.d.ts.map +1 -1
- package/dist/objects/context/index.d.ts +1 -1
- package/dist/objects/context/index.d.ts.map +1 -1
- package/dist/objects/context/types.d.ts +5 -0
- package/dist/objects/context/types.d.ts.map +1 -1
- package/dist/objects/execution.d.ts +100 -0
- package/dist/objects/execution.d.ts.map +1 -0
- package/dist/objects/index.js +37 -24
- package/dist/objects/index.js.map +1 -1
- package/dist/objects/materializer-adapter.d.ts +1 -1
- package/dist/objects/materializer-adapter.d.ts.map +1 -1
- package/dist/objects/query/executor.d.ts +3 -8
- package/dist/objects/query/executor.d.ts.map +1 -1
- package/dist/objects/query/index.d.ts +2 -2
- package/dist/objects/query/index.d.ts.map +1 -1
- package/dist/objects/query/index.js +9 -13
- package/dist/objects/query/index.js.map +1 -1
- package/dist/objects/query/planner.d.ts +0 -3
- package/dist/objects/query/planner.d.ts.map +1 -1
- package/dist/objects/sdk/object-handle.d.ts +2 -2
- package/dist/objects/sdk/object-handle.d.ts.map +1 -1
- package/dist/objects/sdk/object-set.d.ts +2 -0
- package/dist/objects/sdk/object-set.d.ts.map +1 -1
- package/dist/objects/sdk/runtime-query-executor.d.ts +2 -0
- 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/action-service.d.ts +3 -2
- package/dist/objects/service/action-service.d.ts.map +1 -1
- package/dist/objects/service/list-service.d.ts +1 -1
- package/dist/objects/telemetry/history.d.ts +2 -0
- package/dist/objects/telemetry/history.d.ts.map +1 -1
- package/dist/objects/telemetry/write-batch.d.ts.map +1 -1
- package/dist/ontology/index.d.ts +1 -1
- package/dist/ontology/index.d.ts.map +1 -1
- package/dist/ontology/index.js +5 -5
- package/dist/ontology/internal.js +7 -6
- package/dist/ontology/internal.js.map +3 -3
- package/dist/ontology/registry.d.ts +15 -2
- package/dist/ontology/registry.d.ts.map +1 -1
- package/dist/ontology/validation/normalize.d.ts.map +1 -1
- package/dist/pipelines/execution.d.ts +19 -0
- package/dist/pipelines/execution.d.ts.map +1 -0
- package/dist/pipelines/index.d.ts +1 -0
- package/dist/pipelines/index.d.ts.map +1 -1
- package/dist/pipelines/index.js +66 -0
- package/dist/pipelines/index.js.map +9 -0
- package/dist/pipelines/request.d.ts +6 -9
- package/dist/pipelines/request.d.ts.map +1 -1
- package/dist/pipelines/run-dispatch.d.ts +47 -0
- package/dist/pipelines/run-dispatch.d.ts.map +1 -0
- package/dist/projections/builders.d.ts +0 -2
- package/dist/projections/builders.d.ts.map +1 -1
- package/dist/projections/capability.d.ts +7 -0
- package/dist/projections/capability.d.ts.map +1 -0
- package/dist/projections/execution.d.ts +19 -0
- package/dist/projections/execution.d.ts.map +1 -0
- package/dist/projections/index.d.ts +3 -1
- package/dist/projections/index.d.ts.map +1 -1
- package/dist/projections/internal.d.ts +4 -10
- package/dist/projections/internal.d.ts.map +1 -1
- package/dist/projections/internal.js +42 -6
- package/dist/projections/internal.js.map +1 -1
- package/dist/projections/ownership.d.ts +2 -2
- package/dist/projections/ownership.d.ts.map +1 -1
- package/dist/projections/registry.d.ts +21 -11
- package/dist/projections/registry.d.ts.map +1 -1
- package/dist/projections/revision.d.ts +2 -2
- package/dist/projections/revision.d.ts.map +1 -1
- package/dist/projections/run-dispatch.d.ts +37 -0
- package/dist/projections/run-dispatch.d.ts.map +1 -0
- package/dist/projections/run-id.d.ts +3 -0
- package/dist/projections/run-id.d.ts.map +1 -0
- package/dist/projections/types.d.ts +3 -0
- package/dist/projections/types.d.ts.map +1 -1
- package/dist/projections/validation.d.ts +2 -2
- package/dist/projections/validation.d.ts.map +1 -1
- package/dist/queues/in-memory.d.ts +11 -10
- package/dist/queues/in-memory.d.ts.map +1 -1
- package/dist/queues/index.d.ts +1 -1
- package/dist/queues/index.d.ts.map +1 -1
- package/dist/queues/index.js +1 -1
- package/dist/queues/types.d.ts +52 -42
- package/dist/queues/types.d.ts.map +1 -1
- package/dist/rules/execution.d.ts +14 -0
- package/dist/rules/execution.d.ts.map +1 -0
- package/dist/rules/index.d.ts +1 -1
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/validation.d.ts +1 -2
- package/dist/rules/validation.d.ts.map +1 -1
- package/dist/runtime/ai-usage.d.ts +8 -0
- package/dist/runtime/ai-usage.d.ts.map +1 -0
- package/dist/runtime/create.d.ts +7 -5
- package/dist/runtime/create.d.ts.map +1 -1
- package/dist/runtime/definitions.d.ts +35 -0
- package/dist/runtime/definitions.d.ts.map +1 -0
- package/dist/runtime/host.d.ts +123 -0
- package/dist/runtime/host.d.ts.map +1 -0
- package/dist/runtime/index.d.ts +6 -5
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/internal.d.ts +4 -0
- package/dist/runtime/internal.d.ts.map +1 -1
- package/dist/runtime/internal.js +6 -2
- package/dist/runtime/internal.js.map +1 -1
- package/dist/runtime/ontology-mutations.d.ts +4 -2
- package/dist/runtime/ontology-mutations.d.ts.map +1 -1
- package/dist/runtime/resolve-definitions.d.ts +42 -0
- package/dist/runtime/resolve-definitions.d.ts.map +1 -0
- package/dist/runtime/sixb.d.ts +43 -219
- package/dist/runtime/sixb.d.ts.map +1 -1
- package/dist/runtime/types.d.ts +16 -216
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/scheduler/index.d.ts +1 -1
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +3 -6
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/runtime.d.ts +7 -2
- package/dist/scheduler/runtime.d.ts.map +1 -1
- package/dist/schedules/execution.d.ts +6 -0
- package/dist/schedules/execution.d.ts.map +1 -0
- package/dist/schedules/index.js +9 -7
- package/dist/schedules/index.js.map +1 -1
- package/dist/schedules/types.d.ts +1 -3
- package/dist/schedules/types.d.ts.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 +4 -1
- package/dist/security/grants.d.ts.map +1 -1
- package/dist/security/index.d.ts +3 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/registry.d.ts +42 -0
- package/dist/security/registry.d.ts.map +1 -0
- package/dist/security/types.d.ts +7 -12
- 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/storage/action-runs/failure.d.ts +7 -0
- package/dist/storage/action-runs/failure.d.ts.map +1 -0
- package/dist/storage/action-runs/failure.js +14 -0
- package/dist/storage/action-runs/failure.js.map +9 -0
- package/dist/storage/action-runs/idempotency.d.ts.map +1 -1
- package/dist/storage/action-runs/in-memory.d.ts +3 -1
- package/dist/storage/action-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/action-runs/index.d.ts +2 -1
- package/dist/storage/action-runs/index.d.ts.map +1 -1
- package/dist/storage/action-runs/provider.d.ts +10 -0
- package/dist/storage/action-runs/provider.d.ts.map +1 -0
- package/dist/storage/action-runs/provider.js +13 -0
- package/dist/storage/action-runs/provider.js.map +9 -0
- package/dist/storage/action-runs/types.d.ts +37 -18
- package/dist/storage/action-runs/types.d.ts.map +1 -1
- package/dist/storage/agents/errors.d.ts +1 -1
- package/dist/storage/agents/errors.d.ts.map +1 -1
- package/dist/storage/agents/in-memory.d.ts +4 -1
- package/dist/storage/agents/in-memory.d.ts.map +1 -1
- package/dist/storage/agents/index.d.ts +2 -2
- package/dist/storage/agents/index.d.ts.map +1 -1
- package/dist/storage/agents/provider.d.ts +10 -0
- package/dist/storage/agents/provider.d.ts.map +1 -0
- package/dist/storage/agents/provider.js +17 -0
- package/dist/storage/agents/provider.js.map +9 -0
- package/dist/storage/agents/types.d.ts +13 -22
- package/dist/storage/agents/types.d.ts.map +1 -1
- package/dist/storage/ai-usage/errors.d.ts +8 -0
- package/dist/storage/ai-usage/errors.d.ts.map +1 -0
- package/dist/storage/ai-usage/in-memory.d.ts +28 -0
- package/dist/storage/ai-usage/in-memory.d.ts.map +1 -0
- package/dist/storage/ai-usage/index.d.ts +8 -0
- package/dist/storage/ai-usage/index.d.ts.map +1 -0
- package/dist/storage/ai-usage/record.d.ts +6 -0
- package/dist/storage/ai-usage/record.d.ts.map +1 -0
- package/dist/storage/ai-usage/types.d.ts +89 -0
- package/dist/storage/ai-usage/types.d.ts.map +1 -0
- package/dist/storage/ai-usage/usage.d.ts +11 -0
- package/dist/storage/ai-usage/usage.d.ts.map +1 -0
- package/dist/storage/auth/types.d.ts +1 -0
- package/dist/storage/auth/types.d.ts.map +1 -1
- package/dist/storage/connector-connections/errors.d.ts +12 -0
- package/dist/storage/connector-connections/errors.d.ts.map +1 -0
- package/dist/storage/connector-connections/in-memory.d.ts +81 -0
- package/dist/storage/connector-connections/in-memory.d.ts.map +1 -0
- package/dist/storage/connector-connections/index.d.ts +7 -0
- package/dist/storage/connector-connections/index.d.ts.map +1 -0
- package/dist/storage/connector-connections/provider/authorizations.d.ts +20 -0
- package/dist/storage/connector-connections/provider/authorizations.d.ts.map +1 -0
- package/dist/storage/connector-connections/provider/connections.d.ts +17 -0
- package/dist/storage/connector-connections/provider/connections.d.ts.map +1 -0
- package/dist/storage/connector-connections/provider/runs.d.ts +14 -0
- package/dist/storage/connector-connections/provider/runs.d.ts.map +1 -0
- package/dist/storage/connector-connections/provider/shared.d.ts +74 -0
- package/dist/storage/connector-connections/provider/shared.d.ts.map +1 -0
- package/dist/storage/connector-connections/provider.d.ts +49 -0
- package/dist/storage/connector-connections/provider.d.ts.map +1 -0
- package/dist/storage/connector-connections/provider.js +1025 -0
- package/dist/storage/connector-connections/provider.js.map +14 -0
- package/dist/storage/connector-connections/types.d.ts +402 -0
- package/dist/storage/connector-connections/types.d.ts.map +1 -0
- package/dist/storage/executions/errors.d.ts +8 -0
- package/dist/storage/executions/errors.d.ts.map +1 -0
- package/dist/storage/executions/in-memory.d.ts +21 -0
- package/dist/storage/executions/in-memory.d.ts.map +1 -0
- package/dist/storage/executions/index.d.ts +5 -0
- package/dist/storage/executions/index.d.ts.map +1 -0
- package/dist/storage/executions/provider.d.ts +29 -0
- package/dist/storage/executions/provider.d.ts.map +1 -0
- package/dist/storage/executions/provider.js +208 -0
- package/dist/storage/executions/provider.js.map +10 -0
- package/dist/storage/executions/run-link.d.ts +24 -0
- package/dist/storage/executions/run-link.d.ts.map +1 -0
- package/dist/storage/executions/types.d.ts +62 -0
- package/dist/storage/executions/types.d.ts.map +1 -0
- package/dist/storage/executions/validation.d.ts +13 -0
- package/dist/storage/executions/validation.d.ts.map +1 -0
- package/dist/storage/in-memory/index.d.ts +20 -5
- package/dist/storage/in-memory/index.d.ts.map +1 -1
- package/dist/storage/index.d.ts +28 -17
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +90 -27
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/ontology/commits.d.ts +1 -0
- package/dist/storage/ontology/commits.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/index.d.ts +1 -0
- package/dist/storage/ontology/in-memory/index.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/materializations-state.d.ts +3 -2
- package/dist/storage/ontology/in-memory/materializations-state.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/materializations-work.d.ts +2 -2
- package/dist/storage/ontology/in-memory/materializations-work.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/materializations.d.ts +3 -1
- package/dist/storage/ontology/in-memory/materializations.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/shared-state.d.ts +7 -2
- package/dist/storage/ontology/in-memory/shared-state.d.ts.map +1 -1
- package/dist/storage/ontology/index.d.ts +3 -2
- package/dist/storage/ontology/index.d.ts.map +1 -1
- package/dist/storage/ontology/materializations.d.ts +50 -5
- package/dist/storage/ontology/materializations.d.ts.map +1 -1
- package/dist/storage/ontology/outbox.d.ts +8 -2
- package/dist/storage/ontology/outbox.d.ts.map +1 -1
- package/dist/storage/ontology/provider-work.d.ts.map +1 -1
- package/dist/storage/ontology/provider.d.ts +5 -22
- package/dist/storage/ontology/provider.d.ts.map +1 -1
- package/dist/storage/ontology/provider.js +6 -7
- package/dist/storage/ontology/provider.js.map +1 -1
- package/dist/storage/operation-scope.d.ts.map +1 -1
- package/dist/storage/operation-scope.js +1 -1
- package/dist/storage/pipeline-runs/idempotency.d.ts +3 -0
- package/dist/storage/pipeline-runs/idempotency.d.ts.map +1 -0
- package/dist/storage/pipeline-runs/in-memory.d.ts +5 -1
- package/dist/storage/pipeline-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/pipeline-runs/index.d.ts +3 -1
- package/dist/storage/pipeline-runs/index.d.ts.map +1 -1
- package/dist/storage/pipeline-runs/provider.d.ts +10 -0
- package/dist/storage/pipeline-runs/provider.d.ts.map +1 -0
- package/dist/storage/pipeline-runs/provider.js +11 -0
- package/dist/storage/pipeline-runs/provider.js.map +9 -0
- package/dist/storage/pipeline-runs/types.d.ts +30 -14
- package/dist/storage/pipeline-runs/types.d.ts.map +1 -1
- package/dist/storage/projection-runs/in-memory.d.ts +8 -3
- package/dist/storage/projection-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/projection-runs/index.d.ts +2 -2
- package/dist/storage/projection-runs/index.d.ts.map +1 -1
- package/dist/storage/projection-runs/lifecycle.d.ts +14 -8
- package/dist/storage/projection-runs/lifecycle.d.ts.map +1 -1
- package/dist/storage/projection-runs/provider.d.ts +13 -0
- package/dist/storage/projection-runs/provider.d.ts.map +1 -0
- package/dist/storage/projection-runs/{lifecycle.js → provider.js} +15 -4
- package/dist/storage/projection-runs/provider.js.map +9 -0
- package/dist/storage/projection-runs/types.d.ts +28 -11
- package/dist/storage/projection-runs/types.d.ts.map +1 -1
- package/dist/storage/run-listing.d.ts +8 -9
- package/dist/storage/run-listing.d.ts.map +1 -1
- package/dist/storage/sync-runs/idempotency.d.ts +3 -0
- package/dist/storage/sync-runs/idempotency.d.ts.map +1 -0
- package/dist/storage/sync-runs/in-memory.d.ts +5 -1
- package/dist/storage/sync-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/sync-runs/index.d.ts +3 -1
- package/dist/storage/sync-runs/index.d.ts.map +1 -1
- package/dist/storage/sync-runs/provider.d.ts +10 -0
- package/dist/storage/sync-runs/provider.d.ts.map +1 -0
- package/dist/storage/sync-runs/provider.js +11 -0
- package/dist/storage/sync-runs/provider.js.map +9 -0
- package/dist/storage/sync-runs/types.d.ts +35 -14
- package/dist/storage/sync-runs/types.d.ts.map +1 -1
- package/dist/storage/types.d.ts +20 -15
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/webhook-runs/errors.d.ts +3 -0
- package/dist/storage/webhook-runs/errors.d.ts.map +1 -1
- package/dist/storage/webhook-runs/in-memory.d.ts +13 -1
- package/dist/storage/webhook-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/webhook-runs/index.d.ts +3 -2
- package/dist/storage/webhook-runs/index.d.ts.map +1 -1
- package/dist/storage/webhook-runs/provider.d.ts +10 -0
- package/dist/storage/webhook-runs/provider.d.ts.map +1 -0
- package/dist/storage/webhook-runs/provider.js +11 -0
- package/dist/storage/webhook-runs/provider.js.map +9 -0
- package/dist/storage/webhook-runs/types.d.ts +37 -11
- package/dist/storage/webhook-runs/types.d.ts.map +1 -1
- package/dist/storage/workflow-runs/in-memory.d.ts +6 -2
- package/dist/storage/workflow-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/workflow-runs/index.d.ts +2 -1
- package/dist/storage/workflow-runs/index.d.ts.map +1 -1
- package/dist/storage/workflow-runs/provider.d.ts +19 -0
- package/dist/storage/workflow-runs/provider.d.ts.map +1 -0
- package/dist/storage/workflow-runs/provider.js +19 -0
- package/dist/storage/workflow-runs/provider.js.map +9 -0
- package/dist/storage/workflow-runs/types.d.ts +30 -30
- package/dist/storage/workflow-runs/types.d.ts.map +1 -1
- package/dist/syncs/builders.d.ts +11 -3
- package/dist/syncs/builders.d.ts.map +1 -1
- package/dist/syncs/execution.d.ts +18 -0
- package/dist/syncs/execution.d.ts.map +1 -0
- package/dist/syncs/index.d.ts +3 -1
- package/dist/syncs/index.d.ts.map +1 -1
- package/dist/syncs/index.js +65 -0
- package/dist/syncs/index.js.map +9 -0
- package/dist/syncs/request.d.ts +6 -16
- package/dist/syncs/request.d.ts.map +1 -1
- package/dist/syncs/run-dispatch.d.ts +47 -0
- package/dist/syncs/run-dispatch.d.ts.map +1 -0
- package/dist/syncs/sources.d.ts +8 -0
- package/dist/syncs/sources.d.ts.map +1 -0
- package/dist/syncs/types.d.ts +34 -22
- package/dist/syncs/types.d.ts.map +1 -1
- package/dist/syncs/validation.d.ts +14 -0
- package/dist/syncs/validation.d.ts.map +1 -0
- package/dist/testing/action-execution.d.ts +12 -0
- package/dist/testing/action-execution.d.ts.map +1 -0
- package/dist/testing/agent-execution.d.ts +14 -0
- package/dist/testing/agent-execution.d.ts.map +1 -0
- package/dist/testing/agent-storage-contract.d.ts +10 -3
- package/dist/testing/agent-storage-contract.d.ts.map +1 -1
- package/dist/testing/ai-usage-storage-contract.d.ts +13 -0
- package/dist/testing/ai-usage-storage-contract.d.ts.map +1 -0
- package/dist/testing/auth-storage-contract.d.ts.map +1 -1
- package/dist/testing/broker-contract.d.ts.map +1 -1
- package/dist/testing/connector-connection-storage-contract.d.ts +16 -0
- package/dist/testing/connector-connection-storage-contract.d.ts.map +1 -0
- package/dist/testing/execution-storage-contract.d.ts +15 -0
- package/dist/testing/execution-storage-contract.d.ts.map +1 -0
- package/dist/testing/execution.d.ts +23 -0
- package/dist/testing/execution.d.ts.map +1 -0
- package/dist/testing/index.d.ts +13 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +4270 -1484
- package/dist/testing/index.js.map +27 -14
- package/dist/testing/lake-merge-storage-contract.d.ts +7 -0
- package/dist/testing/lake-merge-storage-contract.d.ts.map +1 -0
- package/dist/testing/lake-storage-contract.d.ts.map +1 -1
- package/dist/testing/materializer-fixture.d.ts +2 -2
- package/dist/testing/materializer-fixture.d.ts.map +1 -1
- package/dist/testing/materializer-storage-contract.d.ts.map +1 -1
- package/dist/testing/ontology-contract-fixture.d.ts +1 -0
- package/dist/testing/ontology-contract-fixture.d.ts.map +1 -1
- package/dist/testing/ontology-storage-contract.d.ts.map +1 -1
- package/dist/testing/pipeline-execution.d.ts +16 -0
- package/dist/testing/pipeline-execution.d.ts.map +1 -0
- package/dist/testing/projection-execution.d.ts +20 -0
- package/dist/testing/projection-execution.d.ts.map +1 -0
- package/dist/testing/projection-run-storage-contract.d.ts +9 -4
- package/dist/testing/projection-run-storage-contract.d.ts.map +1 -1
- package/dist/testing/queues-contract.d.ts.map +1 -1
- package/dist/testing/sync-execution.d.ts +16 -0
- package/dist/testing/sync-execution.d.ts.map +1 -0
- package/dist/testing/webhook-execution.d.ts +12 -0
- package/dist/testing/webhook-execution.d.ts.map +1 -0
- package/dist/testing/webhook-run-storage-contract.d.ts +11 -0
- package/dist/testing/webhook-run-storage-contract.d.ts.map +1 -0
- package/dist/testing/workflow-execution.d.ts +23 -0
- package/dist/testing/workflow-execution.d.ts.map +1 -0
- package/dist/webhooks/index.d.ts +2 -1
- package/dist/webhooks/index.d.ts.map +1 -1
- package/dist/webhooks/internal.d.ts +2 -0
- package/dist/webhooks/internal.d.ts.map +1 -0
- package/dist/webhooks/internal.js +150 -0
- package/dist/webhooks/internal.js.map +10 -0
- package/dist/webhooks/registry.d.ts +18 -4
- package/dist/webhooks/registry.d.ts.map +1 -1
- package/dist/webhooks/run-admission.d.ts +25 -0
- package/dist/webhooks/run-admission.d.ts.map +1 -0
- package/dist/webhooks/types.d.ts +8 -5
- package/dist/webhooks/types.d.ts.map +1 -1
- package/dist/workers/index.js +18 -19
- package/dist/workers/index.js.map +4 -4
- package/dist/workers/queue-delivery.d.ts +7 -7
- package/dist/workers/queue-delivery.d.ts.map +1 -1
- package/dist/workers/queue-worker.d.ts +30 -11
- package/dist/workers/queue-worker.d.ts.map +1 -1
- package/dist/workflows/execution.d.ts +49 -0
- package/dist/workflows/execution.d.ts.map +1 -0
- package/dist/workflows/failure.d.ts +28 -0
- package/dist/workflows/failure.d.ts.map +1 -0
- package/dist/workflows/index.d.ts +4 -2
- package/dist/workflows/index.d.ts.map +1 -1
- package/dist/workflows/index.js +63 -35
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/request.d.ts +2 -1
- package/dist/workflows/request.d.ts.map +1 -1
- package/dist/workflows/run-dispatch.d.ts +59 -0
- package/dist/workflows/run-dispatch.d.ts.map +1 -0
- package/dist/workflows/types.d.ts +38 -8
- package/dist/workflows/types.d.ts.map +1 -1
- package/package.json +107 -5
- package/src/actions/commit-edits.ts +0 -3
- package/src/actions/execution.ts +83 -0
- package/src/actions/index.ts +1 -1
- package/src/actions/registry.ts +22 -10
- package/src/actions/request.ts +55 -177
- package/src/actions/run-dispatch.ts +276 -0
- package/src/actions/types/context.ts +2 -4
- package/src/actions/validation.ts +2 -2
- package/src/agents/adapters.ts +8 -12
- package/src/agents/authority.ts +189 -0
- package/src/agents/builders.ts +53 -3
- package/src/agents/dispatch.ts +1 -6
- package/src/agents/errors.ts +24 -0
- package/src/agents/execution.ts +254 -0
- package/src/agents/index.ts +37 -5
- package/src/agents/prompt.ts +17 -5
- package/src/agents/request.ts +153 -13
- package/src/agents/streams.ts +150 -3
- package/src/agents/tool-definition.ts +93 -0
- package/src/agents/types.ts +99 -0
- package/src/agents/validation.ts +289 -5
- package/src/auth/attribution.ts +48 -0
- package/src/auth/index.ts +1 -0
- package/src/auth/runtime.ts +5 -5
- package/src/authorization/decision.ts +75 -14
- package/src/authorization/grant-kinds.ts +9 -0
- package/src/authorization/index.ts +2 -0
- package/src/blob-storage/execution.ts +78 -0
- package/src/blob-storage/validation.ts +2 -10
- package/src/bootstrap/discovery.ts +88 -268
- package/src/bootstrap/index.ts +2 -13
- package/src/broker/in-memory.ts +8 -1
- package/src/broker/types.ts +5 -0
- package/src/connectors/builders.ts +37 -2
- package/src/connectors/connections/authorizations.ts +646 -0
- package/src/connectors/connections/capability.ts +59 -0
- package/src/connectors/connections/command-context.ts +98 -0
- package/src/connectors/connections/contracts.ts +208 -0
- package/src/connectors/connections/credential-codec.ts +48 -0
- package/src/connectors/connections/credential-mutations.ts +574 -0
- package/src/connectors/connections/execution.ts +138 -0
- package/src/connectors/connections/internal.ts +17 -0
- package/src/connectors/connections/provider-operation.ts +41 -0
- package/src/connectors/connections/request.ts +447 -0
- package/src/connectors/connections/runs.ts +702 -0
- package/src/connectors/connections/service.ts +644 -0
- package/src/connectors/connections/storage-boundary.ts +13 -0
- package/src/connectors/connections/tokens.ts +292 -0
- package/src/connectors/connections/validation.ts +316 -0
- package/src/connectors/connections/views.ts +37 -0
- package/src/connectors/credentials.ts +149 -0
- package/src/connectors/errors.ts +111 -3
- package/src/connectors/execution.ts +157 -0
- package/src/connectors/index.ts +26 -2
- package/src/connectors/service.ts +142 -0
- package/src/connectors/types.ts +156 -7
- package/src/datasets/builders.ts +49 -5
- package/src/datasets/changes.ts +13 -0
- package/src/datasets/execution.ts +24 -0
- package/src/datasets/index.ts +3 -0
- package/src/datasets/types.ts +5 -0
- package/src/datasets/validation.ts +53 -11
- package/src/error-reporting/capability.ts +33 -106
- package/src/error-reporting/internal.ts +3 -1
- package/src/error-reporting/reporter.ts +19 -3
- package/src/error-reporting/reports.ts +172 -0
- package/src/error-reporting/types.ts +97 -43
- package/src/errors/catalog.ts +149 -0
- package/src/errors/internal.ts +322 -0
- package/src/errors/types.ts +21 -0
- package/src/events/definitions.ts +0 -4
- package/src/events/execution.ts +45 -0
- package/src/events/index.ts +15 -14
- package/src/events/outbox-dispatcher.ts +53 -18
- package/src/events/{runtime.ts → service.ts} +19 -23
- package/src/events/types/pipelines.ts +4 -1
- package/src/events/types/syncs.ts +3 -0
- package/src/events/types/workflows.ts +4 -2
- package/src/execution/agent.ts +130 -0
- package/src/execution/authorization.ts +409 -0
- package/src/execution/dispatch.ts +7 -0
- package/src/execution/durable.ts +193 -0
- package/src/execution/index.ts +12 -0
- package/src/execution/primitive.ts +50 -0
- package/src/execution/request.ts +109 -0
- package/src/execution/scopes.ts +198 -0
- package/src/execution/types.ts +113 -0
- package/src/http/api-routes.ts +42 -7
- package/src/index.ts +127 -10
- package/src/json.ts +11 -8
- package/src/lake-storage/definition-updates.ts +21 -0
- package/src/lake-storage/in-memory.ts +284 -2
- package/src/lake-storage/index.ts +14 -0
- package/src/lake-storage/merge-validation.ts +117 -0
- package/src/lake-storage/merge.ts +35 -0
- package/src/lake-storage/types.ts +3 -1
- package/src/logging/execution.ts +28 -0
- package/src/logging/index.ts +4 -4
- package/src/logging/{runtime.ts → service.ts} +7 -7
- package/src/materialization/events.ts +1 -0
- package/src/materialization/index.ts +2 -0
- package/src/materialization/model.ts +30 -18
- package/src/materializer/README.md +9 -13
- package/src/materializer/edits/commit.ts +85 -28
- package/src/materializer/edits/load-state.ts +79 -16
- package/src/materializer/edits/operations.ts +72 -36
- package/src/materializer/edits/plan.ts +95 -22
- package/src/materializer/edits/working-state.ts +86 -55
- package/src/materializer/effective/build-events.ts +2 -0
- package/src/materializer/effective/diff.ts +22 -0
- package/src/materializer/effective/load-state.ts +0 -31
- package/src/materializer/effective/resolve.ts +62 -0
- package/src/materializer/execution/commit-lifecycle.ts +9 -1
- package/src/materializer/execution/plan-stream.ts +33 -9
- package/src/materializer/execution/scope.ts +95 -0
- package/src/materializer/execution/work-executor.ts +6 -2
- package/src/materializer/execution/work-records.ts +39 -6
- package/src/materializer/index.ts +9 -1
- package/src/materializer/materializer.ts +67 -5
- package/src/materializer/projections/finish-run.ts +29 -11
- package/src/materializer/projections/replace.ts +55 -22
- package/src/materializer/projections/replacement-plan.ts +37 -7
- package/src/materializer/shared/batching.ts +4 -1
- package/src/materializer/shared/normalize.ts +0 -19
- package/src/materializer/telemetry/append.ts +57 -26
- package/src/materializer/telemetry/plan.ts +15 -6
- package/src/objects/action/request.ts +5 -5
- package/src/objects/context/index.ts +1 -0
- package/src/objects/context/types.ts +6 -0
- package/src/objects/execution.ts +346 -0
- package/src/objects/materializer-adapter.ts +1 -23
- package/src/objects/query/executor.ts +15 -29
- package/src/objects/query/index.ts +1 -2
- package/src/objects/query/planner.ts +0 -6
- package/src/objects/sdk/object-handle.ts +2 -2
- package/src/objects/sdk/object-set.ts +17 -7
- package/src/objects/sdk/runtime-query-executor.ts +9 -2
- package/src/objects/sdk/telemetry-channel.ts +5 -1
- package/src/objects/service/action-service.ts +5 -2
- package/src/objects/service/list-service.ts +1 -1
- package/src/objects/telemetry/history.ts +8 -3
- package/src/objects/telemetry/write-batch.ts +0 -2
- package/src/ontology/index.ts +6 -1
- package/src/ontology/json-schema.ts +2 -1
- package/src/ontology/registry.ts +16 -2
- package/src/ontology/validation/normalize.ts +9 -15
- package/src/pipelines/execution.ts +105 -0
- package/src/pipelines/index.ts +7 -0
- package/src/pipelines/request.ts +32 -26
- package/src/pipelines/run-dispatch.ts +308 -0
- package/src/projections/builders.ts +0 -9
- package/src/projections/capability.ts +37 -0
- package/src/projections/execution.ts +85 -0
- package/src/projections/index.ts +2 -1
- package/src/projections/internal.ts +17 -60
- package/src/projections/ownership.ts +2 -2
- package/src/projections/registry.ts +26 -11
- package/src/projections/revision.ts +7 -5
- package/src/projections/run-dispatch.ts +497 -0
- package/src/projections/run-id.ts +20 -0
- package/src/projections/types.ts +12 -0
- package/src/projections/validation.ts +3 -3
- package/src/queues/in-memory.ts +37 -11
- package/src/queues/index.ts +9 -2
- package/src/queues/types.ts +70 -45
- package/src/rules/execution.ts +49 -0
- package/src/rules/index.ts +0 -1
- package/src/rules/validation.ts +2 -6
- package/src/runtime/ai-usage.ts +17 -0
- package/src/runtime/create.ts +28 -68
- package/src/runtime/definitions.ts +44 -0
- package/src/runtime/host.ts +377 -0
- package/src/runtime/index.ts +5 -13
- package/src/runtime/internal.ts +12 -0
- package/src/runtime/ontology-mutations.ts +5 -3
- package/src/runtime/resolve-definitions.ts +238 -0
- package/src/runtime/sixb.ts +95 -807
- package/src/runtime/types.ts +17 -290
- package/src/scheduler/index.ts +1 -1
- package/src/scheduler/runtime.ts +37 -6
- package/src/schedules/execution.ts +14 -0
- package/src/schedules/types.ts +0 -8
- package/src/security/every.ts +4 -0
- package/src/security/grants.ts +13 -1
- package/src/security/index.ts +3 -1
- package/src/security/registry.ts +107 -0
- package/src/security/types.ts +8 -12
- package/src/security/validation.ts +7 -0
- package/src/storage/action-runs/failure.ts +64 -0
- package/src/storage/action-runs/idempotency.ts +3 -1
- package/src/storage/action-runs/in-memory.ts +39 -9
- package/src/storage/action-runs/index.ts +3 -0
- package/src/storage/action-runs/provider.ts +25 -0
- package/src/storage/action-runs/types.ts +61 -27
- package/src/storage/agents/errors.ts +1 -0
- package/src/storage/agents/in-memory.ts +49 -11
- package/src/storage/agents/index.ts +2 -1
- package/src/storage/agents/provider.ts +27 -0
- package/src/storage/agents/types.ts +19 -19
- package/src/storage/ai-usage/errors.ts +13 -0
- package/src/storage/ai-usage/in-memory.ts +162 -0
- package/src/storage/ai-usage/index.ts +21 -0
- package/src/storage/ai-usage/record.ts +74 -0
- package/src/storage/ai-usage/types.ts +102 -0
- package/src/storage/ai-usage/usage.ts +104 -0
- package/src/storage/auth/types.ts +1 -0
- package/src/storage/connector-connections/errors.ts +24 -0
- package/src/storage/connector-connections/in-memory.ts +1377 -0
- package/src/storage/connector-connections/index.ts +66 -0
- package/src/storage/connector-connections/provider/authorizations.ts +446 -0
- package/src/storage/connector-connections/provider/connections.ts +291 -0
- package/src/storage/connector-connections/provider/runs.ts +369 -0
- package/src/storage/connector-connections/provider/shared.ts +342 -0
- package/src/storage/connector-connections/provider.ts +219 -0
- package/src/storage/connector-connections/types.ts +546 -0
- package/src/storage/executions/errors.ts +21 -0
- package/src/storage/executions/in-memory.ts +75 -0
- package/src/storage/executions/index.ts +16 -0
- package/src/storage/executions/provider.ts +292 -0
- package/src/storage/executions/run-link.ts +70 -0
- package/src/storage/executions/types.ts +49 -0
- package/src/storage/executions/validation.ts +370 -0
- package/src/storage/in-memory/index.ts +50 -16
- package/src/storage/index.ts +155 -15
- package/src/storage/ontology/commits.ts +1 -0
- package/src/storage/ontology/in-memory/index.ts +2 -0
- package/src/storage/ontology/in-memory/materializations-finalization.ts +2 -1
- package/src/storage/ontology/in-memory/materializations-state.ts +10 -0
- package/src/storage/ontology/in-memory/materializations-work.ts +2 -1
- package/src/storage/ontology/in-memory/materializations.ts +131 -9
- package/src/storage/ontology/in-memory/outbox.ts +1 -1
- package/src/storage/ontology/in-memory/shared-state.ts +12 -1
- package/src/storage/ontology/index.ts +6 -0
- package/src/storage/ontology/materializations.ts +50 -4
- package/src/storage/ontology/outbox.ts +13 -2
- package/src/storage/ontology/provider-header-validation.ts +1 -0
- package/src/storage/ontology/provider-work.ts +33 -14
- package/src/storage/ontology/provider.ts +72 -52
- package/src/storage/operation-scope.ts +1 -0
- package/src/storage/pipeline-runs/idempotency.ts +14 -0
- package/src/storage/pipeline-runs/in-memory.ts +88 -8
- package/src/storage/pipeline-runs/index.ts +5 -1
- package/src/storage/pipeline-runs/provider.ts +25 -0
- package/src/storage/pipeline-runs/types.ts +37 -14
- package/src/storage/projection-runs/in-memory.ts +93 -24
- package/src/storage/projection-runs/index.ts +4 -0
- package/src/storage/projection-runs/lifecycle.ts +165 -36
- package/src/storage/projection-runs/provider.ts +34 -0
- package/src/storage/projection-runs/types.ts +34 -11
- package/src/storage/run-listing.ts +22 -13
- package/src/storage/sync-runs/idempotency.ts +18 -0
- package/src/storage/sync-runs/in-memory.ts +92 -9
- package/src/storage/sync-runs/index.ts +5 -1
- package/src/storage/sync-runs/provider.ts +25 -0
- package/src/storage/sync-runs/types.ts +44 -15
- package/src/storage/types.ts +45 -17
- package/src/storage/webhook-runs/errors.ts +14 -0
- package/src/storage/webhook-runs/in-memory.ts +84 -9
- package/src/storage/webhook-runs/index.ts +5 -1
- package/src/storage/webhook-runs/provider.ts +30 -0
- package/src/storage/webhook-runs/types.ts +52 -11
- package/src/storage/workflow-runs/in-memory.ts +91 -55
- package/src/storage/workflow-runs/index.ts +2 -0
- package/src/storage/workflow-runs/provider.ts +70 -0
- package/src/storage/workflow-runs/types.ts +38 -25
- package/src/syncs/builders.ts +33 -15
- package/src/syncs/execution.ts +78 -0
- package/src/syncs/index.ts +14 -0
- package/src/syncs/request.ts +32 -43
- package/src/syncs/run-dispatch.ts +312 -0
- package/src/syncs/sources.ts +20 -0
- package/src/syncs/types.ts +75 -25
- package/src/syncs/validation.ts +77 -0
- package/src/testing/action-execution.ts +61 -0
- package/src/testing/agent-execution.ts +81 -0
- package/src/testing/agent-storage-contract.ts +158 -63
- package/src/testing/ai-usage-storage-contract.ts +528 -0
- package/src/testing/auth-storage-contract.ts +17 -1
- package/src/testing/broker-contract.ts +16 -1
- package/src/testing/connector-connection-storage-contract.ts +1052 -0
- package/src/testing/execution-storage-contract.ts +435 -0
- package/src/testing/execution.ts +48 -0
- package/src/testing/index.ts +56 -0
- package/src/testing/lake-merge-storage-contract.ts +302 -0
- package/src/testing/lake-storage-contract.ts +23 -0
- package/src/testing/materializer-fixture.ts +11 -3
- package/src/testing/materializer-storage-contract.ts +213 -11
- package/src/testing/ontology-contract-fixture.ts +35 -2
- package/src/testing/ontology-storage-contract.ts +75 -14
- package/src/testing/pipeline-execution.ts +64 -0
- package/src/testing/projection-execution.ts +98 -0
- package/src/testing/projection-run-storage-contract.ts +215 -29
- package/src/testing/queues-contract.ts +40 -51
- package/src/testing/sync-execution.ts +61 -0
- package/src/testing/webhook-execution.ts +47 -0
- package/src/testing/webhook-run-storage-contract.ts +240 -0
- package/src/testing/workflow-execution.ts +77 -0
- package/src/webhooks/index.ts +2 -1
- package/src/webhooks/internal.ts +5 -0
- package/src/webhooks/registry.ts +60 -36
- package/src/webhooks/run-admission.ts +172 -0
- package/src/webhooks/types.ts +8 -5
- package/src/workers/queue-delivery.ts +25 -22
- package/src/workers/queue-worker.ts +62 -32
- package/src/workflows/execution.ts +292 -0
- package/src/workflows/failure.ts +63 -0
- package/src/workflows/index.ts +10 -1
- package/src/workflows/request.ts +39 -118
- package/src/workflows/run-dispatch.ts +359 -0
- package/src/workflows/snapshot.ts +1 -10
- package/src/workflows/types.ts +39 -8
- package/dist/actions/runtime.d.ts +0 -11
- package/dist/actions/runtime.d.ts.map +0 -1
- package/dist/agents/runtime.d.ts +0 -41
- package/dist/agents/runtime.d.ts.map +0 -1
- package/dist/chunk-0fygrz37.js +0 -354
- package/dist/chunk-0fygrz37.js.map +0 -17
- package/dist/chunk-0psb6kdw.js +0 -989
- package/dist/chunk-0psb6kdw.js.map +0 -15
- package/dist/chunk-1vffvydj.js.map +0 -10
- package/dist/chunk-2gpr6jsz.js.map +0 -13
- package/dist/chunk-2s6sydsh.js.map +0 -12
- package/dist/chunk-50kv63vj.js.map +0 -12
- package/dist/chunk-590dejbp.js +0 -49
- package/dist/chunk-590dejbp.js.map +0 -10
- package/dist/chunk-867jxh7c.js.map +0 -19
- package/dist/chunk-aebzcsxr.js.map +0 -48
- package/dist/chunk-btpe64e4.js +0 -554
- package/dist/chunk-btpe64e4.js.map +0 -13
- package/dist/chunk-dcgrzj1t.js.map +0 -36
- package/dist/chunk-dhmj53mx.js.map +0 -16
- package/dist/chunk-hsv43v58.js +0 -1390
- package/dist/chunk-hsv43v58.js.map +0 -21
- package/dist/chunk-jdwx7vzs.js.map +0 -14
- package/dist/chunk-k25jm1x5.js +0 -102
- package/dist/chunk-k25jm1x5.js.map +0 -10
- package/dist/chunk-k41ajtz7.js +0 -352
- package/dist/chunk-k41ajtz7.js.map +0 -13
- package/dist/chunk-k6j72mtt.js +0 -9
- package/dist/chunk-k6j72mtt.js.map +0 -10
- package/dist/chunk-nvamz5dv.js +0 -819
- package/dist/chunk-nvamz5dv.js.map +0 -21
- package/dist/chunk-pv1yad91.js +0 -1165
- package/dist/chunk-pv1yad91.js.map +0 -27
- package/dist/chunk-q4qzq0ea.js.map +0 -14
- package/dist/chunk-r65yscvk.js.map +0 -11
- package/dist/chunk-t358gywy.js.map +0 -34
- package/dist/chunk-t72dvahb.js.map +0 -12
- package/dist/chunk-v5c085yp.js.map +0 -10
- package/dist/chunk-wj01s5hr.js.map +0 -11
- package/dist/chunk-wxhdnwh4.js +0 -37
- package/dist/chunk-wxhdnwh4.js.map +0 -10
- package/dist/chunk-xz5g49bp.js.map +0 -11
- package/dist/chunk-ya6brh8a.js.map +0 -11
- package/dist/chunk-yvef9xwc.js.map +0 -44
- package/dist/chunk-yxss87qa.js.map +0 -14
- package/dist/connectors/runtime.d.ts +0 -13
- package/dist/connectors/runtime.d.ts.map +0 -1
- package/dist/events/runtime.d.ts.map +0 -1
- package/dist/objects/contexts.d.ts +0 -45
- package/dist/objects/contexts.d.ts.map +0 -1
- package/dist/objects/helpers.d.ts +0 -7
- package/dist/objects/helpers.d.ts.map +0 -1
- package/dist/runtime/scoped.d.ts +0 -158
- package/dist/runtime/scoped.d.ts.map +0 -1
- package/dist/security/runtime.d.ts +0 -16
- package/dist/security/runtime.d.ts.map +0 -1
- package/dist/storage/webhook-deliveries/in-memory.d.ts +0 -18
- package/dist/storage/webhook-deliveries/in-memory.d.ts.map +0 -1
- package/dist/storage/webhook-deliveries/index.d.ts +0 -3
- package/dist/storage/webhook-deliveries/index.d.ts.map +0 -1
- package/dist/storage/webhook-deliveries/types.d.ts +0 -43
- package/dist/storage/webhook-deliveries/types.d.ts.map +0 -1
- package/dist/workflows/runtime.d.ts +0 -33
- package/dist/workflows/runtime.d.ts.map +0 -1
- package/src/actions/runtime.ts +0 -31
- package/src/agents/runtime.ts +0 -124
- package/src/connectors/runtime.ts +0 -100
- package/src/objects/contexts.ts +0 -64
- package/src/objects/helpers.ts +0 -18
- package/src/runtime/scoped.ts +0 -436
- package/src/security/runtime.ts +0 -101
- package/src/storage/webhook-deliveries/in-memory.ts +0 -108
- package/src/storage/webhook-deliveries/index.ts +0 -9
- package/src/storage/webhook-deliveries/types.ts +0 -41
- package/src/workflows/runtime.ts +0 -68
- /package/dist/{chunk-45tw90k7.js.map → chunk-4gz41why.js.map} +0 -0
- /package/dist/{chunk-vj723r3p.js.map → chunk-8b55ygje.js.map} +0 -0
- /package/dist/{chunk-p6r5g77m.js.map → chunk-vybf6pkp.js.map} +0 -0
- /package/dist/{chunk-5yny9z0e.js.map → chunk-z3zp0bj1.js.map} +0 -0
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/storage/action-runs/errors.ts", "../src/storage/action-runs/idempotency.ts", "../src/storage/action-runs/in-memory.ts", "../src/storage/errors.ts", "../src/storage/file-upload-sessions/errors.ts", "../src/storage/file-upload-sessions/utils.ts", "../src/storage/file-upload-sessions/in-memory.ts", "../src/storage/in-memory/index.ts", "../src/storage/objects/in-memory.ts", "../src/storage/ontology/in-memory/shared-state.ts", "../src/storage/ontology/in-memory/commits.ts", "../src/storage/timeseries/store.ts", "../src/storage/ontology/in-memory/materializations-state.ts", "../src/storage/ontology/in-memory/materializations-work.ts", "../src/storage/ontology/in-memory/materializations-finalization.ts", "../src/storage/ontology/in-memory/materializations.ts", "../src/storage/ontology/in-memory/outbox.ts", "../src/storage/ontology/in-memory/sources.ts", "../src/storage/ontology/in-memory/testing.ts", "../src/storage/ontology/in-memory/index.ts", "../src/storage/pipeline-runs/errors.ts", "../src/storage/run-listing.ts", "../src/storage/pipeline-runs/in-memory.ts", "../src/storage/projection-runs/in-memory.ts", "../src/storage/rules/in-memory.ts", "../src/storage/sync-runs/errors.ts", "../src/storage/sync-runs/in-memory.ts", "../src/storage/transaction.ts", "../src/storage/webhook-deliveries/in-memory.ts", "../src/storage/webhook-runs/errors.ts", "../src/storage/webhook-runs/in-memory.ts", "../src/storage/workflow-interventions/errors.ts", "../src/storage/workflow-interventions/in-memory.ts", "../src/storage/workflow-runs/errors.ts", "../src/storage/workflow-runs/in-memory.ts", "../src/storage/in-memory/testing.ts", "../src/storage/migrations/migrate-storage.ts", "../src/storage/migrations/check-schema.ts", "../src/storage/migrations/migration-set.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"import { MaterializationConflictError } from \"../../materialization/errors\"\n\n/**\n * Base error for action-run storage operations. Callers can use this to catch\n * domain-specific failures without relying on message text.\n */\nexport class ActionRunError extends MaterializationConflictError {\n readonly name = \"ActionRunError\"\n\n constructor(message: string) {\n super(\"run-correlation\", message)\n }\n}\n",
|
|
6
|
-
"import type { ActionSubject } from \"../../actions\"\nimport { stableJsonStringify } from \"../../json\"\nimport type {\n ActionRunEffectsRecord,\n ActionRunPhase,\n ActionRunRecord,\n ActionRunWritebackRecord,\n FinishActionRunInput,\n QueueActionRunInput,\n} from \"./types\"\n\nexport function actionSubjectsEqual(left: ActionSubject, right: ActionSubject): boolean {\n if (left.kind !== right.kind) return false\n if (left.kind === \"none\") return true\n if (right.kind === \"none\") return false\n return left.objectTypeId === right.objectTypeId && left.primaryId === right.primaryId\n}\n\nexport function actionRunParamsEqual(left: unknown, right: unknown): boolean {\n return stableJsonStringify(left) === stableJsonStringify(right)\n}\n\nexport type ActionRunPhaseRecord = ActionRunWritebackRecord | ActionRunEffectsRecord\n\nexport function actionRunPhaseRecordsEqual(\n left: ActionRunPhaseRecord,\n right: ActionRunPhaseRecord\n): boolean {\n return actionRunParamsEqual(stripPhaseRecordCompletedAt(left), stripPhaseRecordCompletedAt(right))\n}\n\nexport function finishActionRunPhase(\n input: FinishActionRunInput,\n current: ActionRunPhase | null | undefined\n): ActionRunPhase {\n if (input.status === \"succeeded\") {\n return input.phase ?? current ?? \"validation\"\n }\n\n return input.phase ?? input.error?.phase ?? current ?? \"validation\"\n}\n\nexport function canRequeueActionRunAfterEnqueueFailure(\n existing: ActionRunRecord,\n input: QueueActionRunInput\n): boolean {\n return (\n existing.status === \"failed\" &&\n existing.phase === \"enqueue\" &&\n existing.actionId === input.actionId &&\n existing.idempotencyKey === input.idempotencyKey &&\n actionSubjectsEqual(existing.subject, input.subject) &&\n actionRunParamsEqual(existing.params, input.params)\n )\n}\n\nexport function isTerminalActionRun(record: Pick<ActionRunRecord, \"status\">): boolean {\n return (\n record.status === \"succeeded\" || record.status === \"failed\" || record.status === \"cancelled\"\n )\n}\n\nfunction stripPhaseRecordCompletedAt(\n record: ActionRunPhaseRecord\n): Omit<ActionRunPhaseRecord, \"completedAt\"> {\n const { completedAt: _completedAt, ...stableRecord } = record\n return stableRecord\n}\n",
|
|
7
|
-
"import { ActionRunError } from \"./errors\"\nimport {\n actionRunPhaseRecordsEqual,\n actionSubjectsEqual,\n canRequeueActionRunAfterEnqueueFailure,\n isTerminalActionRun,\n} from \"./idempotency\"\nimport type {\n ActionRunEffectsRecord,\n ActionRunFailure,\n ActionRunParams,\n ActionRunRecord,\n ActionRunStorage,\n ActionRunWritebackRecord,\n EnterActionRunPhaseInput,\n FinishActionRunInput,\n ListActionRunsInput,\n ListActionRunsResult,\n LockActionMaterializationRunInput,\n QueueActionRunInput,\n RecordActionEffectsInput,\n RecordActionWritebackInput,\n StartActionRunInput,\n} from \"./types\"\n\ntype RunRootOperation = <T>(run: () => Promise<T> | T) => Promise<T>\n\nconst runDirectly: RunRootOperation = async <T>(run: () => Promise<T> | T): Promise<T> => run()\n\nfunction actionRunKey(projectId: string, id: string): string {\n return JSON.stringify([projectId, id])\n}\n\nfunction assertNonBlank(value: string, fieldName: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new ActionRunError(`[Sixb] Action materialization ${fieldName} must be nonblank.`)\n }\n}\n\nfunction cloneActionRunRecord(record: ActionRunRecord): ActionRunRecord {\n return structuredClone(record)\n}\n\nfunction normalizeParams(params: ActionRunParams): ActionRunParams {\n return structuredClone(params)\n}\n\nfunction normalizeSubject(subject: QueueActionRunInput[\"subject\"]): QueueActionRunInput[\"subject\"] {\n return structuredClone(subject)\n}\n\nfunction normalizeError(error: ActionRunFailure | undefined): ActionRunFailure | undefined {\n return error ? structuredClone(error) : undefined\n}\n\nfunction normalizeWriteback(\n input: RecordActionWritebackInput,\n completedAt: Date\n): ActionRunWritebackRecord {\n if (input.status === \"succeeded\") {\n return {\n status: \"succeeded\",\n completedAt,\n result: structuredClone(input.result),\n }\n }\n\n return {\n status: \"failed\",\n completedAt,\n error: normalizeError(input.error),\n }\n}\n\nfunction normalizeEffects(\n input: RecordActionEffectsInput,\n completedAt: Date\n): ActionRunEffectsRecord {\n if (input.status === \"succeeded\") {\n return {\n status: \"succeeded\",\n completedAt,\n }\n }\n\n return {\n status: \"failed\",\n completedAt,\n error: normalizeError(input.error),\n }\n}\n\nfunction compareRuns(a: ActionRunRecord, b: ActionRunRecord, order: \"asc\" | \"desc\"): number {\n const leftAt = a.startedAt ?? a.queuedAt\n const rightAt = b.startedAt ?? b.queuedAt\n const delta = leftAt.getTime() - rightAt.getTime()\n if (delta !== 0) {\n return order === \"asc\" ? delta : -delta\n }\n\n if (a.id === b.id) {\n return 0\n }\n\n return order === \"asc\" ? a.id.localeCompare(b.id) : b.id.localeCompare(a.id)\n}\n\nexport class InMemoryActionRunStorage implements ActionRunStorage {\n private readonly rows = new Map<string, ActionRunRecord>()\n private readonly runRootOperation: RunRootOperation\n\n constructor(input: { readonly runRootOperation?: RunRootOperation } = {}) {\n this.runRootOperation = input.runRootOperation ?? runDirectly\n }\n\n snapshot(): InMemoryActionRunStorageSnapshot {\n return structuredClone(this.rows)\n }\n\n restore(snapshot: InMemoryActionRunStorageSnapshot): void {\n this.rows.clear()\n for (const [key, record] of structuredClone(snapshot)) {\n this.rows.set(key, record)\n }\n }\n\n async lockForMaterialization(input: LockActionMaterializationRunInput): Promise<ActionRunRecord> {\n return this.runRootOperation(() => cloneActionRunRecord(this.requireMaterializationRun(input)))\n }\n\n async queue(input: QueueActionRunInput): Promise<ActionRunRecord> {\n return this.runRootOperation(() => {\n const key = actionRunKey(input.projectId, input.id)\n const existing = this.rows.get(key)\n if (existing && !canRequeueActionRunAfterEnqueueFailure(existing, input)) {\n throw new ActionRunError(\n `[Sixb] Action run '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n\n const record: ActionRunRecord = {\n id: input.id,\n projectId: input.projectId,\n actionId: input.actionId,\n subject: normalizeSubject(input.subject),\n status: \"queued\",\n phase: \"request\",\n queuedAt: new Date(input.queuedAt ?? new Date()),\n params: normalizeParams(input.params),\n idempotencyKey: input.idempotencyKey,\n }\n\n if (existing) {\n const next: ActionRunRecord = {\n ...existing,\n status: \"queued\",\n phase: \"request\",\n queuedAt: record.queuedAt,\n startedAt: undefined,\n finishedAt: undefined,\n error: undefined,\n writeback: undefined,\n effects: undefined,\n }\n this.rows.set(key, structuredClone(next))\n return cloneActionRunRecord(next)\n }\n\n this.rows.set(key, structuredClone(record))\n return cloneActionRunRecord(record)\n })\n }\n\n async start(input: StartActionRunInput): Promise<ActionRunRecord> {\n return this.runRootOperation(() => {\n const key = actionRunKey(input.projectId, input.id)\n const existing = this.rows.get(key)\n\n if (!existing) {\n throw new ActionRunError(\n `[Sixb] Action run '${input.id}' not found for project '${input.projectId}'.`\n )\n }\n\n if (existing.status !== \"queued\") {\n throw new ActionRunError(\n `[Sixb] Action run '${input.id}' cannot start from status '${existing.status}'.`\n )\n }\n\n const next: ActionRunRecord = {\n ...existing,\n status: \"running\",\n phase: input.phase ?? \"validation\",\n startedAt: new Date(input.startedAt ?? new Date()),\n error: undefined,\n }\n\n this.rows.set(key, structuredClone(next))\n return cloneActionRunRecord(next)\n })\n }\n\n async enterPhase(input: EnterActionRunPhaseInput): Promise<ActionRunRecord> {\n return this.runRootOperation(() => {\n const key = actionRunKey(input.projectId, input.id)\n const existing = this.requireRunningRun(key, input.projectId, input.id, \"enter phase\")\n const next: ActionRunRecord = {\n ...existing,\n phase: input.phase,\n }\n\n this.rows.set(key, structuredClone(next))\n return cloneActionRunRecord(next)\n })\n }\n\n async recordWriteback(input: RecordActionWritebackInput): Promise<ActionRunRecord> {\n return this.runRootOperation(() => {\n const key = actionRunKey(input.projectId, input.id)\n const existing = this.requireRunningRun(key, input.projectId, input.id, \"record writeback\")\n const writeback = normalizeWriteback(input, new Date(input.completedAt ?? new Date()))\n\n if (existing.writeback) {\n if (actionRunPhaseRecordsEqual(existing.writeback, writeback)) {\n return cloneActionRunRecord(existing)\n }\n\n throw new ActionRunError(\n `[Sixb] Action run '${input.id}' already has a different writeback record.`\n )\n }\n\n const next: ActionRunRecord = {\n ...existing,\n phase: \"writeback\",\n writeback,\n }\n\n this.rows.set(key, structuredClone(next))\n return cloneActionRunRecord(next)\n })\n }\n\n async recordEffects(input: RecordActionEffectsInput): Promise<ActionRunRecord> {\n return this.runRootOperation(() => {\n const key = actionRunKey(input.projectId, input.id)\n const existing = this.requireRunningRun(key, input.projectId, input.id, \"record effects\")\n const effects = normalizeEffects(input, new Date(input.completedAt ?? new Date()))\n\n if (existing.effects) {\n if (actionRunPhaseRecordsEqual(existing.effects, effects)) {\n return cloneActionRunRecord(existing)\n }\n\n throw new ActionRunError(\n `[Sixb] Action run '${input.id}' already has a different effects record.`\n )\n }\n\n const next: ActionRunRecord = {\n ...existing,\n phase: \"effects\",\n effects,\n }\n\n this.rows.set(key, structuredClone(next))\n return cloneActionRunRecord(next)\n })\n }\n\n async finish(input: FinishActionRunInput): Promise<ActionRunRecord> {\n return this.runRootOperation(() => {\n const key = actionRunKey(input.projectId, input.id)\n const existing = this.rows.get(key)\n\n if (!existing) {\n throw new ActionRunError(\n `[Sixb] Action run '${input.id}' not found for project '${input.projectId}'.`\n )\n }\n\n if (isTerminalActionRun(existing)) {\n throw new ActionRunError(\n `[Sixb] Action run '${input.id}' cannot finish from terminal status '${existing.status}'.`\n )\n }\n\n const phase =\n input.status === \"succeeded\"\n ? (input.phase ?? existing.phase)\n : (input.phase ?? input.error?.phase ?? existing.phase)\n\n const base: ActionRunRecord = {\n ...existing,\n status: input.status,\n phase,\n finishedAt: new Date(input.finishedAt ?? new Date()),\n }\n\n const next: ActionRunRecord =\n input.status === \"succeeded\"\n ? {\n ...base,\n error: undefined,\n }\n : {\n ...base,\n error: normalizeError(input.error),\n }\n\n this.rows.set(key, structuredClone(next))\n return cloneActionRunRecord(next)\n })\n }\n\n private requireRunningRun(\n key: string,\n projectId: string,\n id: string,\n operation: string\n ): ActionRunRecord {\n const existing = this.rows.get(key)\n\n if (!existing) {\n throw new ActionRunError(`[Sixb] Action run '${id}' not found for project '${projectId}'.`)\n }\n\n if (existing.status !== \"running\") {\n throw new ActionRunError(\n `[Sixb] Action run '${id}' cannot ${operation} from status '${existing.status}'.`\n )\n }\n\n return existing\n }\n\n async getById(params: { projectId: string; id: string }): Promise<ActionRunRecord | null> {\n return this.runRootOperation(() => {\n const record = this.rows.get(actionRunKey(params.projectId, params.id))\n return record ? cloneActionRunRecord(record) : null\n })\n }\n\n async list(input: ListActionRunsInput): Promise<ListActionRunsResult> {\n return this.runRootOperation(() => {\n if (input.actionIds?.length === 0) {\n return { runs: [], hasMore: false, total: 0 }\n }\n\n const order = input.order ?? \"desc\"\n const offset = input.offset ?? 0\n const limit = input.limit ?? this.rows.size\n const actionIds = input.actionIds ? new Set(input.actionIds) : null\n const objectTypeIds = input.objectTypeIds ? new Set(input.objectTypeIds) : null\n const statuses = input.statuses ? new Set(input.statuses) : null\n\n const filtered = [...this.rows.values()]\n .filter((record) => record.projectId === input.projectId)\n .filter((record) => (input.actionId ? record.actionId === input.actionId : true))\n .filter((record) => (actionIds ? actionIds.has(record.actionId) : true))\n .filter((record) =>\n objectTypeIds\n ? record.subject.kind !== \"object\" || objectTypeIds.has(record.subject.objectTypeId)\n : true\n )\n .filter((record) =>\n input.subject ? actionSubjectsEqual(record.subject, input.subject) : true\n )\n .filter((record) =>\n input.objectTypeId\n ? record.subject.kind === \"object\" && record.subject.objectTypeId === input.objectTypeId\n : true\n )\n .filter((record) =>\n input.primaryId\n ? record.subject.kind === \"object\" && record.subject.primaryId === input.primaryId\n : true\n )\n .filter((record) => (statuses ? statuses.has(record.status) : true))\n .filter((record) =>\n input.startedAfter ? (record.startedAt ?? record.queuedAt) >= input.startedAfter : true\n )\n .filter((record) =>\n input.startedBefore ? (record.startedAt ?? record.queuedAt) <= input.startedBefore : true\n )\n .sort((a, b) => compareRuns(a, b, order))\n\n const total = filtered.length\n const runs = filtered.slice(offset, offset + limit).map(cloneActionRunRecord)\n return { runs, hasMore: offset + runs.length < total, total }\n })\n }\n\n private requireMaterializationRun(input: LockActionMaterializationRunInput): ActionRunRecord {\n assertNonBlank(input.projectId, \"projectId\")\n assertNonBlank(input.runId, \"runId\")\n assertNonBlank(input.actionId, \"actionId\")\n\n const existing = this.rows.get(actionRunKey(input.projectId, input.runId))\n if (!existing) {\n throw new ActionRunError(\n `[Sixb] Action run '${input.runId}' not found for project '${input.projectId}'.`\n )\n }\n if (existing.actionId !== input.actionId) {\n throw new ActionRunError(\n `[Sixb] Action run '${input.runId}' does not belong to action '${input.actionId}'.`\n )\n }\n if (existing.status !== \"running\") {\n throw new ActionRunError(\n `[Sixb] Action run '${input.runId}' cannot materialize from status '${existing.status}'.`\n )\n }\n return existing\n }\n}\n\nexport type InMemoryActionRunStorageSnapshot = Map<string, ActionRunRecord>\n",
|
|
8
|
-
"/**\n * Thrown when a storage lookup by primary ID finds no matching object.\n * Carries structured context so callers can discriminate without string parsing.\n */\nexport class ObjectNotFoundError extends Error {\n readonly name = \"ObjectNotFoundError\"\n\n constructor(\n readonly objectTypeId: string,\n readonly primaryId: string,\n readonly context: string\n ) {\n super(`[Sixb] ${context}: ${objectTypeId}:${primaryId}`)\n }\n}\n\nexport class ObjectStorageError extends Error {\n readonly name = \"ObjectStorageError\"\n}\n\nexport type StorageTransactionErrorCode =\n | \"nested_transaction\"\n | \"serialization_failure\"\n | \"transaction_inactive\"\n\nexport interface StorageTransactionErrorOptions {\n readonly cause?: unknown\n readonly code?: StorageTransactionErrorCode\n}\n\nexport class StorageTransactionError extends Error {\n readonly name = \"StorageTransactionError\"\n readonly code?: StorageTransactionErrorCode\n override readonly cause?: unknown\n\n constructor(message: string, options: StorageTransactionErrorOptions = {}) {\n super(message)\n this.code = options.code\n this.cause = options.cause\n }\n}\n\nexport function isStorageSerializationFailure(error: unknown): boolean {\n return error instanceof StorageTransactionError && error.code === \"serialization_failure\"\n}\n",
|
|
9
|
-
"/**\n * Transport-agnostic reasons a file upload session operation can fail. Mapping a\n * reason to an HTTP status (or any other transport) is the responsibility of the\n * boundary that surfaces it, not of core.\n */\nexport type FileUploadSessionErrorReason =\n | \"not_found\"\n | \"expired\"\n | \"already_completed\"\n | \"already_aborted\"\n\n/**\n * Error for file upload session invariants and invalid state transitions.\n */\nexport class FileUploadSessionError extends Error {\n readonly name = \"FileUploadSessionError\"\n\n constructor(\n readonly reason: FileUploadSessionErrorReason,\n message: string\n ) {\n super(message)\n }\n}\n",
|
|
10
|
-
"import { randomUUID } from \"node:crypto\"\nimport type { Principal } from \"../../auth\"\nimport type { FileUploadSession } from \"./types\"\n\nexport const DEFAULT_FILE_UPLOAD_SESSION_TTL_MS = 60 * 60 * 1000\nexport const DEFAULT_FILE_UPLOAD_TERMINAL_SESSION_TTL_MS = 15 * 60 * 1000\n\nexport function createUploadExpiresAt(now = Date.now()): Date {\n return new Date(now + DEFAULT_FILE_UPLOAD_SESSION_TTL_MS)\n}\n\nexport function createFileUploadId(): string {\n return `upload_${randomUUID().replaceAll(\"-\", \"\")}`\n}\n\nexport function principalKey(principal: Principal): string {\n return `${principal.type}:${principal.id}`\n}\n\nexport function isFileUploadSessionExpired(\n session: FileUploadSession,\n nowMs = Date.now()\n): boolean {\n return session.status === \"pending\" && session.expiresAt.getTime() <= nowMs\n}\n\nexport function shouldDeleteFileUploadSession(session: FileUploadSession, nowMs: number): boolean {\n if (isFileUploadSessionExpired(session, nowMs)) {\n return true\n }\n\n return isTerminalFileUploadSessionExpired(session, nowMs)\n}\n\nexport function isTerminalFileUploadSessionExpired(\n session: FileUploadSession,\n nowMs: number\n): boolean {\n if (session.status === \"pending\") {\n return false\n }\n\n const terminalAt = session.completedAt ?? session.abortedAt\n if (!terminalAt) {\n return false\n }\n\n return terminalAt.getTime() + DEFAULT_FILE_UPLOAD_TERMINAL_SESSION_TTL_MS <= nowMs\n}\n",
|
|
11
|
-
"import type { Principal } from \"../../auth\"\nimport type { FileRef, SignedBlobUploadPart } from \"../../blob-storage\"\nimport { FileUploadSessionError } from \"./errors\"\nimport type {\n CreateFileUploadSessionInput,\n FileUploadSession,\n FileUploadSessionStore,\n} from \"./types\"\nimport {\n createFileUploadId,\n isFileUploadSessionExpired,\n isTerminalFileUploadSessionExpired,\n principalKey,\n shouldDeleteFileUploadSession,\n} from \"./utils\"\n\nexport type InMemoryFileUploadSessionsSnapshot = Map<string, FileUploadSession>\n\n/**\n * In-memory {@link FileUploadSessionStore}.\n *\n * Sessions live only in this process's memory: they do not survive a restart and\n * are not shared across instances. Staged/direct-put uploads therefore require a\n * single-instance deployment for now; a durable (Pg/Sqlite) store is a follow-up.\n * Expired sessions are reaped opportunistically on `create` and on demand via\n * `cleanupExpired` (there is no background sweeper).\n */\nexport class InMemoryFileUploadSessions implements FileUploadSessionStore {\n private readonly sessionsById = new Map<string, FileUploadSession>()\n\n snapshot(): InMemoryFileUploadSessionsSnapshot {\n return structuredClone(this.sessionsById)\n }\n\n restore(snapshot: InMemoryFileUploadSessionsSnapshot): void {\n this.sessionsById.clear()\n for (const [id, session] of snapshot) {\n this.sessionsById.set(id, structuredClone(session))\n }\n }\n\n async create(input: CreateFileUploadSessionInput): Promise<FileUploadSession> {\n await this.cleanupExpired()\n\n const session: FileUploadSession = {\n id: input.id ?? createFileUploadId(),\n projectId: input.projectId,\n principalKey: principalKey(input.principal),\n strategy: input.strategy,\n status: \"pending\",\n ...(input.fileName === undefined ? {} : { fileName: input.fileName }),\n ...(input.mediaType === undefined ? {} : { mediaType: input.mediaType }),\n ...(input.logicalPath === undefined ? {} : { logicalPath: input.logicalPath }),\n ...(input.expectedSizeBytes === undefined\n ? {}\n : { expectedSizeBytes: input.expectedSizeBytes }),\n ...(input.expectedDigest === undefined ? {} : { expectedDigest: input.expectedDigest }),\n ...(input.providerUpload === undefined ? {} : { providerUpload: input.providerUpload }),\n signedParts: [],\n createdAt: new Date(),\n expiresAt: input.expiresAt,\n }\n\n this.sessionsById.set(session.id, session)\n return session\n }\n\n async getForPrincipal(uploadId: string, principal: Principal): Promise<FileUploadSession> {\n const session = this.sessionsById.get(uploadId)\n if (!session || session.principalKey !== principalKey(principal)) {\n throw new FileUploadSessionError(\"not_found\", \"File upload session not found.\")\n }\n\n const nowMs = Date.now()\n if (isFileUploadSessionExpired(session, nowMs)) {\n this.sessionsById.delete(uploadId)\n throw new FileUploadSessionError(\"expired\", \"File upload session has expired.\")\n }\n\n if (isTerminalFileUploadSessionExpired(session, nowMs)) {\n this.sessionsById.delete(uploadId)\n throw new FileUploadSessionError(\"not_found\", \"File upload session not found.\")\n }\n\n return session\n }\n\n async markUploaded(uploadId: string, fileRef: FileRef): Promise<FileUploadSession> {\n const session = this.requirePending(uploadId)\n const updated = {\n ...session,\n fileRef,\n }\n this.sessionsById.set(uploadId, updated)\n return updated\n }\n\n async addSignedPart(uploadId: string, part: SignedBlobUploadPart): Promise<FileUploadSession> {\n const session = this.requirePending(uploadId)\n const updated = {\n ...session,\n signedParts: [\n ...session.signedParts.filter((candidate) => candidate.partNumber !== part.partNumber),\n part,\n ].sort((left, right) => left.partNumber - right.partNumber),\n }\n this.sessionsById.set(uploadId, updated)\n return updated\n }\n\n async complete(uploadId: string, fileRef: FileRef): Promise<FileUploadSession> {\n const session = this.requirePending(uploadId)\n const updated = {\n ...session,\n status: \"completed\" as const,\n fileRef,\n completedAt: new Date(),\n }\n this.sessionsById.set(uploadId, updated)\n return updated\n }\n\n async abort(uploadId: string): Promise<FileUploadSession> {\n const session = this.requirePending(uploadId)\n const updated = {\n ...session,\n status: \"aborted\" as const,\n abortedAt: new Date(),\n }\n this.sessionsById.set(uploadId, updated)\n return updated\n }\n\n async cleanupExpired(now = new Date()): Promise<number> {\n let deleted = 0\n for (const [id, session] of this.sessionsById) {\n if (shouldDeleteFileUploadSession(session, now.getTime())) {\n this.sessionsById.delete(id)\n deleted += 1\n }\n }\n\n return deleted\n }\n\n private requirePending(uploadId: string): FileUploadSession {\n const session = this.sessionsById.get(uploadId)\n if (!session) {\n throw new FileUploadSessionError(\"not_found\", \"File upload session not found.\")\n }\n\n if (session.status !== \"pending\") {\n throw new FileUploadSessionError(\n session.status === \"completed\" ? \"already_completed\" : \"already_aborted\",\n `File upload session is already ${session.status}.`\n )\n }\n\n return session\n }\n}\n",
|
|
12
|
-
"import { AsyncLocalStorage } from \"node:async_hooks\"\nimport { InMemoryActionRunStorage } from \"../action-runs\"\nimport { type AgentStorage, InMemoryAgentStorage } from \"../agents\"\nimport { type AuthStorage, InMemoryAuthStorage } from \"../auth\"\nimport { StorageTransactionError } from \"../errors\"\nimport { type FileUploadSessionStore, InMemoryFileUploadSessions } from \"../file-upload-sessions\"\nimport type { ObjectStorage } from \"../objects\"\nimport { InMemoryObjectStorage } from \"../objects/in-memory\"\nimport type { OntologyStorage } from \"../ontology\"\nimport { InMemoryOntologyStorage } from \"../ontology/in-memory\"\nimport { ProviderMaterializationTransactionLifecycle } from \"../ontology/provider\"\nimport {\n createAgentOperationScope,\n createAuthOperationScope,\n createOntologyOperationScope,\n createOperationScopedFacade,\n createStorageOperationScope,\n createWorkflowRunOperationScope,\n} from \"../operation-scope\"\nimport { InMemoryPipelineRunStorage, type PipelineRunStorage } from \"../pipeline-runs\"\nimport { InMemoryProjectionRunStorage } from \"../projection-runs\"\nimport { InMemoryRulesStorage, type RulesStorage } from \"../rules\"\nimport { InMemorySyncRunStorage, type SyncRunStorage } from \"../sync-runs\"\nimport type { TimeseriesStorage } from \"../timeseries\"\nimport { InMemoryTimeseriesStorage } from \"../timeseries/store\"\nimport { createTransactionStorageProxy, throwNestedStorageTransaction } from \"../transaction\"\nimport type { Storage, StorageTransactionOptions } from \"../types\"\nimport { InMemoryWebhookDeliveryStorage, type WebhookDeliveryStorage } from \"../webhook-deliveries\"\nimport { InMemoryWebhookRunStorage, type WebhookRunStorage } from \"../webhook-runs\"\nimport {\n InMemoryWorkflowInterventionStorage,\n type WorkflowInterventionStorage,\n} from \"../workflow-interventions\"\nimport { InMemoryWorkflowRunStorage, type WorkflowRunStorage } from \"../workflow-runs\"\nimport { registerInMemoryStorageTestingAdapter } from \"./testing\"\n\n/**\n * In-memory {@link Storage} used for dev and tests.\n *\n * Every top-level storage call (\"root operation\") serializes against a single promise-chain lock\n * unless a transaction is already active, which is what gives {@link InMemoryStorage.transaction}\n * snapshot/rollback atomicity. The provider owns one operation scope and applies it to every async\n * root capability. Transaction calls reuse the already-active scope and therefore never reacquire\n * its non-reentrant lock.\n */\nexport class InMemoryStorage implements Storage {\n readonly objects: ObjectStorage\n readonly timeseries: TimeseriesStorage\n readonly ontology: OntologyStorage\n private readonly objectStorage = new InMemoryObjectStorage()\n private readonly timeseriesStorage = new InMemoryTimeseriesStorage()\n private readonly ontologyStorage: InMemoryOntologyStorage\n private readonly authStorage = new InMemoryAuthStorage()\n private readonly agentStorage = new InMemoryAgentStorage()\n private readonly actionRunStorage = new InMemoryActionRunStorage()\n private readonly syncRunStorage = new InMemorySyncRunStorage()\n private readonly pipelineRunStorage = new InMemoryPipelineRunStorage()\n private readonly projectionRunStorage = new InMemoryProjectionRunStorage()\n private readonly workflowRunStorage = new InMemoryWorkflowRunStorage()\n private readonly workflowInterventionStorage = new InMemoryWorkflowInterventionStorage()\n private readonly webhookDeliveryStorage = new InMemoryWebhookDeliveryStorage()\n private readonly webhookRunStorage = new InMemoryWebhookRunStorage()\n private readonly rulesStorage = new InMemoryRulesStorage()\n private readonly fileUploadSessionStorage = new InMemoryFileUploadSessions()\n readonly auth: AuthStorage\n readonly agents: AgentStorage\n readonly actionRuns: InMemoryActionRunStorage\n readonly syncRuns: SyncRunStorage\n readonly pipelineRuns: PipelineRunStorage\n readonly projectionRuns: InMemoryProjectionRunStorage\n readonly workflowRuns: WorkflowRunStorage\n readonly workflowInterventions: WorkflowInterventionStorage\n readonly webhookDeliveries: WebhookDeliveryStorage\n readonly webhookRuns: WebhookRunStorage\n readonly rules: RulesStorage\n readonly fileUploadSessions: FileUploadSessionStore\n\n constructor() {\n const scope = createStorageOperationScope(\n (run) => this.withStorageOperation(run),\n () => this.assertRootOperationAvailable()\n )\n this.objects = createOperationScopedFacade(this.objectStorage, scope)\n this.timeseries = createOperationScopedFacade(this.timeseriesStorage, scope)\n this.auth = createAuthOperationScope(this.authStorage, scope)\n this.agents = createAgentOperationScope(this.agentStorage, scope)\n this.actionRuns = createOperationScopedFacade(this.actionRunStorage, scope)\n this.syncRuns = createOperationScopedFacade(this.syncRunStorage, scope)\n this.pipelineRuns = createOperationScopedFacade(this.pipelineRunStorage, scope)\n this.projectionRuns = createOperationScopedFacade(this.projectionRunStorage, scope)\n this.workflowRuns = createWorkflowRunOperationScope(this.workflowRunStorage, scope)\n this.workflowInterventions = createOperationScopedFacade(\n this.workflowInterventionStorage,\n scope\n )\n this.webhookDeliveries = createOperationScopedFacade(this.webhookDeliveryStorage, scope)\n this.webhookRuns = createOperationScopedFacade(this.webhookRunStorage, scope)\n this.rules = createOperationScopedFacade(this.rulesStorage, scope)\n this.fileUploadSessions = createOperationScopedFacade(this.fileUploadSessionStorage, scope)\n this.ontologyStorage = new InMemoryOntologyStorage(this.objectStorage, this.timeseriesStorage, {\n runRootOperation: async (run) => run(),\n getTransactionToken: () => this.getActiveTransactionToken(),\n getMaterializationLifecycle: () => this.getActiveMaterializationLifecycle(),\n assertSourceMaterializationExecution: (input) =>\n this.projectionRunStorage.assertSourceMaterializationExecutionUnlocked(input),\n })\n this.ontology = createOntologyOperationScope(this.ontologyStorage, scope)\n this.ontologyStorage.registerTestingAlias(this.ontology)\n registerInMemoryStorageTestingAdapter(this, { snapshot: () => this.snapshot() })\n }\n\n private readonly transactionScope = new AsyncLocalStorage<object>()\n private readonly activeTransactionTokens = new WeakSet<object>()\n private readonly materializationLifecycles = new WeakMap<\n object,\n ProviderMaterializationTransactionLifecycle\n >()\n private transactionTail: Promise<void> = Promise.resolve()\n\n async ping(): Promise<void> {\n await this.withStorageOperation(() => undefined)\n }\n\n /**\n * Run `run` against a transactional view of this storage.\n *\n * Atomicity is achieved by snapshotting every store before the callback and restoring that\n * snapshot if it throws. The snapshot is a full structural clone of the in-memory dataset, so\n * its cost scales with total dataset size rather than changeset size. That is acceptable for the\n * dev/test role of {@link InMemoryStorage} but is the reason it is not intended for large\n * datasets under heavy transactional load — the SQL providers use real database transactions.\n *\n * The `isolation` option is intentionally ignored: the promise-chain lock serializes\n * transactions one at a time, which is at least as strong as `serializable`.\n */\n async transaction<T>(\n run: (tx: Storage) => Promise<T> | T,\n _options: StorageTransactionOptions = {}\n ): Promise<T> {\n const inheritedTransactionToken = this.transactionScope.getStore()\n if (inheritedTransactionToken && this.activeTransactionTokens.has(inheritedTransactionToken)) {\n throwNestedStorageTransaction()\n }\n\n return this.withTransactionLock(async () => {\n const snapshot = this.snapshot()\n let active = true\n const tx = createTransactionStorageProxy(this.createTransactionStorage(), () => active)\n const transactionToken = {}\n const materializationLifecycle = new ProviderMaterializationTransactionLifecycle()\n this.activeTransactionTokens.add(transactionToken)\n this.materializationLifecycles.set(transactionToken, materializationLifecycle)\n\n try {\n const result = await this.transactionScope.run(transactionToken, async () => run(tx))\n materializationLifecycle.assertCommittable()\n return result\n } catch (error) {\n // A failed rollback leaves the store in an unknown state. Surface that explicitly instead\n // of letting the restore error silently replace (mask) the original transaction error.\n try {\n this.restore(snapshot)\n } catch (restoreError) {\n throw new StorageTransactionError(\n `[Sixb] In-memory storage failed to roll back after a transaction error; state may be inconsistent. Original transaction error: ${\n error instanceof Error ? error.message : String(error)\n }`,\n { cause: restoreError }\n )\n }\n throw error\n } finally {\n this.ontologyStorage.completeTransaction(transactionToken)\n materializationLifecycle.deactivate()\n this.activeTransactionTokens.delete(transactionToken)\n active = false\n }\n })\n }\n\n private async withStorageOperation<T>(run: () => Promise<T> | T): Promise<T> {\n this.assertRootOperationAvailable()\n return this.withTransactionLock(async () => run())\n }\n\n private assertRootOperationAvailable(): void {\n if (!this.getActiveTransactionToken()) return\n throw new StorageTransactionError(\n \"[Sixb] Root storage cannot be used inside a transaction callback; use the provided tx storage.\"\n )\n }\n\n private getActiveTransactionToken(): object | null {\n const token = this.transactionScope.getStore()\n return token && this.activeTransactionTokens.has(token) ? token : null\n }\n\n private getActiveMaterializationLifecycle(): ProviderMaterializationTransactionLifecycle | null {\n const token = this.getActiveTransactionToken()\n return token ? (this.materializationLifecycles.get(token) ?? null) : null\n }\n\n private async withTransactionLock<T>(run: () => Promise<T>): Promise<T> {\n const previous = this.transactionTail\n let release!: () => void\n this.transactionTail = new Promise<void>((resolve) => {\n release = resolve\n })\n\n await previous\n try {\n return await run()\n } finally {\n release()\n }\n }\n\n private createTransactionStorage(): Storage {\n return {\n objects: this.objectStorage,\n timeseries: this.timeseriesStorage,\n ontology: this.ontologyStorage,\n auth: this.authStorage,\n agents: this.agentStorage,\n actionRuns: this.actionRunStorage,\n syncRuns: this.syncRunStorage,\n pipelineRuns: this.pipelineRunStorage,\n projectionRuns: this.projectionRunStorage,\n workflowRuns: this.workflowRunStorage,\n workflowInterventions: this.workflowInterventionStorage,\n webhookDeliveries: this.webhookDeliveryStorage,\n webhookRuns: this.webhookRunStorage,\n rules: this.rulesStorage,\n fileUploadSessions: this.fileUploadSessionStorage,\n ping: async () => undefined,\n transaction: async <T>(): Promise<T> => {\n throwNestedStorageTransaction()\n },\n }\n }\n\n private snapshot(): InMemoryStorageSnapshot {\n return {\n objects: this.objectStorage.snapshot(),\n timeseries: this.timeseriesStorage.snapshot(),\n ontology: this.ontologyStorage.snapshot(),\n auth: this.authStorage.snapshot(),\n agents: this.agentStorage.snapshot(),\n actionRuns: this.actionRunStorage.snapshot(),\n syncRuns: this.syncRunStorage.snapshot(),\n pipelineRuns: this.pipelineRunStorage.snapshot(),\n projectionRuns: this.projectionRunStorage.snapshot(),\n workflowRuns: this.workflowRunStorage.snapshot(),\n workflowInterventions: this.workflowInterventionStorage.snapshot(),\n webhookDeliveries: this.webhookDeliveryStorage.snapshot(),\n webhookRuns: this.webhookRunStorage.snapshot(),\n rules: this.rulesStorage.snapshot(),\n fileUploadSessions: this.fileUploadSessionStorage.snapshot(),\n }\n }\n\n private restore(snapshot: InMemoryStorageSnapshot): void {\n this.objectStorage.restore(snapshot.objects)\n this.timeseriesStorage.restore(snapshot.timeseries)\n this.ontologyStorage.restore(snapshot.ontology)\n this.authStorage.restore(snapshot.auth)\n this.agentStorage.restore(snapshot.agents)\n this.actionRunStorage.restore(snapshot.actionRuns)\n this.syncRunStorage.restore(snapshot.syncRuns)\n this.pipelineRunStorage.restore(snapshot.pipelineRuns)\n this.projectionRunStorage.restore(snapshot.projectionRuns)\n this.workflowRunStorage.restore(snapshot.workflowRuns)\n this.workflowInterventionStorage.restore(snapshot.workflowInterventions)\n this.webhookDeliveryStorage.restore(snapshot.webhookDeliveries)\n this.webhookRunStorage.restore(snapshot.webhookRuns)\n this.rulesStorage.restore(snapshot.rules)\n this.fileUploadSessionStorage.restore(snapshot.fileUploadSessions)\n }\n}\n\nexport interface InMemoryStorageSnapshot {\n readonly objects: ReturnType<InMemoryObjectStorage[\"snapshot\"]>\n readonly timeseries: ReturnType<InMemoryTimeseriesStorage[\"snapshot\"]>\n readonly ontology: ReturnType<InMemoryOntologyStorage[\"snapshot\"]>\n readonly auth: ReturnType<InMemoryAuthStorage[\"snapshot\"]>\n readonly agents: ReturnType<InMemoryAgentStorage[\"snapshot\"]>\n readonly actionRuns: ReturnType<InMemoryActionRunStorage[\"snapshot\"]>\n readonly syncRuns: ReturnType<InMemorySyncRunStorage[\"snapshot\"]>\n readonly pipelineRuns: ReturnType<InMemoryPipelineRunStorage[\"snapshot\"]>\n readonly projectionRuns: ReturnType<InMemoryProjectionRunStorage[\"snapshot\"]>\n readonly workflowRuns: ReturnType<InMemoryWorkflowRunStorage[\"snapshot\"]>\n readonly workflowInterventions: ReturnType<InMemoryWorkflowInterventionStorage[\"snapshot\"]>\n readonly webhookDeliveries: ReturnType<InMemoryWebhookDeliveryStorage[\"snapshot\"]>\n readonly webhookRuns: ReturnType<InMemoryWebhookRunStorage[\"snapshot\"]>\n readonly rules: ReturnType<InMemoryRulesStorage[\"snapshot\"]>\n readonly fileUploadSessions: ReturnType<InMemoryFileUploadSessions[\"snapshot\"]>\n}\n",
|
|
13
|
-
"import type { EffectiveLinkSnapshot, EffectiveObjectSnapshot } from \"../../materialization/model\"\nimport type { ObjectQuery, ObjectQueryPredicate, ObjectQuerySortField } from \"../../objects/query\"\nimport { compareQueryScalarValues, queryScalarValuesEqual } from \"../../objects/query/scalar-values\"\nimport type {\n CountObjectsInput,\n CountObjectsResult,\n ExistsObjectsInput,\n ExistsObjectsResult,\n FacetObjectsInput,\n FacetObjectsResult,\n LinkDirection,\n ObjectFacetRequest,\n ObjectFacetResult,\n ObjectLinkRow,\n ObjectQueryCapabilities,\n ObjectRow,\n ObjectStorage,\n QueryObjectsInput,\n QueryObjectsResult,\n} from \"./types\"\n\nconst IN_MEMORY_OBJECT_QUERY_CAPABILITIES: ObjectQueryCapabilities = {\n queryObjects: true,\n countObjects: true,\n existsObjects: true,\n facetObjects: true,\n nodes: {\n start: true,\n filter: true,\n text: true,\n vector: true,\n traverse: true,\n set: true,\n sort: true,\n limit: true,\n page: true,\n project: true,\n },\n predicateOps: {\n and: true,\n or: true,\n not: true,\n eq: true,\n neq: true,\n lt: true,\n lte: true,\n gt: true,\n gte: true,\n in: true,\n exists: true,\n contains: true,\n },\n sortKinds: {\n property: true,\n relevance: true,\n },\n traversalDirections: {\n outgoing: true,\n incoming: true,\n },\n setOps: {\n union: true,\n intersect: true,\n subtract: true,\n },\n scalarOperations: {\n string: { equality: true, ordering: true },\n uuid: { equality: true, ordering: true },\n boolean: { equality: true },\n integer: { equality: true, ordering: true },\n double: { equality: true, ordering: true },\n decimal: { equality: true, ordering: true },\n date: { equality: true, ordering: true },\n timestamp: { equality: true, ordering: true },\n },\n limits: {\n totalCount: true,\n stablePageTokens: true,\n },\n}\n\nfunction objectRowKey(projectId: string, objectTypeId: string): string {\n return `${projectId}:${objectTypeId}`\n}\n\nfunction comparePrimaryIds(left: string, right: string): number {\n if (left < right) return -1\n if (left > right) return 1\n return 0\n}\n\nfunction sourceLinkBucketKey(projectId: string, sourceTypeId: string, sourceId: string): string {\n return `${projectId}:${sourceTypeId}:${sourceId}`\n}\n\nfunction linkRowKey(linkId: string, targetTypeId: string, targetId: string): string {\n return `${linkId}:${targetTypeId}:${targetId}`\n}\n\nfunction fullLinkRowKey(row: ObjectLinkRow): string {\n return `${row.sourceTypeId}:${row.sourceId}:${row.linkId}:${row.targetTypeId}:${row.targetId}`\n}\n\ntype QueryEntry = {\n row: ObjectRow\n score: number\n order: number\n}\n\ntype QueryEvaluation = {\n entries: QueryEntry[]\n total: number\n hasMore: boolean\n nextPageToken?: string\n}\n\nconst PAGE_TOKEN_PREFIX = \"offset:\"\n\nexport interface InMemoryObjectStorageSnapshot {\n readonly rows: Map<string, Map<string, ObjectRow>>\n readonly links: Map<string, Map<string, ObjectLinkRow>>\n}\n\ninterface InMemoryObjectMaterializerAdapter {\n getExactObjectRow(projectId: string, objectTypeId: string, primaryId: string): ObjectRow | null\n getExactLinkRow(\n projectId: string,\n ref: {\n readonly sourceTypeId: string\n readonly sourceId: string\n readonly linkId: string\n readonly targetTypeId: string\n readonly targetId: string\n }\n ): ObjectLinkRow | null\n applyExactObject(row: EffectiveObjectSnapshot, projectId: string): void\n deleteExactObject(projectId: string, objectTypeId: string, primaryId: string): void\n applyExactLink(row: EffectiveLinkSnapshot, projectId: string): void\n deleteExactLink(row: {\n projectId: string\n sourceTypeId: string\n sourceId: string\n linkId: string\n targetTypeId: string\n targetId: string\n }): void\n visitExactLinks(projectId: string, visit: (row: ObjectLinkRow) => void): void\n visitExactScopeLinks(\n projectId: string,\n sourceTypeId: string,\n sourceId: string,\n linkId: string,\n visit: (row: ObjectLinkRow) => void\n ): void\n}\n\nconst materializerAdapters = new WeakMap<InMemoryObjectStorage, InMemoryObjectMaterializerAdapter>()\n\n/** @internal Exact access for the in-memory ontology provider; not exported from package barrels. */\nexport function getInMemoryObjectMaterializerAdapter(\n storage: InMemoryObjectStorage\n): InMemoryObjectMaterializerAdapter {\n const adapter = materializerAdapters.get(storage)\n if (!adapter) throw new Error(\"[Sixb] In-memory object materializer adapter is unavailable.\")\n return adapter\n}\n\nexport class InMemoryObjectStorage implements ObjectStorage {\n private readonly rows = new Map<string, Map<string, ObjectRow>>()\n private readonly links = new Map<string, Map<string, ObjectLinkRow>>()\n\n constructor() {\n materializerAdapters.set(this, {\n getExactObjectRow: (projectId, objectTypeId, primaryId) =>\n this.getExactObjectRow(projectId, objectTypeId, primaryId),\n getExactLinkRow: (projectId, ref) => this.getExactLinkRow(projectId, ref),\n applyExactObject: (row, projectId) => this.applyExactObject(row, projectId),\n deleteExactObject: (projectId, objectTypeId, primaryId) =>\n this.deleteExactObject(projectId, objectTypeId, primaryId),\n applyExactLink: (row, projectId) => this.applyExactLink(row, projectId),\n deleteExactLink: (row) => this.deleteExactLink(row),\n visitExactLinks: (projectId, visit) => {\n for (const bucket of this.links.values()) {\n for (const row of bucket.values()) {\n if (row.projectId === projectId) visit(structuredClone(row))\n }\n }\n },\n visitExactScopeLinks: (projectId, sourceTypeId, sourceId, linkId, visit) => {\n const bucket = this.links.get(sourceLinkBucketKey(projectId, sourceTypeId, sourceId))\n if (!bucket) return\n for (const row of bucket.values()) {\n if (row.linkId === linkId) visit(structuredClone(row))\n }\n },\n })\n }\n\n snapshot(): InMemoryObjectStorageSnapshot {\n return {\n rows: cloneObjectBuckets(this.rows),\n links: cloneLinkBuckets(this.links),\n }\n }\n\n restore(snapshot: InMemoryObjectStorageSnapshot): void {\n this.rows.clear()\n for (const [key, bucket] of cloneObjectBuckets(snapshot.rows)) {\n this.rows.set(key, bucket)\n }\n\n this.links.clear()\n for (const [key, bucket] of cloneLinkBuckets(snapshot.links)) {\n this.links.set(key, bucket)\n }\n }\n\n private getExactObjectRow(\n projectId: string,\n objectTypeId: string,\n primaryId: string\n ): ObjectRow | null {\n const row = this.rows.get(objectRowKey(projectId, objectTypeId))?.get(primaryId)\n return row ? structuredClone(row) : null\n }\n\n private getExactLinkRow(\n projectId: string,\n ref: {\n readonly sourceTypeId: string\n readonly sourceId: string\n readonly linkId: string\n readonly targetTypeId: string\n readonly targetId: string\n }\n ): ObjectLinkRow | null {\n const row = this.links\n .get(sourceLinkBucketKey(projectId, ref.sourceTypeId, ref.sourceId))\n ?.get(linkRowKey(ref.linkId, ref.targetTypeId, ref.targetId))\n return row ? structuredClone(row) : null\n }\n\n private applyExactObject(row: EffectiveObjectSnapshot, projectId: string): void {\n const bucketId = objectRowKey(projectId, row.ref.objectTypeId)\n const bucket = this.rows.get(bucketId) ?? new Map<string, ObjectRow>()\n this.rows.set(bucketId, bucket)\n bucket.set(row.ref.primaryId, {\n projectId,\n objectTypeId: row.ref.objectTypeId,\n primaryId: row.ref.primaryId,\n properties: structuredClone(row.properties) as Record<string, unknown>,\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n version: row.version,\n lastCommitId: row.lastCommitId,\n })\n }\n\n private deleteExactObject(projectId: string, objectTypeId: string, primaryId: string): void {\n this.deleteObjectRow(projectId, objectTypeId, primaryId)\n }\n\n private applyExactLink(row: EffectiveLinkSnapshot, projectId: string): void {\n const bucketKey = sourceLinkBucketKey(\n projectId,\n row.ref.source.objectTypeId,\n row.ref.source.primaryId\n )\n const bucket = this.links.get(bucketKey) ?? new Map<string, ObjectLinkRow>()\n this.links.set(bucketKey, bucket)\n bucket.set(linkRowKey(row.ref.linkId, row.ref.target.objectTypeId, row.ref.target.primaryId), {\n projectId,\n sourceTypeId: row.ref.source.objectTypeId,\n sourceId: row.ref.source.primaryId,\n linkId: row.ref.linkId,\n targetTypeId: row.ref.target.objectTypeId,\n targetId: row.ref.target.primaryId,\n properties: row.properties\n ? (structuredClone(row.properties) as Record<string, unknown>)\n : undefined,\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n lastCommitId: row.lastCommitId,\n })\n }\n\n private deleteExactLink(row: {\n projectId: string\n sourceTypeId: string\n sourceId: string\n linkId: string\n targetTypeId: string\n targetId: string\n }): void {\n this.deleteLinkRow(\n row.projectId,\n row.sourceTypeId,\n row.sourceId,\n row.linkId,\n row.targetTypeId,\n row.targetId\n )\n }\n\n queryCapabilities(): ObjectQueryCapabilities {\n return IN_MEMORY_OBJECT_QUERY_CAPABILITIES\n }\n\n async queryObjects(params: QueryObjectsInput): Promise<QueryObjectsResult> {\n const result = this.evaluateObjectQuery(params.projectId, params.query)\n return {\n objects: result.entries.map((entry) => entry.row),\n hasMore: result.hasMore,\n nextPageToken: result.nextPageToken,\n ...(params.includeTotal === false ? {} : { total: result.total }),\n }\n }\n\n async countObjects(params: CountObjectsInput): Promise<CountObjectsResult> {\n return {\n count: this.evaluateObjectQuery(params.projectId, stripOuterRowShape(params.query)).total,\n }\n }\n\n async existsObjects(params: ExistsObjectsInput): Promise<ExistsObjectsResult> {\n return {\n exists:\n this.evaluateObjectQuery(params.projectId, stripOuterRowShape(params.query)).total > 0,\n }\n }\n\n async facetObjects(params: FacetObjectsInput): Promise<FacetObjectsResult> {\n const result = this.evaluateObjectQuery(params.projectId, stripOuterRowShape(params.query))\n return {\n facets: buildFacetResults(\n result.entries.map((entry) => entry.row),\n params.facets\n ),\n }\n }\n\n private evaluateObjectQuery(projectId: string, query: ObjectQuery): QueryEvaluation {\n switch (query.kind) {\n case \"start\":\n return this.evaluateStart(projectId, query.objectTypeId)\n case \"filter\": {\n const input = this.evaluateObjectQuery(projectId, query.input)\n const entries = input.entries.filter((entry) =>\n matchesPredicate(entry.row, query.predicate)\n )\n return completeEvaluation(entries)\n }\n case \"text\": {\n const input = this.evaluateObjectQuery(projectId, query.input)\n const scoredEntries = input.entries.flatMap((entry) => {\n const score = textScore(entry.row, query.query, query.fields, query.fieldsByObjectType)\n return score > 0 ? [{ ...entry, score: entry.score + score }] : []\n })\n return completeEvaluation(scoredEntries)\n }\n case \"vector\": {\n const input = this.evaluateObjectQuery(projectId, query.input)\n const scoredEntries = input.entries.flatMap((entry) => {\n const score = vectorSimilarity(entry.row.properties[query.propertyId], query.vector)\n return score === null ? [] : [{ ...entry, score: entry.score + score }]\n })\n scoredEntries.sort(compareEntriesByRelevance)\n const limit = Math.max(0, query.k)\n return {\n entries: scoredEntries.slice(0, limit),\n total: scoredEntries.length,\n hasMore: limit < scoredEntries.length,\n }\n }\n case \"traverse\": {\n const input = this.evaluateObjectQuery(projectId, query.input)\n const entries =\n query.direction === \"outgoing\"\n ? this.traverseOutgoing(projectId, input.entries, query.linkId)\n : this.traverseIncoming(\n projectId,\n input.entries,\n query.linkId,\n query.sourceObjectTypeId\n )\n return completeEvaluation(entries)\n }\n case \"set\":\n return this.evaluateSet(projectId, query.op, query.inputs)\n case \"sort\": {\n const input = this.evaluateObjectQuery(projectId, query.input)\n return {\n ...input,\n entries: sortEntries(input.entries, query.fields),\n }\n }\n case \"limit\": {\n const input = this.evaluateObjectQuery(projectId, query.input)\n const limit = Math.max(0, query.limit)\n return {\n entries: input.entries.slice(0, limit),\n total: input.entries.length,\n hasMore: limit < input.entries.length,\n }\n }\n case \"page\": {\n const input = this.evaluateObjectQuery(projectId, query.input)\n const offset = decodePageOffset(query.pageToken)\n const pageSize = Math.max(0, query.pageSize)\n const nextOffset = offset + pageSize\n const hasMore = pageSize > 0 && nextOffset < input.entries.length\n return {\n entries: input.entries.slice(offset, nextOffset),\n total: input.entries.length,\n hasMore,\n nextPageToken: hasMore ? encodePageOffset(nextOffset) : undefined,\n }\n }\n case \"project\": {\n const input = this.evaluateObjectQuery(projectId, query.input)\n if (!query.properties) return input\n const properties = query.properties\n return {\n ...input,\n entries: input.entries.map((entry) => ({\n ...entry,\n row: projectRow(entry.row, properties),\n })),\n }\n }\n case \"expand\":\n // `expand` is output-shaping and is gated off by the planner in this\n // slice (and stripped before aggregates run), so the in-memory engine\n // should never receive one. Link hydration lands in a later slice.\n throw new Error(\"[Sixb] In-memory object storage does not support 'expand' execution yet\")\n }\n }\n\n private evaluateStart(projectId: string, objectTypeId: string): QueryEvaluation {\n const bucket = this.rows.get(objectRowKey(projectId, objectTypeId))\n const entries = [...(bucket?.values() ?? [])].map((row, index) => ({\n row,\n score: 0,\n order: index,\n }))\n return completeEvaluation(entries)\n }\n\n private evaluateSet(\n projectId: string,\n op: \"union\" | \"intersect\" | \"subtract\",\n inputs: readonly ObjectQuery[]\n ): QueryEvaluation {\n const evaluations = inputs.map((input) => this.evaluateObjectQuery(projectId, input))\n const first = evaluations[0]\n if (!first) return completeEvaluation([])\n\n if (op === \"union\") {\n const entriesByKey = new Map<string, QueryEntry>()\n for (const evaluation of evaluations) {\n for (const entry of evaluation.entries) {\n upsertEntry(entriesByKey, entry)\n }\n }\n return completeEvaluation([...entriesByKey.values()])\n }\n\n if (op === \"intersect\") {\n const otherKeySets = evaluations\n .slice(1)\n .map((evaluation) => new Set(evaluation.entries.map((entry) => rowIdentityKey(entry.row))))\n const entries = first.entries.filter((entry) => {\n const key = rowIdentityKey(entry.row)\n return otherKeySets.every((keys) => keys.has(key))\n })\n return completeEvaluation(entries)\n }\n\n const subtractKeys = new Set(\n evaluations\n .slice(1)\n .flatMap((evaluation) => evaluation.entries.map((entry) => rowIdentityKey(entry.row)))\n )\n return completeEvaluation(\n first.entries.filter((entry) => !subtractKeys.has(rowIdentityKey(entry.row)))\n )\n }\n\n private traverseOutgoing(\n projectId: string,\n entries: readonly QueryEntry[],\n linkId: string\n ): QueryEntry[] {\n const resultsByKey = new Map<string, QueryEntry>()\n\n entries.forEach((entry, index) => {\n const bucket = this.links.get(\n sourceLinkBucketKey(projectId, entry.row.objectTypeId, entry.row.primaryId)\n )\n if (!bucket) return\n\n for (const link of bucket.values()) {\n if (link.linkId !== linkId) continue\n const target = this.rows.get(objectRowKey(projectId, link.targetTypeId))?.get(link.targetId)\n if (!target) continue\n upsertEntry(resultsByKey, {\n row: target,\n score: entry.score,\n order: entry.order + index / 1_000_000,\n })\n }\n })\n\n return [...resultsByKey.values()]\n }\n\n private traverseIncoming(\n projectId: string,\n entries: readonly QueryEntry[],\n linkId: string,\n sourceObjectTypeId?: string\n ): QueryEntry[] {\n const inputEntriesByTarget = new Map(entries.map((entry) => [rowIdentityKey(entry.row), entry]))\n const resultsByKey = new Map<string, QueryEntry>()\n\n for (const bucket of this.links.values()) {\n for (const link of bucket.values()) {\n if (link.projectId !== projectId || link.linkId !== linkId) continue\n if (sourceObjectTypeId !== undefined && link.sourceTypeId !== sourceObjectTypeId) continue\n const targetEntry = inputEntriesByTarget.get(\n rowIdentityKeyParts(link.targetTypeId, link.targetId)\n )\n if (!targetEntry) continue\n\n const source = this.rows.get(objectRowKey(projectId, link.sourceTypeId))?.get(link.sourceId)\n if (!source) continue\n upsertEntry(resultsByKey, {\n row: source,\n score: targetEntry.score,\n order: targetEntry.order,\n })\n }\n }\n\n return [...resultsByKey.values()]\n }\n\n /**\n * Reads return the *live* stored row by reference (the SQL providers detach a copy via JSON\n * round-trip). Callers must treat read results as immutable: mutating a returned row mutates the\n * store in place — including after the transaction that read it has completed, which escapes the\n * transaction guard. Internal call sites (e.g. the EditBatch planner) already copy before\n * mutating; external callers must do the same.\n */\n async getByPrimaryId(params: {\n projectId: string\n objectTypeId: string\n primaryId: string\n }): Promise<ObjectRow | null> {\n const bucket = this.rows.get(objectRowKey(params.projectId, params.objectTypeId))\n if (!bucket) return null\n return bucket.get(params.primaryId) ?? null\n }\n\n async listLinks(params: {\n projectId: string\n objectTypeId: string\n objectId: string\n linkId?: string\n direction?: LinkDirection\n }): Promise<readonly ObjectLinkRow[]> {\n const direction = params.direction ?? \"outgoing\"\n const matches = (row: ObjectLinkRow) => !params.linkId || row.linkId === params.linkId\n const rows: ObjectLinkRow[] = []\n\n if (direction === \"outgoing\" || direction === \"both\") {\n const bucket = this.links.get(\n sourceLinkBucketKey(params.projectId, params.objectTypeId, params.objectId)\n )\n if (bucket) rows.push(...[...bucket.values()].filter(matches))\n }\n\n if (direction === \"incoming\" || direction === \"both\") {\n for (const bucket of this.links.values()) {\n for (const row of bucket.values()) {\n if (\n row.projectId === params.projectId &&\n row.targetTypeId === params.objectTypeId &&\n row.targetId === params.objectId &&\n matches(row)\n ) {\n rows.push(row)\n }\n }\n }\n }\n\n if (direction !== \"both\") return rows\n return [...new Map(rows.map((row) => [fullLinkRowKey(row), row])).values()]\n }\n\n async getByPrimaryIdBatch(params: {\n projectId: string\n items: readonly { objectTypeId: string; primaryId: string }[]\n }): Promise<Map<string, ObjectRow>> {\n const result = new Map<string, ObjectRow>()\n for (const item of params.items) {\n const row = await this.getByPrimaryId({\n projectId: params.projectId,\n objectTypeId: item.objectTypeId,\n primaryId: item.primaryId,\n })\n if (row) {\n result.set(`${item.objectTypeId}:${item.primaryId}`, row)\n }\n }\n return result\n }\n\n async listLinksBatch(params: {\n projectId: string\n items: readonly { objectTypeId: string; objectId: string; linkId: string }[]\n }): Promise<Map<string, ObjectLinkRow[]>> {\n const result = new Map<string, ObjectLinkRow[]>()\n for (const item of params.items) {\n const rows = await this.listLinks({\n projectId: params.projectId,\n objectTypeId: item.objectTypeId,\n objectId: item.objectId,\n linkId: item.linkId,\n })\n if (rows.length > 0) {\n result.set(`${item.objectTypeId}:${item.objectId}:${item.linkId}`, [...rows])\n }\n }\n return result\n }\n\n async listIncidentLinksBatch(params: {\n projectId: string\n items: readonly { objectTypeId: string; objectId: string }[]\n }): Promise<readonly ObjectLinkRow[]> {\n const deduped = new Map<string, ObjectLinkRow>()\n for (const item of params.items) {\n const rows = await this.listLinks({\n projectId: params.projectId,\n objectTypeId: item.objectTypeId,\n objectId: item.objectId,\n direction: \"both\",\n })\n for (const row of rows) {\n deduped.set(fullLinkRowKey(row), row)\n }\n }\n return [...deduped.values()]\n }\n\n async listByPrimaryIdPage(params: {\n projectId: string\n objectTypeId: string\n afterPrimaryId?: string\n limit: number\n }): Promise<{ objects: readonly ObjectRow[]; nextPrimaryId?: string }> {\n assertReconciliationPageLimit(params.limit)\n const bucket = this.rows.get(objectRowKey(params.projectId, params.objectTypeId))\n const rows = [...(bucket?.values() ?? [])]\n .filter(\n (row) =>\n !params.afterPrimaryId || comparePrimaryIds(row.primaryId, params.afterPrimaryId) > 0\n )\n .sort((left, right) => comparePrimaryIds(left.primaryId, right.primaryId))\n .slice(0, params.limit + 1)\n const hasMore = rows.length > params.limit\n const objects = rows.slice(0, params.limit).map((row) => structuredClone(row))\n const last = objects.at(-1)\n return {\n objects,\n ...(hasMore && last ? { nextPrimaryId: last.primaryId } : {}),\n }\n }\n\n async list(params: {\n projectId: string\n objectTypeId?: string | readonly string[]\n primaryIdPrefix?: string\n primaryIdSuffix?: string\n updatedAfter?: Date\n updatedBefore?: Date\n createdAfter?: Date\n createdBefore?: Date\n limit?: number\n offset?: number\n orderBy?: \"createdAt\" | \"updatedAt\" | \"primaryId\"\n order?: \"asc\" | \"desc\"\n }): Promise<{ objects: readonly ObjectRow[]; hasMore: boolean; total: number }> {\n let allRows: ObjectRow[] = []\n\n if (params.objectTypeId) {\n const typeIds = Array.isArray(params.objectTypeId)\n ? params.objectTypeId\n : [params.objectTypeId]\n for (const typeId of typeIds) {\n const bucket = this.rows.get(objectRowKey(params.projectId, typeId))\n if (bucket) {\n allRows.push(...bucket.values())\n }\n }\n } else {\n for (const [key, bucket] of this.rows) {\n if (key.startsWith(`${params.projectId}:`)) {\n allRows.push(...bucket.values())\n }\n }\n }\n\n const {\n primaryIdPrefix,\n primaryIdSuffix,\n updatedAfter,\n updatedBefore,\n createdAfter,\n createdBefore,\n } = params\n if (\n primaryIdPrefix ||\n primaryIdSuffix ||\n updatedAfter ||\n updatedBefore ||\n createdAfter ||\n createdBefore\n ) {\n allRows = allRows.filter(\n (row) =>\n (!primaryIdPrefix || row.primaryId.startsWith(primaryIdPrefix)) &&\n (!primaryIdSuffix || row.primaryId.endsWith(primaryIdSuffix)) &&\n (!updatedAfter || row.updatedAt >= updatedAfter) &&\n (!updatedBefore || row.updatedAt <= updatedBefore) &&\n (!createdAfter || row.createdAt >= createdAfter) &&\n (!createdBefore || row.createdAt <= createdBefore)\n )\n }\n\n const total = allRows.length\n\n const offset = params.offset ?? 0\n const limit = params.limit ?? 50\n if (limit === 0) return { objects: [], hasMore: offset < total, total }\n\n const orderBy = params.orderBy ?? \"updatedAt\"\n const order = params.order ?? \"desc\"\n\n allRows.sort((a, b) => {\n let comparison = 0\n switch (orderBy) {\n case \"primaryId\":\n comparison = a.primaryId.localeCompare(b.primaryId)\n break\n case \"createdAt\":\n comparison = a.createdAt.getTime() - b.createdAt.getTime()\n break\n default:\n comparison = a.updatedAt.getTime() - b.updatedAt.getTime()\n break\n }\n return order === \"desc\" ? -comparison : comparison\n })\n\n const objects = allRows.slice(offset, offset + limit)\n const hasMore = offset + limit < total\n\n return { objects, hasMore, total }\n }\n\n private deleteObjectRow(projectId: string, objectTypeId: string, primaryId: string): void {\n const bucket = this.rows.get(objectRowKey(projectId, objectTypeId))\n bucket?.delete(primaryId)\n }\n\n private deleteLinkRow(\n projectId: string,\n sourceTypeId: string,\n sourceId: string,\n linkId: string,\n targetTypeId: string,\n targetId: string\n ): void {\n const bucket = this.links.get(sourceLinkBucketKey(projectId, sourceTypeId, sourceId))\n bucket?.delete(linkRowKey(linkId, targetTypeId, targetId))\n }\n}\n\nfunction assertReconciliationPageLimit(limit: number): void {\n if (!Number.isSafeInteger(limit) || limit <= 0) {\n throw new Error(\"Object reconciliation page limit must be a positive safe integer.\")\n }\n}\n\nfunction cloneObjectBuckets(\n rows: Map<string, Map<string, ObjectRow>>\n): Map<string, Map<string, ObjectRow>> {\n const clone = new Map<string, Map<string, ObjectRow>>()\n for (const [key, bucket] of rows) {\n clone.set(\n key,\n new Map([...bucket.entries()].map(([primaryId, row]) => [primaryId, structuredClone(row)]))\n )\n }\n return clone\n}\n\nfunction cloneLinkBuckets(\n links: Map<string, Map<string, ObjectLinkRow>>\n): Map<string, Map<string, ObjectLinkRow>> {\n const clone = new Map<string, Map<string, ObjectLinkRow>>()\n for (const [key, bucket] of links) {\n clone.set(\n key,\n new Map([...bucket.entries()].map(([linkId, row]) => [linkId, structuredClone(row)]))\n )\n }\n return clone\n}\n\nfunction completeEvaluation(entries: QueryEntry[]): QueryEvaluation {\n return {\n entries,\n total: entries.length,\n hasMore: false,\n }\n}\n\nfunction matchesPredicate(row: ObjectRow, predicate: ObjectQueryPredicate): boolean {\n switch (predicate.op) {\n case \"and\":\n return predicate.items.every((item) => matchesPredicate(row, item))\n case \"or\":\n return predicate.items.some((item) => matchesPredicate(row, item))\n case \"not\":\n return !matchesPredicate(row, predicate.item)\n case \"eq\":\n return queryScalarValuesEqual(\n row.properties[predicate.propertyId],\n predicate.value,\n predicate.scalarKind\n )\n case \"neq\":\n return !queryScalarValuesEqual(\n row.properties[predicate.propertyId],\n predicate.value,\n predicate.scalarKind\n )\n case \"lt\":\n return (\n compareQueryScalarValues(\n row.properties[predicate.propertyId],\n predicate.value,\n predicate.scalarKind\n ) < 0\n )\n case \"lte\":\n return (\n compareQueryScalarValues(\n row.properties[predicate.propertyId],\n predicate.value,\n predicate.scalarKind\n ) <= 0\n )\n case \"gt\":\n return (\n compareQueryScalarValues(\n row.properties[predicate.propertyId],\n predicate.value,\n predicate.scalarKind\n ) > 0\n )\n case \"gte\":\n return (\n compareQueryScalarValues(\n row.properties[predicate.propertyId],\n predicate.value,\n predicate.scalarKind\n ) >= 0\n )\n case \"in\":\n return predicate.values.some((value) =>\n queryScalarValuesEqual(row.properties[predicate.propertyId], value, predicate.scalarKind)\n )\n case \"exists\": {\n const exists =\n Object.hasOwn(row.properties, predicate.propertyId) &&\n row.properties[predicate.propertyId] !== undefined\n return predicate.value ? exists : !exists\n }\n case \"contains\":\n return containsValue(row.properties[predicate.propertyId], predicate.value)\n }\n}\n\nfunction containsValue(actual: unknown, expected: unknown): boolean {\n if (typeof actual === \"string\" && typeof expected === \"string\") {\n return actual.includes(expected)\n }\n\n if (Array.isArray(actual)) {\n return actual.some((item) => queryScalarValuesEqual(item, expected))\n }\n\n if (isPlainObject(actual) && typeof expected === \"string\") {\n return Object.hasOwn(actual, expected)\n }\n\n return false\n}\n\nfunction textScore(\n row: ObjectRow,\n query: string,\n fields: readonly string[] | undefined,\n fieldsByObjectType: Readonly<Record<string, readonly string[]>> | undefined\n): number {\n const terms = tokenize(query)\n if (terms.length === 0) return 0\n\n const scopedFields = fields ?? fieldsByObjectType?.[row.objectTypeId]\n const values = fields\n ? fields.flatMap((field) => collectTextValues(row.properties[field]))\n : scopedFields\n ? scopedFields.flatMap((field) => collectTextValues(row.properties[field]))\n : [row.primaryId, ...Object.values(row.properties).flatMap(collectTextValues)]\n const haystack = values.join(\" \").toLowerCase()\n if (!terms.every((term) => haystack.includes(term))) return 0\n\n const phrase = query.trim().toLowerCase()\n const phraseBoost = phrase.length > 0 && haystack.includes(phrase) ? terms.length : 0\n return terms.reduce((score, term) => score + countOccurrences(haystack, term), phraseBoost)\n}\n\nfunction tokenize(query: string): string[] {\n return query\n .trim()\n .toLowerCase()\n .split(/\\s+/)\n .filter((term) => term.length > 0)\n}\n\nfunction collectTextValues(value: unknown): string[] {\n if (typeof value === \"string\") return [value]\n if (Array.isArray(value)) return value.flatMap(collectTextValues)\n return []\n}\n\nfunction countOccurrences(value: string, needle: string): number {\n if (!needle) return 0\n let count = 0\n let index = value.indexOf(needle)\n while (index !== -1) {\n count += 1\n index = value.indexOf(needle, index + needle.length)\n }\n return count\n}\n\nfunction vectorSimilarity(actual: unknown, expected: readonly number[]): number | null {\n if (!Array.isArray(actual) || actual.length !== expected.length || actual.length === 0) {\n return null\n }\n\n let dot = 0\n let actualNorm = 0\n let expectedNorm = 0\n for (let index = 0; index < expected.length; index += 1) {\n const actualValue = actual[index]\n const expectedValue = expected[index]\n if (\n typeof actualValue !== \"number\" ||\n typeof expectedValue !== \"number\" ||\n !Number.isFinite(actualValue) ||\n !Number.isFinite(expectedValue)\n ) {\n return null\n }\n\n dot += actualValue * expectedValue\n actualNorm += actualValue * actualValue\n expectedNorm += expectedValue * expectedValue\n }\n\n if (actualNorm === 0 || expectedNorm === 0) return null\n return dot / (Math.sqrt(actualNorm) * Math.sqrt(expectedNorm))\n}\n\nfunction sortEntries(\n entries: readonly QueryEntry[],\n fields: readonly ObjectQuerySortField[]\n): QueryEntry[] {\n return [...entries].sort((left, right) => {\n for (const field of fields) {\n const comparison = compareSortField(left, right, field)\n if (comparison !== 0) return comparison\n }\n return (\n left.order - right.order || rowIdentityKey(left.row).localeCompare(rowIdentityKey(right.row))\n )\n })\n}\n\nfunction compareSortField(\n left: QueryEntry,\n right: QueryEntry,\n field: ObjectQuerySortField\n): number {\n if (field.kind === \"relevance\") {\n const direction = field.direction ?? \"desc\"\n const comparison = right.score - left.score\n return direction === \"desc\" ? comparison : -comparison\n }\n\n const leftValue = left.row.properties[field.propertyId]\n const rightValue = right.row.properties[field.propertyId]\n const leftMissing = leftValue === undefined || leftValue === null\n const rightMissing = rightValue === undefined || rightValue === null\n if (leftMissing && rightMissing) return 0\n if (leftMissing) return 1\n if (rightMissing) return -1\n\n const comparison = compareQueryScalarValues(leftValue, rightValue, field.scalarKind)\n if (Number.isNaN(comparison)) return 0\n return field.direction === \"desc\" ? -comparison : comparison\n}\n\nfunction compareEntriesByRelevance(left: QueryEntry, right: QueryEntry): number {\n return (\n right.score - left.score || rowIdentityKey(left.row).localeCompare(rowIdentityKey(right.row))\n )\n}\n\nfunction projectRow(row: ObjectRow, properties: readonly string[]): ObjectRow {\n const projected: Record<string, unknown> = {}\n for (const propertyId of properties) {\n if (Object.hasOwn(row.properties, propertyId)) {\n projected[propertyId] = row.properties[propertyId]\n }\n }\n return {\n ...row,\n properties: projected,\n }\n}\n\nfunction stripOuterRowShape(query: ObjectQuery): ObjectQuery {\n switch (query.kind) {\n case \"limit\":\n case \"page\":\n case \"project\":\n case \"sort\":\n // `expand` is output-shaping: aggregates ignore it (it never changes which\n // objects match).\n case \"expand\":\n return stripOuterRowShape(query.input)\n default:\n return query\n }\n}\n\nfunction buildFacetResults(\n rows: readonly ObjectRow[],\n facets: readonly ObjectFacetRequest[]\n): ObjectFacetResult[] {\n return facets.map((facet) => ({\n propertyId: facet.propertyId,\n buckets: buildFacetBuckets(rows, facet),\n }))\n}\n\nfunction buildFacetBuckets(\n rows: readonly ObjectRow[],\n facet: ObjectFacetRequest\n): ObjectFacetResult[\"buckets\"] {\n const buckets = new Map<string, { value: unknown; count: number }>()\n\n for (const row of rows) {\n if (!Object.hasOwn(row.properties, facet.propertyId)) continue\n const value = row.properties[facet.propertyId]\n if (value === undefined) continue\n const key = facetValueKey(value)\n const existing = buckets.get(key)\n if (existing) {\n existing.count += 1\n } else {\n buckets.set(key, { value, count: 1 })\n }\n }\n\n return [...buckets.values()]\n .sort(\n (left, right) =>\n right.count - left.count ||\n facetValueSortKey(left.value).localeCompare(facetValueSortKey(right.value))\n )\n .slice(0, facet.limit)\n}\n\nfunction facetValueKey(value: unknown): string {\n return JSON.stringify(value) ?? String(value)\n}\n\nfunction facetValueSortKey(value: unknown): string {\n return JSON.stringify(value) ?? String(value)\n}\n\nfunction rowIdentityKey(row: ObjectRow): string {\n return rowIdentityKeyParts(row.objectTypeId, row.primaryId)\n}\n\nfunction rowIdentityKeyParts(objectTypeId: string, primaryId: string): string {\n return `${objectTypeId}:${primaryId}`\n}\n\nfunction upsertEntry(entriesByKey: Map<string, QueryEntry>, entry: QueryEntry): void {\n const key = rowIdentityKey(entry.row)\n const existing = entriesByKey.get(key)\n if (!existing) {\n entriesByKey.set(key, entry)\n return\n }\n\n if (entry.score > existing.score) {\n entriesByKey.set(key, {\n ...existing,\n score: entry.score,\n })\n }\n}\n\nfunction encodePageOffset(offset: number): string {\n return `${PAGE_TOKEN_PREFIX}${offset}`\n}\n\nfunction decodePageOffset(token: string | undefined): number {\n if (!token) return 0\n if (!token.startsWith(PAGE_TOKEN_PREFIX)) {\n throw new Error(\"[Sixb] Invalid object query page token\")\n }\n\n const offset = Number(token.slice(PAGE_TOKEN_PREFIX.length))\n if (!Number.isInteger(offset) || offset < 0) {\n throw new Error(\"[Sixb] Invalid object query page token\")\n }\n return offset\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n",
|
|
14
|
-
"import { MaterializationValidationError } from \"../../../materialization/errors\"\nimport type { OntologyMaterializationOrigin } from \"../../../materialization/model\"\nimport type { OntologyCommitOriginSelector, OntologyCommitRecord } from \"../commits\"\nimport type {\n MaterializationWorkRecord,\n StoredLinkOverride,\n StoredObjectOverride,\n} from \"../materializations\"\nimport type { OntologyOutboxRecord } from \"../outbox\"\nimport type { OntologySourceRecord, StageSourceAssertion } from \"../sources\"\n\nexport interface InMemorySourceMaterialization extends OntologySourceRecord {\n readonly rowsByEntity: Map<string, StageSourceAssertion>\n readonly rootOrdinals: Map<string, number>\n readonly ordinalRoots: Map<number, string>\n}\n\nexport interface InMemoryStoredObjectOverride extends StoredObjectOverride {\n readonly projectId: string\n}\n\nexport interface InMemoryStoredLinkOverride extends StoredLinkOverride {\n readonly projectId: string\n}\n\nexport interface InMemoryOntologyState {\n readonly commitsById: Map<string, OntologyCommitRecord>\n readonly commitIdByIdempotency: Map<string, string>\n readonly commitIdByOrigin: Map<string, string>\n readonly sourceMaterializations: Map<string, InMemorySourceMaterialization>\n readonly objectOverrides: Map<string, InMemoryStoredObjectOverride>\n readonly linkOverrides: Map<string, InMemoryStoredLinkOverride>\n readonly outbox: Map<string, OntologyOutboxRecord>\n}\n\n/** @internal Test-only failure injection for the in-memory ontology provider. */\nexport interface InMemoryOntologyStorageTestHooks {\n readonly beforeRead?: (boundary: string) => void\n readonly beforeWrite?: (boundary: string, ordinal: number) => void\n readonly observeBuffer?: (boundary: string, rows: number) => void\n readonly observeWork?: (records: readonly MaterializationWorkRecord[]) => void\n}\n\nexport function createInMemoryOntologyState(): InMemoryOntologyState {\n return {\n commitsById: new Map(),\n commitIdByIdempotency: new Map(),\n commitIdByOrigin: new Map(),\n sourceMaterializations: new Map(),\n objectOverrides: new Map(),\n linkOverrides: new Map(),\n outbox: new Map(),\n }\n}\n\nexport function projectEntityKey(projectId: string, entityKey: string): string {\n return JSON.stringify([projectId, entityKey])\n}\n\nexport function sourceMaterializationKey(\n projectId: string,\n sourceId: string,\n materializationId: string\n): string {\n return JSON.stringify([projectId, sourceId, materializationId])\n}\n\nexport function sourceMaterializationRecord(\n materialization: InMemorySourceMaterialization\n): OntologySourceRecord {\n const {\n rowsByEntity: _rows,\n rootOrdinals: _roots,\n ordinalRoots: _ordinals,\n ...record\n } = materialization\n return structuredClone(record)\n}\n\nexport function commitKey(projectId: string, commitId: string): string {\n return JSON.stringify([projectId, commitId])\n}\n\nexport function idempotencyKey(projectId: string, key: string): string {\n return JSON.stringify([projectId, key])\n}\n\nexport function ontologyCommitOriginSelector(\n origin: OntologyMaterializationOrigin\n): OntologyCommitOriginSelector | null {\n if (origin.kind === \"action\") return { kind: \"action\", actionRunId: origin.runId }\n if (origin.kind === \"projection\") {\n return { kind: \"projection\", projectionRunId: origin.projectionRunId }\n }\n if (origin.kind === \"telemetry\" && origin.source.kind === \"projection\") {\n return {\n kind: \"telemetry\",\n projectionRunId: origin.source.projectionRunId,\n batchOrdinal: origin.source.batchOrdinal,\n }\n }\n return null\n}\n\nexport function commitOriginKey(projectId: string, origin: OntologyCommitOriginSelector): string {\n switch (origin.kind) {\n case \"action\":\n return JSON.stringify([projectId, origin.kind, origin.actionRunId])\n case \"projection\":\n return JSON.stringify([projectId, origin.kind, origin.projectionRunId])\n case \"telemetry\":\n return JSON.stringify([projectId, origin.kind, origin.projectionRunId, origin.batchOrdinal])\n }\n}\n\nexport function outboxKey(projectId: string, eventId: string): string {\n return JSON.stringify([projectId, eventId])\n}\n\nexport function cloneOntologyState(state: InMemoryOntologyState): InMemoryOntologyState {\n return structuredClone(state)\n}\n\nexport function restoreOntologyState(\n target: InMemoryOntologyState,\n snapshot: InMemoryOntologyState\n): void {\n for (const key of Object.keys(target) as (keyof InMemoryOntologyState)[]) {\n const targetMap = target[key] as Map<unknown, unknown>\n const sourceMap = structuredClone(snapshot[key]) as Map<unknown, unknown>\n targetMap.clear()\n for (const [entryKey, value] of sourceMap) targetMap.set(entryKey, value)\n }\n}\n\n/** Insert `value` into a sorted, size-bounded accumulator, dropping the largest entry past `limit`. */\nexport function insertBounded<T>(\n values: T[],\n value: T,\n limit: number,\n compare: (left: T, right: T) => number\n): void {\n let index = values.findIndex((candidate) => compare(value, candidate) < 0)\n if (index < 0) index = values.length\n values.splice(index, 0, value)\n if (values.length > limit) values.pop()\n}\n\nexport function assertNonblank(value: string, label: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new MaterializationValidationError(`${label} must be nonblank.`)\n }\n}\n\nexport function assertTimestamp(value: string, label: string): number {\n const milliseconds = Date.parse(value)\n if (!Number.isFinite(milliseconds) || new Date(milliseconds).toISOString() !== value) {\n throw new MaterializationValidationError(`${label} must be a canonical UTC timestamp.`)\n }\n return milliseconds\n}\n",
|
|
15
|
-
"import type {\n GetOntologyCommitByIdempotencyKeyInput,\n GetOntologyCommitByIdInput,\n GetOntologyCommitByOriginInput,\n ListOntologyCommitsInput,\n ListOntologyCommitsResult,\n OntologyCommitRecord,\n OntologyCommitRunSelector,\n OntologyCommitStorage,\n} from \"../commits\"\nimport {\n commitKey,\n commitOriginKey,\n type InMemoryOntologyState,\n idempotencyKey,\n} from \"./shared-state\"\n\nexport class InMemoryOntologyCommitStorage implements OntologyCommitStorage {\n constructor(\n private readonly state: InMemoryOntologyState,\n private readonly runRootOperation: <T>(run: () => Promise<T> | T) => Promise<T>\n ) {}\n\n async getByIdempotencyKey(\n input: GetOntologyCommitByIdempotencyKeyInput\n ): Promise<OntologyCommitRecord | null> {\n return this.runRootOperation(() => {\n const id = this.state.commitIdByIdempotency.get(\n idempotencyKey(input.projectId, input.idempotencyKey)\n )\n if (!id) return null\n return structuredClone(this.state.commitsById.get(commitKey(input.projectId, id)) ?? null)\n })\n }\n\n async getById(input: GetOntologyCommitByIdInput): Promise<OntologyCommitRecord | null> {\n return this.runRootOperation(() =>\n structuredClone(this.state.commitsById.get(commitKey(input.projectId, input.id)) ?? null)\n )\n }\n\n async getByOrigin(input: GetOntologyCommitByOriginInput): Promise<OntologyCommitRecord | null> {\n return this.runRootOperation(() => {\n assertOriginLookup(input)\n const id = this.state.commitIdByOrigin.get(commitOriginKey(input.projectId, input.origin))\n if (!id) return null\n return structuredClone(this.state.commitsById.get(commitKey(input.projectId, id)) ?? null)\n })\n }\n\n async list(input: ListOntologyCommitsInput): Promise<ListOntologyCommitsResult> {\n return this.runRootOperation(() => {\n if (input.projectId.trim().length === 0 || input.run?.id.trim().length === 0) {\n throw new Error(\"[Sixb] Ontology commit project and run ids must be nonblank.\")\n }\n const offset = input.offset ?? 0\n const limit = input.limit ?? this.state.commitsById.size\n if (\n !Number.isSafeInteger(offset) ||\n offset < 0 ||\n !Number.isSafeInteger(limit) ||\n limit < 0\n ) {\n throw new Error(\n \"[Sixb] Ontology commit list limit and offset must be nonnegative integers.\"\n )\n }\n const direction = input.order === \"desc\" ? -1 : 1\n const commits = [...this.state.commitsById.values()]\n .filter((commit) => commit.projectId === input.projectId)\n .filter((commit) => (input.run ? commitMatchesRun(commit, input.run) : true))\n .sort((left, right) => {\n if (input.run?.kind === \"projection\") {\n const byOrdinal = projectionRunOrdinal(left) - projectionRunOrdinal(right)\n if (byOrdinal !== 0) return byOrdinal * direction\n }\n const byTime = left.committedAt.localeCompare(right.committedAt)\n if (byTime !== 0) return byTime * direction\n return left.id.localeCompare(right.id) * direction\n })\n const total = commits.length\n const page = commits.slice(offset, offset + limit).map((commit) => structuredClone(commit))\n return { commits: page, total, hasMore: offset + page.length < total }\n })\n }\n}\n\nfunction assertOriginLookup(input: GetOntologyCommitByOriginInput): void {\n if (input.projectId.trim().length === 0) {\n throw new Error(\"[Sixb] Ontology commit project id must be nonblank.\")\n }\n const runId =\n input.origin.kind === \"action\" ? input.origin.actionRunId : input.origin.projectionRunId\n if (runId.trim().length === 0) {\n throw new Error(\"[Sixb] Ontology commit origin run id must be nonblank.\")\n }\n if (\n input.origin.kind === \"telemetry\" &&\n (!Number.isSafeInteger(input.origin.batchOrdinal) || input.origin.batchOrdinal < 0)\n ) {\n throw new Error(\"[Sixb] Ontology telemetry commit batch ordinal must be nonnegative.\")\n }\n}\n\nfunction commitMatchesRun(commit: OntologyCommitRecord, run: OntologyCommitRunSelector): boolean {\n if (run.kind === \"action\") {\n return commit.origin.kind === \"action\" && commit.origin.runId === run.id\n }\n if (commit.origin.kind === \"projection\") return commit.origin.projectionRunId === run.id\n return (\n commit.origin.kind === \"telemetry\" &&\n commit.origin.source.kind === \"projection\" &&\n commit.origin.source.projectionRunId === run.id\n )\n}\n\nfunction projectionRunOrdinal(commit: OntologyCommitRecord): number {\n if (commit.origin.kind === \"telemetry\" && commit.origin.source.kind === \"projection\") {\n return commit.origin.source.batchOrdinal\n }\n return 0\n}\n",
|
|
16
|
-
"import type { TelemetrySeriesRef } from \"../../materialization/model\"\nimport type { StoredTelemetryPoint } from \"../ontology/materializations\"\nimport type { TimeseriesHistoryBatchInput, TimeseriesPoint, TimeseriesStorage } from \"./types\"\n\nfunction pointKey(\n projectId: string,\n objectTypeId: string,\n objectId: string,\n propertyId: string\n): string {\n return JSON.stringify([projectId, objectTypeId, objectId, propertyId])\n}\n\nexport class InMemoryTimeseriesStorage implements TimeseriesStorage {\n // A telemetry point is uniquely identified by (series, at): one value per\n // instant per series. Re-applying the same instant is a last-write-wins\n // upsert, which makes telemetry writes idempotent under replay for free.\n private readonly pointsByKey = new Map<string, Map<number, TimeseriesPoint>>()\n\n constructor() {\n materializerAdapters.set(this, {\n getExactPoint: (projectId, series, at) => this.getExactPoint(projectId, series, at),\n listLatestForObject: (projectId, objectTypeId, objectId) =>\n this.listLatestForObject(projectId, objectTypeId, objectId),\n applyExactPoint: (projectId, point) => this.applyExactPoint(projectId, point),\n })\n }\n\n snapshot(): InMemoryTimeseriesStorageSnapshot {\n return {\n pointsByKey: structuredClone(this.pointsByKey),\n }\n }\n\n restore(snapshot: InMemoryTimeseriesStorageSnapshot): void {\n this.pointsByKey.clear()\n for (const [key, points] of structuredClone(snapshot.pointsByKey)) {\n this.pointsByKey.set(key, points)\n }\n }\n\n private getExactPoint(\n projectId: string,\n series: TelemetrySeriesRef,\n at: string\n ): TimeseriesPoint | null {\n const point =\n this.pointsByKey\n .get(\n pointKey(\n projectId,\n series.object.objectTypeId,\n series.object.primaryId,\n series.propertyId\n )\n )\n ?.get(new Date(at).getTime()) ?? null\n return point ? clonePoint(point) : null\n }\n\n private listLatestForObject(\n projectId: string,\n objectTypeId: string,\n objectId: string\n ): TimeseriesPoint[] {\n const latest: TimeseriesPoint[] = []\n for (const series of this.pointsByKey.values()) {\n let point: TimeseriesPoint | null = null\n for (const candidate of series.values()) {\n if (\n candidate.projectId !== projectId ||\n candidate.objectTypeId !== objectTypeId ||\n candidate.objectId !== objectId\n ) {\n continue\n }\n if (!point || candidate.at > point.at) point = candidate\n }\n if (point) latest.push(clonePoint(point))\n }\n return latest\n }\n\n private applyExactPoint(projectId: string, point: StoredTelemetryPoint): void {\n const key = pointKey(\n projectId,\n point.series.object.objectTypeId,\n point.series.object.primaryId,\n point.series.propertyId\n )\n const series = this.pointsByKey.get(key) ?? new Map<number, TimeseriesPoint>()\n series.set(new Date(point.at).getTime(), {\n projectId,\n objectTypeId: point.series.object.objectTypeId,\n objectId: point.series.object.primaryId,\n propertyId: point.series.propertyId,\n value: structuredClone(point.value),\n ...(point.unit !== undefined ? { unit: point.unit } : {}),\n at: new Date(point.at),\n lastCommitId: point.lastCommitId,\n })\n this.pointsByKey.set(key, series)\n }\n\n async getHistory(params: {\n projectId: string\n objectTypeId: string\n objectId: string\n propertyId: string\n from?: Date\n to?: Date\n limit?: number\n order?: \"asc\" | \"desc\"\n }): Promise<readonly TimeseriesPoint[]> {\n const key = pointKey(params.projectId, params.objectTypeId, params.objectId, params.propertyId)\n const { from, to } = params\n let points = [...(this.pointsByKey.get(key)?.values() ?? [])]\n if (from || to) {\n points = points.filter((point) => (!from || point.at >= from) && (!to || point.at <= to))\n }\n\n points.sort((a, b) => a.at.getTime() - b.at.getTime())\n if (params.order === \"desc\") {\n points.reverse()\n }\n\n if (params.limit !== undefined) {\n points = points.slice(0, Math.max(0, params.limit))\n }\n\n return points.map(clonePoint)\n }\n\n async getHistoryBatch(input: TimeseriesHistoryBatchInput): Promise<\n readonly {\n objectTypeId: string\n objectId: string\n propertyId: string\n points: readonly TimeseriesPoint[]\n }[]\n > {\n const results = []\n for (const series of input.series) {\n results.push({\n ...series,\n points: await this.getHistory({\n projectId: input.projectId,\n objectTypeId: series.objectTypeId,\n objectId: series.objectId,\n propertyId: series.propertyId,\n from: input.from,\n to: input.to,\n limit: input.limitPerSeries,\n order: input.order,\n }),\n })\n }\n return results\n }\n\n async getLatest(params: {\n projectId: string\n objectTypeId: string\n objectId: string\n propertyId: string\n }): Promise<TimeseriesPoint | null> {\n const series = this.pointsByKey.get(\n pointKey(params.projectId, params.objectTypeId, params.objectId, params.propertyId)\n )\n if (!series || series.size === 0) {\n return null\n }\n\n let latest: TimeseriesPoint | null = null\n for (const point of series.values()) {\n if (!latest || point.at.getTime() > latest.at.getTime()) {\n latest = point\n }\n }\n return latest ? clonePoint(latest) : null\n }\n}\n\ninterface InMemoryTimeseriesMaterializerAdapter {\n getExactPoint(projectId: string, series: TelemetrySeriesRef, at: string): TimeseriesPoint | null\n listLatestForObject(projectId: string, objectTypeId: string, objectId: string): TimeseriesPoint[]\n applyExactPoint(projectId: string, point: StoredTelemetryPoint): void\n}\n\nconst materializerAdapters = new WeakMap<\n InMemoryTimeseriesStorage,\n InMemoryTimeseriesMaterializerAdapter\n>()\n\n/** @internal Exact access for the in-memory ontology provider; not exported from package barrels. */\nexport function getInMemoryTimeseriesMaterializerAdapter(\n storage: InMemoryTimeseriesStorage\n): InMemoryTimeseriesMaterializerAdapter {\n const adapter = materializerAdapters.get(storage)\n if (!adapter) throw new Error(\"[Sixb] In-memory timeseries materializer adapter is unavailable.\")\n return adapter\n}\n\nfunction clonePoint(point: TimeseriesPoint): TimeseriesPoint {\n return {\n ...structuredClone(point),\n value: structuredClone(point.value),\n at: new Date(point.at),\n }\n}\n\nexport interface InMemoryTimeseriesStorageSnapshot {\n readonly pointsByKey: Map<string, Map<number, TimeseriesPoint>>\n}\n",
|
|
17
|
-
"import { MaterializationConflictError } from \"../../../materialization/errors\"\nimport type {\n EffectiveLinkSnapshot,\n EffectiveObjectSnapshot,\n OntologyLinkRef,\n} from \"../../../materialization/model\"\nimport { linkRefKey, linkRefSortKey, linkScopeSortKey } from \"../../../materialization/refs\"\nimport type { ObjectLinkRow, ObjectRow } from \"../../objects/types\"\nimport type { TimeseriesPoint } from \"../../timeseries/types\"\nimport type {\n StoredLinkOverride,\n StoredObjectOverride,\n StoredTelemetryPoint,\n} from \"../materializations\"\nimport type {\n StageSourceAssertion,\n StoredSourceAssertion,\n StoredSourceLinkAssertion,\n StoredSourceObjectAssertion,\n} from \"../sources\"\nimport type { ReplacementSessionState } from \"./materializations\"\nimport type {\n InMemoryOntologyState,\n InMemorySourceMaterialization,\n InMemoryStoredLinkOverride,\n InMemoryStoredObjectOverride,\n} from \"./shared-state\"\n\nexport function publicObjectOverride(\n value: InMemoryStoredObjectOverride | undefined\n): StoredObjectOverride | null {\n if (!value) return null\n const { projectId: _, ...stored } = value\n return stored\n}\n\nexport function publicLinkOverride(\n value: InMemoryStoredLinkOverride | undefined\n): StoredLinkOverride | null {\n if (!value) return null\n const { projectId: _, ...stored } = value\n return stored\n}\n\nexport function uniqueBy<T>(values: readonly T[], keyOf: (value: T) => string): T[] {\n return [...new Map(values.map((value) => [keyOf(value), structuredClone(value)])).values()]\n}\n\nexport function objectSnapshot(row: ObjectRow): EffectiveObjectSnapshot {\n if (!row.lastCommitId)\n throw new MaterializationConflictError(\n \"effective-state\",\n `Effective object ${row.objectTypeId}:${row.primaryId} lacks materializer provenance.`\n )\n return {\n ref: { objectTypeId: row.objectTypeId, primaryId: row.primaryId },\n properties: structuredClone(row.properties) as EffectiveObjectSnapshot[\"properties\"],\n version: row.version,\n createdAt: row.createdAt.toISOString(),\n updatedAt: row.updatedAt.toISOString(),\n lastCommitId: row.lastCommitId,\n }\n}\n\nexport function linkSnapshot(row: ObjectLinkRow): EffectiveLinkSnapshot {\n if (!row.lastCommitId)\n throw new MaterializationConflictError(\n \"effective-state\",\n `Effective link lacks materializer provenance.`\n )\n return {\n ref: linkRef(row),\n ...(row.properties\n ? { properties: structuredClone(row.properties) as EffectiveLinkSnapshot[\"properties\"] }\n : {}),\n createdAt: row.createdAt.toISOString(),\n updatedAt: row.updatedAt.toISOString(),\n lastCommitId: row.lastCommitId,\n }\n}\n\nexport function linkRef(row: ObjectLinkRow): OntologyLinkRef {\n return {\n source: { objectTypeId: row.sourceTypeId, primaryId: row.sourceId },\n linkId: row.linkId,\n target: { objectTypeId: row.targetTypeId, primaryId: row.targetId },\n }\n}\n\nexport function storedPoint(point: TimeseriesPoint): StoredTelemetryPoint {\n if (!point.lastCommitId)\n throw new MaterializationConflictError(\n \"timeseries-point\",\n \"Telemetry point lacks materializer provenance.\"\n )\n return {\n series: {\n object: { objectTypeId: point.objectTypeId, primaryId: point.objectId },\n propertyId: point.propertyId,\n },\n value: structuredClone(point.value) as StoredTelemetryPoint[\"value\"],\n ...(point.unit !== undefined ? { unit: point.unit } : {}),\n at: point.at.toISOString(),\n lastCommitId: point.lastCommitId,\n }\n}\n\nexport function findActiveSourceMaterialization(\n state: InMemoryOntologyState,\n projectId: string,\n sourceId: string\n): InMemorySourceMaterialization | undefined {\n let active: InMemorySourceMaterialization | undefined\n for (const materialization of state.sourceMaterializations.values()) {\n if (\n materialization.projectId !== projectId ||\n materialization.source.projectionId !== sourceId ||\n materialization.status !== \"active\"\n ) {\n continue\n }\n if (active) {\n throw new MaterializationConflictError(\n \"source-materialization\",\n `Source '${sourceId}' has more than one active materialization.`\n )\n }\n active = materialization\n }\n return active\n}\n\nexport function storedSource(\n sourceId: string,\n materializationId: string,\n row: StageSourceAssertion\n): StoredSourceAssertion {\n return {\n source: { projectionId: sourceId },\n materializationId,\n root: structuredClone(row.root),\n assertion: structuredClone(row.assertion),\n stagingOrdinal: row.stagingOrdinal,\n } as StoredSourceAssertion\n}\n\nexport function storedSourceObject(\n sourceId: string,\n materializationId: string | undefined,\n row: StageSourceAssertion | undefined\n): StoredSourceObjectAssertion | null {\n if (!materializationId || !row || row.assertion.kind !== \"object\") return null\n return storedSource(sourceId, materializationId, row) as StoredSourceObjectAssertion\n}\n\nexport function storedSourceLink(\n sourceId: string,\n materializationId: string | undefined,\n row: StageSourceAssertion | undefined\n): StoredSourceLinkAssertion | null {\n if (!materializationId || !row || row.assertion.kind !== \"link\") return null\n return storedSource(sourceId, materializationId, row) as StoredSourceLinkAssertion\n}\n\nexport function addReplacementLink(\n replacement: ReplacementSessionState,\n ref: OntologyLinkRef,\n diffRequired: boolean\n): void {\n const key = linkRefKey(ref)\n const existing = replacement.links.get(key)\n if (existing) {\n existing.diffRequired ||= diffRequired\n if (diffRequired) replacement.affectedScopes.add(linkScopeSortKey(ref.source, ref.linkId))\n return\n }\n replacement.links.set(key, {\n ref: structuredClone(ref),\n sortKey: linkRefSortKey(ref),\n diffRequired,\n })\n if (diffRequired) replacement.affectedScopes.add(linkScopeSortKey(ref.source, ref.linkId))\n}\n",
|
|
18
|
-
"import { stableJsonStringify } from \"../../../json\"\nimport { MaterializationConflictError } from \"../../../materialization/errors\"\nimport type {\n MaterializationPlanChunk,\n StoredLinkOverride,\n StoredObjectOverride,\n} from \"../materializations\"\nimport { invalidCorrelation, materializationPlanItems } from \"../provider-work\"\nimport type { SessionState } from \"./materializations\"\n\nexport * from \"../provider-work\"\n\nexport function assertChunkSequence(session: SessionState, chunk: MaterializationPlanChunk): void {\n const planItems = materializationPlanItems(chunk)\n const applyStream = session.workStreams.apply\n const appliedStart = session.appliedPlanItems.length\n if (\n planItems.length > 0 &&\n (!applyStream.started || appliedStart + planItems.length > applyStream.emittedCount)\n ) {\n invalidCorrelation(\"Materialization plan items cannot be applied before they are streamed.\")\n }\n for (let offset = 0; offset < planItems.length; offset += 1) {\n const expected = session.applyWork[appliedStart + offset]?.item\n if (!expected || stableJsonStringify(planItems[offset]) !== stableJsonStringify(expected)) {\n invalidCorrelation(\"Materialization plan items must be applied in exact streamed order.\")\n }\n }\n\n const eventStream = session.workStreams.event\n const appliedOutboxCount = session.outboxEnvelopes.size\n if (\n chunk.outbox.length > 0 &&\n (!eventStream.started || appliedOutboxCount + chunk.outbox.length > eventStream.emittedCount)\n ) {\n invalidCorrelation(\"Materialization events cannot be applied before they are streamed.\")\n }\n for (let offset = 0; offset < chunk.outbox.length; offset += 1) {\n const expected = session.eventWork[appliedOutboxCount + offset]\n const actual = chunk.outbox[offset]?.envelope\n if (!expected || !actual) {\n invalidCorrelation(\"Materialization outbox events must follow exact streamed order.\")\n }\n const { id: _id, commitOrdinal, ...actualDraft } = actual\n if (\n commitOrdinal !== appliedOutboxCount + offset ||\n stableJsonStringify(actualDraft) !== stableJsonStringify(expected.draft)\n ) {\n invalidCorrelation(\"Materialization outbox events must follow exact streamed order.\")\n }\n }\n}\n\nexport function assertLastCommit(\n value: StoredObjectOverride | StoredLinkOverride | undefined,\n expected: string | null,\n label: string\n): void {\n if ((value?.lastCommitId ?? null) !== expected) {\n throw new MaterializationConflictError(\"effective-state\", `Expected ${label} changed.`)\n }\n}\n",
|
|
19
|
-
"import { stableJsonStringify } from \"../../../json\"\nimport { assertPinnedDatasetWatermark } from \"../../../materialization/dataset-watermark\"\nimport { MaterializationConflictError } from \"../../../materialization/errors\"\nimport { createEventId } from \"../../../materialization/identity\"\nimport type {\n EffectiveChangeCounts,\n OntologyObjectRef,\n PinnedDatasetVersion,\n TelemetryCommitResult,\n} from \"../../../materialization/model\"\nimport { linkRefSortKey } from \"../../../materialization/refs\"\nimport {\n getInMemoryObjectMaterializerAdapter,\n type InMemoryObjectStorage,\n} from \"../../objects/in-memory\"\nimport type { MaterializationCardinalityOccupantWorkRecord } from \"../materializations\"\nimport type { SessionState } from \"./materializations\"\nimport { findActiveSourceMaterialization, linkRef } from \"./materializations-state\"\nimport { compareEventWork, invalidCorrelation } from \"./materializations-work\"\nimport { type InMemoryOntologyState, outboxKey, sourceMaterializationKey } from \"./shared-state\"\n\nexport function assertFinalizationCorrelations(\n session: SessionState,\n finalization: import(\"../materializations\").MaterializationPlanFinalization,\n state: InMemoryOntologyState,\n objects: InMemoryObjectStorage\n): void {\n const { commit } = session.header\n const { result, sourceActivations } = finalization\n if (\n result.commitId !== commit.id ||\n result.kind !== commit.intent.kind ||\n result.committedAt !== commit.committedAt ||\n result.created !== true ||\n !Number.isSafeInteger(result.eventCount) ||\n result.eventCount < 0 ||\n result.eventCount !== session.outboxEnvelopes.size\n ) {\n invalidCorrelation(\"Materialization result does not correlate with its commit intent.\")\n }\n for (let ordinal = 0; ordinal < result.eventCount; ordinal += 1) {\n if (!session.outboxEnvelopes.has(ordinal)) {\n invalidCorrelation(\"Outbox event ordinals must be contiguous from zero.\")\n }\n }\n\n if (commit.intent.kind === \"edit\") {\n if (result.kind !== \"edit\" || result.outcomes.length !== commit.intent.operationCount) {\n invalidCorrelation(\"Edit result does not correlate with its operation count.\")\n }\n if (sourceActivations.length !== 0) {\n invalidCorrelation(\"Edit materialization cannot activate a source materialization.\")\n }\n } else if (commit.intent.kind === \"projection\") {\n if (result.kind !== \"projection\" || sourceActivations.length !== 1) {\n invalidCorrelation(\"Projection result requires exactly one correlated source activation.\")\n }\n } else if (result.kind !== \"telemetry\" || sourceActivations.length !== 0) {\n invalidCorrelation(\"Telemetry result does not correlate with its point intent.\")\n }\n\n for (const activation of sourceActivations) {\n assertSourceActivationCorrelation(activation, session, state)\n }\n if (sourceActivations[0]) {\n assertReplacementFullyStreamed(session, sourceActivations[0])\n }\n assertFinalizedWork(session, state, objects)\n if (commit.intent.kind === \"projection\") {\n if (result.kind !== \"projection\" || !projectionCountsCorrelate(session, result.counts)) {\n invalidCorrelation(\"Projection result counts do not correlate with finalized work.\")\n }\n } else if (\n commit.intent.kind === \"telemetry\" &&\n (result.kind !== \"telemetry\" ||\n !telemetryCountsCorrelate(session, commit.intent.pointCount, result))\n ) {\n invalidCorrelation(\"Telemetry result counts do not correlate with finalized work.\")\n }\n}\n\nfunction projectionCountsCorrelate(session: SessionState, actual: EffectiveChangeCounts): boolean {\n const expected = deriveExpectedProjectionCounts(session)\n if (expected === null) return false\n\n return effectiveChangeCountsMatch(actual, expected)\n}\n\ninterface ClassifiedProjectionCounts {\n objects: number\n links: number\n}\n\ninterface AppliedProjectionChangeCounts {\n objectsCreated: number\n objectsUpdated: number\n objectsDeleted: number\n linksCreated: number\n linksUpdated: number\n linksDeleted: number\n}\n\nconst effectiveChangeCountKeys = [\n \"objectsCreated\",\n \"objectsUpdated\",\n \"objectsDeleted\",\n \"objectsUnchanged\",\n \"linksCreated\",\n \"linksUpdated\",\n \"linksDeleted\",\n \"linksUnchanged\",\n] as const satisfies readonly (keyof EffectiveChangeCounts)[]\n\nfunction deriveExpectedProjectionCounts(session: SessionState): EffectiveChangeCounts | null {\n const classified = countClassifiedProjectionEntities(session)\n const applied = countAppliedProjectionChanges(session)\n const objectsUnchanged = remainingClassifiedCount(\n classified.objects,\n applied.objectsCreated,\n applied.objectsUpdated,\n applied.objectsDeleted\n )\n const linksUnchanged = remainingClassifiedCount(\n classified.links,\n applied.linksCreated,\n applied.linksUpdated,\n applied.linksDeleted\n )\n\n if (objectsUnchanged < 0 || linksUnchanged < 0) return null\n\n return { ...applied, objectsUnchanged, linksUnchanged }\n}\n\nfunction countClassifiedProjectionEntities(session: SessionState): ClassifiedProjectionCounts {\n const counts = { objects: 0, links: 0 }\n\n for (const record of session.work.values()) {\n if (record.kind !== \"classification\") continue\n\n if (record.entityKind === \"object\") counts.objects += 1\n if (record.entityKind === \"link\") counts.links += 1\n }\n\n return counts\n}\n\nfunction countAppliedProjectionChanges(session: SessionState): AppliedProjectionChangeCounts {\n const counts: AppliedProjectionChangeCounts = {\n objectsCreated: 0,\n objectsUpdated: 0,\n objectsDeleted: 0,\n linksCreated: 0,\n linksUpdated: 0,\n linksDeleted: 0,\n }\n\n for (const work of session.applyWork) {\n const { item } = work\n\n switch (item.kind) {\n case \"object-upsert\":\n if (item.value.expected.exists) counts.objectsUpdated += 1\n else counts.objectsCreated += 1\n break\n case \"object-delete\":\n counts.objectsDeleted += 1\n break\n case \"link-upsert\":\n if (item.value.expected.exists) counts.linksUpdated += 1\n else counts.linksCreated += 1\n break\n case \"link-delete\":\n counts.linksDeleted += 1\n break\n }\n }\n\n return counts\n}\n\nfunction remainingClassifiedCount(\n classified: number,\n created: number,\n updated: number,\n deleted: number\n): number {\n return classified - created - updated - deleted\n}\n\nfunction effectiveChangeCountsMatch(\n actual: EffectiveChangeCounts,\n expected: EffectiveChangeCounts\n): boolean {\n return effectiveChangeCountKeys.every((key) => {\n const count = actual[key]\n return Number.isSafeInteger(count) && count >= 0 && count === expected[key]\n })\n}\n\nfunction telemetryCountsCorrelate(\n session: SessionState,\n pointCount: number,\n actual: TelemetryCommitResult\n): boolean {\n let pointsCreated = 0\n let pointsUpdated = 0\n let latestObjectsChanged = 0\n for (const work of session.applyWork) {\n if (work.item.kind === \"point-upsert\") {\n if (work.item.value.expected.lastCommitId === null) pointsCreated += 1\n else pointsUpdated += 1\n } else if (work.item.kind === \"object-upsert\") {\n latestObjectsChanged += 1\n }\n }\n const expected = {\n pointsCreated,\n pointsUpdated,\n pointsUnchanged: pointCount - pointsCreated - pointsUpdated,\n latestObjectsChanged,\n }\n return (\n expected.pointsUnchanged >= 0 &&\n (Object.keys(expected) as (keyof typeof expected)[]).every(\n (key) =>\n Number.isSafeInteger(actual[key]) && actual[key] >= 0 && actual[key] === expected[key]\n )\n )\n}\n\nfunction assertSourceActivationCorrelation(\n activation: import(\"../materializations\").SourceActivationWrite,\n session: SessionState,\n state: InMemoryOntologyState\n): void {\n const { header } = session\n const { commit } = header\n if (\n commit.intent.kind !== \"projection\" ||\n commit.origin.kind !== \"projection\" ||\n activation.source.projectionId !== commit.intent.source.projectionId ||\n activation.source.projectionId !== commit.origin.projectionId ||\n activation.execution.projectionRunId !== commit.origin.projectionRunId ||\n activation.protocol !== \"replacement\" ||\n stableJsonStringify(activation.datasetVersion) !==\n stableJsonStringify(commit.intent.datasetVersion) ||\n activation.projectionRevision !== commit.projectionRevision ||\n activation.ownershipHash !== commit.ownershipHash ||\n activation.ontologyRevision !== commit.ontologyRevision ||\n activation.lastCommitId !== commit.id ||\n activation.updatedAt !== commit.committedAt ||\n !header.expected.sources.some(\n (expected) => stableJsonStringify(expected) === stableJsonStringify(activation.expected)\n )\n ) {\n invalidCorrelation(\"Source activation does not correlate with its projection commit.\")\n }\n const candidate = state.sourceMaterializations.get(\n sourceMaterializationKey(\n commit.projectId,\n activation.source.projectionId,\n activation.materializationId\n )\n )\n if (!candidate || candidate.status !== \"ready\") {\n throw new MaterializationConflictError(\n \"source-materialization\",\n \"Source activation candidate is missing or is not ready.\"\n )\n }\n if (\n candidate.projectionRunId !== activation.execution.projectionRunId ||\n candidate.executionToken !== activation.execution.executionToken ||\n candidate.projectionKind !== activation.projectionKind ||\n candidate.protocol !== activation.protocol ||\n stableJsonStringify(candidate.datasetVersion) !==\n stableJsonStringify(activation.datasetVersion) ||\n candidate.projectionRevision !== activation.projectionRevision ||\n candidate.ownershipHash !== activation.ownershipHash ||\n candidate.ontologyRevision !== activation.ontologyRevision\n ) {\n invalidCorrelation(\"Source activation does not match its ready candidate identity.\")\n }\n if (candidate.readyAt === null) {\n invalidCorrelation(\"Source activation candidate has no ready timestamp.\")\n }\n assertTimestampNotBefore(\n activation.updatedAt,\n candidate.readyAt,\n \"Source activation cannot precede candidate readiness.\"\n )\n const previous = findActiveSourceMaterialization(\n state,\n commit.projectId,\n activation.source.projectionId\n )\n if (previous) {\n assertSourceDatasetWatermark(previous.datasetVersion, activation.datasetVersion)\n assertTimestampNotBefore(\n activation.updatedAt,\n previous.updatedAt,\n \"Source activation cannot precede the active materialization update.\"\n )\n }\n}\n\nfunction assertSourceDatasetWatermark(\n active: PinnedDatasetVersion,\n next: PinnedDatasetVersion\n): void {\n assertPinnedDatasetWatermark(active, next, \"Source activation\")\n}\n\nfunction assertFinalizedWork(\n session: SessionState,\n state: InMemoryOntologyState,\n objects: InMemoryObjectStorage\n): void {\n const expectedPlanItems = session.applyWork.map((record) => stableJsonStringify(record.item))\n const appliedPlanItems = session.appliedPlanItems\n if (expectedPlanItems.length > 0 && !session.workStreams.apply.completed) {\n invalidCorrelation(\"Materialization plan work was not fully streamed.\")\n }\n if (stableJsonStringify(appliedPlanItems) !== stableJsonStringify(expectedPlanItems)) {\n invalidCorrelation(\"Materialization plan work was not applied exactly once.\")\n }\n if (session.cardinalityWork.length > 0 && !session.workStreams.cardinality.completed) {\n invalidCorrelation(\"Materialization cardinality work was not fully validated.\")\n }\n assertFinalCardinality(session.cardinalityWork, session.header.commit.projectId, objects)\n if (session.header.commit.intent.kind === \"telemetry\") {\n const pointKeys = classificationKeys(session, \"point\")\n if (pointKeys.length !== session.header.commit.intent.pointCount) {\n invalidCorrelation(\n \"Telemetry point classification coverage does not match the commit intent.\"\n )\n }\n }\n\n const expectedEvents = [...session.eventWork].sort(compareEventWork)\n if (expectedEvents.length > 0 && !session.workStreams.event.completed) {\n invalidCorrelation(\"Materialization event work was not fully drained.\")\n }\n if (session.outboxEnvelopes.size !== expectedEvents.length) {\n invalidCorrelation(\"Materialization event work was not fully written to the outbox.\")\n }\n for (let ordinal = 0; ordinal < expectedEvents.length; ordinal += 1) {\n const expected = expectedEvents[ordinal]\n const actual = session.outboxEnvelopes.get(ordinal)\n if (!expected || !actual) {\n invalidCorrelation(\"Materialization event work was not fully written to the outbox.\")\n }\n const { id, commitOrdinal, ...actualDraft } = actual\n if (\n commitOrdinal !== ordinal ||\n id !== createEventId(session.header.commit.projectId, session.header.commit.id, ordinal) ||\n stableJsonStringify(actualDraft) !== stableJsonStringify(expected.draft)\n ) {\n invalidCorrelation(\"Materialization outbox event does not match its staged event work.\")\n }\n const persisted = state.outbox.get(outboxKey(session.header.commit.projectId, actual.id))\n if (!persisted || stableJsonStringify(persisted.envelope) !== stableJsonStringify(actual)) {\n invalidCorrelation(\"Materialization outbox event was not persisted.\")\n }\n }\n}\n\nfunction assertFinalCardinality(\n records: readonly MaterializationCardinalityOccupantWorkRecord[],\n projectId: string,\n objects: InMemoryObjectStorage\n): void {\n const scopes = new Map<\n string,\n {\n readonly source: OntologyObjectRef\n readonly linkId: string\n readonly occupiedLinkKeys: Set<string>\n }\n >()\n let currentScope: string | null = null\n let occupiedCount = 0\n for (const record of records) {\n if (record.scopeSortKey !== currentScope) {\n currentScope = record.scopeSortKey\n occupiedCount = 0\n }\n const scope = scopes.get(record.scopeSortKey) ?? {\n source: structuredClone(record.ref.source),\n linkId: record.ref.linkId,\n occupiedLinkKeys: new Set<string>(),\n }\n scopes.set(record.scopeSortKey, scope)\n if (record.occupied) {\n occupiedCount += 1\n scope.occupiedLinkKeys.add(record.linkSortKey)\n if (occupiedCount > 1) {\n invalidCorrelation(\"Materialization cardinality work violates cardinality-one.\")\n }\n }\n }\n\n const adapter = getInMemoryObjectMaterializerAdapter(objects)\n for (const scope of scopes.values()) {\n const effectiveLinkKeys: string[] = []\n adapter.visitExactScopeLinks(\n projectId,\n scope.source.objectTypeId,\n scope.source.primaryId,\n scope.linkId,\n (row) => effectiveLinkKeys.push(linkRefSortKey(linkRef(row)))\n )\n effectiveLinkKeys.sort()\n const occupiedLinkKeys = [...scope.occupiedLinkKeys].sort()\n if (stableJsonStringify(effectiveLinkKeys) !== stableJsonStringify(occupiedLinkKeys)) {\n invalidCorrelation(\n \"Materialization cardinality work does not match the final effective link scope.\"\n )\n }\n }\n}\n\nfunction assertReplacementFullyStreamed(\n session: SessionState,\n activation: import(\"../materializations\").SourceActivationWrite\n): void {\n const replacement = session.replacement\n if (\n !replacement ||\n replacement.sourceId !== activation.source.projectionId ||\n replacement.candidateMaterializationId !== activation.materializationId ||\n replacement.candidate.materializationId !== activation.materializationId ||\n replacement.candidate.projectionKind !== activation.projectionKind ||\n replacement.candidate.protocol !== activation.protocol\n ) {\n invalidCorrelation(\n \"Source activation does not match the replacement candidate opened by the session.\"\n )\n }\n if (\n activation.projectionKind === \"object\" &&\n (!replacement.objectStreamCompleted || !replacement.linkStreamCompleted)\n ) {\n invalidCorrelation(\"Object projection replacement state was not fully streamed.\")\n }\n if (activation.projectionKind === \"link\" && !replacement.linkStreamCompleted) {\n invalidCorrelation(\"Link projection replacement state was not fully streamed.\")\n }\n const expectedObjectKeys =\n activation.projectionKind === \"object\" ? [...replacement.objects.keys()].sort() : []\n const expectedLinkKeys = [...replacement.links.entries()]\n .filter(([, value]) => value.diffRequired)\n .map(([key]) => key)\n .sort()\n if (\n stableJsonStringify(classificationKeys(session, \"object\")) !==\n stableJsonStringify(expectedObjectKeys) ||\n stableJsonStringify(classificationKeys(session, \"link\")) !==\n stableJsonStringify(expectedLinkKeys) ||\n classificationKeys(session, \"point\").length > 0\n ) {\n invalidCorrelation(\n \"Projection replacement classification coverage does not match its streamed state.\"\n )\n }\n}\n\nfunction classificationKeys(\n session: SessionState,\n entityKind: import(\"../materializations\").MaterializationWorkEntityKind\n): string[] {\n return [...session.work.values()]\n .filter(\n (record): record is import(\"../materializations\").MaterializationClassificationWorkRecord =>\n record.kind === \"classification\" && record.entityKind === entityKind\n )\n .map((record) => record.identityKey)\n .sort()\n}\n\nfunction assertTimestampNotBefore(value: string, minimum: string, message: string): void {\n if (Date.parse(value) < Date.parse(minimum)) invalidCorrelation(message)\n}\n",
|
|
20
|
-
"import { stableJsonStringify } from \"../../../json\"\nimport {\n MaterializationConflictError,\n MaterializationValidationError,\n} from \"../../../materialization/errors\"\nimport type {\n ExpectedLinkRevision,\n ExpectedObjectRevision,\n OntologyLinkRef,\n OntologyObjectRef,\n} from \"../../../materialization/model\"\nimport {\n linkRefKey,\n linkRefSortKey,\n linkScopeSortKey,\n objectRefKey,\n objectRefSortKey,\n projectionEntityKey,\n telemetryPointKey,\n telemetryPointSortKey,\n} from \"../../../materialization/refs\"\nimport {\n getInMemoryObjectMaterializerAdapter,\n type InMemoryObjectStorage,\n} from \"../../objects/in-memory\"\nimport type { ObjectLinkRow } from \"../../objects/types\"\nimport {\n getInMemoryTimeseriesMaterializerAdapter,\n type InMemoryTimeseriesStorage,\n} from \"../../timeseries/store\"\nimport type { OntologyCommitRecord } from \"../commits\"\nimport type {\n ApplyMaterializationChunkInput,\n ApplyMaterializationResult,\n ExpectedSourceRevision,\n ExpectedTimeseriesPointRevision,\n FinalizeMaterializationInput,\n MaterializationCardinalityOccupantWorkRecord,\n MaterializationEventWorkRecord,\n MaterializationLinkScopeState,\n MaterializationLinkState,\n MaterializationObjectExistence,\n MaterializationObjectExistenceWorkRecord,\n MaterializationObjectState,\n MaterializationPlanHeader,\n MaterializationPlanWorkRecord,\n MaterializationSession,\n MaterializationStatePage,\n MaterializationWorkPage,\n MaterializationWorkRecord,\n OntologyMaterializationStorage,\n ReadMaterializationObjectExistenceInput,\n SourceReplacementLinkState,\n SourceReplacementObjectState,\n SourceReplacementStatePage,\n StageMaterializationWorkInput,\n StoredTelemetryPoint,\n StreamMaterializationStateInput,\n StreamMaterializationWorkInput,\n StreamSourceReplacementStateInput,\n} from \"../materializations\"\nimport type { OntologyMaterializationEvent } from \"../outbox\"\nimport {\n appendScopeSnapshot,\n assertMaterializationHeader,\n finishScopeAccumulator,\n type ProviderMaterializationTransactionLifecycle,\n startScopeAccumulator,\n uniqueSorted,\n} from \"../provider\"\nimport type {\n StoredSourceAssertion,\n StoredSourceLinkAssertion,\n StoredSourceObjectAssertion,\n} from \"../sources\"\nimport { assertFinalizationCorrelations } from \"./materializations-finalization\"\nimport {\n addReplacementLink,\n findActiveSourceMaterialization,\n linkRef,\n linkSnapshot,\n objectSnapshot,\n publicLinkOverride,\n publicObjectOverride,\n storedPoint,\n storedSource,\n storedSourceLink,\n storedSourceObject,\n uniqueBy,\n} from \"./materializations-state\"\nimport {\n assertChunkSequence,\n assertLastCommit,\n assertPageRows,\n assertPlanChunkCorrelations,\n assertWorkRecord,\n compareCardinalityWork,\n compareEventWork,\n comparePlanWork,\n materializationChunkRows,\n materializationPlanItems,\n workUniquenessKey,\n} from \"./materializations-work\"\nimport {\n assertTimestamp,\n commitKey,\n commitOriginKey,\n type InMemoryOntologyState,\n type InMemoryOntologyStorageTestHooks,\n type InMemorySourceMaterialization,\n idempotencyKey,\n ontologyCommitOriginSelector,\n outboxKey,\n projectEntityKey,\n sourceMaterializationKey,\n} from \"./shared-state\"\n\nexport interface SessionState {\n readonly providerToken: object\n readonly header: MaterializationPlanHeader\n readonly transactionToken: object\n readonly lifecycle: ProviderMaterializationTransactionLifecycle\n active: boolean\n writeOrdinal: number\n readonly work: Map<string, MaterializationWorkRecord>\n readonly workUniqueKeys: Set<string>\n readonly applyWork: MaterializationPlanWorkRecord[]\n readonly cardinalityWork: MaterializationCardinalityOccupantWorkRecord[]\n readonly eventWork: MaterializationEventWorkRecord[]\n readonly appliedPlanItems: string[]\n readonly outboxEnvelopes: Map<number, OntologyMaterializationEvent>\n readonly workStreams: Record<StreamMaterializationWorkInput[\"order\"], WorkStreamState>\n workSealed: boolean\n incidentLinksByObject: Map<string, readonly OntologyLinkRef[]> | null\n linkScopeStates: Map<string, MaterializationLinkScopeState> | null\n readonly objectExistence: Map<string, MaterializationObjectExistenceWorkRecord>\n replacement: ReplacementSessionState | null\n}\n\nexport interface WorkStreamState {\n started: boolean\n completed: boolean\n emittedCount: number\n}\n\nexport interface ReplacementObjectWork {\n readonly ref: OntologyObjectRef\n readonly sortKey: string\n}\n\nexport interface ReplacementLinkWork {\n readonly ref: OntologyLinkRef\n readonly sortKey: string\n diffRequired: boolean\n}\n\nexport interface ReplacementSessionState {\n readonly sourceId: string\n readonly candidateMaterializationId: string\n readonly previous: InMemorySourceMaterialization | undefined\n readonly candidate: InMemorySourceMaterialization\n readonly objects: Map<string, ReplacementObjectWork>\n readonly links: Map<string, ReplacementLinkWork>\n orderedObjects: ReplacementObjectWork[]\n orderedLinks: ReplacementLinkWork[] | null\n readonly affectedScopes: Set<string>\n readonly incidentObjects: Map<string, OntologyObjectRef>\n objectStreamStarted: boolean\n objectStreamCompleted: boolean\n linkStreamStarted: boolean\n linkStreamCompleted: boolean\n linksExpanded: boolean\n}\n\nexport class InMemoryOntologyMaterializationStorage implements OntologyMaterializationStorage {\n private readonly sessions = new WeakMap<object, SessionState>()\n private readonly liveSessions = new Set<SessionState>()\n\n constructor(\n private readonly state: InMemoryOntologyState,\n private readonly objects: InMemoryObjectStorage,\n private readonly timeseries: InMemoryTimeseriesStorage,\n private readonly getTransactionToken: () => object | null,\n private readonly getMaterializationLifecycle: () => ProviderMaterializationTransactionLifecycle | null,\n private readonly hooks: InMemoryOntologyStorageTestHooks = {}\n ) {}\n\n async begin(input: MaterializationPlanHeader): Promise<MaterializationSession> {\n const transactionToken = this.getTransactionToken()\n const lifecycle = this.getMaterializationLifecycle()\n if (!transactionToken || !lifecycle) {\n throw new MaterializationValidationError(\n \"Materialization sessions require an active storage transaction.\"\n )\n }\n assertMaterializationHeader(input)\n this.assertCommitAbsent(input)\n for (const expected of input.expected.sources)\n this.assertSource(expected, input.commit.projectId)\n for (const expected of input.expected.objects)\n await this.assertObject(expected, input.commit.projectId)\n for (const expected of input.expected.links)\n await this.assertLink(expected, input.commit.projectId)\n const expectedScopeStates = new Map<string, MaterializationLinkScopeState>()\n for (const expected of input.expected.linkScopes) {\n const key = linkScopeSortKey(expected.source, expected.linkId)\n const current =\n expectedScopeStates.get(key) ??\n this.computeLinkScopeState(input.commit.projectId, expected.source, expected.linkId)\n expectedScopeStates.set(key, current)\n if (current.fingerprint !== expected.fingerprint) {\n throw new MaterializationConflictError(\n \"effective-state\",\n `Expected link scope changed for ${expected.source.objectTypeId}:${expected.source.primaryId}.${expected.linkId}.`\n )\n }\n }\n for (const expected of input.expected.points) this.assertPoint(expected, input.commit.projectId)\n\n const providerToken = {}\n const session = {\n providerToken,\n header: structuredClone(input),\n transactionToken,\n lifecycle,\n active: true,\n writeOrdinal: 0,\n work: new Map<string, MaterializationWorkRecord>(),\n workUniqueKeys: new Set<string>(),\n applyWork: [],\n cardinalityWork: [],\n eventWork: [],\n appliedPlanItems: [],\n outboxEnvelopes: new Map<number, OntologyMaterializationEvent>(),\n workStreams: {\n apply: { started: false, completed: false, emittedCount: 0 },\n cardinality: { started: false, completed: false, emittedCount: 0 },\n event: { started: false, completed: false, emittedCount: 0 },\n },\n workSealed: false,\n incidentLinksByObject: null,\n linkScopeStates: expectedScopeStates,\n objectExistence: new Map<string, MaterializationObjectExistenceWorkRecord>(),\n replacement: null,\n }\n this.sessions.set(providerToken, session)\n this.liveSessions.add(session)\n lifecycle.register(providerToken)\n return { providerToken }\n }\n\n deactivateTransaction(transactionToken: object): void {\n for (const session of this.liveSessions) {\n if (session.transactionToken !== transactionToken) continue\n this.releaseSession(session)\n }\n }\n\n /** Deactivate a session, drop its transaction-local work, and stop tracking it as live. */\n private releaseSession(session: SessionState): void {\n session.active = false\n session.work.clear()\n session.workUniqueKeys.clear()\n session.applyWork.length = 0\n session.cardinalityWork.length = 0\n session.eventWork.length = 0\n session.appliedPlanItems.length = 0\n session.outboxEnvelopes.clear()\n session.incidentLinksByObject = null\n session.linkScopeStates = null\n session.objectExistence.clear()\n session.replacement = null\n this.liveSessions.delete(session)\n session.lifecycle.complete(session.providerToken)\n }\n\n async *streamState(\n input: StreamMaterializationStateInput\n ): AsyncIterable<MaterializationStatePage> {\n const session = this.requireSession(input.session)\n assertPageRows(input.pageRows)\n for await (const request of input.requests) {\n this.requireSession(input.session)\n this.hooks.beforeRead?.(\"state.read\")\n const objectRefs = uniqueSorted(request.objects, objectRefKey, objectRefSortKey)\n for (let offset = 0; offset < objectRefs.length; offset += input.pageRows) {\n this.requireSession(input.session)\n const objects: MaterializationObjectState[] = []\n for (const ref of objectRefs.slice(offset, offset + input.pageRows)) {\n objects.push(await this.objectState(session, ref))\n }\n this.requireSession(input.session)\n this.hooks.observeBuffer?.(\"state.object.page\", objects.length)\n yield { objects, links: [], linkScopes: [], points: [] }\n }\n\n const linkRefs = uniqueSorted(request.links, linkRefKey, linkRefSortKey)\n for (let offset = 0; offset < linkRefs.length; offset += input.pageRows) {\n this.requireSession(input.session)\n const links: MaterializationLinkState[] = []\n for (const ref of linkRefs.slice(offset, offset + input.pageRows)) {\n links.push(await this.linkState(session, ref))\n }\n this.requireSession(input.session)\n this.hooks.observeBuffer?.(\"state.link.page\", links.length)\n yield { objects: [], links, linkScopes: [], points: [] }\n }\n\n const incidentRefs = this.incidentLinkRefs(session, request.incidentObjects)\n for (let offset = 0; offset < incidentRefs.length; offset += input.pageRows) {\n this.requireSession(input.session)\n const refs = incidentRefs.slice(offset, offset + input.pageRows)\n const links: MaterializationLinkState[] = []\n for (const ref of refs) links.push(await this.linkState(session, ref))\n this.requireSession(input.session)\n this.hooks.observeBuffer?.(\"state.incident-link.page\", links.length)\n yield { objects: [], links, linkScopes: [], points: [] }\n }\n\n for (const scope of uniqueBy(request.linkScopes, (value) =>\n linkScopeSortKey(value.source, value.linkId)\n )) {\n this.requireSession(input.session)\n const value = this.linkScopeState(session, scope.source, scope.linkId)\n // Scope rows are currently only requested for cardinality-one links, so the complete member\n // set is bounded by the ontology invariant. Replacement scope enumeration is flattened in\n // its dedicated stream and never uses this shape.\n yield { objects: [], links: [], linkScopes: [value], points: [] }\n }\n\n const requestedPoints = uniqueSorted(\n request.points,\n (point) => telemetryPointKey(point.series, point.at),\n (point) => telemetryPointSortKey(point.series, point.at)\n )\n for (let offset = 0; offset < requestedPoints.length; offset += input.pageRows) {\n this.requireSession(input.session)\n const points: StoredTelemetryPoint[] = []\n for (const point of requestedPoints.slice(offset, offset + input.pageRows)) {\n const stored = getInMemoryTimeseriesMaterializerAdapter(this.timeseries).getExactPoint(\n session.header.commit.projectId,\n point.series,\n point.at\n )\n if (stored) points.push(storedPoint(stored))\n }\n this.requireSession(input.session)\n this.hooks.observeBuffer?.(\"state.point.page\", points.length)\n if (points.length > 0) yield { objects: [], links: [], linkScopes: [], points }\n }\n }\n }\n\n async *streamSourceReplacementState(\n input: StreamSourceReplacementStateInput\n ): AsyncIterable<SourceReplacementStatePage> {\n const session = this.requireSession(input.session)\n assertPageRows(input.pageRows)\n const replacement = this.requireReplacement(session, input)\n if (input.entityKind === \"object\") {\n if (replacement.candidate.projectionKind !== \"object\") {\n throw new MaterializationConflictError(\n \"source-materialization\",\n \"Link projection replacement cannot stream object state.\"\n )\n }\n if (replacement.objectStreamStarted)\n throw new MaterializationConflictError(\n \"effective-state\",\n \"Replacement object state may only be streamed once per session.\"\n )\n replacement.objectStreamStarted = true\n this.hooks.beforeRead?.(\"source-replacement.object\")\n for (let offset = 0; offset < replacement.orderedObjects.length; offset += input.pageRows) {\n this.requireSession(input.session)\n const selected = replacement.orderedObjects.slice(offset, offset + input.pageRows)\n const objects: SourceReplacementObjectState[] = []\n for (const entry of selected) {\n const key = projectionEntityKey({ kind: \"object\", ref: entry.ref })\n const base = await this.objectState(session, entry.ref)\n objects.push({\n ref: base.ref,\n candidateSource: storedSourceObject(\n input.source.projectionId,\n replacement.candidate.materializationId,\n replacement.candidate.rowsByEntity.get(key)\n ),\n override: base.override,\n effective: base.effective,\n latestTelemetry: base.latestTelemetry,\n })\n }\n this.requireSession(input.session)\n this.hooks.observeBuffer?.(\"replacement.object.page\", objects.length)\n yield { objects, links: [] }\n }\n this.requireSession(input.session)\n replacement.objectStreamCompleted = true\n return\n }\n\n if (replacement.candidate.projectionKind === \"object\" && !replacement.objectStreamCompleted) {\n throw new MaterializationConflictError(\n \"effective-state\",\n \"Object projection replacement must fully stream object state before link state.\"\n )\n }\n if (replacement.linkStreamStarted)\n throw new MaterializationConflictError(\n \"effective-state\",\n \"Replacement link state may only be streamed once per session.\"\n )\n replacement.linkStreamStarted = true\n this.hooks.beforeRead?.(\"source-replacement.link\")\n this.expandReplacementLinks(session, replacement)\n replacement.orderedLinks ??= [...replacement.links.values()].sort((left, right) =>\n left.sortKey.localeCompare(right.sortKey)\n )\n for (let offset = 0; offset < replacement.orderedLinks.length; offset += input.pageRows) {\n this.requireSession(input.session)\n const selected = replacement.orderedLinks.slice(offset, offset + input.pageRows)\n const links: SourceReplacementLinkState[] = []\n for (const entry of selected) {\n const key = projectionEntityKey({ kind: \"link\", ref: entry.ref })\n const base = await this.linkState(session, entry.ref)\n const ownedByReplacement =\n replacement.previous?.rowsByEntity.has(key) || replacement.candidate.rowsByEntity.has(key)\n links.push({\n ref: base.ref,\n candidateSource: ownedByReplacement\n ? storedSourceLink(\n input.source.projectionId,\n replacement.candidate.materializationId,\n replacement.candidate.rowsByEntity.get(key)\n )\n : base.source,\n override: base.override,\n effective: base.effective,\n diffRequired: entry.diffRequired,\n })\n }\n this.requireSession(input.session)\n this.hooks.observeBuffer?.(\"replacement.link.page\", links.length)\n yield { objects: [], links }\n }\n this.requireSession(input.session)\n replacement.linkStreamCompleted = true\n }\n\n async stageWork(input: StageMaterializationWorkInput): Promise<void> {\n const session = this.requireSession(input.session)\n if (session.workSealed) {\n throw new MaterializationConflictError(\n \"effective-state\",\n \"Materialization work cannot be staged after draining begins.\"\n )\n }\n const batchKeys = new Set<string>()\n const batchUniqueKeys = new Set<string>()\n for (const record of input.records) {\n assertWorkRecord(record, session.header)\n const uniqueKey = workUniquenessKey(record)\n if (\n batchKeys.has(record.recordKey) ||\n session.work.has(record.recordKey) ||\n batchUniqueKeys.has(uniqueKey) ||\n session.workUniqueKeys.has(uniqueKey)\n ) {\n throw new MaterializationConflictError(\n \"effective-state\",\n `Duplicate materialization work key '${record.recordKey}'.`\n )\n }\n if (\n record.kind === \"incident-object\" &&\n (!session.replacement || session.replacement.linkStreamStarted)\n ) {\n throw new MaterializationConflictError(\n \"effective-state\",\n \"Incident replacement work must be staged before link state is streamed.\"\n )\n }\n batchKeys.add(record.recordKey)\n batchUniqueKeys.add(uniqueKey)\n }\n const cloned = input.records.map((record) => structuredClone(record))\n this.hooks.observeWork?.(cloned)\n for (const record of cloned) {\n session.work.set(record.recordKey, record)\n session.workUniqueKeys.add(workUniquenessKey(record))\n if (record.kind === \"plan\") session.applyWork.push(record)\n if (record.kind === \"cardinality\") session.cardinalityWork.push(record)\n if (record.kind === \"event\") session.eventWork.push(record)\n if (record.kind === \"object-existence\") {\n session.objectExistence.set(objectRefKey(record.ref), record)\n }\n if (record.kind === \"incident-object\") {\n const replacement = session.replacement\n if (replacement) {\n replacement.incidentObjects.set(objectRefKey(record.ref), record.ref)\n replacement.linksExpanded = false\n replacement.orderedLinks = null\n }\n }\n }\n this.hooks.observeBuffer?.(\"work.stage\", cloned.length)\n }\n\n async *streamWork(input: StreamMaterializationWorkInput): AsyncIterable<MaterializationWorkPage> {\n const session = this.requireSession(input.session)\n assertPageRows(input.pageRows)\n const stream = session.workStreams[input.order]\n if (stream.started) {\n throw new MaterializationConflictError(\n \"effective-state\",\n `Materialization ${input.order} work may only be streamed once per session.`\n )\n }\n stream.started = true\n if (!session.workSealed) {\n session.applyWork.sort(comparePlanWork)\n session.cardinalityWork.sort(compareCardinalityWork)\n session.eventWork.sort(compareEventWork)\n session.workSealed = true\n }\n const records =\n input.order === \"apply\"\n ? session.applyWork\n : input.order === \"cardinality\"\n ? session.cardinalityWork\n : session.eventWork\n for (let offset = 0; offset < records.length; offset += input.pageRows) {\n this.requireSession(input.session)\n const selected = records.slice(offset, offset + input.pageRows)\n this.hooks.observeBuffer?.(`work.${input.order}.page`, selected.length)\n stream.emittedCount = offset + selected.length\n yield { records: structuredClone(selected) }\n }\n this.requireSession(input.session)\n stream.completed = true\n }\n\n async readObjectExistence(\n input: ReadMaterializationObjectExistenceInput\n ): Promise<readonly MaterializationObjectExistence[]> {\n const session = this.requireSession(input.session)\n const result: MaterializationObjectExistence[] = []\n for (const ref of input.refs) {\n const record = session.objectExistence.get(objectRefKey(ref))\n if (record) {\n result.push({ ref: structuredClone(record.ref), exists: record.exists })\n }\n }\n return result\n }\n\n async applyChunk(input: ApplyMaterializationChunkInput): Promise<void> {\n const session = this.requireSession(input.session)\n const projectId = session.header.commit.projectId\n assertPlanChunkCorrelations(input.chunk, session.header.commit)\n assertChunkSequence(session, input.chunk)\n this.hooks.observeBuffer?.(\"apply.chunk\", materializationChunkRows(input.chunk))\n const write = (boundary: string, apply: () => void): void => {\n this.hooks.beforeWrite?.(boundary, session.writeOrdinal++)\n apply()\n }\n\n for (const item of input.chunk.overrides.objectUpserts)\n write(\"override.object.upsert\", () => {\n const key = projectEntityKey(projectId, objectRefKey(item.ref))\n assertLastCommit(\n this.state.objectOverrides.get(key),\n item.expectedLastCommitId,\n \"object override\"\n )\n this.state.objectOverrides.set(\n key,\n structuredClone({\n projectId,\n ref: item.ref,\n value: item.value,\n lastCommitId: item.lastCommitId,\n updatedAt: item.updatedAt,\n })\n )\n })\n for (const item of input.chunk.overrides.objectDeletes)\n write(\"override.object.delete\", () => {\n const key = projectEntityKey(projectId, objectRefKey(item.ref))\n assertLastCommit(\n this.state.objectOverrides.get(key),\n item.expectedLastCommitId,\n \"object override\"\n )\n this.state.objectOverrides.delete(key)\n })\n for (const item of input.chunk.overrides.linkUpserts)\n write(\"override.link.upsert\", () => {\n const key = projectEntityKey(projectId, linkRefKey(item.ref))\n assertLastCommit(\n this.state.linkOverrides.get(key),\n item.expectedLastCommitId,\n \"link override\"\n )\n this.state.linkOverrides.set(\n key,\n structuredClone({\n projectId,\n ref: item.ref,\n value: item.value,\n lastCommitId: item.lastCommitId,\n updatedAt: item.updatedAt,\n })\n )\n })\n for (const item of input.chunk.overrides.linkDeletes)\n write(\"override.link.delete\", () => {\n const key = projectEntityKey(projectId, linkRefKey(item.ref))\n assertLastCommit(\n this.state.linkOverrides.get(key),\n item.expectedLastCommitId,\n \"link override\"\n )\n this.state.linkOverrides.delete(key)\n })\n\n for (const item of input.chunk.effective.linkDeletes)\n write(\"effective.link.delete\", () => {\n this.assertLinkSync(item.expected, projectId)\n getInMemoryObjectMaterializerAdapter(this.objects).deleteExactLink({\n projectId,\n sourceTypeId: item.ref.source.objectTypeId,\n sourceId: item.ref.source.primaryId,\n linkId: item.ref.linkId,\n targetTypeId: item.ref.target.objectTypeId,\n targetId: item.ref.target.primaryId,\n })\n })\n for (const item of input.chunk.effective.objectDeletes)\n write(\"effective.object.delete\", () => {\n this.assertObjectSync(item.expected, projectId)\n getInMemoryObjectMaterializerAdapter(this.objects).deleteExactObject(\n projectId,\n item.ref.objectTypeId,\n item.ref.primaryId\n )\n })\n for (const item of input.chunk.effective.objectUpserts)\n write(\"effective.object.upsert\", () => {\n this.assertObjectSync(item.expected, projectId)\n getInMemoryObjectMaterializerAdapter(this.objects).applyExactObject(item.row, projectId)\n })\n for (const item of input.chunk.effective.linkUpserts)\n write(\"effective.link.upsert\", () => {\n this.assertLinkSync(item.expected, projectId)\n getInMemoryObjectMaterializerAdapter(this.objects).applyExactLink(item.row, projectId)\n })\n for (const item of input.chunk.timeseries.pointUpserts)\n write(\"timeseries.point.upsert\", () => {\n this.assertPoint(item.expected, projectId)\n getInMemoryTimeseriesMaterializerAdapter(this.timeseries).applyExactPoint(\n projectId,\n item.point\n )\n })\n for (const item of input.chunk.outbox)\n write(\"outbox.insert\", () => {\n const envelope = item.envelope\n if (envelope.projectId !== projectId || envelope.commitId !== session.header.commit.id) {\n throw new MaterializationValidationError(\n \"Outbox event does not correlate with its materialization commit.\"\n )\n }\n assertTimestamp(item.availableAt, \"Outbox availableAt\")\n assertTimestamp(item.createdAt, \"Outbox createdAt\")\n assertTimestamp(envelope.occurredAt, \"Outbox event occurredAt\")\n const key = outboxKey(projectId, envelope.id)\n if (this.state.outbox.has(key)) {\n throw new MaterializationConflictError(\n \"effective-state\",\n `Duplicate outbox event '${envelope.id}'.`\n )\n }\n if (session.outboxEnvelopes.has(envelope.commitOrdinal))\n throw new MaterializationConflictError(\n \"effective-state\",\n \"Duplicate outbox commit ordinal.\"\n )\n this.state.outbox.set(key, {\n envelope: structuredClone(envelope),\n availableAt: item.availableAt,\n attempts: 0,\n leaseId: null,\n leaseExpiresAt: null,\n publishedAt: null,\n lastError: null,\n createdAt: item.createdAt,\n })\n session.outboxEnvelopes.set(envelope.commitOrdinal, structuredClone(envelope))\n })\n for (const item of materializationPlanItems(input.chunk)) {\n session.appliedPlanItems.push(stableJsonStringify(item))\n }\n }\n\n async finalize(input: FinalizeMaterializationInput): Promise<ApplyMaterializationResult> {\n const session = this.requireSession(input.session)\n const { commit } = session.header\n // Recheck reservations at the durable boundary: callers may open more than one session in the\n // same transaction before either one finalizes.\n this.assertCommitAbsent(session.header)\n assertFinalizationCorrelations(session, input.finalization, this.state, this.objects)\n this.hooks.beforeWrite?.(\"finalize\", session.writeOrdinal++)\n for (const activation of input.finalization.sourceActivations) {\n this.hooks.beforeWrite?.(\"source.activate\", session.writeOrdinal++)\n assertTimestamp(activation.datasetVersion.createdAt, \"Source dataset version createdAt\")\n assertTimestamp(activation.updatedAt, \"Source activation updatedAt\")\n this.assertSource(activation.expected, commit.projectId)\n const candidateKey = sourceMaterializationKey(\n commit.projectId,\n activation.source.projectionId,\n activation.materializationId\n )\n const candidate = this.state.sourceMaterializations.get(candidateKey)\n if (!candidate || candidate.status !== \"ready\")\n throw new MaterializationConflictError(\n \"source-materialization\",\n \"Source activation candidate is missing or is not ready.\"\n )\n const previous = findActiveSourceMaterialization(\n this.state,\n commit.projectId,\n activation.source.projectionId\n )\n if (previous) {\n this.state.sourceMaterializations.set(\n sourceMaterializationKey(\n previous.projectId,\n previous.source.projectionId,\n previous.materializationId\n ),\n {\n ...previous,\n status: \"superseded\",\n executionToken: null,\n terminalAt: activation.updatedAt,\n updatedAt: activation.updatedAt,\n }\n )\n }\n this.state.sourceMaterializations.set(candidateKey, {\n ...candidate,\n status: \"active\",\n executionToken: null,\n activatedAt: activation.updatedAt,\n lastCommitId: activation.lastCommitId,\n updatedAt: activation.updatedAt,\n })\n }\n const record = {\n ...structuredClone(commit),\n result: structuredClone(input.finalization.result),\n } as OntologyCommitRecord\n this.state.commitsById.set(commitKey(commit.projectId, commit.id), record)\n this.state.commitIdByIdempotency.set(\n idempotencyKey(commit.projectId, commit.idempotencyKey),\n commit.id\n )\n const origin = ontologyCommitOriginSelector(commit.origin)\n if (origin) {\n this.state.commitIdByOrigin.set(commitOriginKey(commit.projectId, origin), commit.id)\n }\n this.releaseSession(session)\n return { commit: structuredClone(record) }\n }\n\n private requireSession(session: MaterializationSession): SessionState {\n const value = this.sessions.get(session.providerToken)\n if (\n !value ||\n !value.active ||\n !this.getTransactionToken() ||\n this.getTransactionToken() !== value.transactionToken\n ) {\n throw new MaterializationConflictError(\n \"effective-state\",\n \"Materialization session is inactive.\"\n )\n }\n return value\n }\n\n private requireReplacement(\n session: SessionState,\n input: StreamSourceReplacementStateInput\n ): ReplacementSessionState {\n if (session.replacement) {\n if (\n session.replacement.sourceId !== input.source.projectionId ||\n session.replacement.candidateMaterializationId !== input.candidateMaterializationId\n ) {\n throw new MaterializationConflictError(\n \"source-materialization\",\n \"Materialization session already owns another replacement union.\"\n )\n }\n return session.replacement\n }\n const projectId = session.header.commit.projectId\n const sourceId = input.source.projectionId\n const candidate = this.state.sourceMaterializations.get(\n sourceMaterializationKey(projectId, sourceId, input.candidateMaterializationId)\n )\n if (!candidate || candidate.status !== \"ready\") {\n throw new MaterializationConflictError(\n \"source-materialization\",\n `Candidate source materialization '${input.candidateMaterializationId}' is missing or is not ready.`\n )\n }\n const previous = findActiveSourceMaterialization(this.state, projectId, sourceId)\n if (\n candidate.protocol !== \"replacement\" ||\n (previous &&\n (previous.protocol !== candidate.protocol ||\n previous.projectionKind !== candidate.projectionKind))\n ) {\n throw new MaterializationConflictError(\n \"source-materialization\",\n \"Source replacement kind or protocol does not match its active materialization.\"\n )\n }\n const replacement: ReplacementSessionState = {\n sourceId,\n candidateMaterializationId: input.candidateMaterializationId,\n previous,\n candidate,\n objects: new Map(),\n links: new Map(),\n orderedObjects: [],\n orderedLinks: null,\n affectedScopes: new Set(),\n incidentObjects: new Map(),\n objectStreamStarted: false,\n objectStreamCompleted: false,\n linkStreamStarted: false,\n linkStreamCompleted: false,\n linksExpanded: false,\n }\n for (const materialization of [previous, candidate]) {\n if (!materialization) continue\n for (const row of materialization.rowsByEntity.values()) {\n if (row.assertion.kind === \"object\") {\n const ref = row.assertion.ref\n replacement.objects.set(objectRefKey(ref), { ref, sortKey: objectRefSortKey(ref) })\n } else {\n addReplacementLink(replacement, row.assertion.ref, true)\n }\n }\n }\n replacement.orderedObjects = [...replacement.objects.values()].sort((left, right) =>\n left.sortKey.localeCompare(right.sortKey)\n )\n session.replacement = replacement\n return replacement\n }\n\n private expandReplacementLinks(\n session: SessionState,\n replacement: ReplacementSessionState\n ): void {\n if (replacement.linksExpanded) return\n const projectId = session.header.commit.projectId\n const incident = replacement.incidentObjects\n const touchesIncident = (ref: OntologyLinkRef): boolean =>\n incident.has(objectRefKey(ref.source)) || incident.has(objectRefKey(ref.target))\n\n const adapter = getInMemoryObjectMaterializerAdapter(this.objects)\n adapter.visitExactLinks(projectId, (row) => {\n const ref = linkRef(row)\n if (touchesIncident(ref)) addReplacementLink(replacement, ref, true)\n })\n for (const override of this.state.linkOverrides.values()) {\n if (override.projectId !== projectId) continue\n if (touchesIncident(override.ref)) addReplacementLink(replacement, override.ref, true)\n }\n for (const active of this.state.sourceMaterializations.values()) {\n if (active.projectId !== projectId || active.status !== \"active\") continue\n for (const row of active.rowsByEntity.values()) {\n if (row.assertion.kind === \"link\" && touchesIncident(row.assertion.ref)) {\n addReplacementLink(replacement, row.assertion.ref, true)\n }\n }\n }\n\n adapter.visitExactLinks(projectId, (row) => {\n const ref = linkRef(row)\n if (replacement.affectedScopes.has(linkScopeSortKey(ref.source, ref.linkId))) {\n addReplacementLink(replacement, ref, false)\n }\n })\n replacement.linksExpanded = true\n replacement.orderedLinks = null\n }\n\n private assertCommitAbsent(header: MaterializationPlanHeader): void {\n if (this.state.commitsById.has(commitKey(header.commit.projectId, header.commit.id))) {\n throw new MaterializationConflictError(\n \"idempotency\",\n `Ontology commit '${header.commit.id}' already exists.`\n )\n }\n if (\n this.state.commitIdByIdempotency.has(\n idempotencyKey(header.commit.projectId, header.commit.idempotencyKey)\n )\n ) {\n throw new MaterializationConflictError(\n \"idempotency\",\n \"Ontology idempotency key already exists.\"\n )\n }\n const origin = ontologyCommitOriginSelector(header.commit.origin)\n if (\n origin &&\n this.state.commitIdByOrigin.has(commitOriginKey(header.commit.projectId, origin))\n ) {\n throw new MaterializationConflictError(\n \"run-correlation\",\n \"Ontology commit origin already has an authoritative commit.\"\n )\n }\n }\n\n private assertSource(expected: ExpectedSourceRevision, projectId: string): void {\n const current = findActiveSourceMaterialization(\n this.state,\n projectId,\n expected.source.projectionId\n )\n if (\n (current?.materializationId ?? null) !== expected.activeMaterializationId ||\n (current?.lastCommitId ?? null) !== expected.lastCommitId\n ) {\n throw new MaterializationConflictError(\n \"projection-fence\",\n `Source '${expected.source.projectionId}' changed.`\n )\n }\n }\n\n private async assertObject(expected: ExpectedObjectRevision, projectId: string): Promise<void> {\n this.assertObjectSync(expected, projectId)\n }\n\n private assertObjectSync(expected: ExpectedObjectRevision, projectId: string): void {\n const row = getInMemoryObjectMaterializerAdapter(this.objects).getExactObjectRow(\n projectId,\n expected.ref.objectTypeId,\n expected.ref.primaryId\n )\n if (!expected.exists) {\n if (row)\n throw new MaterializationConflictError(\n \"effective-state\",\n `Expected object ${objectRefKey(expected.ref)} to be absent.`\n )\n return\n }\n if (!row || row.version !== expected.version || row.lastCommitId !== expected.lastCommitId) {\n throw new MaterializationConflictError(\n \"effective-state\",\n `Expected object ${objectRefKey(expected.ref)} changed.`\n )\n }\n }\n\n private async assertLink(expected: ExpectedLinkRevision, projectId: string): Promise<void> {\n this.assertLinkSync(expected, projectId)\n }\n\n private assertLinkSync(expected: ExpectedLinkRevision, projectId: string): void {\n const row = getInMemoryObjectMaterializerAdapter(this.objects).getExactLinkRow(projectId, {\n sourceTypeId: expected.ref.source.objectTypeId,\n sourceId: expected.ref.source.primaryId,\n linkId: expected.ref.linkId,\n targetTypeId: expected.ref.target.objectTypeId,\n targetId: expected.ref.target.primaryId,\n })\n if (!expected.exists) {\n if (row)\n throw new MaterializationConflictError(\n \"effective-state\",\n `Expected link ${linkRefKey(expected.ref)} to be absent.`\n )\n return\n }\n if (!row || row.lastCommitId !== expected.lastCommitId) {\n throw new MaterializationConflictError(\n \"effective-state\",\n `Expected link ${linkRefKey(expected.ref)} changed.`\n )\n }\n }\n\n private assertPoint(expected: ExpectedTimeseriesPointRevision, projectId: string): void {\n const point = getInMemoryTimeseriesMaterializerAdapter(this.timeseries).getExactPoint(\n projectId,\n expected.series,\n expected.at\n )\n if ((point?.lastCommitId ?? null) !== expected.lastCommitId) {\n throw new MaterializationConflictError(\n \"timeseries-point\",\n `Telemetry point ${telemetryPointKey(expected.series, expected.at)} changed.`\n )\n }\n }\n\n private async objectState(\n session: SessionState,\n ref: OntologyObjectRef\n ): Promise<MaterializationObjectState> {\n const projectId = session.header.commit.projectId\n const row = await this.objects.getByPrimaryId({\n projectId,\n objectTypeId: ref.objectTypeId,\n primaryId: ref.primaryId,\n })\n return {\n ref: structuredClone(ref),\n source: this.findActiveObjectSource(projectId, ref),\n override: structuredClone(\n publicObjectOverride(\n this.state.objectOverrides.get(projectEntityKey(projectId, objectRefKey(ref)))\n )\n ),\n effective: row ? objectSnapshot(row) : null,\n latestTelemetry: getInMemoryTimeseriesMaterializerAdapter(this.timeseries)\n .listLatestForObject(projectId, ref.objectTypeId, ref.primaryId)\n .map(storedPoint),\n }\n }\n\n private async linkState(\n session: SessionState,\n ref: OntologyLinkRef\n ): Promise<MaterializationLinkState> {\n const projectId = session.header.commit.projectId\n const row = getInMemoryObjectMaterializerAdapter(this.objects).getExactLinkRow(projectId, {\n sourceTypeId: ref.source.objectTypeId,\n sourceId: ref.source.primaryId,\n linkId: ref.linkId,\n targetTypeId: ref.target.objectTypeId,\n targetId: ref.target.primaryId,\n })\n return {\n ref: structuredClone(ref),\n source: this.findActiveLinkSource(projectId, ref),\n override: structuredClone(\n publicLinkOverride(\n this.state.linkOverrides.get(projectEntityKey(projectId, linkRefKey(ref)))\n )\n ),\n effective: row ? linkSnapshot(row) : null,\n }\n }\n\n private linkScopeState(\n session: SessionState,\n source: OntologyObjectRef,\n linkId: string\n ): MaterializationLinkScopeState {\n session.linkScopeStates ??= new Map()\n const key = linkScopeSortKey(source, linkId)\n const existing = session.linkScopeStates.get(key)\n if (existing) return structuredClone(existing)\n const computed = this.computeLinkScopeState(session.header.commit.projectId, source, linkId)\n session.linkScopeStates.set(key, computed)\n return structuredClone(computed)\n }\n\n private computeLinkScopeState(\n projectId: string,\n source: OntologyObjectRef,\n linkId: string\n ): MaterializationLinkScopeState {\n const rows: ObjectLinkRow[] = []\n getInMemoryObjectMaterializerAdapter(this.objects).visitExactScopeLinks(\n projectId,\n source.objectTypeId,\n source.primaryId,\n linkId,\n (row) => rows.push(row)\n )\n rows.sort((left, right) =>\n linkRefSortKey(linkRef(left)).localeCompare(linkRefSortKey(linkRef(right)))\n )\n const accumulator = startScopeAccumulator(source, linkId, linkScopeSortKey(source, linkId))\n for (let offset = 0; offset < rows.length; offset += 1_000) {\n const page = rows.slice(offset, offset + 1_000)\n this.hooks.observeBuffer?.(\"state.link-scope.page\", page.length)\n for (const row of page) {\n appendScopeSnapshot(accumulator, linkSnapshot(row))\n }\n }\n return finishScopeAccumulator(accumulator)\n }\n\n private findActiveObjectSource(\n projectId: string,\n ref: OntologyObjectRef\n ): StoredSourceObjectAssertion | null {\n const found = this.findActiveSource(projectId, projectionEntityKey({ kind: \"object\", ref }))\n return found?.assertion.kind === \"object\" ? (found as StoredSourceObjectAssertion) : null\n }\n\n private findActiveLinkSource(\n projectId: string,\n ref: OntologyLinkRef\n ): StoredSourceLinkAssertion | null {\n const found = this.findActiveSource(projectId, projectionEntityKey({ kind: \"link\", ref }))\n return found?.assertion.kind === \"link\" ? (found as StoredSourceLinkAssertion) : null\n }\n\n private findActiveSource(projectId: string, entityKey: string): StoredSourceAssertion | null {\n let found: StoredSourceAssertion | null = null\n for (const active of this.state.sourceMaterializations.values()) {\n if (active.projectId !== projectId || active.status !== \"active\") continue\n const row = active.rowsByEntity.get(entityKey)\n if (!row) continue\n if (found)\n throw new MaterializationConflictError(\n \"source-materialization\",\n `Multiple active sources assert ${entityKey}.`\n )\n found = storedSource(active.source.projectionId, active.materializationId, row)\n }\n return structuredClone(found)\n }\n\n private incidentLinkRefs(\n session: SessionState,\n objects: readonly OntologyObjectRef[]\n ): readonly OntologyLinkRef[] {\n if (objects.length === 0) return []\n session.incidentLinksByObject ??= this.buildIncidentLinkIndex(session.header.commit.projectId)\n const selected = new Map<string, OntologyLinkRef>()\n for (const object of objects) {\n for (const ref of session.incidentLinksByObject.get(objectRefKey(object)) ?? []) {\n selected.set(linkRefSortKey(ref), ref)\n }\n }\n return [...selected.entries()]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([, ref]) => ref)\n }\n\n private buildIncidentLinkIndex(projectId: string): Map<string, readonly OntologyLinkRef[]> {\n const mutable = new Map<string, Map<string, OntologyLinkRef>>()\n const consider = (ref: OntologyLinkRef): void => {\n const sortKey = linkRefSortKey(ref)\n for (const endpoint of [ref.source, ref.target]) {\n const key = objectRefKey(endpoint)\n const links = mutable.get(key) ?? new Map<string, OntologyLinkRef>()\n links.set(sortKey, structuredClone(ref))\n mutable.set(key, links)\n }\n }\n getInMemoryObjectMaterializerAdapter(this.objects).visitExactLinks(projectId, (row) =>\n consider(linkRef(row))\n )\n for (const override of this.state.linkOverrides.values()) {\n if (override.projectId === projectId) consider(override.ref)\n }\n for (const active of this.state.sourceMaterializations.values()) {\n if (active.projectId !== projectId || active.status !== \"active\") continue\n for (const row of active.rowsByEntity.values()) {\n if (row.assertion.kind === \"link\") consider(row.assertion.ref)\n }\n }\n const index = new Map<string, readonly OntologyLinkRef[]>()\n for (const [objectKey, refs] of mutable) {\n index.set(\n objectKey,\n [...refs.entries()]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([, ref]) => ref)\n )\n }\n return index\n }\n}\n",
|
|
21
|
-
"import {\n MaterializationConflictError,\n MaterializationValidationError,\n} from \"../../../materialization/errors\"\nimport type {\n ClaimedOntologyOutboxRow,\n ClaimOntologyOutboxInput,\n CompleteOntologyOutboxLeaseInput,\n OntologyOutboxRecord,\n OntologyOutboxStorage,\n OntologyOutboxSummary,\n PurgePublishedOntologyOutboxInput,\n RescheduleOntologyOutboxLeaseInput,\n SummarizeOntologyOutboxInput,\n} from \"../outbox\"\nimport {\n assertNonblank,\n assertTimestamp,\n type InMemoryOntologyState,\n insertBounded,\n outboxKey,\n} from \"./shared-state\"\n\nexport class InMemoryOntologyOutboxStorage implements OntologyOutboxStorage {\n constructor(\n private readonly state: InMemoryOntologyState,\n private readonly runRootOperation: <T>(run: () => Promise<T> | T) => Promise<T>\n ) {}\n\n async claim(input: ClaimOntologyOutboxInput): Promise<readonly ClaimedOntologyOutboxRow[]> {\n return this.runRootOperation(() => this.claimUnlocked(input))\n }\n\n private claimUnlocked(input: ClaimOntologyOutboxInput): readonly ClaimedOntologyOutboxRow[] {\n assertNonblank(input.projectId, \"Ontology outbox project id\")\n assertPositiveLimit(input.limit)\n const now = assertTimestamp(input.now, \"Ontology outbox claim time\")\n const leaseExpiresAt = assertTimestamp(input.leaseExpiresAt, \"Ontology outbox lease expiry\")\n assertNonblank(input.leaseId, \"Ontology outbox lease id\")\n if (leaseExpiresAt <= now) {\n throw new MaterializationValidationError(\n \"Ontology outbox lease expiry must be later than the claim time.\"\n )\n }\n const rows: OntologyOutboxRecord[] = []\n for (const row of this.state.outbox.values()) {\n if (row.envelope.projectId !== input.projectId) continue\n assertPairedLease(row)\n if (row.publishedAt !== null || Date.parse(row.availableAt) > now) continue\n if (row.leaseExpiresAt !== null && Date.parse(row.leaseExpiresAt) > now) continue\n insertBounded(rows, row, input.limit, compareClaimRows)\n }\n return rows.map((row) => {\n const claimed: ClaimedOntologyOutboxRow = {\n ...row,\n attempts: row.attempts + 1,\n leaseId: input.leaseId,\n leaseExpiresAt: input.leaseExpiresAt,\n }\n this.state.outbox.set(outboxKey(input.projectId, row.envelope.id), structuredClone(claimed))\n return structuredClone(claimed)\n })\n }\n\n async markPublished(input: CompleteOntologyOutboxLeaseInput): Promise<void> {\n await this.runRootOperation(() => this.markPublishedUnlocked(input))\n }\n\n private markPublishedUnlocked(input: CompleteOntologyOutboxLeaseInput): void {\n assertNonblank(input.projectId, \"Ontology outbox project id\")\n assertNonblank(input.leaseId, \"Ontology outbox lease id\")\n assertTimestamp(input.publishedAt, \"Ontology outbox publishedAt\")\n const rows = this.validateLeaseBatch(input.projectId, input.ids, input.leaseId)\n for (const [key, row] of rows) {\n this.state.outbox.set(key, {\n ...row,\n publishedAt: input.publishedAt,\n leaseId: null,\n leaseExpiresAt: null,\n })\n }\n }\n\n async reschedule(input: RescheduleOntologyOutboxLeaseInput): Promise<void> {\n await this.runRootOperation(() => this.rescheduleUnlocked(input))\n }\n\n private rescheduleUnlocked(input: RescheduleOntologyOutboxLeaseInput): void {\n assertNonblank(input.projectId, \"Ontology outbox project id\")\n assertNonblank(input.leaseId, \"Ontology outbox lease id\")\n assertTimestamp(input.availableAt, \"Ontology outbox availableAt\")\n const rows = this.validateLeaseBatch(input.projectId, input.ids, input.leaseId)\n for (const [key, row] of rows) {\n this.state.outbox.set(key, {\n ...row,\n availableAt: input.availableAt,\n lastError: input.error,\n leaseId: null,\n leaseExpiresAt: null,\n })\n }\n }\n\n async purgePublished(input: PurgePublishedOntologyOutboxInput): Promise<number> {\n return this.runRootOperation(() => this.purgePublishedUnlocked(input))\n }\n\n async summarize(input: SummarizeOntologyOutboxInput): Promise<OntologyOutboxSummary> {\n return this.runRootOperation(() => {\n assertNonblank(input.projectId, \"Ontology outbox project id\")\n let pendingCount = 0\n let oldestPendingAt: string | null = null\n let retryingCount = 0\n let maxAttempts = 0\n\n for (const row of this.state.outbox.values()) {\n if (row.envelope.projectId !== input.projectId || row.publishedAt !== null) continue\n pendingCount += 1\n if (row.attempts > 0) retryingCount += 1\n maxAttempts = Math.max(maxAttempts, row.attempts)\n if (oldestPendingAt === null || row.createdAt < oldestPendingAt) {\n oldestPendingAt = row.createdAt\n }\n }\n\n return { pendingCount, oldestPendingAt, retryingCount, maxAttempts }\n })\n }\n\n private purgePublishedUnlocked(input: PurgePublishedOntologyOutboxInput): number {\n assertNonblank(input.projectId, \"Ontology outbox project id\")\n assertPositiveLimit(input.limit)\n const cutoff = assertTimestamp(input.publishedBefore, \"Ontology outbox purge cutoff\")\n const rows: [string, OntologyOutboxRecord][] = []\n for (const entry of this.state.outbox.entries()) {\n const [, row] = entry\n if (\n row.envelope.projectId !== input.projectId ||\n row.publishedAt === null ||\n Date.parse(row.publishedAt) >= cutoff\n ) {\n continue\n }\n insertBounded(rows, entry, input.limit, ([, left], [, right]) =>\n comparePublishedRows(left, right)\n )\n }\n for (const [key] of rows) this.state.outbox.delete(key)\n return rows.length\n }\n\n private requireLease(key: string, leaseId: string) {\n const row = this.state.outbox.get(key)\n if (!row || row.leaseId !== leaseId || row.leaseExpiresAt === null) {\n throw new MaterializationConflictError(\n \"outbox-lease\",\n \"Ontology outbox lease does not match.\"\n )\n }\n return row\n }\n\n private validateLeaseBatch(\n projectId: string,\n ids: readonly string[],\n leaseId: string\n ): readonly (readonly [string, ReturnType<InMemoryOntologyOutboxStorage[\"requireLease\"]>])[] {\n const seen = new Set<string>()\n return ids.map((id) => {\n assertNonblank(id, \"Ontology outbox event id\")\n if (seen.has(id)) {\n throw new MaterializationValidationError(\n `Ontology outbox lease batch repeats event '${id}'.`\n )\n }\n seen.add(id)\n const key = outboxKey(projectId, id)\n return [key, this.requireLease(key, leaseId)] as const\n })\n }\n}\n\n/**\n * Deterministic claim order.\n *\n * Every row of one commit shares `createdAt`, so `commitOrdinal` gives providers a stable batch\n * order. It correlates facts but does not promise broker delivery order: concurrent leases and\n * retries may publish later rows first.\n */\nfunction compareClaimRows(\n left: import(\"../outbox\").OntologyOutboxRecord,\n right: import(\"../outbox\").OntologyOutboxRecord\n): number {\n return (\n left.createdAt.localeCompare(right.createdAt) ||\n left.envelope.commitId.localeCompare(right.envelope.commitId) ||\n left.envelope.commitOrdinal - right.envelope.commitOrdinal\n )\n}\n\nfunction comparePublishedRows(\n left: import(\"../outbox\").OntologyOutboxRecord,\n right: import(\"../outbox\").OntologyOutboxRecord\n): number {\n return (\n (left.publishedAt ?? \"\").localeCompare(right.publishedAt ?? \"\") ||\n left.envelope.id.localeCompare(right.envelope.id)\n )\n}\n\nfunction assertPositiveLimit(limit: number): void {\n if (!Number.isSafeInteger(limit) || limit <= 0) {\n throw new MaterializationValidationError(\"Ontology outbox limit must be positive.\")\n }\n}\n\nfunction assertPairedLease(row: {\n readonly leaseId: string | null\n readonly leaseExpiresAt: string | null\n}): void {\n if ((row.leaseId === null) !== (row.leaseExpiresAt === null)) {\n throw new MaterializationConflictError(\n \"outbox-lease\",\n \"Ontology outbox row has an unpaired lease lifecycle.\"\n )\n }\n}\n",
|
|
22
|
-
"import { stableJsonStringify } from \"../../../json\"\nimport { MaterializationValidationError } from \"../../../materialization/errors\"\nimport type { ProjectionExecution } from \"../../../materialization/model\"\nimport { projectionEntityKey } from \"../../../materialization/refs\"\nimport {\n assertSourceBeginInput as assertBeginInput,\n assertTimestamp as assertCanonicalTimestamp,\n assertSourceProject as assertProjectAndSource,\n assertSourceCandidateOwner,\n assertSourceExecutionIdentity,\n assertSourceStagedRow,\n assertSourceWriteIdentity as assertWriteIdentity,\n isExactStagingManifest,\n sourceConflict,\n sourceMaterializationIdentity,\n} from \"../provider\"\nimport type {\n AbandonSourceMaterializationCandidateInput,\n AbandonSourceMaterializationInput,\n AssertSourceMaterializationExecution,\n BeginSourceMaterializationInput,\n CleanupTerminalSourceMaterializationsInput,\n CleanupTerminalSourceMaterializationsResult,\n GetActiveOntologySourceInput,\n MarkSourceMaterializationReadyInput,\n OntologySourceRecord,\n OntologySourceStorage,\n ReclaimSourceMaterializationInput,\n StageSourceAssertion,\n StageSourceRowsInput,\n StageSourceRowsResult,\n SummarizeTerminalSourceMaterializationsInput,\n TerminalSourceMaterializationSummary,\n} from \"../sources\"\nimport {\n assertNonblank,\n type InMemoryOntologyState,\n type InMemorySourceMaterialization,\n insertBounded,\n sourceMaterializationKey,\n sourceMaterializationRecord,\n} from \"./shared-state\"\n\nexport class InMemoryOntologySourceStorage implements OntologySourceStorage {\n constructor(\n private readonly state: InMemoryOntologyState,\n private readonly runRootOperation: <T>(run: () => Promise<T> | T) => Promise<T>,\n private readonly assertExecution: AssertSourceMaterializationExecution\n ) {}\n\n async beginMaterialization(\n input: BeginSourceMaterializationInput\n ): Promise<OntologySourceRecord> {\n return this.runRootOperation(async () => {\n assertBeginInput(input)\n await this.assertCurrentExecution(input)\n const key = sourceMaterializationKey(\n input.projectId,\n input.source.projectionId,\n input.materializationId\n )\n const existing = this.state.sourceMaterializations.get(key)\n if (existing) {\n if (isExactStagingManifest(sourceMaterializationRecord(existing), input)) {\n return sourceMaterializationRecord(existing)\n }\n throw sourceConflict(\n `Source materialization '${input.materializationId}' already exists with different identity or state.`\n )\n }\n\n const nonterminal = this.findRunCandidates(\n input.projectId,\n input.source.projectionId,\n input.execution.projectionRunId\n )\n if (nonterminal.length > 0) {\n throw sourceConflict(\n `Projection run '${input.execution.projectionRunId}' already has a nonterminal source materialization; reclaim it before beginning another.`\n )\n }\n\n const materialization: InMemorySourceMaterialization = {\n projectId: input.projectId,\n source: structuredClone(input.source),\n materializationId: input.materializationId,\n projectionRunId: input.execution.projectionRunId,\n projectionKind: input.projectionKind,\n protocol: input.protocol,\n status: \"staging\",\n executionToken: input.execution.executionToken,\n datasetVersion: structuredClone(input.datasetVersion),\n projectionRevision: input.projectionRevision,\n ownershipHash: input.ownershipHash,\n ontologyRevision: input.ontologyRevision,\n rootCount: null,\n assertionCount: null,\n createdAt: input.createdAt,\n readyAt: null,\n activatedAt: null,\n terminalAt: null,\n lastCommitId: null,\n updatedAt: input.createdAt,\n rowsByEntity: new Map(),\n rootOrdinals: new Map(),\n ordinalRoots: new Map(),\n }\n this.state.sourceMaterializations.set(key, materialization)\n return sourceMaterializationRecord(materialization)\n })\n }\n\n async stageRows(input: StageSourceRowsInput): Promise<StageSourceRowsResult> {\n return this.runRootOperation(async () => {\n assertWriteIdentity(input)\n await this.assertCurrentExecution(input)\n const materialization = this.requireMaterialization(input)\n assertSourceCandidateOwner(sourceMaterializationRecord(materialization), input.execution)\n if (materialization.status !== \"staging\") {\n throw sourceConflict(\n `Source materialization '${input.materializationId}' is '${materialization.status}' and cannot accept rows.`\n )\n }\n return stageRowsAtomically(materialization, input.rows)\n })\n }\n\n async markReady(input: MarkSourceMaterializationReadyInput): Promise<OntologySourceRecord> {\n return this.runRootOperation(async () => {\n assertWriteIdentity(input)\n assertCanonicalTimestamp(input.readyAt, \"Source readyAt\")\n assertCount(input.rootCount, \"Source root count\")\n assertCount(input.assertionCount, \"Source assertion count\")\n await this.assertCurrentExecution(input)\n const materialization = this.requireMaterialization(input)\n assertSourceCandidateOwner(sourceMaterializationRecord(materialization), input.execution)\n\n if (materialization.status === \"ready\") {\n if (\n materialization.rootCount === input.rootCount &&\n materialization.assertionCount === input.assertionCount &&\n materialization.readyAt === input.readyAt\n ) {\n return sourceMaterializationRecord(materialization)\n }\n throw sourceConflict(\n `Source materialization '${input.materializationId}' was marked ready with different counts or time.`\n )\n }\n if (materialization.status !== \"staging\") {\n throw sourceConflict(\n `Source materialization '${input.materializationId}' cannot transition from '${materialization.status}' to 'ready'.`\n )\n }\n assertNotBefore(input.readyAt, materialization.createdAt, \"Source readyAt\", \"createdAt\")\n assertReadyCounts(materialization, input.rootCount, input.assertionCount)\n\n const ready: InMemorySourceMaterialization = {\n ...materialization,\n status: \"ready\",\n rootCount: input.rootCount,\n assertionCount: input.assertionCount,\n readyAt: input.readyAt,\n updatedAt: input.readyAt,\n }\n this.state.sourceMaterializations.set(\n sourceMaterializationKey(\n input.projectId,\n input.source.projectionId,\n input.materializationId\n ),\n ready\n )\n return sourceMaterializationRecord(ready)\n })\n }\n\n async getActive(input: GetActiveOntologySourceInput): Promise<OntologySourceRecord | null> {\n return this.runRootOperation(() => {\n assertProjectAndSource(input)\n const active = [...this.state.sourceMaterializations.values()].filter(\n (materialization) =>\n materialization.projectId === input.projectId &&\n materialization.source.projectionId === input.source.projectionId &&\n materialization.status === \"active\"\n )\n if (active.length > 1) {\n throw sourceConflict(\n `Source '${input.source.projectionId}' has more than one active materialization.`\n )\n }\n return active[0] ? sourceMaterializationRecord(active[0]) : null\n })\n }\n\n async abandon(input: AbandonSourceMaterializationCandidateInput): Promise<OntologySourceRecord>\n async abandon(input: ReclaimSourceMaterializationInput): Promise<OntologySourceRecord | null>\n async abandon(input: AbandonSourceMaterializationInput): Promise<OntologySourceRecord | null> {\n return this.runRootOperation(async () => {\n assertProjectAndSource(input)\n assertSourceExecutionIdentity(input.execution.projectionRunId, input.execution.executionToken)\n assertCanonicalTimestamp(input.abandonedAt, \"Source abandonedAt\")\n await this.assertCurrentExecution(input)\n return input.kind === \"candidate\"\n ? this.abandonCandidate(input)\n : this.abandonForReclaim(input)\n })\n }\n\n async cleanupTerminal(\n input: CleanupTerminalSourceMaterializationsInput\n ): Promise<CleanupTerminalSourceMaterializationsResult> {\n return this.runRootOperation(() => {\n assertNonblank(input.projectId, \"Terminal source cleanup project id\")\n assertCanonicalTimestamp(input.terminalBefore, \"Terminal source cleanup cutoff\")\n if (!Number.isSafeInteger(input.limit) || input.limit <= 0) {\n throw new MaterializationValidationError(\n \"Terminal source cleanup limit must be a positive safe integer.\"\n )\n }\n\n const candidates: [string, InMemorySourceMaterialization][] = []\n for (const entry of this.state.sourceMaterializations.entries()) {\n const materialization = entry[1]\n if (\n materialization.projectId !== input.projectId ||\n (materialization.status !== \"superseded\" && materialization.status !== \"abandoned\") ||\n materialization.terminalAt === null ||\n materialization.terminalAt >= input.terminalBefore\n ) {\n continue\n }\n insertBounded(candidates, entry, input.limit, compareTerminalMaterializations)\n }\n\n let remaining = input.limit\n let rowsDeleted = 0\n let materializationsDeleted = 0\n for (const [key, candidate] of candidates) {\n if (remaining === 0) break\n const current = this.state.sourceMaterializations.get(key)\n if (current !== candidate) continue\n // Terminal manifests never participate in reads or activation again. Release their\n // ingestion-only indexes immediately instead of retaining O(root count) memory until the\n // last child row is removed by a later bounded cleanup pass.\n current.rootOrdinals.clear()\n current.ordinalRoots.clear()\n for (const entityKey of current.rowsByEntity.keys()) {\n if (remaining === 0) break\n current.rowsByEntity.delete(entityKey)\n rowsDeleted += 1\n remaining -= 1\n }\n if (current.rowsByEntity.size === 0 && remaining > 0) {\n this.state.sourceMaterializations.delete(key)\n materializationsDeleted += 1\n remaining -= 1\n }\n }\n return { rowsDeleted, materializationsDeleted }\n })\n }\n\n async summarizeTerminal(\n input: SummarizeTerminalSourceMaterializationsInput\n ): Promise<TerminalSourceMaterializationSummary> {\n return this.runRootOperation(() => {\n assertNonblank(input.projectId, \"Terminal source summary project id\")\n let count = 0\n let oldestTerminalAt: string | null = null\n for (const materialization of this.state.sourceMaterializations.values()) {\n if (\n materialization.projectId !== input.projectId ||\n (materialization.status !== \"superseded\" && materialization.status !== \"abandoned\") ||\n materialization.terminalAt === null\n ) {\n continue\n }\n count += 1\n if (oldestTerminalAt === null || materialization.terminalAt < oldestTerminalAt) {\n oldestTerminalAt = materialization.terminalAt\n }\n }\n return { count, oldestTerminalAt }\n })\n }\n\n private async assertCurrentExecution(\n input:\n | BeginSourceMaterializationInput\n | {\n readonly projectId: string\n readonly source: BeginSourceMaterializationInput[\"source\"]\n readonly execution: ProjectionExecution\n }\n ): Promise<void> {\n await this.assertExecution({\n projectId: input.projectId,\n source: input.source,\n execution: input.execution,\n ...(\"projectionKind\" in input ? { identity: sourceMaterializationIdentity(input) } : {}),\n })\n }\n\n private requireMaterialization(input: {\n readonly projectId: string\n readonly source: BeginSourceMaterializationInput[\"source\"]\n readonly materializationId: string\n }): InMemorySourceMaterialization {\n const materialization = this.state.sourceMaterializations.get(\n sourceMaterializationKey(input.projectId, input.source.projectionId, input.materializationId)\n )\n if (!materialization) {\n throw sourceConflict(`Source materialization '${input.materializationId}' does not exist.`)\n }\n return materialization\n }\n\n private abandonCandidate(\n input: AbandonSourceMaterializationCandidateInput\n ): OntologySourceRecord {\n const materialization = this.requireMaterialization(input)\n if (materialization.status === \"abandoned\") {\n if (\n materialization.projectionRunId === input.execution.projectionRunId &&\n materialization.terminalAt === input.abandonedAt\n ) {\n return sourceMaterializationRecord(materialization)\n }\n throw sourceConflict(\n `Source materialization '${input.materializationId}' was abandoned by another execution or at another time.`\n )\n }\n assertSourceCandidateOwner(sourceMaterializationRecord(materialization), input.execution)\n if (materialization.status !== \"staging\" && materialization.status !== \"ready\") {\n throw sourceConflict(\n `Source materialization '${input.materializationId}' cannot transition from '${materialization.status}' to 'abandoned'.`\n )\n }\n return this.transitionToAbandoned(materialization, input.abandonedAt)\n }\n\n private abandonForReclaim(input: ReclaimSourceMaterializationInput): OntologySourceRecord | null {\n const candidates = this.findRunCandidates(\n input.projectId,\n input.source.projectionId,\n input.execution.projectionRunId\n )\n if (\n candidates.some(\n ([, materialization]) => materialization.executionToken === input.execution.executionToken\n )\n ) {\n throw sourceConflict(\n `Projection run '${input.execution.projectionRunId}' already has a source materialization owned by the current execution.`\n )\n }\n if (candidates.length > 1) {\n throw sourceConflict(\n `Projection run '${input.execution.projectionRunId}' has multiple nonterminal source materializations.`\n )\n }\n const candidate = candidates[0]?.[1]\n return candidate ? this.transitionToAbandoned(candidate, input.abandonedAt) : null\n }\n\n private transitionToAbandoned(\n materialization: InMemorySourceMaterialization,\n abandonedAt: string\n ): OntologySourceRecord {\n assertNotBefore(abandonedAt, materialization.createdAt, \"Source abandonedAt\", \"createdAt\")\n if (materialization.readyAt !== null) {\n assertNotBefore(abandonedAt, materialization.readyAt, \"Source abandonedAt\", \"readyAt\")\n }\n const abandoned: InMemorySourceMaterialization = {\n ...materialization,\n status: \"abandoned\",\n executionToken: null,\n terminalAt: abandonedAt,\n updatedAt: abandonedAt,\n }\n this.state.sourceMaterializations.set(\n sourceMaterializationKey(\n materialization.projectId,\n materialization.source.projectionId,\n materialization.materializationId\n ),\n abandoned\n )\n return sourceMaterializationRecord(abandoned)\n }\n\n private findRunCandidates(\n projectId: string,\n sourceId: string,\n projectionRunId: string\n ): [string, InMemorySourceMaterialization][] {\n return [...this.state.sourceMaterializations.entries()].filter(\n ([, materialization]) =>\n materialization.projectId === projectId &&\n materialization.source.projectionId === sourceId &&\n materialization.projectionRunId === projectionRunId &&\n (materialization.status === \"staging\" || materialization.status === \"ready\")\n )\n }\n}\n\nfunction stageRowsAtomically(\n materialization: InMemorySourceMaterialization,\n rows: StageSourceRowsInput[\"rows\"]\n): StageSourceRowsResult {\n let inserted = 0\n let unchanged = 0\n const newRows = new Map<string, StageSourceRowsInput[\"rows\"][number]>()\n const newRootOrdinals = new Map<string, number>()\n const newOrdinalRoots = new Map<number, string>()\n for (const row of rows) {\n assertSourceStagedRow(materialization.projectionKind, row)\n\n const rootKey = projectionEntityKey(row.root)\n const existingOrdinal =\n materialization.rootOrdinals.get(rootKey) ?? newRootOrdinals.get(rootKey)\n if (existingOrdinal !== undefined && existingOrdinal !== row.stagingOrdinal) {\n throw new MaterializationValidationError(\n `Source materialization repeats root ${rootKey} at a different stream ordinal.`\n )\n }\n const existingRoot =\n materialization.ordinalRoots.get(row.stagingOrdinal) ??\n newOrdinalRoots.get(row.stagingOrdinal)\n if (existingRoot !== undefined && existingRoot !== rootKey) {\n throw new MaterializationValidationError(\n `Source materialization repeats stream ordinal ${row.stagingOrdinal} for another root.`\n )\n }\n\n const entityKey = projectionEntityKey(row.assertion)\n const existing = materialization.rowsByEntity.get(entityKey) ?? newRows.get(entityKey)\n if (existing) {\n if (stableJsonStringify(existing) === stableJsonStringify(row)) {\n unchanged += 1\n continue\n }\n throw new MaterializationValidationError(\n `Source materialization repeats asserted entity ${entityKey}.`\n )\n }\n\n newRootOrdinals.set(rootKey, row.stagingOrdinal)\n newOrdinalRoots.set(row.stagingOrdinal, rootKey)\n newRows.set(entityKey, structuredClone(row))\n inserted += 1\n }\n\n for (const [rootKey, ordinal] of newRootOrdinals) {\n materialization.rootOrdinals.set(rootKey, ordinal)\n }\n for (const [ordinal, rootKey] of newOrdinalRoots) {\n materialization.ordinalRoots.set(ordinal, rootKey)\n }\n for (const [entityKey, row] of newRows) materialization.rowsByEntity.set(entityKey, row)\n return { inserted, unchanged }\n}\n\nfunction assertReadyCounts(\n materialization: InMemorySourceMaterialization,\n rootCount: number,\n assertionCount: number\n): void {\n if (\n materialization.rootOrdinals.size !== rootCount ||\n materialization.ordinalRoots.size !== rootCount ||\n materialization.rowsByEntity.size !== assertionCount\n ) {\n throw new MaterializationValidationError(\n \"Source ready counts do not match the staged roots and assertions.\"\n )\n }\n for (let ordinal = 0; ordinal < rootCount; ordinal += 1) {\n if (!materialization.ordinalRoots.has(ordinal)) {\n throw new MaterializationValidationError(\n `Source staging ordinals must be contiguous from zero; missing ${ordinal}.`\n )\n }\n }\n assertReadyTopology(materialization)\n}\n\nfunction assertReadyTopology(materialization: InMemorySourceMaterialization): void {\n const rowsByRoot = new Map<string, StageSourceAssertion[]>()\n for (const row of materialization.rowsByEntity.values()) {\n const rootKey = projectionEntityKey(row.root)\n const rows = rowsByRoot.get(rootKey) ?? []\n rows.push(row)\n rowsByRoot.set(rootKey, rows)\n }\n\n for (const rootKey of materialization.rootOrdinals.keys()) {\n const rows = rowsByRoot.get(rootKey) ?? []\n const first = rows[0]\n if (!first) {\n throw new MaterializationValidationError(`Source root ${rootKey} has no staged assertions.`)\n }\n const root = first.root\n\n if (materialization.projectionKind === \"link\") {\n if (\n rows.length !== 1 ||\n root.kind !== \"link\" ||\n first.assertion.kind !== \"link\" ||\n projectionEntityKey(first.assertion) !== rootKey\n ) {\n throw new MaterializationValidationError(\n `Link projection root ${rootKey} must contain exactly its matching link assertion.`\n )\n }\n continue\n }\n\n if (root.kind !== \"object\") {\n throw new MaterializationValidationError(\n `Object projection root ${rootKey} must be an object.`\n )\n }\n const matchingObjects = rows.filter(\n (row) => row.assertion.kind === \"object\" && projectionEntityKey(row.assertion) === rootKey\n )\n const hasForeignAssertion = rows.some((row) => {\n if (row.assertion.kind === \"object\") return projectionEntityKey(row.assertion) !== rootKey\n return projectionEntityKey({ kind: \"object\", ref: row.assertion.ref.source }) !== rootKey\n })\n if (matchingObjects.length !== 1 || hasForeignAssertion) {\n throw new MaterializationValidationError(\n `Object projection root ${rootKey} must contain exactly its matching object assertion plus links sourced from that root.`\n )\n }\n }\n}\n\nfunction assertCount(value: number, label: string): void {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new MaterializationValidationError(`${label} must be a nonnegative safe integer.`)\n }\n}\n\nfunction assertNotBefore(\n value: string,\n minimum: string,\n label: string,\n minimumLabel: string\n): void {\n if (value < minimum) {\n throw new MaterializationValidationError(`${label} cannot precede source ${minimumLabel}.`)\n }\n}\n\nfunction compareTerminalMaterializations(\n [, left]: readonly [string, InMemorySourceMaterialization],\n [, right]: readonly [string, InMemorySourceMaterialization]\n): number {\n return (\n (left.terminalAt ?? \"\").localeCompare(right.terminalAt ?? \"\") ||\n left.source.projectionId.localeCompare(right.source.projectionId) ||\n left.materializationId.localeCompare(right.materializationId)\n )\n}\n",
|
|
23
|
-
"import type { OntologyStorage } from \"..\"\nimport type { InMemoryOntologyState, InMemoryOntologyStorageTestHooks } from \"./shared-state\"\n\nexport interface InMemoryOntologyStorageTestingAdapter {\n setTestHooks(hooks: InMemoryOntologyStorageTestHooks): void\n snapshot(): InMemoryOntologyState\n}\n\nconst testingAdapters = new WeakMap<object, InMemoryOntologyStorageTestingAdapter>()\n\nexport function registerInMemoryOntologyStorageTestingAdapter(\n storage: OntologyStorage,\n adapter: InMemoryOntologyStorageTestingAdapter\n): void {\n testingAdapters.set(storage, adapter)\n}\n\n/** @internal Relative test-only access; intentionally absent from every package barrel. */\nexport function getInMemoryOntologyStorageTestingAdapter(\n storage: OntologyStorage\n): InMemoryOntologyStorageTestingAdapter {\n const adapter = testingAdapters.get(storage)\n if (!adapter) {\n throw new Error(\"[Sixb] In-memory ontology storage testing adapter is unavailable.\")\n }\n return adapter\n}\n\nexport type { InMemoryOntologyStorageTestHooks } from \"./shared-state\"\n",
|
|
24
|
-
"import type { InMemoryObjectStorage } from \"../../objects/in-memory\"\nimport type { InMemoryTimeseriesStorage } from \"../../timeseries/store\"\nimport type { OntologyStorage } from \"..\"\nimport type { ProviderMaterializationTransactionLifecycle } from \"../provider\"\nimport type { AssertSourceMaterializationExecution } from \"../sources\"\nimport { InMemoryOntologyCommitStorage } from \"./commits\"\nimport { InMemoryOntologyMaterializationStorage } from \"./materializations\"\nimport { InMemoryOntologyOutboxStorage } from \"./outbox\"\nimport {\n cloneOntologyState,\n createInMemoryOntologyState,\n type InMemoryOntologyState,\n type InMemoryOntologyStorageTestHooks,\n restoreOntologyState,\n} from \"./shared-state\"\nimport { InMemoryOntologySourceStorage } from \"./sources\"\nimport {\n type InMemoryOntologyStorageTestingAdapter,\n registerInMemoryOntologyStorageTestingAdapter,\n} from \"./testing\"\n\nexport type InMemoryOntologyStorageSnapshot = InMemoryOntologyState\n\ninterface InMemoryOntologyStorageOptions {\n readonly runRootOperation: <T>(run: () => Promise<T> | T) => Promise<T>\n readonly getTransactionToken: () => object | null\n readonly getMaterializationLifecycle: () => ProviderMaterializationTransactionLifecycle | null\n readonly assertSourceMaterializationExecution: AssertSourceMaterializationExecution\n}\n\nexport class InMemoryOntologyStorage implements OntologyStorage {\n private readonly state = createInMemoryOntologyState()\n readonly commits: InMemoryOntologyCommitStorage\n readonly sources: InMemoryOntologySourceStorage\n readonly materializations: InMemoryOntologyMaterializationStorage\n readonly outbox: InMemoryOntologyOutboxStorage\n private testHooks: InMemoryOntologyStorageTestHooks = {}\n private readonly testingAdapter: InMemoryOntologyStorageTestingAdapter = {\n setTestHooks: (hooks) => this.setTestHooks(hooks),\n snapshot: () => this.snapshot(),\n }\n\n constructor(\n objects: InMemoryObjectStorage,\n timeseries: InMemoryTimeseriesStorage,\n options: InMemoryOntologyStorageOptions\n ) {\n this.commits = new InMemoryOntologyCommitStorage(this.state, options.runRootOperation)\n this.sources = new InMemoryOntologySourceStorage(\n this.state,\n options.runRootOperation,\n options.assertSourceMaterializationExecution\n )\n this.outbox = new InMemoryOntologyOutboxStorage(this.state, options.runRootOperation)\n this.materializations = new InMemoryOntologyMaterializationStorage(\n this.state,\n objects,\n timeseries,\n options.getTransactionToken,\n options.getMaterializationLifecycle,\n {\n beforeRead: (boundary) => this.testHooks.beforeRead?.(boundary),\n beforeWrite: (boundary, ordinal) => this.testHooks.beforeWrite?.(boundary, ordinal),\n observeBuffer: (boundary, rows) => this.testHooks.observeBuffer?.(boundary, rows),\n observeWork: (records) => this.testHooks.observeWork?.(records),\n }\n )\n registerInMemoryOntologyStorageTestingAdapter(this, this.testingAdapter)\n }\n\n /** @internal Test-only failure injection; not part of OntologyStorage. */\n setTestHooks(hooks: InMemoryOntologyStorageTestHooks): void {\n this.testHooks = hooks\n }\n\n /** @internal Register a decorated facade as an alias for the same test adapter. */\n registerTestingAlias(storage: OntologyStorage): void {\n registerInMemoryOntologyStorageTestingAdapter(storage, this.testingAdapter)\n }\n\n snapshot(): InMemoryOntologyStorageSnapshot {\n return cloneOntologyState(this.state)\n }\n\n restore(snapshot: InMemoryOntologyStorageSnapshot): void {\n restoreOntologyState(this.state, snapshot)\n }\n\n completeTransaction(transactionToken: object): void {\n this.materializations.deactivateTransaction(transactionToken)\n }\n}\n\nexport type { InMemoryOntologyStorageTestHooks } from \"./shared-state\"\n",
|
|
25
|
-
"/**\n * Base error for pipeline-run storage operations.\n */\nexport class PipelineRunError extends Error {\n readonly name = \"PipelineRunError\"\n}\n",
|
|
26
|
-
"export type RunListOrder = \"asc\" | \"desc\"\n\nexport type { ListPage as RunListPage, ListWindow as RunListWindow } from \"./pagination\"\nexport { paginate } from \"./pagination\"\n\nexport interface StartedAtRunRecord<TStatus extends string = string> {\n readonly id: string\n readonly status: TStatus\n readonly startedAt: Date\n}\n\nexport interface RunListDateFilters<TStatus extends string = string> {\n readonly statuses?: readonly TStatus[]\n readonly startedAfter?: Date\n readonly startedBefore?: Date\n}\n\nexport function storageKey(projectId: string, id: string): string {\n return `${projectId}:${id}`\n}\n\nexport function cloneRecord<T>(record: T): T {\n return structuredClone(record)\n}\n\nexport function hasEmptyStatuses(input: { readonly statuses?: readonly unknown[] }): boolean {\n return input.statuses !== undefined && input.statuses.length === 0\n}\n\nexport function toStatusSet<TStatus extends string>(\n statuses: readonly TStatus[] | undefined\n): ReadonlySet<TStatus> | null {\n return statuses ? new Set(statuses) : null\n}\n\nexport function matchesRunListDateFilters<TStatus extends string>(\n record: StartedAtRunRecord<TStatus>,\n filters: {\n readonly statuses: ReadonlySet<TStatus> | null\n readonly startedAfter?: Date\n readonly startedBefore?: Date\n }\n): boolean {\n if (filters.statuses && !filters.statuses.has(record.status)) {\n return false\n }\n\n if (filters.startedAfter && record.startedAt < filters.startedAfter) {\n return false\n }\n\n if (filters.startedBefore && record.startedAt > filters.startedBefore) {\n return false\n }\n\n return true\n}\n\nexport function compareStartedAt(\n left: { readonly id: string; readonly startedAt: Date },\n right: { readonly id: string; readonly startedAt: Date },\n order: RunListOrder\n): number {\n const delta = left.startedAt.getTime() - right.startedAt.getTime()\n if (delta !== 0) {\n return order === \"asc\" ? delta : -delta\n }\n\n if (left.id === right.id) {\n return 0\n }\n\n return order === \"asc\" ? left.id.localeCompare(right.id) : right.id.localeCompare(left.id)\n}\n\nexport function latestStartedAtByOwnerId<\n TRecord extends { readonly id: string; readonly startedAt: Date },\n>(\n records: readonly TRecord[],\n ownerIds: readonly string[],\n ownerIdFor: (record: TRecord) => string\n): readonly TRecord[] {\n const uniqueOwnerIds = [...new Set(ownerIds)]\n if (uniqueOwnerIds.length === 0) {\n return []\n }\n\n const requested = new Set(uniqueOwnerIds)\n const latestByOwnerId = new Map<string, TRecord>()\n\n for (const record of records) {\n const ownerId = ownerIdFor(record)\n if (!requested.has(ownerId)) {\n continue\n }\n\n const current = latestByOwnerId.get(ownerId)\n if (!current || compareStartedAt(record, current, \"desc\") < 0) {\n latestByOwnerId.set(ownerId, record)\n }\n }\n\n return uniqueOwnerIds.flatMap((ownerId) => {\n const record = latestByOwnerId.get(ownerId)\n return record ? [record] : []\n })\n}\n",
|
|
27
|
-
"import {\n cloneRecord,\n compareStartedAt,\n hasEmptyStatuses,\n latestStartedAtByOwnerId,\n matchesRunListDateFilters,\n paginate,\n storageKey,\n toStatusSet,\n} from \"../run-listing\"\nimport { PipelineRunError } from \"./errors\"\nimport type {\n FinishPipelineRunInput,\n FinishPipelineStepRunInput,\n ListLatestPipelineRunsInput,\n ListLatestPipelineRunsResult,\n ListPipelineRunsInput,\n ListPipelineRunsResult,\n ListPipelineStepRunsInput,\n ListPipelineStepRunsResult,\n PipelineRunFailure,\n PipelineRunRecord,\n PipelineRunStorage,\n PipelineStepRunRecord,\n StartPipelineRunInput,\n StartPipelineStepRunInput,\n} from \"./types\"\n\nfunction normalizeError(error: PipelineRunFailure | undefined): PipelineRunFailure | undefined {\n return error ? cloneRecord(error) : undefined\n}\n\nfunction assertNonNegativeInteger(value: number | undefined, fieldName: string): void {\n if (value !== undefined && (!Number.isInteger(value) || value < 0)) {\n throw new PipelineRunError(`[Sixb] Pipeline run ${fieldName} must be a non-negative integer.`)\n }\n}\n\nexport class InMemoryPipelineRunStorage implements PipelineRunStorage {\n private readonly runs = new Map<string, PipelineRunRecord>()\n private readonly steps = new Map<string, PipelineStepRunRecord>()\n\n snapshot(): InMemoryPipelineRunStorageSnapshot {\n return {\n runs: structuredClone(this.runs),\n steps: structuredClone(this.steps),\n }\n }\n\n restore(snapshot: InMemoryPipelineRunStorageSnapshot): void {\n this.runs.clear()\n for (const [key, record] of structuredClone(snapshot.runs)) {\n this.runs.set(key, record)\n }\n\n this.steps.clear()\n for (const [key, record] of structuredClone(snapshot.steps)) {\n this.steps.set(key, record)\n }\n }\n\n async start(input: StartPipelineRunInput): Promise<PipelineRunRecord> {\n const key = storageKey(input.projectId, input.id)\n if (this.runs.has(key)) {\n throw new PipelineRunError(\n `[Sixb] Pipeline run '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n\n const record: PipelineRunRecord = {\n id: input.id,\n projectId: input.projectId,\n pipelineId: input.pipelineId,\n status: \"running\",\n startedAt: new Date(input.startedAt ?? new Date()),\n }\n\n this.runs.set(key, cloneRecord(record))\n return cloneRecord(record)\n }\n\n async finish(input: FinishPipelineRunInput): Promise<PipelineRunRecord> {\n const existing = this.requireRunningPipelineRun(input.projectId, input.id)\n const base: PipelineRunRecord = {\n ...existing,\n status: input.status,\n finishedAt: new Date(input.finishedAt ?? new Date()),\n }\n\n const next: PipelineRunRecord =\n input.status === \"succeeded\"\n ? {\n ...base,\n output: input.output ? cloneRecord(input.output) : undefined,\n error: undefined,\n }\n : {\n ...base,\n output: undefined,\n error: normalizeError(input.error),\n }\n\n this.runs.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async startStep(input: StartPipelineStepRunInput): Promise<PipelineStepRunRecord> {\n const pipelineRun = this.requireRunningPipelineRun(input.projectId, input.pipelineRunId)\n if (pipelineRun.pipelineId !== input.pipelineId) {\n throw new PipelineRunError(\n `[Sixb] Pipeline step run '${input.id}' pipeline '${input.pipelineId}' does not match pipeline run '${input.pipelineRunId}' pipeline '${pipelineRun.pipelineId}'.`\n )\n }\n\n const key = storageKey(input.projectId, input.id)\n if (this.steps.has(key)) {\n throw new PipelineRunError(\n `[Sixb] Pipeline step run '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n\n const record: PipelineStepRunRecord = {\n id: input.id,\n projectId: input.projectId,\n pipelineRunId: input.pipelineRunId,\n pipelineId: input.pipelineId,\n stepId: input.stepId,\n datasetId: input.datasetId,\n mode: input.mode,\n status: \"running\",\n startedAt: new Date(input.startedAt ?? new Date()),\n inputs: cloneRecord(input.inputs),\n }\n\n this.steps.set(key, cloneRecord(record))\n return cloneRecord(record)\n }\n\n async finishStep(input: FinishPipelineStepRunInput): Promise<PipelineStepRunRecord> {\n assertNonNegativeInteger(input.rowsWritten, \"rowsWritten\")\n\n const existing = this.requireRunningStepRun(input.projectId, input.id)\n\n if (input.status === \"succeeded\" && input.output.datasetId !== existing.datasetId) {\n throw new PipelineRunError(\n `[Sixb] Pipeline step run '${input.id}' output dataset '${input.output.datasetId}' does not match '${existing.datasetId}'.`\n )\n }\n\n const base: PipelineStepRunRecord = {\n ...existing,\n status: input.status,\n finishedAt: new Date(input.finishedAt ?? new Date()),\n rowsWritten: input.rowsWritten ?? existing.rowsWritten,\n }\n\n const next: PipelineStepRunRecord =\n input.status === \"succeeded\"\n ? {\n ...base,\n output: cloneRecord(input.output),\n error: undefined,\n }\n : {\n ...base,\n output: undefined,\n error: normalizeError(input.error),\n }\n\n this.steps.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async getById(params: { projectId: string; id: string }): Promise<PipelineRunRecord | null> {\n const record = this.runs.get(storageKey(params.projectId, params.id))\n return record ? cloneRecord(record) : null\n }\n\n async list(input: ListPipelineRunsInput): Promise<ListPipelineRunsResult> {\n if (hasEmptyStatuses(input) || input.pipelineIds?.length === 0) {\n return {\n runs: [],\n hasMore: false,\n total: 0,\n }\n }\n\n const order = input.order ?? \"desc\"\n const statuses = toStatusSet(input.statuses)\n const pipelineIds = input.pipelineIds ? new Set(input.pipelineIds) : null\n const filtered = [...this.runs.values()]\n .filter((record) => record.projectId === input.projectId)\n .filter((record) => (input.pipelineId ? record.pipelineId === input.pipelineId : true))\n .filter((record) => (pipelineIds ? pipelineIds.has(record.pipelineId) : true))\n .filter((record) =>\n matchesRunListDateFilters(record, {\n statuses,\n startedAfter: input.startedAfter,\n startedBefore: input.startedBefore,\n })\n )\n .sort((left, right) => compareStartedAt(left, right, order))\n\n const { page, total, hasMore } = paginate(filtered, input)\n\n return {\n runs: page.map(cloneRecord),\n hasMore,\n total,\n }\n }\n\n async listLatestByPipelineIds(\n input: ListLatestPipelineRunsInput\n ): Promise<ListLatestPipelineRunsResult> {\n const runs = latestStartedAtByOwnerId(\n [...this.runs.values()].filter((record) => record.projectId === input.projectId),\n input.pipelineIds,\n (record) => record.pipelineId\n )\n\n return {\n runs: runs.map(cloneRecord),\n }\n }\n\n async listSteps(input: ListPipelineStepRunsInput): Promise<ListPipelineStepRunsResult> {\n if (hasEmptyStatuses(input)) {\n return {\n steps: [],\n hasMore: false,\n total: 0,\n }\n }\n\n const order = input.order ?? \"desc\"\n const statuses = toStatusSet(input.statuses)\n const filtered = [...this.steps.values()]\n .filter((record) => record.projectId === input.projectId)\n .filter((record) =>\n input.pipelineRunId ? record.pipelineRunId === input.pipelineRunId : true\n )\n .filter((record) => (input.pipelineId ? record.pipelineId === input.pipelineId : true))\n .filter((record) => (input.stepId ? record.stepId === input.stepId : true))\n .filter((record) => (input.datasetId ? record.datasetId === input.datasetId : true))\n .filter((record) =>\n matchesRunListDateFilters(record, {\n statuses,\n startedAfter: input.startedAfter,\n startedBefore: input.startedBefore,\n })\n )\n .sort((left, right) => compareStartedAt(left, right, order))\n\n const { page, total, hasMore } = paginate(filtered, input)\n\n return {\n steps: page.map(cloneRecord),\n hasMore,\n total,\n }\n }\n\n private requireExistingPipelineRun(projectId: string, id: string): PipelineRunRecord {\n const record = this.runs.get(storageKey(projectId, id))\n if (!record) {\n throw new PipelineRunError(\n `[Sixb] Pipeline run '${id}' not found for project '${projectId}'.`\n )\n }\n\n return record\n }\n\n private requireRunningPipelineRun(projectId: string, id: string): PipelineRunRecord {\n const record = this.requireExistingPipelineRun(projectId, id)\n if (record.status !== \"running\") {\n throw new PipelineRunError(\n `[Sixb] Pipeline run '${id}' for project '${projectId}' is already terminal.`\n )\n }\n\n return record\n }\n\n private requireRunningStepRun(projectId: string, id: string): PipelineStepRunRecord {\n const record = this.steps.get(storageKey(projectId, id))\n if (!record) {\n throw new PipelineRunError(\n `[Sixb] Pipeline step run '${id}' not found for project '${projectId}'.`\n )\n }\n\n if (record.status !== \"running\") {\n throw new PipelineRunError(\n `[Sixb] Pipeline step run '${id}' for project '${projectId}' is already terminal.`\n )\n }\n\n return record\n }\n}\n\nexport interface InMemoryPipelineRunStorageSnapshot {\n readonly runs: Map<string, PipelineRunRecord>\n readonly steps: Map<string, PipelineStepRunRecord>\n}\n",
|
|
28
|
-
"import { randomUUID } from \"node:crypto\"\nimport type { AssertSourceMaterializationExecutionInput } from \"../ontology/sources\"\nimport { latestStartedAtByOwnerId } from \"../run-listing\"\nimport { ProjectionRunError } from \"./errors\"\nimport {\n advanceProjectionTelemetry,\n assertGenericProgressDoesNotAdvanceTelemetry,\n assertProjectionMissingTarget,\n assertProjectionRunExecution,\n assertProjectionRunIdentityMatches,\n assertProjectionRunListWindow,\n assertProjectionRunNonEmpty,\n assertProjectionRunRunning,\n assertProjectionRunStartInput,\n createProjectionRunClaim,\n createProjectionRunRecord,\n finishProjectionRunRecord,\n immutableDatasetVersionConflict,\n mergeProjectionRunProgress,\n planProjectionRunReclaim,\n projectionRunNotFound,\n publicProjectionRunRecord,\n requireTelemetryProjectionRun,\n type StoredProjectionRunRecord,\n staleProjectionRunExecution,\n} from \"./lifecycle\"\nimport {\n type AdvanceProjectionTelemetryCheckpointInput,\n type FinishProjectionRunInput,\n type ListLatestProjectionRunsInput,\n type ListLatestProjectionRunsResult,\n type ListProjectionRunsInput,\n type ListProjectionRunsResult,\n type LockProjectionRunForMaterializationInput,\n type ProjectionRunClaim,\n type ProjectionRunRecord,\n type ProjectionRunStorage,\n projectionRunObjectTypesVisible,\n type RecordProjectionMissingTargetInput,\n type StartOrReclaimProjectionRunInput,\n type TelemetryProjectionRunRecord,\n type UpdateProjectionRunInput,\n} from \"./types\"\n\ntype RunRootOperation = <T>(run: () => Promise<T> | T) => Promise<T>\nconst runDirectly: RunRootOperation = async <T>(run: () => Promise<T> | T): Promise<T> => run()\n\nfunction projectionRunKey(projectId: string, id: string): string {\n return JSON.stringify([projectId, id])\n}\n\nfunction compareRuns(a: ProjectionRunRecord, b: ProjectionRunRecord, order: \"asc\" | \"desc\") {\n const delta = a.startedAt.getTime() - b.startedAt.getTime()\n if (delta !== 0) return order === \"asc\" ? delta : -delta\n if (a.id === b.id) return 0\n return order === \"asc\" ? a.id.localeCompare(b.id) : b.id.localeCompare(a.id)\n}\n\nexport class InMemoryProjectionRunStorage implements ProjectionRunStorage {\n private readonly rows = new Map<string, StoredProjectionRunRecord>()\n /** Durable per-run history prevents a reclaimed execution token from becoming valid again. */\n private readonly executionTokensByRun = new Map<string, Set<string>>()\n private readonly runRootOperation: RunRootOperation\n private readonly createExecutionToken: () => string\n\n constructor(\n input: {\n readonly runRootOperation?: RunRootOperation\n readonly executionToken?: () => string\n } = {}\n ) {\n this.runRootOperation = input.runRootOperation ?? runDirectly\n this.createExecutionToken = input.executionToken ?? randomUUID\n }\n\n snapshot(): InMemoryProjectionRunStorageSnapshot {\n return structuredClone({\n rows: this.rows,\n executionTokensByRun: this.executionTokensByRun,\n })\n }\n\n restore(snapshot: InMemoryProjectionRunStorageSnapshot): void {\n this.rows.clear()\n this.executionTokensByRun.clear()\n for (const [key, record] of structuredClone(snapshot.rows)) this.rows.set(key, record)\n for (const [key, tokens] of structuredClone(snapshot.executionTokensByRun)) {\n this.executionTokensByRun.set(key, tokens)\n }\n }\n\n async startOrReclaim(input: StartOrReclaimProjectionRunInput): Promise<ProjectionRunClaim> {\n return this.runRootOperation(() => {\n assertProjectionRunStartInput(input)\n this.assertDatasetVersionIsImmutable(input)\n\n const key = projectionRunKey(input.projectId, input.id)\n const existing = this.rows.get(key)\n const attempt = existing ? planProjectionRunReclaim(existing, input).attempt : 1\n const executionToken = this.issueExecutionToken(key, input.id, existing?.executionToken)\n const record: StoredProjectionRunRecord = existing\n ? { ...existing, attempt, executionToken }\n : { ...createProjectionRunRecord(input), executionToken }\n\n this.rows.set(key, structuredClone(record))\n return createProjectionRunClaim(record)\n })\n }\n\n async lockForMaterialization(\n input: LockProjectionRunForMaterializationInput\n ): Promise<ProjectionRunRecord> {\n return this.runRootOperation(() => publicProjectionRunRecord(this.requireExecution(input)))\n }\n\n /** @internal The caller must already hold InMemoryStorage's root operation lock. */\n assertSourceMaterializationExecutionUnlocked(\n input: AssertSourceMaterializationExecutionInput\n ): void {\n assertProjectionRunNonEmpty(input.source.projectionId, \"projectionId\")\n assertProjectionRunNonEmpty(input.execution.executionToken, \"executionToken\")\n const record = this.requireRunning(input.projectId, input.execution.projectionRunId)\n if (\n record.identity.projectionId !== input.source.projectionId ||\n record.identity.protocol !== \"replacement\"\n ) {\n throw new ProjectionRunError(\n `[Sixb] Projection run '${record.id}' does not own replacement source '${input.source.projectionId}'.`\n )\n }\n if (record.executionToken !== input.execution.executionToken) {\n throw staleProjectionRunExecution(record.id)\n }\n if (input.identity) {\n assertProjectionRunIdentityMatches(record, {\n projectionId: input.source.projectionId,\n ...input.identity,\n })\n }\n }\n\n async update(input: UpdateProjectionRunInput): Promise<ProjectionRunRecord> {\n return this.runRootOperation(() => {\n const existing = this.requireExecution(input)\n assertGenericProgressDoesNotAdvanceTelemetry(existing, input.progress)\n const next = {\n ...existing,\n progress: mergeProjectionRunProgress(existing.progress, input.progress),\n }\n this.rows.set(projectionRunKey(input.projectId, input.id), structuredClone(next))\n return publicProjectionRunRecord(next)\n })\n }\n async advanceTelemetryCheckpoint(\n input: AdvanceProjectionTelemetryCheckpointInput\n ): Promise<TelemetryProjectionRunRecord> {\n return this.runRootOperation(() => {\n const existing = this.requireTelemetryExecution(input)\n const advance = advanceProjectionTelemetry(existing, input)\n const next: TelemetryProjectionRunRecord & { readonly executionToken: string } = {\n ...existing,\n progress: advance.progress,\n telemetryCheckpoint: advance.checkpoint,\n missingTarget: undefined,\n }\n this.rows.set(projectionRunKey(input.projectId, input.id), structuredClone(next))\n return publicProjectionRunRecord(next) as TelemetryProjectionRunRecord\n })\n }\n\n async recordMissingTarget(\n input: RecordProjectionMissingTargetInput\n ): Promise<TelemetryProjectionRunRecord> {\n return this.runRootOperation(() => {\n const existing = this.requireTelemetryExecution(input)\n const next: TelemetryProjectionRunRecord & { readonly executionToken: string } = {\n ...existing,\n missingTarget: assertProjectionMissingTarget(existing, input.missingTarget),\n }\n this.rows.set(projectionRunKey(input.projectId, input.id), structuredClone(next))\n return publicProjectionRunRecord(next) as TelemetryProjectionRunRecord\n })\n }\n\n async finish(input: FinishProjectionRunInput): Promise<ProjectionRunRecord> {\n return this.runRootOperation(() => {\n const existing = this.requireExecution(input)\n const next = finishProjectionRunRecord(existing, input)\n this.rows.set(projectionRunKey(input.projectId, input.id), structuredClone(next))\n return publicProjectionRunRecord(next)\n })\n }\n\n async getById(params: { projectId: string; id: string }): Promise<ProjectionRunRecord | null> {\n return this.runRootOperation(() => {\n const record = this.rows.get(projectionRunKey(params.projectId, params.id))\n return record ? publicProjectionRunRecord(record) : null\n })\n }\n\n async list(input: ListProjectionRunsInput): Promise<ListProjectionRunsResult> {\n return this.runRootOperation(() => {\n assertProjectionRunNonEmpty(input.projectId, \"projectId\")\n assertProjectionRunListWindow(input.limit, \"limit\")\n assertProjectionRunListWindow(input.offset, \"offset\")\n if (input.statuses?.length === 0) return { runs: [], hasMore: false, total: 0 }\n\n const order = input.order ?? \"desc\"\n const offset = input.offset ?? 0\n const limit = input.limit ?? this.rows.size\n const statuses = input.statuses ? new Set(input.statuses) : null\n const objectTypeIds = input.objectTypeIds ? new Set(input.objectTypeIds) : null\n const filtered = [...this.rows.values()]\n .filter((record) => record.projectId === input.projectId)\n .filter((record) =>\n input.projectionId ? record.identity.projectionId === input.projectionId : true\n )\n .filter((record) =>\n input.projectionKind ? record.identity.projectionKind === input.projectionKind : true\n )\n .filter((record) =>\n input.datasetId ? record.identity.datasetVersion.datasetId === input.datasetId : true\n )\n .filter((record) =>\n input.datasetVersionId\n ? record.identity.datasetVersion.versionId === input.datasetVersionId\n : true\n )\n .filter((record) =>\n objectTypeIds\n ? projectionRunObjectTypesVisible(record, (id) => objectTypeIds.has(id))\n : true\n )\n .filter((record) => (statuses ? statuses.has(record.status) : true))\n .filter((record) => (input.startedAfter ? record.startedAt >= input.startedAfter : true))\n .filter((record) => (input.startedBefore ? record.startedAt <= input.startedBefore : true))\n .sort((left, right) => compareRuns(left, right, order))\n\n const total = filtered.length\n const runs = filtered.slice(offset, offset + limit).map(publicProjectionRunRecord)\n return { runs, hasMore: offset + runs.length < total, total }\n })\n }\n\n async listLatestByProjectionIds(\n input: ListLatestProjectionRunsInput\n ): Promise<ListLatestProjectionRunsResult> {\n return this.runRootOperation(() => {\n const runs = latestStartedAtByOwnerId(\n [...this.rows.values()].filter((record) => record.projectId === input.projectId),\n input.projectionIds,\n (record) => record.identity.projectionId\n )\n return { runs: runs.map(publicProjectionRunRecord) }\n })\n }\n\n private assertDatasetVersionIsImmutable(input: StartOrReclaimProjectionRunInput): void {\n for (const candidate of this.rows.values()) {\n if (\n candidate.projectId === input.projectId &&\n candidate.id !== input.id &&\n candidate.identity.datasetVersion.datasetId === input.identity.datasetVersion.datasetId &&\n candidate.identity.datasetVersion.versionId === input.identity.datasetVersion.versionId &&\n candidate.identity.datasetVersion.createdAt !== input.identity.datasetVersion.createdAt\n ) {\n throw immutableDatasetVersionConflict(input.identity)\n }\n }\n }\n\n private issueExecutionToken(\n key: string,\n runId: string,\n currentToken: string | undefined\n ): string {\n const executionToken = this.createExecutionToken()\n assertProjectionRunNonEmpty(executionToken, \"executionToken\")\n const usedTokens = this.executionTokensByRun.get(key) ?? new Set<string>()\n if (currentToken) usedTokens.add(currentToken)\n if (usedTokens.has(executionToken)) {\n throw new ProjectionRunError(\n `[Sixb] Projection run '${runId}' execution token was already used.`\n )\n }\n usedTokens.add(executionToken)\n this.executionTokensByRun.set(key, usedTokens)\n return executionToken\n }\n\n private requireExecution(\n input: LockProjectionRunForMaterializationInput\n ): StoredProjectionRunRecord & { readonly executionToken: string } {\n const record = this.requireRunning(input.projectId, input.id)\n assertProjectionRunExecution(record, input)\n return record\n }\n\n private requireTelemetryExecution(\n input: LockProjectionRunForMaterializationInput\n ): TelemetryProjectionRunRecord & { readonly executionToken: string } {\n const record = this.requireExecution(input)\n return requireTelemetryProjectionRun(record)\n }\n\n private requireRunning(projectId: string, id: string): StoredProjectionRunRecord {\n assertProjectionRunNonEmpty(projectId, \"projectId\")\n assertProjectionRunNonEmpty(id, \"id\")\n const record = this.rows.get(projectionRunKey(projectId, id))\n if (!record) {\n throw projectionRunNotFound(projectId, id)\n }\n assertProjectionRunRunning(record)\n return record\n }\n}\n\nexport interface InMemoryProjectionRunStorageSnapshot {\n readonly rows: Map<string, StoredProjectionRunRecord>\n readonly executionTokensByRun: Map<string, Set<string>>\n}\n",
|
|
29
|
-
"import type {\n RuleEventSubject,\n StoredRuleResolvedEvent,\n StoredRuleTriggeredEvent,\n} from \"../../events\"\nimport type {\n ListActiveRuleStatesInput,\n ListActiveRuleStatesResult,\n ListRuleStatesReconciliationPageInput,\n ListRuleStatesReconciliationPageResult,\n RuleStateCursor,\n RuleStateRecord,\n RuleStateTransitionEvent,\n RulesStorage,\n} from \"./types\"\n\nfunction stateKey(params: {\n readonly projectId: string\n readonly ruleId: string\n readonly subject: RuleEventSubject\n}): string {\n return JSON.stringify([\n params.projectId,\n params.ruleId,\n params.subject.kind,\n params.subject.objectTypeId,\n params.subject.primaryId,\n ])\n}\n\nfunction cloneRuleStateRecord(record: RuleStateRecord): RuleStateRecord {\n return structuredClone(record)\n}\n\nfunction compareRuleStateRecords(\n left: RuleStateRecord,\n right: RuleStateRecord,\n order: \"asc\" | \"desc\"\n): number {\n const direction = order === \"asc\" ? 1 : -1\n const fields = [\n left.triggeredAt.localeCompare(right.triggeredAt),\n left.ruleId.localeCompare(right.ruleId),\n left.subject.objectTypeId.localeCompare(right.subject.objectTypeId),\n left.subject.primaryId.localeCompare(right.subject.primaryId),\n ]\n\n for (const value of fields) {\n if (value !== 0) {\n return value * direction\n }\n }\n\n return 0\n}\n\nfunction compareRuleStateIdentity(left: RuleStateRecord, right: RuleStateRecord): number {\n return (\n left.ruleId.localeCompare(right.ruleId) ||\n left.subject.objectTypeId.localeCompare(right.subject.objectTypeId) ||\n left.subject.primaryId.localeCompare(right.subject.primaryId)\n )\n}\n\nfunction compareCursor(record: RuleStateRecord, cursor: RuleStateCursor): number {\n return (\n record.ruleId.localeCompare(cursor.ruleId) ||\n record.subject.objectTypeId.localeCompare(cursor.objectTypeId) ||\n record.subject.primaryId.localeCompare(cursor.primaryId)\n )\n}\n\nexport class InMemoryRulesStorage implements RulesStorage {\n private readonly active = new Map<string, RuleStateRecord>()\n\n snapshot(): InMemoryRulesStorageSnapshot {\n return structuredClone(this.active)\n }\n\n restore(snapshot: InMemoryRulesStorageSnapshot): void {\n this.active.clear()\n for (const [key, record] of structuredClone(snapshot)) {\n this.active.set(key, record)\n }\n }\n\n async getActive(params: {\n projectId: string\n ruleId: string\n subject: RuleEventSubject\n }): Promise<RuleStateRecord | null> {\n const record = this.active.get(stateKey(params))\n return record ? cloneRuleStateRecord(record) : null\n }\n\n async getActiveBatch(params: {\n projectId: string\n items: readonly { readonly ruleId: string; readonly subject: RuleEventSubject }[]\n }): Promise<readonly RuleStateRecord[]> {\n return params.items.flatMap((item) => {\n const record = this.active.get(stateKey({ projectId: params.projectId, ...item }))\n return record ? [cloneRuleStateRecord(record)] : []\n })\n }\n\n async listActive(input: ListActiveRuleStatesInput): Promise<ListActiveRuleStatesResult> {\n if (input.objectTypeIds?.length === 0) {\n return { states: [], hasMore: false, total: 0 }\n }\n\n const order = input.order ?? \"desc\"\n const offset = input.offset ?? 0\n const objectTypeIds = input.objectTypeIds ? new Set(input.objectTypeIds) : null\n const states = [...this.active.values()]\n .filter((record) => record.projectId === input.projectId)\n .filter((record) => !input.ruleId || record.ruleId === input.ruleId)\n .filter((record) => !input.objectTypeId || record.subject.objectTypeId === input.objectTypeId)\n .filter((record) => (objectTypeIds ? objectTypeIds.has(record.subject.objectTypeId) : true))\n .filter((record) => !input.primaryId || record.subject.primaryId === input.primaryId)\n .sort((left, right) => compareRuleStateRecords(left, right, order))\n\n const total = states.length\n const windowed =\n input.limit === undefined ? states.slice(offset) : states.slice(offset, offset + input.limit)\n\n return {\n states: windowed.map(cloneRuleStateRecord),\n hasMore: offset + windowed.length < total,\n total,\n }\n }\n\n async listReconciliationPage(\n input: ListRuleStatesReconciliationPageInput\n ): Promise<ListRuleStatesReconciliationPageResult> {\n const rows = [...this.active.values()]\n .filter((record) => record.projectId === input.projectId)\n .filter((record) => record.subject.kind === \"object\")\n .filter((record) => !input.after || compareCursor(record, input.after) > 0)\n .sort(compareRuleStateIdentity)\n .slice(0, input.limit + 1)\n const hasMore = rows.length > input.limit\n const states = rows.slice(0, input.limit).map(cloneRuleStateRecord)\n const last = states.at(-1)\n return {\n states,\n ...(hasMore && last\n ? {\n next: {\n ruleId: last.ruleId,\n objectTypeId: last.subject.objectTypeId,\n primaryId: last.subject.primaryId,\n },\n }\n : {}),\n }\n }\n\n async applyTriggered(event: StoredRuleTriggeredEvent): Promise<void> {\n const record: RuleStateRecord = {\n projectId: event.projectId,\n ruleId: event.payload.ruleId,\n subject: structuredClone(event.payload.subject),\n triggeredAt: event.payload.triggeredAt,\n }\n\n this.active.set(stateKey(record), cloneRuleStateRecord(record))\n }\n\n async applyResolved(event: StoredRuleResolvedEvent): Promise<void> {\n this.active.delete(\n stateKey({\n projectId: event.projectId,\n ruleId: event.payload.ruleId,\n subject: event.payload.subject,\n })\n )\n }\n\n async applyTransitions(events: readonly RuleStateTransitionEvent[]): Promise<void> {\n for (const event of events) {\n if (event.type === \"rule.triggered\") {\n await this.applyTriggered(event)\n } else {\n await this.applyResolved(event)\n }\n }\n }\n}\n\nexport type InMemoryRulesStorageSnapshot = Map<string, RuleStateRecord>\n",
|
|
30
|
-
"/**\n * Base error for sync-run storage operations. Callers can use this to catch\n * domain-specific failures without relying on message text.\n */\nexport class SyncRunError extends Error {\n readonly name = \"SyncRunError\"\n}\n",
|
|
31
|
-
"import { cloneJsonValue, type JsonValue } from \"../../json\"\nimport {\n compareStartedAt,\n hasEmptyStatuses,\n latestStartedAtByOwnerId,\n matchesRunListDateFilters,\n paginate,\n toStatusSet,\n} from \"../run-listing\"\nimport { SyncRunError } from \"./errors\"\nimport type {\n FinishSyncRunInput,\n ListLatestSyncRunsInput,\n ListLatestSyncRunsResult,\n ListSyncRunsInput,\n ListSyncRunsResult,\n StartSyncRunInput,\n SyncRunFailure,\n SyncRunRecord,\n SyncRunStorage,\n} from \"./types\"\n\nfunction syncRunKey(projectId: string, id: string): string {\n return `${projectId}:${id}`\n}\n\nfunction cloneSyncRunRecord(record: SyncRunRecord): SyncRunRecord {\n return structuredClone(record)\n}\n\nfunction normalizeCheckpoint(checkpoint: JsonValue | undefined): JsonValue | undefined {\n return checkpoint !== undefined ? cloneJsonValue(checkpoint) : undefined\n}\n\nfunction normalizeError(error: SyncRunFailure | undefined): SyncRunFailure | undefined {\n return error ? structuredClone(error) : undefined\n}\n\nexport class InMemorySyncRunStorage implements SyncRunStorage {\n private readonly rows = new Map<string, SyncRunRecord>()\n\n snapshot(): InMemorySyncRunStorageSnapshot {\n return structuredClone(this.rows)\n }\n\n restore(snapshot: InMemorySyncRunStorageSnapshot): void {\n this.rows.clear()\n for (const [key, record] of structuredClone(snapshot)) {\n this.rows.set(key, record)\n }\n }\n\n async start(input: StartSyncRunInput): Promise<SyncRunRecord> {\n const key = syncRunKey(input.projectId, input.id)\n if (this.rows.has(key)) {\n throw new SyncRunError(\n `[Sixb] Sync run '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n\n const record: SyncRunRecord = {\n id: input.id,\n projectId: input.projectId,\n syncId: input.syncId,\n datasetId: input.datasetId,\n mode: input.mode,\n status: \"running\",\n startedAt: new Date(input.startedAt ?? new Date()),\n expectedLatestVersionId: input.expectedLatestVersionId,\n commitMessage: input.commitMessage,\n }\n\n this.rows.set(key, structuredClone(record))\n return cloneSyncRunRecord(record)\n }\n\n async finish(input: FinishSyncRunInput): Promise<SyncRunRecord> {\n const key = syncRunKey(input.projectId, input.id)\n const existing = this.rows.get(key)\n\n if (!existing) {\n throw new SyncRunError(\n `[Sixb] Sync run '${input.id}' not found for project '${input.projectId}'.`\n )\n }\n\n if (input.status === \"succeeded\") {\n if (input.output && input.output.datasetId !== existing.datasetId) {\n throw new SyncRunError(\n `[Sixb] Sync run '${input.id}' output dataset '${input.output.datasetId}' does not match '${existing.datasetId}'.`\n )\n }\n if (!input.output && (existing.mode !== \"append\" || input.rowsRead !== 0)) {\n throw new SyncRunError(\n `[Sixb] Sync run '${input.id}' may omit its output only for an empty append.`\n )\n }\n }\n\n const base: SyncRunRecord = {\n ...existing,\n status: input.status,\n finishedAt: new Date(input.finishedAt ?? new Date()),\n }\n\n const next: SyncRunRecord =\n input.status === \"succeeded\"\n ? {\n ...base,\n rowsRead: input.rowsRead,\n output: input.output ? structuredClone(input.output) : undefined,\n error: undefined,\n checkpoint: normalizeCheckpoint(input.checkpoint),\n }\n : {\n ...base,\n rowsRead: input.rowsRead ?? existing.rowsRead,\n output: undefined,\n error: normalizeError(input.error),\n checkpoint: undefined,\n }\n\n this.rows.set(key, structuredClone(next))\n return cloneSyncRunRecord(next)\n }\n\n async getById(params: { projectId: string; id: string }): Promise<SyncRunRecord | null> {\n const record = this.rows.get(syncRunKey(params.projectId, params.id))\n return record ? cloneSyncRunRecord(record) : null\n }\n\n async list(input: ListSyncRunsInput): Promise<ListSyncRunsResult> {\n if (hasEmptyStatuses(input) || input.syncIds?.length === 0) {\n return {\n runs: [],\n hasMore: false,\n total: 0,\n }\n }\n\n const order = input.order ?? \"desc\"\n const statuses = toStatusSet(input.statuses)\n const syncIds = input.syncIds ? new Set(input.syncIds) : null\n\n const filtered = [...this.rows.values()]\n .filter((record) => record.projectId === input.projectId)\n .filter((record) => (input.syncId ? record.syncId === input.syncId : true))\n .filter((record) => (syncIds ? syncIds.has(record.syncId) : true))\n .filter((record) => (input.datasetId ? record.datasetId === input.datasetId : true))\n .filter((record) =>\n matchesRunListDateFilters(record, {\n statuses,\n startedAfter: input.startedAfter,\n startedBefore: input.startedBefore,\n })\n )\n .sort((left, right) => compareStartedAt(left, right, order))\n\n const { page, total, hasMore } = paginate(filtered, input)\n\n return {\n runs: page.map(cloneSyncRunRecord),\n hasMore,\n total,\n }\n }\n\n async listLatestBySyncIds(input: ListLatestSyncRunsInput): Promise<ListLatestSyncRunsResult> {\n const runs = latestStartedAtByOwnerId(\n [...this.rows.values()].filter((record) => record.projectId === input.projectId),\n input.syncIds,\n (record) => record.syncId\n )\n\n return {\n runs: runs.map(cloneSyncRunRecord),\n }\n }\n}\n\nexport type InMemorySyncRunStorageSnapshot = Map<string, SyncRunRecord>\n",
|
|
32
|
-
"import { StorageTransactionError } from \"./errors\"\n\ntype ObjectLike = Record<PropertyKey, unknown>\n\nexport function createTransactionStorageProxy<T extends object>(\n target: T,\n isActive: () => boolean\n): T {\n const proxies = new WeakMap<object, object>()\n\n const wrap = <TValue extends object>(value: TValue): TValue => {\n const existing = proxies.get(value)\n if (existing) return existing as TValue\n\n const proxy = new Proxy(value as ObjectLike, {\n // The guard runs on property access and on call. Its purpose is to fail fast when a\n // transaction handle (`tx`) leaks past the transaction's lifetime — using it afterward is a\n // bug, not a recoverable state. Overhead is bounded: only the storage namespaces reachable\n // from `tx` are wrapped (a handful), not the row/link data graph, and never per-record.\n get(current, property, receiver) {\n assertTransactionActive(isActive)\n const result = Reflect.get(current, property, receiver)\n if (typeof result === \"function\") {\n return (...args: unknown[]) => {\n assertTransactionActive(isActive)\n return result.apply(current, args)\n }\n }\n if (result && typeof result === \"object\") {\n return wrap(result)\n }\n return result\n },\n })\n\n proxies.set(value, proxy)\n return proxy as TValue\n }\n\n return wrap(target)\n}\n\nexport function assertTransactionActive(isActive: () => boolean): void {\n if (!isActive()) {\n throw new StorageTransactionError(\n \"[Sixb] Transaction storage cannot be used after transaction completion.\",\n { code: \"transaction_inactive\" }\n )\n }\n}\n\nexport function throwNestedStorageTransaction(): never {\n throw new StorageTransactionError(\"[Sixb] Nested storage transactions are not supported yet.\", {\n code: \"nested_transaction\",\n })\n}\n",
|
|
33
|
-
"import type {\n WebhookDeliveryClaimRecord,\n WebhookDeliveryKey,\n WebhookDeliveryRecord,\n WebhookDeliveryStorage,\n} from \"./types\"\n\nfunction cloneDeliveryRecord(record: WebhookDeliveryRecord): WebhookDeliveryRecord {\n return structuredClone(record)\n}\n\nexport class InMemoryWebhookDeliveryStorage implements WebhookDeliveryStorage {\n private readonly deliveries = new Map<string, WebhookDeliveryRecord>()\n\n snapshot(): InMemoryWebhookDeliveryStorageSnapshot {\n return structuredClone(this.deliveries)\n }\n\n restore(snapshot: InMemoryWebhookDeliveryStorageSnapshot): void {\n this.deliveries.clear()\n for (const [key, record] of structuredClone(snapshot)) {\n this.deliveries.set(key, record)\n }\n }\n\n async claim(\n input: WebhookDeliveryKey & { receivedAt: string }\n ): Promise<WebhookDeliveryClaimRecord> {\n const key = serializeKey(input)\n const existing = this.deliveries.get(key)\n\n if (existing?.status === \"completed\") {\n return {\n ...cloneDeliveryRecord(existing),\n claimResult: \"duplicate\",\n }\n }\n\n if (existing?.status === \"in_progress\") {\n return {\n ...cloneDeliveryRecord(existing),\n claimResult: \"in_progress\",\n }\n }\n\n // New and failed deliveries both get a fresh handler attempt.\n const next: WebhookDeliveryRecord = {\n projectId: input.projectId,\n connectorId: input.connectorId,\n webhookId: input.webhookId,\n idempotencyKey: input.idempotencyKey,\n status: \"in_progress\",\n receivedAt: input.receivedAt,\n }\n this.deliveries.set(key, structuredClone(next))\n\n return {\n ...cloneDeliveryRecord(next),\n claimResult: \"claimed\",\n }\n }\n\n async complete(\n input: WebhookDeliveryKey & { completedAt: string }\n ): Promise<WebhookDeliveryRecord> {\n const key = serializeKey(input)\n const next: WebhookDeliveryRecord = {\n projectId: input.projectId,\n connectorId: input.connectorId,\n webhookId: input.webhookId,\n idempotencyKey: input.idempotencyKey,\n ...this.deliveries.get(key),\n status: \"completed\",\n completedAt: input.completedAt,\n failedAt: undefined,\n error: undefined,\n }\n\n this.deliveries.set(key, structuredClone(next))\n return cloneDeliveryRecord(next)\n }\n\n async fail(\n input: WebhookDeliveryKey & { failedAt: string; error: string }\n ): Promise<WebhookDeliveryRecord> {\n const key = serializeKey(input)\n const next: WebhookDeliveryRecord = {\n projectId: input.projectId,\n connectorId: input.connectorId,\n webhookId: input.webhookId,\n idempotencyKey: input.idempotencyKey,\n ...this.deliveries.get(key),\n status: \"failed\",\n failedAt: input.failedAt,\n error: input.error,\n completedAt: undefined,\n }\n\n this.deliveries.set(key, structuredClone(next))\n return cloneDeliveryRecord(next)\n }\n}\n\nexport type InMemoryWebhookDeliveryStorageSnapshot = Map<string, WebhookDeliveryRecord>\n\nfunction serializeKey(key: WebhookDeliveryKey): string {\n return JSON.stringify([key.projectId, key.connectorId, key.webhookId, key.idempotencyKey])\n}\n",
|
|
34
|
-
"/**\n * Base error for webhook-run storage operations.\n */\nexport class WebhookRunError extends Error {\n readonly name = \"WebhookRunError\"\n}\n",
|
|
35
|
-
"import {\n cloneRecord,\n compareStartedAt,\n hasEmptyStatuses,\n matchesRunListDateFilters,\n paginate,\n storageKey,\n toStatusSet,\n} from \"../run-listing\"\nimport { WebhookRunError } from \"./errors\"\nimport type {\n FinishWebhookRunInput,\n ListWebhookRunsInput,\n ListWebhookRunsResult,\n StartWebhookRunInput,\n WebhookRunRecord,\n WebhookRunStorage,\n} from \"./types\"\n\nexport class InMemoryWebhookRunStorage implements WebhookRunStorage {\n private readonly runs = new Map<string, WebhookRunRecord>()\n\n snapshot(): InMemoryWebhookRunStorageSnapshot {\n return structuredClone(this.runs)\n }\n\n restore(snapshot: InMemoryWebhookRunStorageSnapshot): void {\n this.runs.clear()\n for (const [key, record] of structuredClone(snapshot)) {\n this.runs.set(key, record)\n }\n }\n\n async start(input: StartWebhookRunInput): Promise<WebhookRunRecord> {\n const key = storageKey(input.projectId, input.id)\n if (this.runs.has(key)) {\n throw new WebhookRunError(\n `[Sixb] Webhook run '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n\n const record: WebhookRunRecord = {\n id: input.id,\n projectId: input.projectId,\n connectorId: input.connectorId,\n webhookId: input.webhookId,\n status: \"running\",\n method: input.method,\n route: input.route,\n startedAt: new Date(input.startedAt ?? new Date()),\n }\n\n this.runs.set(key, cloneRecord(record))\n return cloneRecord(record)\n }\n\n async finish(input: FinishWebhookRunInput): Promise<WebhookRunRecord> {\n const existing = this.requireRunningWebhookRun(input.projectId, input.id)\n const next: WebhookRunRecord = {\n ...existing,\n status: input.status,\n finishedAt: new Date(input.finishedAt ?? new Date()),\n requestBodyBytes: input.requestBodyBytes,\n responseStatus: input.responseStatus,\n idempotencyKey: input.idempotencyKey,\n deliveryClaimResult: input.deliveryClaimResult,\n error: input.status === \"succeeded\" ? undefined : input.error,\n }\n\n this.runs.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async getById(params: { projectId: string; id: string }): Promise<WebhookRunRecord | null> {\n const record = this.runs.get(storageKey(params.projectId, params.id))\n return record ? cloneRecord(record) : null\n }\n\n async list(input: ListWebhookRunsInput): Promise<ListWebhookRunsResult> {\n if (hasEmptyStatuses(input)) {\n return {\n runs: [],\n hasMore: false,\n total: 0,\n }\n }\n\n const order = input.order ?? \"desc\"\n const statuses = toStatusSet(input.statuses)\n const filtered = [...this.runs.values()]\n .filter((record) => record.projectId === input.projectId)\n .filter((record) => (input.connectorId ? record.connectorId === input.connectorId : true))\n .filter((record) => (input.webhookId ? record.webhookId === input.webhookId : true))\n .filter((record) =>\n input.idempotencyKey ? record.idempotencyKey === input.idempotencyKey : true\n )\n .filter((record) =>\n matchesRunListDateFilters(record, {\n statuses,\n startedAfter: input.startedAfter,\n startedBefore: input.startedBefore,\n })\n )\n .sort((left, right) => compareStartedAt(left, right, order))\n\n const { page, total, hasMore } = paginate(filtered, input)\n\n return {\n runs: page.map(cloneRecord),\n hasMore,\n total,\n }\n }\n\n private requireRunningWebhookRun(projectId: string, id: string): WebhookRunRecord {\n const record = this.runs.get(storageKey(projectId, id))\n if (!record) {\n throw new WebhookRunError(`[Sixb] Webhook run '${id}' not found for project '${projectId}'.`)\n }\n\n if (record.status !== \"running\") {\n throw new WebhookRunError(\n `[Sixb] Webhook run '${id}' for project '${projectId}' is already terminal.`\n )\n }\n\n return record\n }\n}\n\nexport type InMemoryWebhookRunStorageSnapshot = Map<string, WebhookRunRecord>\n",
|
|
36
|
-
"/**\n * Base error for workflow-intervention storage operations.\n */\nexport class WorkflowInterventionError extends Error {\n readonly name = \"WorkflowInterventionError\"\n}\n",
|
|
37
|
-
"import { cloneRecord, hasEmptyStatuses, paginate, storageKey, toStatusSet } from \"../run-listing\"\nimport { WorkflowInterventionError } from \"./errors\"\nimport type {\n CancelWorkflowInterventionInput,\n CreateWorkflowInterventionInput,\n ExpireWorkflowInterventionInput,\n ListWorkflowInterventionsInput,\n ListWorkflowInterventionsResult,\n SubmitWorkflowInterventionInput,\n WorkflowInterventionRecord,\n WorkflowInterventionStorage,\n} from \"./types\"\n\nfunction assertNonNegativeInteger(value: number, fieldName: string): void {\n if (!Number.isInteger(value) || value < 0) {\n throw new WorkflowInterventionError(\n `[Sixb] Workflow intervention ${fieldName} must be a non-negative integer.`\n )\n }\n}\n\nexport class InMemoryWorkflowInterventionStorage implements WorkflowInterventionStorage {\n private readonly interventions = new Map<string, WorkflowInterventionRecord>()\n\n snapshot(): InMemoryWorkflowInterventionStorageSnapshot {\n return structuredClone(this.interventions)\n }\n\n restore(snapshot: InMemoryWorkflowInterventionStorageSnapshot): void {\n this.interventions.clear()\n for (const [key, record] of structuredClone(snapshot)) {\n this.interventions.set(key, record)\n }\n }\n\n async create(input: CreateWorkflowInterventionInput): Promise<WorkflowInterventionRecord> {\n assertNonNegativeInteger(input.nodeIndex, \"nodeIndex\")\n\n const key = storageKey(input.projectId, input.id)\n if (this.interventions.has(key)) {\n throw new WorkflowInterventionError(\n `[Sixb] Workflow intervention '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n\n const record: WorkflowInterventionRecord = {\n id: input.id,\n projectId: input.projectId,\n workflowId: input.workflowId,\n workflowRunId: input.workflowRunId,\n nodeRunId: input.nodeRunId,\n nodeIndex: input.nodeIndex,\n nodeId: input.nodeId,\n nodeKey: input.nodeKey,\n interventionId: input.interventionId,\n input: cloneRecord(input.input),\n defaultResponse: cloneRecord(input.defaultResponse),\n status: \"pending\",\n requestedAt: new Date(input.requestedAt ?? new Date()),\n expiresAt: input.expiresAt ? new Date(input.expiresAt) : undefined,\n }\n\n this.interventions.set(key, cloneRecord(record))\n return cloneRecord(record)\n }\n\n async submit(input: SubmitWorkflowInterventionInput): Promise<WorkflowInterventionRecord> {\n const existing = this.requirePendingIntervention(input.projectId, input.id)\n const next: WorkflowInterventionRecord = {\n ...existing,\n status: \"submitted\",\n submittedAt: new Date(input.submittedAt ?? new Date()),\n submittedBy: input.submittedBy ? cloneRecord(input.submittedBy) : undefined,\n response: cloneRecord(input.response),\n }\n\n this.interventions.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async cancel(input: CancelWorkflowInterventionInput): Promise<WorkflowInterventionRecord> {\n const existing = this.requirePendingIntervention(input.projectId, input.id)\n const next: WorkflowInterventionRecord = {\n ...existing,\n status: \"cancelled\",\n cancelledAt: new Date(input.cancelledAt ?? new Date()),\n cancelledBy: input.cancelledBy ? cloneRecord(input.cancelledBy) : undefined,\n }\n\n this.interventions.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async expire(input: ExpireWorkflowInterventionInput): Promise<WorkflowInterventionRecord> {\n const existing = this.requirePendingIntervention(input.projectId, input.id)\n const next: WorkflowInterventionRecord = {\n ...existing,\n status: \"expired\",\n expiredAt: new Date(input.expiredAt ?? new Date()),\n }\n\n this.interventions.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async getById(params: {\n projectId: string\n id: string\n }): Promise<WorkflowInterventionRecord | null> {\n const record = this.interventions.get(storageKey(params.projectId, params.id))\n return record ? cloneRecord(record) : null\n }\n\n async list(input: ListWorkflowInterventionsInput): Promise<ListWorkflowInterventionsResult> {\n if (hasEmptyStatuses(input) || input.workflowIds?.length === 0) {\n return {\n interventions: [],\n hasMore: false,\n total: 0,\n }\n }\n\n const order = input.order ?? \"desc\"\n const statuses = toStatusSet(input.statuses)\n const workflowIds = input.workflowIds ? new Set(input.workflowIds) : null\n const filtered = [...this.interventions.values()]\n .filter((record) => record.projectId === input.projectId)\n .filter((record) => (statuses ? statuses.has(record.status) : true))\n .filter((record) => (input.workflowId ? record.workflowId === input.workflowId : true))\n .filter((record) => (workflowIds ? workflowIds.has(record.workflowId) : true))\n .filter((record) =>\n input.workflowRunId ? record.workflowRunId === input.workflowRunId : true\n )\n .filter((record) => (input.nodeRunId ? record.nodeRunId === input.nodeRunId : true))\n .filter((record) => (input.nodeId ? record.nodeId === input.nodeId : true))\n .filter((record) => (input.nodeKey ? record.nodeKey === input.nodeKey : true))\n .filter((record) =>\n input.interventionId ? record.interventionId === input.interventionId : true\n )\n .filter((record) =>\n input.requestedAfter ? record.requestedAt >= input.requestedAfter : true\n )\n .filter((record) =>\n input.requestedBefore ? record.requestedAt <= input.requestedBefore : true\n )\n .sort((left, right) => compareRequestedAt(left, right, order))\n\n const { page, total, hasMore } = paginate(filtered, input)\n\n return {\n interventions: page.map(cloneRecord),\n hasMore,\n total,\n }\n }\n\n private requirePendingIntervention(projectId: string, id: string): WorkflowInterventionRecord {\n const record = this.interventions.get(storageKey(projectId, id))\n if (!record) {\n throw new WorkflowInterventionError(\n `[Sixb] Workflow intervention '${id}' not found for project '${projectId}'.`\n )\n }\n\n if (record.status !== \"pending\") {\n throw new WorkflowInterventionError(\n `[Sixb] Workflow intervention '${id}' for project '${projectId}' is not pending.`\n )\n }\n\n return record\n }\n}\n\nexport type InMemoryWorkflowInterventionStorageSnapshot = Map<string, WorkflowInterventionRecord>\n\nfunction compareRequestedAt(\n left: { readonly id: string; readonly requestedAt: Date },\n right: { readonly id: string; readonly requestedAt: Date },\n order: \"asc\" | \"desc\"\n): number {\n const delta = left.requestedAt.getTime() - right.requestedAt.getTime()\n if (delta !== 0) {\n return order === \"asc\" ? delta : -delta\n }\n\n if (left.id === right.id) {\n return 0\n }\n\n return order === \"asc\" ? left.id.localeCompare(right.id) : right.id.localeCompare(left.id)\n}\n",
|
|
38
|
-
"/**\n * Base error for workflow-run storage operations.\n */\nexport class WorkflowRunError extends Error {\n readonly name = \"WorkflowRunError\"\n}\n",
|
|
39
|
-
"import { SYSTEM_PRINCIPAL } from \"../../auth\"\nimport {\n cloneRecord,\n compareStartedAt,\n hasEmptyStatuses,\n latestStartedAtByOwnerId,\n matchesRunListDateFilters,\n paginate,\n storageKey,\n toStatusSet,\n} from \"../run-listing\"\nimport { WorkflowRunError } from \"./errors\"\nimport type {\n CancelWorkflowAgentNodeRunInput,\n ConfirmWorkflowAgentNodeRunExecutionOwnershipInput,\n ConfirmWorkflowRunExecutionOwnershipInput,\n CreateWorkflowAgentNodeRunInput,\n FinishWorkflowAgentNodeRunInput,\n FinishWorkflowNodeRunInput,\n FinishWorkflowRunInput,\n ListLatestWorkflowRunsInput,\n ListLatestWorkflowRunsResult,\n ListWorkflowAgentNodeRunsInput,\n ListWorkflowAgentNodeRunsResult,\n ListWorkflowNodeRunsInput,\n ListWorkflowNodeRunsResult,\n ListWorkflowRunsInput,\n ListWorkflowRunsResult,\n QueueWorkflowRunInput,\n ReclaimWorkflowAgentNodeRunInput,\n ReclaimWorkflowRunInput,\n ResumeWorkflowRunInput,\n StartWorkflowAgentNodeRunInput,\n StartWorkflowNodeRunInput,\n StartWorkflowRunInput,\n WaitWorkflowNodeRunInput,\n WaitWorkflowRunInput,\n WorkflowAgentNodeRunRecord,\n WorkflowAgentNodeRunStorage,\n WorkflowNodeRunRecord,\n WorkflowNodeRunStorage,\n WorkflowRunRecord,\n WorkflowRunStorage,\n} from \"./types\"\n\nfunction assertNonNegativeInteger(value: number, fieldName: string): void {\n if (!Number.isInteger(value) || value < 0) {\n throw new WorkflowRunError(`[Sixb] Workflow run ${fieldName} must be a non-negative integer.`)\n }\n}\n\nexport class InMemoryWorkflowRunStorage implements WorkflowRunStorage {\n readonly nodes: InMemoryWorkflowNodeRunStorage\n readonly agentNodes: InMemoryWorkflowAgentNodeRunStorage\n\n private readonly runs = new Map<string, WorkflowRunRecord>()\n\n constructor() {\n this.nodes = new InMemoryWorkflowNodeRunStorage({\n requireRunningWorkflowRun: (projectId, id) => this.requireRunningWorkflowRun(projectId, id),\n requireActiveWorkflowRun: (projectId, id) => this.requireActiveWorkflowRun(projectId, id),\n assertExecutionOwnership: (projectId, id, token) =>\n this.assertExecutionOwnership(projectId, id, token),\n })\n this.agentNodes = new InMemoryWorkflowAgentNodeRunStorage({\n requireAgentNodeRun: (projectId, id) => this.nodes.requireAgentNodeRun(projectId, id),\n })\n }\n\n snapshot(): InMemoryWorkflowRunStorageSnapshot {\n return {\n runs: structuredClone(this.runs),\n nodes: this.nodes.snapshot(),\n agentNodes: this.agentNodes.snapshot(),\n }\n }\n\n restore(snapshot: InMemoryWorkflowRunStorageSnapshot): void {\n this.runs.clear()\n for (const [key, record] of structuredClone(snapshot.runs)) {\n this.runs.set(key, record)\n }\n this.nodes.restore(snapshot.nodes)\n this.agentNodes.restore(snapshot.agentNodes)\n }\n\n async queue(input: QueueWorkflowRunInput): Promise<WorkflowRunRecord> {\n const key = storageKey(input.projectId, input.id)\n if (this.runs.has(key)) {\n throw new WorkflowRunError(\n `[Sixb] Workflow run '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n\n const queuedAt = new Date(input.queuedAt ?? new Date())\n const record: WorkflowRunRecord = {\n id: input.id,\n projectId: input.projectId,\n workflowId: input.workflowId,\n status: \"queued\",\n input: cloneRecord(input.input),\n queuedAt,\n startedAt: queuedAt,\n attempt: 0,\n requestedByPrincipal: cloneRecord(input.requestedByPrincipal ?? SYSTEM_PRINCIPAL),\n ...(input.source ? { source: cloneRecord(input.source) } : {}),\n }\n\n this.runs.set(key, cloneRecord(record))\n return cloneRecord(record)\n }\n\n async start(input: StartWorkflowRunInput): Promise<WorkflowRunRecord> {\n const key = storageKey(input.projectId, input.id)\n const existing = this.runs.get(key)\n if (existing) {\n if (existing.status !== \"queued\") {\n throw new WorkflowRunError(\n `[Sixb] Workflow run '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n\n if (existing.workflowId !== input.workflowId) {\n throw new WorkflowRunError(\n `[Sixb] Workflow run '${input.id}' workflow '${input.workflowId}' does not match existing workflow '${existing.workflowId}'.`\n )\n }\n\n const next: WorkflowRunRecord = {\n ...existing,\n status: \"running\",\n input: cloneRecord(input.input),\n startedAt: new Date(input.startedAt ?? new Date()),\n finishedAt: undefined,\n error: undefined,\n source:\n existing.source ?? (input.source === undefined ? undefined : cloneRecord(input.source)),\n attempt: existing.attempt + 1,\n execution: input.execution ? cloneRecord(input.execution) : undefined,\n }\n\n this.runs.set(key, cloneRecord(next))\n return cloneRecord(next)\n }\n\n const record: WorkflowRunRecord = {\n id: input.id,\n projectId: input.projectId,\n workflowId: input.workflowId,\n status: \"running\",\n input: cloneRecord(input.input),\n startedAt: new Date(input.startedAt ?? new Date()),\n attempt: 1,\n requestedByPrincipal: cloneRecord(input.requestedByPrincipal ?? SYSTEM_PRINCIPAL),\n ...(input.execution ? { execution: cloneRecord(input.execution) } : {}),\n ...(input.source ? { source: cloneRecord(input.source) } : {}),\n }\n\n this.runs.set(key, cloneRecord(record))\n return cloneRecord(record)\n }\n\n async finish(input: FinishWorkflowRunInput): Promise<WorkflowRunRecord> {\n const existing = this.requireFinishableWorkflowRun(input)\n this.assertRecordExecutionOwnership(existing, input.executionToken)\n const base: WorkflowRunRecord = {\n ...existing,\n status: input.status,\n finishedAt: new Date(input.finishedAt ?? new Date()),\n execution: undefined,\n }\n\n const next: WorkflowRunRecord =\n input.status === \"succeeded\"\n ? {\n ...base,\n error: undefined,\n }\n : {\n ...base,\n error: input.error,\n }\n\n this.runs.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async wait(input: WaitWorkflowRunInput): Promise<WorkflowRunRecord> {\n const existing = this.requireRunningWorkflowRun(input.projectId, input.id)\n this.assertRecordExecutionOwnership(existing, input.executionToken)\n const next: WorkflowRunRecord = {\n ...existing,\n status: \"waiting\",\n finishedAt: undefined,\n error: undefined,\n execution: undefined,\n }\n\n this.runs.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async resume(input: ResumeWorkflowRunInput): Promise<WorkflowRunRecord> {\n const existing = this.requireWaitingWorkflowRun(input.projectId, input.id)\n const next: WorkflowRunRecord = {\n ...existing,\n status: \"running\",\n finishedAt: undefined,\n error: undefined,\n attempt: existing.attempt + 1,\n execution: input.execution ? cloneRecord(input.execution) : undefined,\n }\n\n this.runs.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async reclaim(input: ReclaimWorkflowRunInput): Promise<WorkflowRunRecord> {\n const existing = this.requireRunningWorkflowRun(input.projectId, input.id)\n const next: WorkflowRunRecord = {\n ...existing,\n attempt: existing.attempt + 1,\n execution: cloneRecord(input.execution),\n }\n this.runs.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async confirmExecutionOwnership(\n input: ConfirmWorkflowRunExecutionOwnershipInput\n ): Promise<WorkflowRunRecord> {\n const existing = this.requireRunningWorkflowRun(input.projectId, input.id)\n this.assertRecordExecutionOwnership(existing, input.executionToken)\n const next: WorkflowRunRecord = {\n ...existing,\n execution: {\n token: input.executionToken,\n queueLeaseExpiresAt: new Date(\n Math.max(\n existing.execution!.queueLeaseExpiresAt.getTime(),\n input.queueLeaseExpiresAt.getTime()\n )\n ),\n },\n }\n this.runs.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async getById(params: { projectId: string; id: string }): Promise<WorkflowRunRecord | null> {\n const record = this.runs.get(storageKey(params.projectId, params.id))\n return record ? cloneRecord(record) : null\n }\n\n async list(input: ListWorkflowRunsInput): Promise<ListWorkflowRunsResult> {\n if (hasEmptyStatuses(input) || input.workflowIds?.length === 0) {\n return {\n runs: [],\n hasMore: false,\n total: 0,\n }\n }\n\n const order = input.order ?? \"desc\"\n const statuses = toStatusSet(input.statuses)\n const workflowIds = input.workflowIds ? new Set(input.workflowIds) : null\n const filtered = [...this.runs.values()]\n .filter((record) => record.projectId === input.projectId)\n .filter((record) => (input.workflowId ? record.workflowId === input.workflowId : true))\n .filter((record) => (workflowIds ? workflowIds.has(record.workflowId) : true))\n .filter((record) =>\n matchesRunListDateFilters(record, {\n statuses,\n startedAfter: input.startedAfter,\n startedBefore: input.startedBefore,\n })\n )\n .sort((left, right) => compareStartedAt(left, right, order))\n\n const { page, total, hasMore } = paginate(filtered, input)\n\n return {\n runs: page.map(cloneRecord),\n hasMore,\n total,\n }\n }\n\n async listLatestByWorkflowIds(\n input: ListLatestWorkflowRunsInput\n ): Promise<ListLatestWorkflowRunsResult> {\n const runs = latestStartedAtByOwnerId(\n [...this.runs.values()].filter((record) => record.projectId === input.projectId),\n input.workflowIds,\n (record) => record.workflowId\n )\n\n return {\n runs: runs.map(cloneRecord),\n }\n }\n\n private requireExistingWorkflowRun(projectId: string, id: string): WorkflowRunRecord {\n const record = this.runs.get(storageKey(projectId, id))\n if (!record) {\n throw new WorkflowRunError(\n `[Sixb] Workflow run '${id}' not found for project '${projectId}'.`\n )\n }\n\n return record\n }\n\n private requireRunningWorkflowRun(projectId: string, id: string): WorkflowRunRecord {\n const record = this.requireExistingWorkflowRun(projectId, id)\n if (record.status !== \"running\") {\n throw new WorkflowRunError(\n `[Sixb] Workflow run '${id}' for project '${projectId}' must be running.`\n )\n }\n\n return record\n }\n\n private requireWaitingWorkflowRun(projectId: string, id: string): WorkflowRunRecord {\n const record = this.requireExistingWorkflowRun(projectId, id)\n if (record.status !== \"waiting\") {\n throw new WorkflowRunError(\n `[Sixb] Workflow run '${id}' for project '${projectId}' must be waiting.`\n )\n }\n\n return record\n }\n\n private requireActiveWorkflowRun(projectId: string, id: string): WorkflowRunRecord {\n const record = this.requireExistingWorkflowRun(projectId, id)\n if (record.status !== \"running\" && record.status !== \"waiting\") {\n throw new WorkflowRunError(\n `[Sixb] Workflow run '${id}' for project '${projectId}' is already terminal.`\n )\n }\n\n return record\n }\n\n private requireFinishableWorkflowRun(input: FinishWorkflowRunInput): WorkflowRunRecord {\n const record = this.requireExistingWorkflowRun(input.projectId, input.id)\n if (record.status === \"running\") {\n return record\n }\n\n if (record.status === \"waiting\" && input.status !== \"succeeded\") {\n return record\n }\n\n if (record.status === \"queued\" && input.status !== \"succeeded\") {\n return record\n }\n\n throw new WorkflowRunError(\n `[Sixb] Workflow run '${input.id}' for project '${input.projectId}' cannot be finished from status '${record.status}'.`\n )\n }\n\n private assertExecutionOwnership(projectId: string, id: string, token?: string): void {\n this.assertRecordExecutionOwnership(this.requireExistingWorkflowRun(projectId, id), token)\n }\n\n private assertRecordExecutionOwnership(record: WorkflowRunRecord, token?: string): void {\n if (record.execution?.token !== token) {\n throw new WorkflowRunError(\n `[Sixb] Execution token is no longer current on workflow run '${record.id}'.`\n )\n }\n }\n}\n\nexport class InMemoryWorkflowNodeRunStorage implements WorkflowNodeRunStorage {\n private readonly nodes = new Map<string, WorkflowNodeRunRecord>()\n\n constructor(\n private readonly workflowRuns: {\n requireRunningWorkflowRun(projectId: string, id: string): WorkflowRunRecord\n requireActiveWorkflowRun(projectId: string, id: string): WorkflowRunRecord\n assertExecutionOwnership(projectId: string, id: string, token?: string): void\n }\n ) {}\n\n snapshot(): InMemoryWorkflowNodeRunStorageSnapshot {\n return structuredClone(this.nodes)\n }\n\n restore(snapshot: InMemoryWorkflowNodeRunStorageSnapshot): void {\n this.nodes.clear()\n for (const [key, record] of structuredClone(snapshot)) {\n this.nodes.set(key, record)\n }\n }\n\n async start(input: StartWorkflowNodeRunInput): Promise<WorkflowNodeRunRecord> {\n assertNonNegativeInteger(input.nodeIndex, \"nodeIndex\")\n\n const workflowRun = this.workflowRuns.requireRunningWorkflowRun(\n input.projectId,\n input.workflowRunId\n )\n this.workflowRuns.assertExecutionOwnership(\n input.projectId,\n input.workflowRunId,\n input.executionToken\n )\n if (workflowRun.workflowId !== input.workflowId) {\n throw new WorkflowRunError(\n `[Sixb] Workflow node run '${input.id}' workflow '${input.workflowId}' does not match workflow run '${input.workflowRunId}' workflow '${workflowRun.workflowId}'.`\n )\n }\n\n const key = storageKey(input.projectId, input.id)\n if (this.nodes.has(key)) {\n throw new WorkflowRunError(\n `[Sixb] Workflow node run '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n\n const record: WorkflowNodeRunRecord = {\n id: input.id,\n projectId: input.projectId,\n workflowRunId: input.workflowRunId,\n workflowId: input.workflowId,\n nodeIndex: input.nodeIndex,\n nodeType: input.nodeType,\n nodeId: input.nodeId,\n nodeKey: input.nodeKey,\n status: \"running\",\n input: cloneRecord(input.input),\n startedAt: new Date(input.startedAt ?? new Date()),\n }\n\n this.nodes.set(key, cloneRecord(record))\n return cloneRecord(record)\n }\n\n async finish(input: FinishWorkflowNodeRunInput): Promise<WorkflowNodeRunRecord> {\n const existing = this.requireActiveNodeRun(input.projectId, input.id)\n this.workflowRuns.assertExecutionOwnership(\n input.projectId,\n existing.workflowRunId,\n input.executionToken\n )\n const base: WorkflowNodeRunRecord = {\n ...existing,\n status: input.status,\n finishedAt: new Date(input.finishedAt ?? new Date()),\n }\n\n const next: WorkflowNodeRunRecord =\n input.status === \"succeeded\"\n ? {\n ...base,\n output: input.output ? cloneRecord(input.output) : undefined,\n error: undefined,\n }\n : {\n ...base,\n output: undefined,\n error: input.error,\n }\n\n this.nodes.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async wait(input: WaitWorkflowNodeRunInput): Promise<WorkflowNodeRunRecord> {\n const existing = this.requireRunningNodeRun(input.projectId, input.id)\n this.workflowRuns.requireActiveWorkflowRun(input.projectId, existing.workflowRunId)\n this.workflowRuns.assertExecutionOwnership(\n input.projectId,\n existing.workflowRunId,\n input.executionToken\n )\n\n const next: WorkflowNodeRunRecord = {\n ...existing,\n status: \"waiting\",\n finishedAt: undefined,\n output: undefined,\n error: undefined,\n }\n\n this.nodes.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async getById(params: { projectId: string; id: string }): Promise<WorkflowNodeRunRecord | null> {\n const record = this.nodes.get(storageKey(params.projectId, params.id))\n return record ? cloneRecord(record) : null\n }\n\n async list(input: ListWorkflowNodeRunsInput): Promise<ListWorkflowNodeRunsResult> {\n if (hasEmptyStatuses(input)) {\n return {\n nodes: [],\n hasMore: false,\n total: 0,\n }\n }\n\n const order = input.order ?? \"desc\"\n const statuses = toStatusSet(input.statuses)\n const filtered = [...this.nodes.values()]\n .filter((record) => record.projectId === input.projectId)\n .filter((record) =>\n input.workflowRunId ? record.workflowRunId === input.workflowRunId : true\n )\n .filter((record) => (input.workflowId ? record.workflowId === input.workflowId : true))\n .filter((record) => (input.nodeType ? record.nodeType === input.nodeType : true))\n .filter((record) => (input.nodeId ? record.nodeId === input.nodeId : true))\n .filter((record) => (input.nodeKey ? record.nodeKey === input.nodeKey : true))\n .filter((record) =>\n matchesRunListDateFilters(record, {\n statuses,\n startedAfter: input.startedAfter,\n startedBefore: input.startedBefore,\n })\n )\n .sort((left, right) => compareStartedAt(left, right, order))\n\n const { page, total, hasMore } = paginate(filtered, input)\n\n return {\n nodes: page.map(cloneRecord),\n hasMore,\n total,\n }\n }\n\n private requireRunningNodeRun(projectId: string, id: string): WorkflowNodeRunRecord {\n const record = this.nodes.get(storageKey(projectId, id))\n if (!record) {\n throw new WorkflowRunError(\n `[Sixb] Workflow node run '${id}' not found for project '${projectId}'.`\n )\n }\n\n if (record.status !== \"running\") {\n throw new WorkflowRunError(\n `[Sixb] Workflow node run '${id}' for project '${projectId}' must be running.`\n )\n }\n\n return record\n }\n\n private requireActiveNodeRun(projectId: string, id: string): WorkflowNodeRunRecord {\n const record = this.nodes.get(storageKey(projectId, id))\n if (!record) {\n throw new WorkflowRunError(\n `[Sixb] Workflow node run '${id}' not found for project '${projectId}'.`\n )\n }\n\n if (record.status !== \"running\" && record.status !== \"waiting\") {\n throw new WorkflowRunError(\n `[Sixb] Workflow node run '${id}' for project '${projectId}' is already terminal.`\n )\n }\n\n return record\n }\n\n requireAgentNodeRun(projectId: string, id: string): WorkflowNodeRunRecord {\n const node = this.nodes.get(storageKey(projectId, id))\n if (!node) {\n throw new WorkflowRunError(\n `[Sixb] Workflow node run '${id}' not found for project '${projectId}'.`\n )\n }\n if (node.nodeType !== \"agent\") {\n throw new WorkflowRunError(`[Sixb] Workflow node run '${id}' is not an agent node.`)\n }\n return node\n }\n}\n\nexport class InMemoryWorkflowAgentNodeRunStorage implements WorkflowAgentNodeRunStorage {\n private readonly runs = new Map<string, WorkflowAgentNodeRunRecord>()\n\n constructor(\n private readonly nodes: {\n requireAgentNodeRun(projectId: string, id: string): WorkflowNodeRunRecord\n }\n ) {}\n\n snapshot(): InMemoryWorkflowAgentNodeRunStorageSnapshot {\n return structuredClone(this.runs)\n }\n\n restore(snapshot: InMemoryWorkflowAgentNodeRunStorageSnapshot): void {\n this.runs.clear()\n for (const [key, record] of structuredClone(snapshot)) this.runs.set(key, record)\n }\n\n async create(input: CreateWorkflowAgentNodeRunInput): Promise<WorkflowAgentNodeRunRecord> {\n const node = this.nodes.requireAgentNodeRun(input.projectId, input.nodeRunId)\n if (node.status !== \"running\") {\n throw new WorkflowRunError(\n `[Sixb] Agent workflow node run '${input.nodeRunId}' must be running when queued.`\n )\n }\n const key = storageKey(input.projectId, input.nodeRunId)\n if (this.runs.has(key)) {\n throw new WorkflowRunError(\n `[Sixb] Agent execution already exists for workflow node run '${input.nodeRunId}'.`\n )\n }\n const record: WorkflowAgentNodeRunRecord = {\n projectId: input.projectId,\n nodeRunId: input.nodeRunId,\n agentId: input.agentId,\n status: \"queued\",\n prompt: input.prompt,\n attempt: 0,\n createdAt: new Date(input.createdAt ?? new Date()),\n }\n this.runs.set(key, cloneRecord(record))\n return cloneRecord(record)\n }\n\n async start(input: StartWorkflowAgentNodeRunInput): Promise<WorkflowAgentNodeRunRecord> {\n const run = this.requireStatus(input.projectId, input.nodeRunId, \"queued\")\n const next: WorkflowAgentNodeRunRecord = {\n ...run,\n status: \"running\",\n ...(input.executionPrincipal\n ? { executionPrincipal: cloneRecord(input.executionPrincipal) }\n : {}),\n ...(input.modelId ? { modelId: input.modelId } : {}),\n attempt: 1,\n execution: cloneRecord(input.execution),\n startedAt: new Date(input.startedAt ?? new Date()),\n }\n return this.save(next)\n }\n\n async reclaim(input: ReclaimWorkflowAgentNodeRunInput): Promise<WorkflowAgentNodeRunRecord> {\n const run = this.requireStatus(input.projectId, input.nodeRunId, \"running\")\n return this.save({ ...run, attempt: run.attempt + 1, execution: cloneRecord(input.execution) })\n }\n\n async confirmExecutionOwnership(\n input: ConfirmWorkflowAgentNodeRunExecutionOwnershipInput\n ): Promise<WorkflowAgentNodeRunRecord> {\n const run = this.requireOwned(input.projectId, input.nodeRunId, input.executionToken)\n return this.save({\n ...run,\n execution: {\n token: input.executionToken,\n queueLeaseExpiresAt: new Date(\n Math.max(\n run.execution!.queueLeaseExpiresAt.getTime(),\n input.queueLeaseExpiresAt.getTime()\n )\n ),\n },\n })\n }\n\n async finish(input: FinishWorkflowAgentNodeRunInput): Promise<WorkflowAgentNodeRunRecord> {\n const run = this.requireOwned(input.projectId, input.nodeRunId, input.executionToken)\n return this.save({\n ...run,\n status: input.status,\n ...(input.modelId === undefined ? {} : { modelId: input.modelId }),\n ...(input.finishReason === undefined ? {} : { finishReason: input.finishReason }),\n ...(input.usage === undefined ? {} : { usage: cloneRecord(input.usage) }),\n ...(input.trace === undefined ? {} : { trace: cloneRecord(input.trace) }),\n ...(input.diagnostics === undefined ? {} : { diagnostics: cloneRecord(input.diagnostics) }),\n ...(input.status === \"succeeded\" || input.error === undefined ? {} : { error: input.error }),\n execution: undefined,\n completedAt: new Date(input.completedAt ?? new Date()),\n })\n }\n\n async cancel(input: CancelWorkflowAgentNodeRunInput): Promise<WorkflowAgentNodeRunRecord> {\n const run = this.requireExisting(input.projectId, input.nodeRunId)\n if (run.status !== \"queued\" && run.status !== \"running\") {\n throw new WorkflowRunError(\n `[Sixb] Agent workflow node run '${input.nodeRunId}' cannot be cancelled from status '${run.status}'.`\n )\n }\n return this.save({\n ...run,\n status: \"cancelled\",\n execution: undefined,\n error: input.error,\n completedAt: new Date(input.completedAt ?? new Date()),\n })\n }\n\n async getByNodeRunId(params: {\n projectId: string\n nodeRunId: string\n }): Promise<WorkflowAgentNodeRunRecord | null> {\n const run = this.runs.get(storageKey(params.projectId, params.nodeRunId))\n return run ? cloneRecord(run) : null\n }\n\n async list(input: ListWorkflowAgentNodeRunsInput): Promise<ListWorkflowAgentNodeRunsResult> {\n const statuses = input.statuses ? new Set(input.statuses) : null\n const order = input.order ?? \"desc\"\n const filtered = [...this.runs.values()]\n .filter((run) => run.projectId === input.projectId)\n .filter((run) => (input.agentId ? run.agentId === input.agentId : true))\n .filter((run) => (statuses ? statuses.has(run.status) : true))\n .sort((a, b) =>\n order === \"asc\"\n ? a.createdAt.getTime() - b.createdAt.getTime()\n : b.createdAt.getTime() - a.createdAt.getTime()\n )\n const { page, total, hasMore } = paginate(filtered, input)\n return { runs: page.map(cloneRecord), total, hasMore }\n }\n\n private requireStatus(\n projectId: string,\n nodeRunId: string,\n status: WorkflowAgentNodeRunRecord[\"status\"]\n ): WorkflowAgentNodeRunRecord {\n const run = this.runs.get(storageKey(projectId, nodeRunId))\n if (!run) throw new WorkflowRunError(`[Sixb] Agent workflow node run '${nodeRunId}' not found.`)\n if (run.status !== status) {\n throw new WorkflowRunError(\n `[Sixb] Agent workflow node run '${nodeRunId}' must be ${status} (status '${run.status}').`\n )\n }\n return run\n }\n\n private requireExisting(projectId: string, nodeRunId: string): WorkflowAgentNodeRunRecord {\n const run = this.runs.get(storageKey(projectId, nodeRunId))\n if (!run) {\n throw new WorkflowRunError(\n `[Sixb] Agent workflow node run '${nodeRunId}' not found for project '${projectId}'.`\n )\n }\n return run\n }\n\n private requireOwned(\n projectId: string,\n nodeRunId: string,\n token: string\n ): WorkflowAgentNodeRunRecord {\n const run = this.requireStatus(projectId, nodeRunId, \"running\")\n if (run.execution?.token !== token) {\n throw new WorkflowRunError(\n `[Sixb] Execution token is no longer current on agent workflow node run '${nodeRunId}'.`\n )\n }\n return run\n }\n\n private save(record: WorkflowAgentNodeRunRecord): WorkflowAgentNodeRunRecord {\n this.runs.set(storageKey(record.projectId, record.nodeRunId), cloneRecord(record))\n return cloneRecord(record)\n }\n}\n\nexport interface InMemoryWorkflowRunStorageSnapshot {\n readonly runs: Map<string, WorkflowRunRecord>\n readonly nodes: InMemoryWorkflowNodeRunStorageSnapshot\n readonly agentNodes: InMemoryWorkflowAgentNodeRunStorageSnapshot\n}\n\nexport type InMemoryWorkflowNodeRunStorageSnapshot = Map<string, WorkflowNodeRunRecord>\nexport type InMemoryWorkflowAgentNodeRunStorageSnapshot = Map<string, WorkflowAgentNodeRunRecord>\n",
|
|
40
|
-
"import type { InMemoryStorageSnapshot } from \".\"\n\nexport interface InMemoryStorageTestingAdapter {\n snapshot(): InMemoryStorageSnapshot\n}\n\nconst testingAdapters = new WeakMap<object, InMemoryStorageTestingAdapter>()\n\nexport function registerInMemoryStorageTestingAdapter(\n storage: object,\n adapter: InMemoryStorageTestingAdapter\n): void {\n testingAdapters.set(storage, adapter)\n}\n\n/** @internal Relative test-only access; intentionally absent from every package barrel. */\nexport function getInMemoryStorageTestingAdapter(storage: object): InMemoryStorageTestingAdapter {\n const adapter = testingAdapters.get(storage)\n if (!adapter) throw new Error(\"[Sixb] In-memory storage testing adapter is unavailable.\")\n return adapter\n}\n",
|
|
41
|
-
"import type { Storage } from \"../types\"\nimport type { MigrationCapableStorage, MigrationReport, StorageMigrationResult } from \"./types\"\n\nexport function isMigrationCapableStorage(storage: Storage): storage is MigrationCapableStorage {\n return Array.isArray((storage as { migrators?: unknown }).migrators)\n}\n\n/** Runs storage adapter migrators when the configured storage exposes them. */\nexport async function migrateStorage(storage: Storage): Promise<StorageMigrationResult> {\n if (!isMigrationCapableStorage(storage) || storage.migrators.length === 0) {\n return { status: \"skipped\", reports: [] }\n }\n\n const reports: MigrationReport[] = []\n\n for (const migrator of storage.migrators) {\n reports.push(await migrator.migrate())\n }\n\n return {\n status: reports.some((report) => report.status === \"migrated\") ? \"migrated\" : \"current\",\n reports,\n }\n}\n",
|
|
42
|
-
"import type { Storage } from \"../types\"\nimport { isMigrationCapableStorage } from \"./migrate-storage\"\n\nexport interface StorageSchemaCheck {\n readonly ok: boolean\n /**\n * Whether anything was read. False when the storage exposes no migrators: usable on the\n * strength of having no schema rather than of a verified one.\n */\n readonly verified: boolean\n /** Absent only when `ok`. Names the adapter, the state, and what to do about it. */\n readonly reason?: string\n}\n\n/**\n * Reports whether the configured storage's schema is usable, without touching it.\n *\n * Storage with no migrators is usable by definition. Failures are returned rather than thrown,\n * because both callers report instead of aborting: `/ready` and `sixb check`.\n */\nexport async function checkStorageSchema(storage: Storage): Promise<StorageSchemaCheck> {\n if (!isMigrationCapableStorage(storage)) return { ok: true, verified: false }\n\n try {\n // `status()` is the only read-only member of the migrator contract: `migrate()` calls\n // `ensure()` first, so it runs DDL and takes an advisory lock. This serves `/ready`.\n const statuses = await Promise.all(storage.migrators.map((migrator) => migrator.status()))\n const unusable = statuses.filter((status) => status.state !== \"current\")\n\n if (unusable.length === 0) return { ok: true, verified: true }\n\n return {\n ok: false,\n verified: true,\n // Named, because \"could not be verified\" leaves an operator guessing between a missing\n // migration, a schema newer than the build, and no database at all.\n reason: unusable\n .map((status) => `${status.adapterId}: ${status.state} — ${status.reason ?? \"\"}`)\n .join(\"; \"),\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return {\n ok: false,\n verified: false,\n reason: `Storage schema could not be verified: ${message}`,\n }\n }\n}\n",
|
|
43
|
-
"import type {\n DefineMigrationsOptions,\n MigrationHistoryStore,\n MigrationPlan,\n MigrationRecord,\n MigrationReport,\n MigrationSet,\n MigrationStatus,\n MigrationStep,\n MigrationStepOptions,\n} from \"./types\"\n\nexport interface PlanMigrationSetParams<TContext> {\n readonly migrations: MigrationSet<TContext>\n readonly state: MigrationHistoryStore\n}\n\nexport interface RunMigrationSetParams<TContext> extends PlanMigrationSetParams<TContext> {\n readonly context: TContext\n readonly now?: () => string\n}\n\nexport function step<TContext>(\n id: string,\n up: (context: TContext) => void | Promise<void>,\n options: MigrationStepOptions = {}\n): MigrationStep<TContext> {\n const { version, name } = parseMigrationId(id)\n\n return {\n id,\n version,\n name,\n checksum: options.checksum,\n up,\n }\n}\n\nexport function defineMigrations<TContext>(\n options: DefineMigrationsOptions<TContext>\n): MigrationSet<TContext> {\n const steps = [...options.steps]\n assertValidSteps(options.adapterId, steps)\n\n return {\n adapterId: options.adapterId,\n latestVersion: steps.at(-1)?.version ?? 0,\n steps,\n }\n}\n\nasync function planMigrationSet<TContext>(\n params: PlanMigrationSetParams<TContext>\n): Promise<MigrationPlan<TContext>> {\n await params.state.ensure()\n\n const rows = await params.state.readHistory(params.migrations.adapterId)\n const applied = assertAppliedPrefix(params.migrations, rows)\n\n return {\n adapterId: params.migrations.adapterId,\n latestVersion: params.migrations.latestVersion,\n applied,\n pending: params.migrations.steps.slice(applied.length),\n }\n}\n\nexport async function runMigrationSet<TContext>(\n params: RunMigrationSetParams<TContext>\n): Promise<MigrationReport> {\n const now = params.now ?? (() => new Date().toISOString())\n const plan = await planMigrationSet(params)\n const applied: string[] = []\n\n for (const migration of plan.pending) {\n await params.state.transaction(async () => {\n await params.state.markStarted(plan.adapterId, migration, now())\n await migration.up(params.context)\n await params.state.markApplied(plan.adapterId, migration, now())\n })\n\n applied.push(migration.id)\n }\n\n return {\n adapterId: plan.adapterId,\n latestVersion: plan.latestVersion,\n status: applied.length > 0 ? \"migrated\" : \"current\",\n applied,\n skipped: plan.applied.map((migration) => migration.id),\n }\n}\n\nfunction parseMigrationId(id: string): { version: number; name: string } {\n const match = /^(\\d+)(?:[-_](.+))?$/.exec(id)\n\n if (!match) {\n throw new Error(`[Sixb] Migration id must start with a numeric prefix: ${id}`)\n }\n\n const version = Number(match[1])\n\n if (!Number.isInteger(version) || version < 1) {\n throw new Error(`[Sixb] Migration id must start with a positive version: ${id}`)\n }\n\n return {\n version,\n name: match[2] ?? id,\n }\n}\n\nfunction assertValidSteps<TContext>(\n adapterId: string,\n steps: readonly MigrationStep<TContext>[]\n): void {\n let previousVersion = 0\n\n for (const migration of steps) {\n if (migration.version <= previousVersion) {\n throw new Error(`[${adapterId}] Migrations must be ordered by ascending version.`)\n }\n\n previousVersion = migration.version\n }\n}\n\n/**\n * Classifies migration history without touching the database.\n *\n * The single source of truth for what a history means. `status()` reports the result\n * and `assertAppliedPrefix` throws on it, so the read-only probe and the migration\n * path can never disagree about whether a database is usable.\n *\n * `rows: null` means the history table itself is absent, which a probe must be able to\n * express without creating it.\n */\nexport function describeMigrationHistory<TContext>(params: {\n readonly migrations: MigrationSet<TContext>\n readonly rows: readonly MigrationRecord[] | null\n}): MigrationStatus {\n const { migrations, rows } = params\n const base = { adapterId: migrations.adapterId, latestVersion: migrations.latestVersion }\n\n // An adapter that declares no migrations and has recorded none is as current as it can\n // be. Reading that as `uninitialized` sent an operator to run `sixb db migrate`, which\n // would have applied nothing and reported the same state again. Only the empty history\n // qualifies: an adapter with no steps whose database recorded some is `ahead`, which\n // the walk below still finds.\n if (rows === null) {\n return migrations.steps.length === 0\n ? { ...base, appliedVersion: 0, state: \"current\" }\n : {\n ...base,\n appliedVersion: 0,\n state: \"uninitialized\",\n reason: \"No migration history exists. Run `sixb db migrate`.\",\n }\n }\n\n const applied = [...rows].sort((a, b) => a.version - b.version)\n const appliedVersion = applied.at(-1)?.version ?? 0\n const found = { ...base, appliedVersion }\n const seen = new Set<number>()\n\n for (const row of applied) {\n if (row.adapterId !== migrations.adapterId) {\n return {\n ...found,\n state: \"incompatible\",\n reason: `Migration state belongs to a different adapter: ${row.adapterId}`,\n }\n }\n\n if (row.status === \"started\") {\n return {\n ...found,\n state: \"dirty\",\n reason: `Migration '${row.id}' started and never finished. Resolve it by hand before serving traffic.`,\n }\n }\n\n if (row.status !== \"applied\") {\n return {\n ...found,\n state: \"incompatible\",\n reason: `Invalid migration status: ${row.status}`,\n }\n }\n\n if (seen.has(row.version)) {\n return {\n ...found,\n state: \"incompatible\",\n reason: `Duplicate applied migration: ${row.version}`,\n }\n }\n\n seen.add(row.version)\n }\n\n for (const [index, row] of applied.entries()) {\n const migration = migrations.steps[index]\n\n if (!migration || row.version > migrations.latestVersion) {\n return {\n ...found,\n state: \"ahead\",\n reason:\n \"Database schema is newer than this Sixb version. Downgrades are not supported; \" +\n \"deploy a build that knows this schema.\",\n }\n }\n\n if (row.version !== migration.version || row.id !== migration.id) {\n return {\n ...found,\n state: \"incompatible\",\n reason: \"Applied migration history does not match declared migrations\",\n }\n }\n\n if ((row.checksum ?? null) !== (migration.checksum ?? null)) {\n return {\n ...found,\n state: \"incompatible\",\n reason: `Applied migration checksum changed: ${row.id}`,\n }\n }\n }\n\n if (applied.length === 0) {\n return migrations.steps.length === 0\n ? { ...found, state: \"current\" }\n : {\n ...found,\n state: \"uninitialized\",\n reason: \"Migration history is empty. Run `sixb db migrate`.\",\n }\n }\n\n const pendingCount = migrations.steps.length - applied.length\n if (pendingCount > 0) {\n return {\n ...found,\n state: \"pending\",\n reason: `${pendingCount} migration(s) are not applied. Run \\`sixb db migrate\\`.`,\n }\n }\n\n return { ...found, state: \"current\" }\n}\n\nfunction assertAppliedPrefix<TContext>(\n migrations: MigrationSet<TContext>,\n rows: readonly MigrationRecord[]\n): readonly MigrationRecord[] {\n const status = describeMigrationHistory({ migrations, rows })\n\n // `uninitialized` and `pending` are the normal inputs to a migration, not failures.\n if (\n status.state !== \"current\" &&\n status.state !== \"uninitialized\" &&\n status.state !== \"pending\"\n ) {\n throw new Error(`[${migrations.adapterId}] ${status.reason}`)\n }\n\n return [...rows].sort((a, b) => a.version - b.version)\n}\n"
|
|
44
|
-
],
|
|
45
|
-
"mappings": "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",
|
|
46
|
-
"debugId": "2180A1BB5A9E6CD664756E2164756E21",
|
|
47
|
-
"names": []
|
|
48
|
-
}
|