@sixb/core 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -20
- 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 +38 -24
- 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 +7 -7
- package/dist/actions/worker.js.map +1 -1
- package/dist/agents/adapters.d.ts +21 -1
- 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/context.js +2 -2
- package/dist/agents/dispatch.d.ts.map +1 -1
- package/dist/agents/errors.d.ts +2 -2
- package/dist/agents/errors.d.ts.map +1 -1
- package/dist/agents/execution.d.ts +48 -0
- package/dist/agents/execution.d.ts.map +1 -0
- package/dist/agents/index.d.ts +12 -9
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +77 -18
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/prompt.d.ts +8 -2
- 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/thread-context-projection.d.ts +19 -0
- package/dist/agents/thread-context-projection.d.ts.map +1 -0
- package/dist/agents/tool-definition.d.ts.map +1 -1
- package/dist/agents/tool-result.d.ts +6 -0
- package/dist/agents/tool-result.d.ts.map +1 -0
- package/dist/agents/types.d.ts +39 -3
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/agents/validation.d.ts +3 -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 +11 -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 +2 -2
- 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 +3 -3
- 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 +63 -60
- 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-177ed2mp.js +3118 -0
- package/dist/chunk-177ed2mp.js.map +46 -0
- package/dist/chunk-1ywq4hzk.js +607 -0
- package/dist/chunk-1ywq4hzk.js.map +14 -0
- package/dist/chunk-261ag4t4.js +252 -0
- package/dist/chunk-261ag4t4.js.map +12 -0
- package/dist/{chunk-y2ygpd0m.js → chunk-3j7573mj.js} +2 -2
- package/dist/{chunk-y2ygpd0m.js.map → chunk-3j7573mj.js.map} +2 -2
- package/dist/{chunk-p7vj8xgb.js → chunk-3rsf30p4.js} +81 -58
- package/dist/chunk-3rsf30p4.js.map +35 -0
- package/dist/chunk-4aw0jwk0.js +118 -0
- package/dist/chunk-4aw0jwk0.js.map +10 -0
- package/dist/{chunk-md9jbrm9.js → chunk-4gz41why.js} +1 -1
- package/dist/chunk-4p9rh7jj.js +164 -0
- package/dist/chunk-4p9rh7jj.js.map +12 -0
- package/dist/chunk-4z3n1dzt.js +1206 -0
- package/dist/chunk-4z3n1dzt.js.map +23 -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-63te770v.js.map +1 -1
- package/dist/{chunk-xz5g49bp.js → chunk-6gjqgd3d.js} +3 -1
- package/dist/chunk-6gjqgd3d.js.map +11 -0
- package/dist/{chunk-6rzdtvn5.js → chunk-8b55ygje.js} +1 -1
- package/dist/chunk-8m5ejdpn.js +33 -0
- package/dist/chunk-8m5ejdpn.js.map +10 -0
- package/dist/chunk-96swp2wd.js +47 -0
- package/dist/chunk-96swp2wd.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-r82k4z7z.js → chunk-a31h57d5.js} +2 -2
- package/dist/{chunk-t72dvahb.js → chunk-bhxaq2nn.js} +61 -44
- package/dist/chunk-bhxaq2nn.js.map +12 -0
- package/dist/chunk-bv41fmjn.js +3294 -0
- package/dist/chunk-bv41fmjn.js.map +35 -0
- package/dist/chunk-c6cfqydk.js +128 -0
- package/dist/chunk-c6cfqydk.js.map +13 -0
- package/dist/chunk-c8bw2b6c.js +317 -0
- package/dist/chunk-c8bw2b6c.js.map +11 -0
- package/dist/{chunk-qzyemcj7.js → chunk-ckxfnx7f.js} +2 -2
- package/dist/chunk-cy0n5dms.js +27 -0
- package/dist/chunk-cy0n5dms.js.map +11 -0
- package/dist/{chunk-xt6qx9sh.js → chunk-d2adj15j.js} +91 -9
- package/dist/chunk-d2adj15j.js.map +37 -0
- package/dist/{chunk-avppcgt6.js → chunk-d6y2wsfg.js} +241 -144
- package/dist/chunk-d6y2wsfg.js.map +15 -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-rjqm6ksg.js → chunk-ettb0cy4.js} +725 -266
- package/dist/chunk-ettb0cy4.js.map +45 -0
- package/dist/chunk-ezake7g1.js +32 -0
- package/dist/chunk-ezake7g1.js.map +11 -0
- package/dist/{chunk-b1bqvhpe.js → chunk-f1cyvnrk.js} +14 -34
- package/dist/chunk-f1cyvnrk.js.map +13 -0
- package/dist/{chunk-yn947ck3.js → chunk-f2rt4vkh.js} +48 -29
- package/dist/chunk-f2rt4vkh.js.map +14 -0
- package/dist/{chunk-hb9xcx9c.js → chunk-fmx1sz2h.js} +117 -56
- package/dist/chunk-fmx1sz2h.js.map +15 -0
- package/dist/{chunk-f6kyyeef.js → chunk-ghteq96b.js} +8 -8
- package/dist/{chunk-f6kyyeef.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-km4rkj4t.js +402 -0
- package/dist/chunk-km4rkj4t.js.map +14 -0
- package/dist/chunk-kqxgf6kv.js +898 -0
- package/dist/chunk-kqxgf6kv.js.map +15 -0
- package/dist/chunk-n5x5y80a.js +137 -0
- package/dist/chunk-n5x5y80a.js.map +10 -0
- package/dist/chunk-nf4r78r4.js +44 -0
- package/dist/chunk-nf4r78r4.js.map +10 -0
- package/dist/chunk-pxtrxm3p.js +55 -0
- package/dist/chunk-pxtrxm3p.js.map +11 -0
- package/dist/chunk-qer6am8w.js +133 -0
- package/dist/chunk-qer6am8w.js.map +11 -0
- package/dist/{chunk-sb0shdvv.js → chunk-rdeagz6b.js} +3 -3
- package/dist/{chunk-sb0shdvv.js.map → chunk-rdeagz6b.js.map} +3 -3
- package/dist/chunk-rhrbz7d4.js +36 -0
- package/dist/chunk-rhrbz7d4.js.map +10 -0
- package/dist/{chunk-53s4asfm.js → chunk-rnshztfq.js} +2 -2
- package/dist/chunk-t0jjkep3.js +35 -0
- package/dist/chunk-t0jjkep3.js.map +10 -0
- package/dist/{chunk-be9vm29v.js → chunk-t8t39h7v.js} +1 -1
- package/dist/{chunk-be9vm29v.js.map → chunk-t8t39h7v.js.map} +3 -3
- package/dist/chunk-t9xghkva.js +28 -0
- package/dist/chunk-t9xghkva.js.map +10 -0
- package/dist/{chunk-nbywkytr.js → chunk-ttba8x6z.js} +13 -33
- package/dist/chunk-ttba8x6z.js.map +15 -0
- package/dist/{chunk-8kv2sez0.js → chunk-vybf6pkp.js} +1 -1
- package/dist/chunk-wb4051cx.js +404 -0
- package/dist/chunk-wb4051cx.js.map +12 -0
- package/dist/{chunk-4tvj3ate.js → chunk-wtmzkcht.js} +4 -3
- package/dist/chunk-wtmzkcht.js.map +11 -0
- package/dist/{chunk-xqbtf4wn.js → chunk-xc7hq65b.js} +5 -3
- package/dist/{chunk-xqbtf4wn.js.map → chunk-xc7hq65b.js.map} +3 -3
- 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-raq0x6bd.js → chunk-xmggaxg4.js} +2199 -380
- package/dist/chunk-xmggaxg4.js.map +54 -0
- package/dist/{chunk-6zrpewy4.js → chunk-z3zp0bj1.js} +1 -1
- package/dist/chunk-z8j83gzd.js +90 -0
- package/dist/chunk-z8j83gzd.js.map +10 -0
- package/dist/chunk-zcnhxkvd.js +7 -0
- package/dist/chunk-zcnhxkvd.js.map +10 -0
- package/dist/chunk-zpw39qhj.js +194 -0
- package/dist/chunk-zpw39qhj.js.map +10 -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-hz8m927w.js → chunk-zqysyfjt.js} +1 -1
- 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/execution.d.ts +8 -0
- package/dist/datasets/execution.d.ts.map +1 -0
- 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 +73 -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 +91 -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 +100 -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/index.d.ts +31 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +133 -105
- package/dist/index.js.map +1 -1
- package/dist/json.d.ts +0 -1
- package/dist/json.d.ts.map +1 -1
- package/dist/lake-storage/index.js +5 -5
- 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 +30 -17
- package/dist/materialization/model.d.ts.map +1 -1
- package/dist/materializer/edits/apply.d.ts +6 -1
- package/dist/materializer/edits/apply.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 +38 -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 +19 -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 +33 -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 +40 -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 +4 -4
- package/dist/ontology/registry.d.ts +15 -2
- package/dist/ontology/registry.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 +68 -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 +19 -8
- 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 +5 -2
- package/dist/projections/index.d.ts.map +1 -1
- package/dist/projections/internal.d.ts +8 -11
- package/dist/projections/internal.d.ts.map +1 -1
- package/dist/projections/internal.js +48 -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/timestamp.d.ts +3 -0
- package/dist/projections/timestamp.d.ts.map +1 -0
- package/dist/projections/types.d.ts +12 -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 +59 -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-cost.d.ts +8 -0
- package/dist/runtime/ai-cost.d.ts.map +1 -0
- 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 +22 -5
- 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 +41 -0
- package/dist/storage/agents/provider.d.ts.map +1 -0
- package/dist/storage/agents/provider.js +28 -0
- package/dist/storage/agents/provider.js.map +9 -0
- package/dist/storage/agents/types.d.ts +83 -26
- package/dist/storage/agents/types.d.ts.map +1 -1
- package/dist/storage/ai-cost/analytics.d.ts +61 -0
- package/dist/storage/ai-cost/analytics.d.ts.map +1 -0
- package/dist/storage/ai-cost/codec.d.ts +14 -0
- package/dist/storage/ai-cost/codec.d.ts.map +1 -0
- package/dist/storage/ai-cost/errors.d.ts +7 -0
- package/dist/storage/ai-cost/errors.d.ts.map +1 -0
- package/dist/storage/ai-cost/in-memory.d.ts +32 -0
- package/dist/storage/ai-cost/in-memory.d.ts.map +1 -0
- package/dist/storage/ai-cost/index.d.ts +6 -0
- package/dist/storage/ai-cost/index.d.ts.map +1 -0
- package/dist/storage/ai-cost/provider.d.ts +7 -0
- package/dist/storage/ai-cost/provider.d.ts.map +1 -0
- package/dist/storage/ai-cost/provider.js +132 -0
- package/dist/storage/ai-cost/provider.js.map +10 -0
- package/dist/storage/ai-cost/types.d.ts +154 -0
- package/dist/storage/ai-cost/types.d.ts.map +1 -0
- package/dist/storage/ai-cost/validation.d.ts +7 -0
- package/dist/storage/ai-cost/validation.d.ts.map +1 -0
- 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 +25 -5
- package/dist/storage/in-memory/index.d.ts.map +1 -1
- package/dist/storage/index.d.ts +30 -17
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +99 -29
- 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 +53 -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 +28 -11
- package/dist/storage/sync-runs/types.d.ts.map +1 -1
- package/dist/storage/types.d.ts +22 -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 +20 -0
- package/dist/storage/workflow-runs/provider.js.map +9 -0
- package/dist/storage/workflow-runs/types.d.ts +28 -30
- package/dist/storage/workflow-runs/types.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 +67 -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 +16 -9
- package/dist/syncs/types.d.ts.map +1 -1
- 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 +12 -4
- package/dist/testing/agent-storage-contract.d.ts.map +1 -1
- package/dist/testing/ai-cost-storage-contract.d.ts +12 -0
- package/dist/testing/ai-cost-storage-contract.d.ts.map +1 -0
- 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 +4754 -1592
- package/dist/testing/index.js.map +26 -13
- 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 +152 -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 +29 -20
- 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 +32 -11
- package/dist/workers/queue-worker.d.ts.map +1 -1
- package/dist/workflows/execution.d.ts +52 -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 +67 -36
- 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 +113 -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 +71 -26
- package/src/agents/authority.ts +189 -0
- package/src/agents/dispatch.ts +1 -6
- package/src/agents/errors.ts +4 -2
- package/src/agents/execution.ts +266 -0
- package/src/agents/index.ts +33 -4
- package/src/agents/prompt.ts +47 -7
- package/src/agents/request.ts +158 -13
- package/src/agents/streams.ts +150 -3
- package/src/agents/thread-context-projection.ts +93 -0
- package/src/agents/tool-definition.ts +17 -2
- package/src/agents/tool-result.ts +61 -0
- package/src/agents/types.ts +49 -5
- package/src/agents/validation.ts +3 -3
- 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/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/execution.ts +24 -0
- 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 +3 -3
- package/src/index.ts +122 -9
- package/src/json.ts +0 -4
- 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 +34 -18
- package/src/materializer/README.md +9 -13
- package/src/materializer/edits/apply.ts +55 -2
- package/src/materializer/edits/commit.ts +85 -28
- package/src/materializer/edits/load-state.ts +79 -16
- package/src/materializer/edits/operations.ts +80 -37
- package/src/materializer/edits/plan.ts +95 -22
- package/src/materializer/edits/working-state.ts +93 -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 +140 -9
- 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 +42 -7
- package/src/materializer/index.ts +9 -1
- package/src/materializer/materializer.ts +67 -5
- package/src/materializer/projections/entry-validator.ts +23 -1
- package/src/materializer/projections/finish-run.ts +29 -11
- package/src/materializer/projections/replace.ts +55 -22
- package/src/materializer/projections/replacement-plan.ts +39 -7
- package/src/materializer/shared/batching.ts +4 -1
- package/src/materializer/shared/normalize.ts +16 -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/registry.ts +16 -2
- 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 +100 -44
- package/src/projections/capability.ts +37 -0
- package/src/projections/execution.ts +85 -0
- package/src/projections/index.ts +8 -1
- package/src/projections/internal.ts +21 -61
- package/src/projections/ownership.ts +2 -2
- package/src/projections/registry.ts +33 -11
- package/src/projections/revision.ts +11 -5
- package/src/projections/run-dispatch.ts +497 -0
- package/src/projections/run-id.ts +20 -0
- package/src/projections/timestamp.ts +66 -0
- package/src/projections/types.ts +19 -0
- package/src/projections/validation.ts +27 -3
- package/src/queues/in-memory.ts +37 -11
- package/src/queues/index.ts +10 -2
- package/src/queues/types.ts +78 -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-cost.ts +15 -0
- 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 -822
- 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 +219 -14
- package/src/storage/agents/index.ts +7 -1
- package/src/storage/agents/provider.ts +252 -0
- package/src/storage/agents/types.ts +96 -22
- package/src/storage/ai-cost/analytics.ts +602 -0
- package/src/storage/ai-cost/codec.ts +136 -0
- package/src/storage/ai-cost/errors.ts +12 -0
- package/src/storage/ai-cost/in-memory.ts +164 -0
- package/src/storage/ai-cost/index.ts +35 -0
- package/src/storage/ai-cost/provider.ts +20 -0
- package/src/storage/ai-cost/types.ts +193 -0
- package/src/storage/ai-cost/validation.ts +337 -0
- 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 +100 -16
- package/src/storage/index.ts +191 -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 +132 -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 +53 -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 +2 -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 +90 -7
- package/src/storage/sync-runs/index.ts +4 -1
- package/src/storage/sync-runs/provider.ts +25 -0
- package/src/storage/sync-runs/types.ts +35 -11
- package/src/storage/types.ts +46 -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 +89 -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 +36 -25
- package/src/syncs/builders.ts +2 -2
- package/src/syncs/execution.ts +78 -0
- package/src/syncs/index.ts +13 -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 +32 -8
- package/src/testing/action-execution.ts +61 -0
- package/src/testing/agent-execution.ts +81 -0
- package/src/testing/agent-storage-contract.ts +498 -64
- package/src/testing/ai-cost-storage-contract.ts +320 -0
- 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 +57 -0
- package/src/testing/materializer-fixture.ts +11 -3
- package/src/testing/materializer-storage-contract.ts +333 -13
- 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 +76 -33
- package/src/workflows/execution.ts +313 -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/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-4hwxq5e6.js +0 -49
- package/dist/chunk-4hwxq5e6.js.map +0 -10
- package/dist/chunk-4tvj3ate.js.map +0 -11
- package/dist/chunk-50kv63vj.js.map +0 -12
- package/dist/chunk-86459jn0.js +0 -1091
- package/dist/chunk-86459jn0.js.map +0 -22
- package/dist/chunk-867jxh7c.js.map +0 -19
- package/dist/chunk-9k3hgv8h.js +0 -352
- package/dist/chunk-9k3hgv8h.js.map +0 -13
- package/dist/chunk-avppcgt6.js.map +0 -14
- package/dist/chunk-b1bqvhpe.js.map +0 -13
- package/dist/chunk-b5dp7gaf.js +0 -1092
- package/dist/chunk-b5dp7gaf.js.map +0 -26
- package/dist/chunk-bh8bwma3.js +0 -37
- package/dist/chunk-bh8bwma3.js.map +0 -10
- package/dist/chunk-btcsywk4.js +0 -985
- package/dist/chunk-btcsywk4.js.map +0 -15
- package/dist/chunk-exrfbt2d.js +0 -354
- package/dist/chunk-exrfbt2d.js.map +0 -17
- package/dist/chunk-hb9xcx9c.js.map +0 -14
- package/dist/chunk-k25jm1x5.js +0 -102
- package/dist/chunk-k25jm1x5.js.map +0 -10
- package/dist/chunk-k6j72mtt.js +0 -9
- package/dist/chunk-k6j72mtt.js.map +0 -10
- package/dist/chunk-m9w0artv.js +0 -554
- package/dist/chunk-m9w0artv.js.map +0 -13
- package/dist/chunk-nbywkytr.js.map +0 -16
- package/dist/chunk-p7vj8xgb.js.map +0 -34
- package/dist/chunk-raq0x6bd.js.map +0 -48
- package/dist/chunk-rgzed50y.js +0 -1445
- package/dist/chunk-rgzed50y.js.map +0 -22
- package/dist/chunk-rjqm6ksg.js.map +0 -44
- package/dist/chunk-t72dvahb.js.map +0 -12
- package/dist/chunk-v5c085yp.js.map +0 -10
- package/dist/chunk-xt6qx9sh.js.map +0 -36
- package/dist/chunk-xz5g49bp.js.map +0 -11
- package/dist/chunk-ya6brh8a.js.map +0 -11
- package/dist/chunk-yn947ck3.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-md9jbrm9.js.map → chunk-4gz41why.js.map} +0 -0
- /package/dist/{chunk-6rzdtvn5.js.map → chunk-8b55ygje.js.map} +0 -0
- /package/dist/{chunk-r82k4z7z.js.map → chunk-a31h57d5.js.map} +0 -0
- /package/dist/{chunk-qzyemcj7.js.map → chunk-ckxfnx7f.js.map} +0 -0
- /package/dist/{chunk-53s4asfm.js.map → chunk-rnshztfq.js.map} +0 -0
- /package/dist/{chunk-8kv2sez0.js.map → chunk-vybf6pkp.js.map} +0 -0
- /package/dist/{chunk-6zrpewy4.js.map → chunk-z3zp0bj1.js.map} +0 -0
- /package/dist/{chunk-hz8m927w.js.map → chunk-zqysyfjt.js.map} +0 -0
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
} from "./chunk-
|
|
3
|
+
parseDatasetTimestamp
|
|
4
|
+
} from "./chunk-96swp2wd.js";
|
|
5
|
+
import {
|
|
6
|
+
ensureExecutionRecord,
|
|
7
|
+
executionRecordInputFromRuntime
|
|
8
|
+
} from "./chunk-4aw0jwk0.js";
|
|
5
9
|
import {
|
|
6
|
-
|
|
7
|
-
} from "./chunk-
|
|
10
|
+
isStorageSerializationFailure
|
|
11
|
+
} from "./chunk-xmggaxg4.js";
|
|
8
12
|
import {
|
|
9
13
|
createCommitId,
|
|
10
14
|
createEventId,
|
|
11
15
|
createRequestHash,
|
|
16
|
+
materializationApplyPhase,
|
|
12
17
|
materializationEventKindOrdinal,
|
|
13
18
|
sha256Canonical
|
|
14
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-fmx1sz2h.js";
|
|
15
20
|
import {
|
|
16
21
|
assertPinnedDatasetWatermark
|
|
17
22
|
} from "./chunk-9dzba0f2.js";
|
|
@@ -32,7 +37,7 @@ import {
|
|
|
32
37
|
telemetryPointKey,
|
|
33
38
|
telemetryPointSortKey,
|
|
34
39
|
utf8JsonByteLength
|
|
35
|
-
} from "./chunk-
|
|
40
|
+
} from "./chunk-vybf6pkp.js";
|
|
36
41
|
import {
|
|
37
42
|
MaterializationCancellationError,
|
|
38
43
|
MaterializationConflictError,
|
|
@@ -48,18 +53,19 @@ import {
|
|
|
48
53
|
validateObjectProperties,
|
|
49
54
|
validatePropertyValue,
|
|
50
55
|
validateTelemetryUnit
|
|
51
|
-
} from "./chunk-
|
|
56
|
+
} from "./chunk-rnshztfq.js";
|
|
52
57
|
import {
|
|
53
58
|
ProjectionValidationError,
|
|
54
59
|
isProjectionDefinition,
|
|
60
|
+
resolveExecutionScopeAuthorization,
|
|
55
61
|
validateProjectionsAtStartup
|
|
56
|
-
} from "./chunk-
|
|
62
|
+
} from "./chunk-4z3n1dzt.js";
|
|
57
63
|
import {
|
|
58
64
|
assertJsonValue,
|
|
59
65
|
cloneJsonValue,
|
|
60
66
|
compareStrings,
|
|
61
67
|
stableJsonStringify
|
|
62
|
-
} from "./chunk-
|
|
68
|
+
} from "./chunk-t8t39h7v.js";
|
|
63
69
|
// src/projections/revision.ts
|
|
64
70
|
function computeOntologyRevision(ontology) {
|
|
65
71
|
const referencedValueTypeIds = collectOntologyValueTypeDependencies(ontology);
|
|
@@ -166,7 +172,8 @@ function normalizeProjectionDefinition(projection) {
|
|
|
166
172
|
sourceField: link.sourceField ?? null,
|
|
167
173
|
targetObjectTypeId: link.targetObjectTypeId
|
|
168
174
|
}
|
|
169
|
-
]))
|
|
175
|
+
])),
|
|
176
|
+
conflictResolution: projection.conflictResolution ?? { strategy: "editsWin" }
|
|
170
177
|
};
|
|
171
178
|
}
|
|
172
179
|
if (projection._tag === "LinkProjectionDefinition") {
|
|
@@ -193,7 +200,8 @@ function projectionColumns(projection) {
|
|
|
193
200
|
if (projection._tag === "ObjectProjectionDefinition") {
|
|
194
201
|
return new Set([
|
|
195
202
|
...Object.values(projection.properties),
|
|
196
|
-
...Object.values(projection.links).flatMap((link) => link.sourceField === undefined ? [] : [link.sourceField])
|
|
203
|
+
...Object.values(projection.links).flatMap((link) => link.sourceField === undefined ? [] : [link.sourceField]),
|
|
204
|
+
...projection.conflictResolution?.strategy === "mostRecent" ? [projection.conflictResolution.sourceTimestamp] : []
|
|
197
205
|
]);
|
|
198
206
|
}
|
|
199
207
|
if (projection._tag === "LinkProjectionDefinition") {
|
|
@@ -324,16 +332,19 @@ class ProjectionRegistry {
|
|
|
324
332
|
this.dispatchById.set(descriptor.projectionId, descriptor);
|
|
325
333
|
}
|
|
326
334
|
}
|
|
327
|
-
|
|
335
|
+
list() {
|
|
336
|
+
return [...this.objectProjections, ...this.linkProjections, ...this.telemetryProjections];
|
|
337
|
+
}
|
|
338
|
+
listObjects() {
|
|
328
339
|
return this.objectProjections;
|
|
329
340
|
}
|
|
330
|
-
|
|
341
|
+
listLinks() {
|
|
331
342
|
return this.linkProjections;
|
|
332
343
|
}
|
|
333
|
-
|
|
344
|
+
listTelemetry() {
|
|
334
345
|
return this.telemetryProjections;
|
|
335
346
|
}
|
|
336
|
-
|
|
347
|
+
getById(projectionId) {
|
|
337
348
|
return this.projectionsById.get(projectionId) ?? null;
|
|
338
349
|
}
|
|
339
350
|
getDispatchDescriptors() {
|
|
@@ -418,7 +429,11 @@ function cloneObjectProjectionDefinition(projection) {
|
|
|
418
429
|
...descriptor.sourceField !== undefined ? { sourceField: descriptor.sourceField } : {},
|
|
419
430
|
targetObjectTypeId: descriptor.targetObjectTypeId
|
|
420
431
|
}
|
|
421
|
-
]))
|
|
432
|
+
])),
|
|
433
|
+
conflictResolution: projection.conflictResolution?.strategy === "mostRecent" ? {
|
|
434
|
+
strategy: "mostRecent",
|
|
435
|
+
sourceTimestamp: projection.conflictResolution.sourceTimestamp
|
|
436
|
+
} : { strategy: "editsWin" }
|
|
422
437
|
};
|
|
423
438
|
}
|
|
424
439
|
function cloneLinkProjectionDefinition(projection) {
|
|
@@ -456,7 +471,7 @@ function deepFreeze(value) {
|
|
|
456
471
|
}
|
|
457
472
|
// src/materializer/shared/batching.ts
|
|
458
473
|
var DEFAULT_MATERIALIZATION_BATCHING = Object.freeze({
|
|
459
|
-
sourceStageRows:
|
|
474
|
+
sourceStageRows: 2000,
|
|
460
475
|
sourceStageBytes: 4 * 1024 * 1024,
|
|
461
476
|
statePageRows: 1000,
|
|
462
477
|
planChunkRows: 1000,
|
|
@@ -571,7 +586,7 @@ function createMaterializerContext(input) {
|
|
|
571
586
|
}
|
|
572
587
|
|
|
573
588
|
// src/materializer/execution/commit-lifecycle.ts
|
|
574
|
-
async function replayCommitRecord(context, identity, storage = context.storage) {
|
|
589
|
+
async function replayCommitRecord(context, identity, executionId, storage = context.storage) {
|
|
575
590
|
const existing = await storage.ontology.commits.getByIdempotencyKey({
|
|
576
591
|
projectId: context.projectId,
|
|
577
592
|
idempotencyKey: identity.idempotencyKey
|
|
@@ -581,10 +596,13 @@ async function replayCommitRecord(context, identity, storage = context.storage)
|
|
|
581
596
|
if (existing.requestHash !== identity.requestHash) {
|
|
582
597
|
throw new MaterializationConflictError("idempotency", `Idempotency key '${identity.idempotencyKey}' was reused with different intent.`);
|
|
583
598
|
}
|
|
599
|
+
if (existing.executionId !== executionId) {
|
|
600
|
+
throw new MaterializationConflictError("idempotency", `Idempotency key '${identity.idempotencyKey}' belongs to execution '${existing.executionId}', not '${executionId}'.`);
|
|
601
|
+
}
|
|
584
602
|
return existing;
|
|
585
603
|
}
|
|
586
|
-
async function replayCommit(context, identity, storage = context.storage) {
|
|
587
|
-
const existing = await replayCommitRecord(context, identity, storage);
|
|
604
|
+
async function replayCommit(context, identity, executionId, storage = context.storage) {
|
|
605
|
+
const existing = await replayCommitRecord(context, identity, executionId, storage);
|
|
588
606
|
if (!existing)
|
|
589
607
|
return null;
|
|
590
608
|
return { ...structuredClone(existing.result), created: false };
|
|
@@ -602,6 +620,43 @@ async function withSerializationRetry(context, run) {
|
|
|
602
620
|
}
|
|
603
621
|
}
|
|
604
622
|
|
|
623
|
+
// src/materializer/execution/scope.ts
|
|
624
|
+
function prepareMaterializerExecution(projectId, scope) {
|
|
625
|
+
const authorization = resolveExecutionScopeAuthorization(projectId, scope);
|
|
626
|
+
const base = {
|
|
627
|
+
scope,
|
|
628
|
+
record: executionRecordInputFromRuntime({
|
|
629
|
+
execution: scope.execution,
|
|
630
|
+
runtimeAuthorization: scope.authorization
|
|
631
|
+
}),
|
|
632
|
+
executionId: scope.execution.id,
|
|
633
|
+
correlationId: scope.execution.correlationId
|
|
634
|
+
};
|
|
635
|
+
if (authorization.type !== "principal")
|
|
636
|
+
return base;
|
|
637
|
+
return { ...base, actor: authorization.context.principal };
|
|
638
|
+
}
|
|
639
|
+
function ensureMaterializerExecution(executions, execution) {
|
|
640
|
+
return ensureExecutionRecord(executions, execution.record);
|
|
641
|
+
}
|
|
642
|
+
function assertRuntimeMutationExecution(execution) {
|
|
643
|
+
if (execution.scope.execution.executor.type !== "kernel")
|
|
644
|
+
return;
|
|
645
|
+
throw new MaterializationValidationError(`Kernel execution '${execution.executionId}' cannot enter the runtime mutation boundary.`);
|
|
646
|
+
}
|
|
647
|
+
function assertTrustedPrimitiveMutationExecution(execution, primitive) {
|
|
648
|
+
const executor = execution.scope.execution.executor;
|
|
649
|
+
if (executor.type === "primitive" && executor.kind === primitive.kind && executor.id === primitive.id && executor.runId === primitive.runId) {
|
|
650
|
+
return;
|
|
651
|
+
}
|
|
652
|
+
throw new MaterializationConflictError("run-correlation", `Execution '${execution.executionId}' does not own ${primitive.kind} run '${primitive.runId}'.`);
|
|
653
|
+
}
|
|
654
|
+
function assertMaterializerRunExecution(execution, runExecutionId, label) {
|
|
655
|
+
if (runExecutionId === execution.executionId)
|
|
656
|
+
return;
|
|
657
|
+
throw new MaterializationConflictError("run-correlation", `${label} belongs to execution '${runExecutionId}', not '${execution.executionId}'.`);
|
|
658
|
+
}
|
|
659
|
+
|
|
605
660
|
// src/materializer/effective/build-events.ts
|
|
606
661
|
function buildObjectMaterializationEventDraft(input) {
|
|
607
662
|
const draft = buildObjectEventDraft(input, input.change);
|
|
@@ -713,6 +768,7 @@ function eventDraftBase(context) {
|
|
|
713
768
|
schemaVersion: 1,
|
|
714
769
|
projectId: context.projectId,
|
|
715
770
|
occurredAt: context.committedAt,
|
|
771
|
+
correlationId: context.correlationId,
|
|
716
772
|
origin: context.origin,
|
|
717
773
|
commitId: context.commitId
|
|
718
774
|
};
|
|
@@ -780,7 +836,13 @@ async function* planStream(items, batching) {
|
|
|
780
836
|
}
|
|
781
837
|
function mutableChunk() {
|
|
782
838
|
return {
|
|
783
|
-
overrides: {
|
|
839
|
+
overrides: {
|
|
840
|
+
objects: { upserts: [], deletes: [] },
|
|
841
|
+
links: {
|
|
842
|
+
edges: { upserts: [], deletes: [] },
|
|
843
|
+
slots: { upserts: [], deletes: [] }
|
|
844
|
+
}
|
|
845
|
+
},
|
|
784
846
|
effective: { objectUpserts: [], objectDeletes: [], linkUpserts: [], linkDeletes: [] },
|
|
785
847
|
timeseries: { pointUpserts: [] },
|
|
786
848
|
outbox: []
|
|
@@ -789,16 +851,22 @@ function mutableChunk() {
|
|
|
789
851
|
function appendItem(chunk, item) {
|
|
790
852
|
switch (item.kind) {
|
|
791
853
|
case "object-override-upsert":
|
|
792
|
-
chunk.overrides.
|
|
854
|
+
chunk.overrides.objects.upserts.push(item.value);
|
|
793
855
|
break;
|
|
794
856
|
case "object-override-delete":
|
|
795
|
-
chunk.overrides.
|
|
857
|
+
chunk.overrides.objects.deletes.push(item.value);
|
|
796
858
|
break;
|
|
797
859
|
case "link-override-upsert":
|
|
798
|
-
chunk.overrides.
|
|
860
|
+
chunk.overrides.links.edges.upserts.push(item.value);
|
|
799
861
|
break;
|
|
800
862
|
case "link-override-delete":
|
|
801
|
-
chunk.overrides.
|
|
863
|
+
chunk.overrides.links.edges.deletes.push(item.value);
|
|
864
|
+
break;
|
|
865
|
+
case "link-slot-override-upsert":
|
|
866
|
+
chunk.overrides.links.slots.upserts.push(item.value);
|
|
867
|
+
break;
|
|
868
|
+
case "link-slot-override-delete":
|
|
869
|
+
chunk.overrides.links.slots.deletes.push(item.value);
|
|
802
870
|
break;
|
|
803
871
|
case "object-upsert":
|
|
804
872
|
chunk.effective.objectUpserts.push(item.value);
|
|
@@ -822,8 +890,8 @@ function appendItem(chunk, item) {
|
|
|
822
890
|
}
|
|
823
891
|
|
|
824
892
|
// src/materializer/execution/work-records.ts
|
|
825
|
-
function
|
|
826
|
-
if (stableJsonStringify(working.originalOverride?.value ?? null) === stableJsonStringify(working.override)) {
|
|
893
|
+
function appendObjectOverrideWork(items, working, identity) {
|
|
894
|
+
if (stableJsonStringify(working.originalOverride?.value ?? null) === stableJsonStringify(working.override) && stableJsonStringify(working.originalEditedAt) === stableJsonStringify(working.editedAt)) {
|
|
827
895
|
return;
|
|
828
896
|
}
|
|
829
897
|
if (working.override) {
|
|
@@ -832,6 +900,7 @@ function appendObjectOverridePlan(items, working, identity) {
|
|
|
832
900
|
value: {
|
|
833
901
|
ref: working.ref,
|
|
834
902
|
value: working.override,
|
|
903
|
+
editedAt: working.editedAt,
|
|
835
904
|
expectedLastCommitId: working.originalOverride?.lastCommitId ?? null,
|
|
836
905
|
lastCommitId: identity.commitId,
|
|
837
906
|
updatedAt: identity.committedAt
|
|
@@ -844,7 +913,7 @@ function appendObjectOverridePlan(items, working, identity) {
|
|
|
844
913
|
});
|
|
845
914
|
}
|
|
846
915
|
}
|
|
847
|
-
function
|
|
916
|
+
function appendLinkEdgeOverrideWork(items, working, identity) {
|
|
848
917
|
if (stableJsonStringify(working.originalOverride?.value ?? null) === stableJsonStringify(working.override)) {
|
|
849
918
|
return;
|
|
850
919
|
}
|
|
@@ -866,7 +935,32 @@ function appendLinkOverridePlan(items, working, identity) {
|
|
|
866
935
|
});
|
|
867
936
|
}
|
|
868
937
|
}
|
|
869
|
-
function
|
|
938
|
+
function appendLinkSlotOverrideWork(items, working, identity) {
|
|
939
|
+
if (stableJsonStringify(working.originalOverride?.value ?? null) === stableJsonStringify(working.override)) {
|
|
940
|
+
return;
|
|
941
|
+
}
|
|
942
|
+
if (working.override) {
|
|
943
|
+
items.push({
|
|
944
|
+
kind: "link-slot-override-upsert",
|
|
945
|
+
value: {
|
|
946
|
+
ref: working.ref,
|
|
947
|
+
value: working.override,
|
|
948
|
+
expectedLastCommitId: working.originalOverride?.lastCommitId ?? null,
|
|
949
|
+
lastCommitId: identity.commitId,
|
|
950
|
+
updatedAt: identity.committedAt
|
|
951
|
+
}
|
|
952
|
+
});
|
|
953
|
+
} else if (working.originalOverride) {
|
|
954
|
+
items.push({
|
|
955
|
+
kind: "link-slot-override-delete",
|
|
956
|
+
value: {
|
|
957
|
+
ref: working.ref,
|
|
958
|
+
expectedLastCommitId: working.originalOverride.lastCommitId
|
|
959
|
+
}
|
|
960
|
+
});
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
function appendEffectiveObjectWork(items, change) {
|
|
870
964
|
if (change.kind === "deleted") {
|
|
871
965
|
items.push({
|
|
872
966
|
kind: "object-delete",
|
|
@@ -885,7 +979,7 @@ function appendObjectEffectivePlan(items, change) {
|
|
|
885
979
|
});
|
|
886
980
|
}
|
|
887
981
|
}
|
|
888
|
-
function
|
|
982
|
+
function appendEffectiveLinkWork(items, change) {
|
|
889
983
|
if (change.kind === "deleted") {
|
|
890
984
|
items.push({
|
|
891
985
|
kind: "link-delete",
|
|
@@ -996,6 +1090,7 @@ async function drainStagedWork(context, storage, session, signal) {
|
|
|
996
1090
|
await flush();
|
|
997
1091
|
}
|
|
998
1092
|
async function validateStagedCardinality(context, storage, session, signal) {
|
|
1093
|
+
let currentView = null;
|
|
999
1094
|
let currentScope = null;
|
|
1000
1095
|
let occupant = null;
|
|
1001
1096
|
for await (const page of storage.streamWork({
|
|
@@ -1008,14 +1103,15 @@ async function validateStagedCardinality(context, storage, session, signal) {
|
|
|
1008
1103
|
if (record.kind !== "cardinality") {
|
|
1009
1104
|
throw new MaterializationValidationError("Provider returned non-cardinality cardinality work.");
|
|
1010
1105
|
}
|
|
1011
|
-
if (record.scopeSortKey !== currentScope) {
|
|
1106
|
+
if (record.view !== currentView || record.scopeSortKey !== currentScope) {
|
|
1107
|
+
currentView = record.view;
|
|
1012
1108
|
currentScope = record.scopeSortKey;
|
|
1013
1109
|
occupant = null;
|
|
1014
1110
|
}
|
|
1015
1111
|
if (!record.occupied)
|
|
1016
1112
|
continue;
|
|
1017
1113
|
if (occupant && occupant !== record.linkSortKey) {
|
|
1018
|
-
throw new MaterializationValidationError(`Link scope '${record.ref.source.objectTypeId}.${record.ref.linkId}' has cardinality one.`);
|
|
1114
|
+
throw new MaterializationValidationError(record.view === "candidate" ? `Projection source scope '${record.ref.source.objectTypeId}.${record.ref.linkId}' has cardinality one.` : `Link scope '${record.ref.source.objectTypeId}.${record.ref.linkId}' has cardinality one.`);
|
|
1019
1115
|
}
|
|
1020
1116
|
occupant = record.linkSortKey;
|
|
1021
1117
|
}
|
|
@@ -1067,18 +1163,6 @@ function normalizeNonblank(value, label) {
|
|
|
1067
1163
|
}
|
|
1068
1164
|
return value;
|
|
1069
1165
|
}
|
|
1070
|
-
function normalizeEventActor(actor) {
|
|
1071
|
-
if (typeof actor !== "object" || actor === null || Array.isArray(actor)) {
|
|
1072
|
-
throw new MaterializationValidationError("Event actor must be an object.");
|
|
1073
|
-
}
|
|
1074
|
-
if (actor.type !== "user" && actor.type !== "serviceAccount" && actor.type !== "system") {
|
|
1075
|
-
throw new MaterializationValidationError("Event actor type must be 'user', 'serviceAccount', or 'system'.");
|
|
1076
|
-
}
|
|
1077
|
-
return Object.freeze({
|
|
1078
|
-
type: actor.type,
|
|
1079
|
-
id: normalizeNonblank(actor.id, "Event actor id")
|
|
1080
|
-
});
|
|
1081
|
-
}
|
|
1082
1166
|
function normalizeTimestamp(value, label) {
|
|
1083
1167
|
const milliseconds = Date.parse(value);
|
|
1084
1168
|
if (!Number.isFinite(milliseconds)) {
|
|
@@ -1086,6 +1170,13 @@ function normalizeTimestamp(value, label) {
|
|
|
1086
1170
|
}
|
|
1087
1171
|
return new Date(milliseconds).toISOString();
|
|
1088
1172
|
}
|
|
1173
|
+
function normalizeProjectionSourceTimestamp(value) {
|
|
1174
|
+
const timestamp = parseDatasetTimestamp(value);
|
|
1175
|
+
if (!timestamp) {
|
|
1176
|
+
throw new MaterializationValidationError("Projection source update timestamp must be a valid timestamp.");
|
|
1177
|
+
}
|
|
1178
|
+
return timestamp.toISOString();
|
|
1179
|
+
}
|
|
1089
1180
|
function normalizePropertyIds(values, label) {
|
|
1090
1181
|
const seen = new Set;
|
|
1091
1182
|
const normalized = [];
|
|
@@ -1243,7 +1334,6 @@ function normalizeOntologyEditCommit(input) {
|
|
|
1243
1334
|
kind: "runtime",
|
|
1244
1335
|
requestId: normalizeNonblank(input.source.requestId, "Runtime request id")
|
|
1245
1336
|
}),
|
|
1246
|
-
...input.actor !== undefined ? { actor: normalizeEventActor(input.actor) } : {},
|
|
1247
1337
|
operations: Object.freeze(operations),
|
|
1248
1338
|
...input.operationGroups !== undefined ? { operationGroups: normalizeOperationGroups(input.operationGroups, operationIds) } : {}
|
|
1249
1339
|
});
|
|
@@ -1262,7 +1352,6 @@ function normalizeOntologyEditCommit(input) {
|
|
|
1262
1352
|
return Object.freeze({
|
|
1263
1353
|
mode: "atomic",
|
|
1264
1354
|
source,
|
|
1265
|
-
...input.actor !== undefined ? { actor: normalizeEventActor(input.actor) } : {},
|
|
1266
1355
|
operations: Object.freeze(operations),
|
|
1267
1356
|
expectedObjects: deduplicateExpectations(expectedObjects, (value) => objectRefKey(value.ref), "Expected objects"),
|
|
1268
1357
|
expectedLinks: deduplicateExpectations(expectedLinks, (value) => linkRefKey(value.ref), "Expected links"),
|
|
@@ -1297,7 +1386,10 @@ function normalizeProjectionAssertion(assertion) {
|
|
|
1297
1386
|
return assertion.kind === "object" ? Object.freeze({
|
|
1298
1387
|
kind: "object",
|
|
1299
1388
|
ref: normalizeObjectRef(assertion.ref),
|
|
1300
|
-
properties: normalizeJsonProperties(assertion.properties)
|
|
1389
|
+
properties: normalizeJsonProperties(assertion.properties),
|
|
1390
|
+
...assertion.sourceUpdatedAt !== undefined ? {
|
|
1391
|
+
sourceUpdatedAt: normalizeProjectionSourceTimestamp(assertion.sourceUpdatedAt)
|
|
1392
|
+
} : {}
|
|
1301
1393
|
}) : Object.freeze({
|
|
1302
1394
|
kind: "link",
|
|
1303
1395
|
ref: normalizeLinkRef(assertion.ref),
|
|
@@ -1401,7 +1493,6 @@ function normalizeTelemetryAppend(input) {
|
|
|
1401
1493
|
}
|
|
1402
1494
|
return Object.freeze({
|
|
1403
1495
|
source,
|
|
1404
|
-
...input.actor !== undefined ? { actor: normalizeEventActor(input.actor) } : {},
|
|
1405
1496
|
points: Object.freeze(points)
|
|
1406
1497
|
});
|
|
1407
1498
|
}
|
|
@@ -1444,6 +1535,136 @@ async function loadState(context, storage, session, request) {
|
|
|
1444
1535
|
return result;
|
|
1445
1536
|
}
|
|
1446
1537
|
|
|
1538
|
+
// src/materializer/effective/resolve.ts
|
|
1539
|
+
function usableLinkSlotOverride(stored) {
|
|
1540
|
+
if (!stored)
|
|
1541
|
+
return null;
|
|
1542
|
+
if (stored.value.kind !== "legacy-conflict")
|
|
1543
|
+
return stored.value;
|
|
1544
|
+
const { source, linkId } = stored.ref;
|
|
1545
|
+
const scopeLabel = JSON.stringify([source.objectTypeId, source.primaryId, linkId]);
|
|
1546
|
+
throw new MaterializationConflictError("effective-state", `Cardinality-one link slot ${scopeLabel} could not be migrated automatically because it ` + "contains multiple legacy upsert overrides. Consolidate the stored overrides and clear " + "the migration conflict marker before materializing this scope.");
|
|
1547
|
+
}
|
|
1548
|
+
function resolveEffectiveObject(input) {
|
|
1549
|
+
const properties = resolveObjectAuthority(input.source, input.override, input.editedAt);
|
|
1550
|
+
if (!properties)
|
|
1551
|
+
return null;
|
|
1552
|
+
properties[input.primaryPropertyId] = input.ref.primaryId;
|
|
1553
|
+
applyLatestTelemetry(properties, input.latestTelemetry);
|
|
1554
|
+
return { ref: input.ref, properties };
|
|
1555
|
+
}
|
|
1556
|
+
function resolveObjectAuthority(source, override, editedAt) {
|
|
1557
|
+
switch (override?.kind) {
|
|
1558
|
+
case "delete":
|
|
1559
|
+
return null;
|
|
1560
|
+
case "create":
|
|
1561
|
+
if (!source)
|
|
1562
|
+
return { ...override.properties };
|
|
1563
|
+
return resolveSourceAndEdits(source, override, editedAt);
|
|
1564
|
+
case "patch":
|
|
1565
|
+
if (!source)
|
|
1566
|
+
return null;
|
|
1567
|
+
return resolveSourceAndEdits(source, override, editedAt);
|
|
1568
|
+
default:
|
|
1569
|
+
if (!source)
|
|
1570
|
+
return null;
|
|
1571
|
+
return { ...source.assertion.properties };
|
|
1572
|
+
}
|
|
1573
|
+
}
|
|
1574
|
+
function resolveSourceAndEdits(source, override, editedAt) {
|
|
1575
|
+
const properties = { ...source.assertion.properties };
|
|
1576
|
+
const absentSourcePropertyIds = new Set(source.assertion.absentSourcePropertyIds ?? []);
|
|
1577
|
+
for (const propertyId of objectEditCandidateIds(override, editedAt)) {
|
|
1578
|
+
const edit = objectEditCandidate(override, propertyId);
|
|
1579
|
+
const editTimestamp = editedAt[propertyId];
|
|
1580
|
+
const hasSourceCandidate = Object.hasOwn(source.assertion.properties, propertyId) || absentSourcePropertyIds.has(propertyId);
|
|
1581
|
+
const sourceWins = hasSourceCandidate && source.assertion.sourceUpdatedAt !== undefined && editTimestamp !== undefined && source.assertion.sourceUpdatedAt.localeCompare(editTimestamp) >= 0;
|
|
1582
|
+
if (!sourceWins)
|
|
1583
|
+
applyObjectEditCandidate(properties, propertyId, edit);
|
|
1584
|
+
}
|
|
1585
|
+
return properties;
|
|
1586
|
+
}
|
|
1587
|
+
function objectEditCandidateIds(override, editedAt) {
|
|
1588
|
+
const ids = new Set(Object.keys(editedAt));
|
|
1589
|
+
if (override.kind === "create") {
|
|
1590
|
+
for (const propertyId of Object.keys(override.properties))
|
|
1591
|
+
ids.add(propertyId);
|
|
1592
|
+
} else {
|
|
1593
|
+
for (const propertyId of Object.keys(override.set))
|
|
1594
|
+
ids.add(propertyId);
|
|
1595
|
+
for (const propertyId of override.unset)
|
|
1596
|
+
ids.add(propertyId);
|
|
1597
|
+
}
|
|
1598
|
+
return [...ids];
|
|
1599
|
+
}
|
|
1600
|
+
function objectEditCandidate(override, propertyId) {
|
|
1601
|
+
const values = override.kind === "create" ? override.properties : override.set;
|
|
1602
|
+
return Object.hasOwn(values, propertyId) ? { present: true, value: values[propertyId] } : { present: false };
|
|
1603
|
+
}
|
|
1604
|
+
function applyObjectEditCandidate(properties, propertyId, candidate) {
|
|
1605
|
+
if (candidate.present)
|
|
1606
|
+
properties[propertyId] = candidate.value;
|
|
1607
|
+
else
|
|
1608
|
+
delete properties[propertyId];
|
|
1609
|
+
}
|
|
1610
|
+
function storedObjectEditedAt(stored) {
|
|
1611
|
+
if (!stored || stored.value.kind === "delete")
|
|
1612
|
+
return {};
|
|
1613
|
+
const editedAt = { ...stored.editedAt ?? {} };
|
|
1614
|
+
const candidateIds = stored.value.kind === "create" ? Object.keys(stored.value.properties) : [...Object.keys(stored.value.set), ...stored.value.unset];
|
|
1615
|
+
for (const propertyId of candidateIds)
|
|
1616
|
+
editedAt[propertyId] ??= stored.updatedAt;
|
|
1617
|
+
return editedAt;
|
|
1618
|
+
}
|
|
1619
|
+
function applyLatestTelemetry(properties, latestTelemetry) {
|
|
1620
|
+
for (const point of latestTelemetry)
|
|
1621
|
+
properties[point.series.propertyId] = point.value;
|
|
1622
|
+
}
|
|
1623
|
+
function resolveEffectiveLink(input) {
|
|
1624
|
+
if (!input.sourceEndpointExists || !input.targetEndpointExists)
|
|
1625
|
+
return null;
|
|
1626
|
+
if (input.override?.kind === "delete")
|
|
1627
|
+
return null;
|
|
1628
|
+
if (input.override?.kind === "upsert") {
|
|
1629
|
+
return resolvedLink(input.ref, input.override.properties);
|
|
1630
|
+
}
|
|
1631
|
+
if (!input.source)
|
|
1632
|
+
return null;
|
|
1633
|
+
return resolvedLink(input.ref, input.source.assertion.properties);
|
|
1634
|
+
}
|
|
1635
|
+
function resolveEffectiveLinkSlot(input) {
|
|
1636
|
+
if (!input.endpointExists(input.scope.source))
|
|
1637
|
+
return null;
|
|
1638
|
+
if (input.override?.kind === "clear")
|
|
1639
|
+
return null;
|
|
1640
|
+
if (input.override?.kind === "set") {
|
|
1641
|
+
if (!input.endpointExists(input.override.target))
|
|
1642
|
+
return null;
|
|
1643
|
+
return resolvedLink({
|
|
1644
|
+
source: input.scope.source,
|
|
1645
|
+
linkId: input.scope.linkId,
|
|
1646
|
+
target: input.override.target
|
|
1647
|
+
}, input.override.properties);
|
|
1648
|
+
}
|
|
1649
|
+
if (!input.source || !input.endpointExists(input.source.assertion.ref.target))
|
|
1650
|
+
return null;
|
|
1651
|
+
return resolvedLink(input.source.assertion.ref, input.source.assertion.properties);
|
|
1652
|
+
}
|
|
1653
|
+
function resolveEffectiveLinkSlotMember(input) {
|
|
1654
|
+
const resolved = resolveEffectiveLinkSlot({
|
|
1655
|
+
scope: { source: input.ref.source, linkId: input.ref.linkId },
|
|
1656
|
+
source: input.source,
|
|
1657
|
+
override: input.override,
|
|
1658
|
+
endpointExists: input.endpointExists
|
|
1659
|
+
});
|
|
1660
|
+
return resolved && linkRefKey(resolved.ref) === linkRefKey(input.ref) ? resolved : null;
|
|
1661
|
+
}
|
|
1662
|
+
function resolvedLink(ref, properties) {
|
|
1663
|
+
if (properties === undefined)
|
|
1664
|
+
return { ref };
|
|
1665
|
+
return { ref, properties };
|
|
1666
|
+
}
|
|
1667
|
+
|
|
1447
1668
|
// src/materializer/edits/read-set.ts
|
|
1448
1669
|
function buildEditReadSet(ontology, operations) {
|
|
1449
1670
|
const objects = new Map;
|
|
@@ -1493,88 +1714,49 @@ function isObjectOperation(operation) {
|
|
|
1493
1714
|
return operation.kind.startsWith("object.");
|
|
1494
1715
|
}
|
|
1495
1716
|
|
|
1496
|
-
// src/materializer/effective/resolve.ts
|
|
1497
|
-
function resolveEffectiveObject(input) {
|
|
1498
|
-
const properties = resolveObjectAuthority(input.source, input.override);
|
|
1499
|
-
if (!properties)
|
|
1500
|
-
return null;
|
|
1501
|
-
properties[input.primaryPropertyId] = input.ref.primaryId;
|
|
1502
|
-
applyLatestTelemetry(properties, input.latestTelemetry);
|
|
1503
|
-
return { ref: input.ref, properties };
|
|
1504
|
-
}
|
|
1505
|
-
function resolveObjectAuthority(source, override) {
|
|
1506
|
-
switch (override?.kind) {
|
|
1507
|
-
case "delete":
|
|
1508
|
-
return null;
|
|
1509
|
-
case "create":
|
|
1510
|
-
return { ...override.properties };
|
|
1511
|
-
case "patch":
|
|
1512
|
-
if (!source)
|
|
1513
|
-
return null;
|
|
1514
|
-
return applyObjectPatch(source.assertion.properties, override);
|
|
1515
|
-
default:
|
|
1516
|
-
if (!source)
|
|
1517
|
-
return null;
|
|
1518
|
-
return { ...source.assertion.properties };
|
|
1519
|
-
}
|
|
1520
|
-
}
|
|
1521
|
-
function applyObjectPatch(sourceProperties, override) {
|
|
1522
|
-
const properties = { ...sourceProperties, ...override.set };
|
|
1523
|
-
for (const propertyId of override.unset)
|
|
1524
|
-
delete properties[propertyId];
|
|
1525
|
-
return properties;
|
|
1526
|
-
}
|
|
1527
|
-
function applyLatestTelemetry(properties, latestTelemetry) {
|
|
1528
|
-
for (const point of latestTelemetry)
|
|
1529
|
-
properties[point.series.propertyId] = point.value;
|
|
1530
|
-
}
|
|
1531
|
-
function resolveEffectiveLink(input) {
|
|
1532
|
-
if (!input.sourceEndpointExists || !input.targetEndpointExists)
|
|
1533
|
-
return null;
|
|
1534
|
-
if (input.override?.kind === "delete")
|
|
1535
|
-
return null;
|
|
1536
|
-
if (input.override?.kind === "upsert") {
|
|
1537
|
-
return resolvedLink(input.ref, input.override.properties);
|
|
1538
|
-
}
|
|
1539
|
-
if (!input.source)
|
|
1540
|
-
return null;
|
|
1541
|
-
return resolvedLink(input.ref, input.source.assertion.properties);
|
|
1542
|
-
}
|
|
1543
|
-
function resolvedLink(ref, properties) {
|
|
1544
|
-
if (properties === undefined)
|
|
1545
|
-
return { ref };
|
|
1546
|
-
return { ref, properties };
|
|
1547
|
-
}
|
|
1548
|
-
|
|
1549
1717
|
// src/materializer/edits/working-state.ts
|
|
1550
|
-
function mergeWorkingState(
|
|
1718
|
+
function mergeWorkingState(ontology, working, state) {
|
|
1551
1719
|
for (const object of state.objects) {
|
|
1552
|
-
if (!objects.has(objectRefKey(object.ref))) {
|
|
1553
|
-
objects.set(objectRefKey(object.ref), workingObjectFromState(object));
|
|
1720
|
+
if (!working.objects.has(objectRefKey(object.ref))) {
|
|
1721
|
+
working.objects.set(objectRefKey(object.ref), workingObjectFromState(object));
|
|
1554
1722
|
}
|
|
1555
1723
|
}
|
|
1556
1724
|
for (const link of state.links) {
|
|
1557
|
-
if (!links.has(linkRefKey(link.ref))) {
|
|
1558
|
-
links.set(linkRefKey(link.ref),
|
|
1725
|
+
if (linkCardinality(ontology, link.ref) !== "one" && !working.links.edges.has(linkRefKey(link.ref))) {
|
|
1726
|
+
working.links.edges.set(linkRefKey(link.ref), workingLinkEdgeFromState(link));
|
|
1559
1727
|
}
|
|
1560
1728
|
}
|
|
1561
1729
|
for (const scope of state.linkScopes) {
|
|
1562
|
-
|
|
1563
|
-
|
|
1730
|
+
const key = linkScopeKey(scope.source, scope.linkId);
|
|
1731
|
+
if (!working.links.slots.has(key)) {
|
|
1732
|
+
working.links.slots.set(key, workingLinkSlotFromState(scope));
|
|
1564
1733
|
}
|
|
1565
1734
|
}
|
|
1566
1735
|
}
|
|
1736
|
+
function workingLinkSlotFromState(scope) {
|
|
1737
|
+
return {
|
|
1738
|
+
ref: { source: scope.source, linkId: scope.linkId },
|
|
1739
|
+
source: scope.sourceAssertion,
|
|
1740
|
+
originalOverride: scope.override,
|
|
1741
|
+
override: usableLinkSlotOverride(scope.override),
|
|
1742
|
+
before: scope.effective,
|
|
1743
|
+
effectiveCount: scope.effectiveCount
|
|
1744
|
+
};
|
|
1745
|
+
}
|
|
1567
1746
|
function workingObjectFromState(object) {
|
|
1747
|
+
const editedAt = storedObjectEditedAt(object.override);
|
|
1568
1748
|
return {
|
|
1569
1749
|
ref: object.ref,
|
|
1570
1750
|
source: object.source,
|
|
1571
1751
|
originalOverride: object.override,
|
|
1572
1752
|
override: object.override?.value ?? null,
|
|
1753
|
+
originalEditedAt: editedAt,
|
|
1754
|
+
editedAt: { ...editedAt },
|
|
1573
1755
|
before: object.effective,
|
|
1574
1756
|
latestTelemetry: [...object.latestTelemetry]
|
|
1575
1757
|
};
|
|
1576
1758
|
}
|
|
1577
|
-
function
|
|
1759
|
+
function workingLinkEdgeFromState(link) {
|
|
1578
1760
|
return {
|
|
1579
1761
|
ref: link.ref,
|
|
1580
1762
|
source: link.source,
|
|
@@ -1589,10 +1771,11 @@ function resolveObject(ontology, working) {
|
|
|
1589
1771
|
primaryPropertyId: ontology.getPrimaryPropertyId(working.ref.objectTypeId),
|
|
1590
1772
|
source: working.source,
|
|
1591
1773
|
override: working.override,
|
|
1774
|
+
editedAt: working.editedAt,
|
|
1592
1775
|
latestTelemetry: working.latestTelemetry
|
|
1593
1776
|
});
|
|
1594
1777
|
}
|
|
1595
|
-
function
|
|
1778
|
+
function resolveLinkEdge(ontology, working, objects) {
|
|
1596
1779
|
const source = objects.get(objectRefKey(working.ref.source));
|
|
1597
1780
|
const target = objects.get(objectRefKey(working.ref.target));
|
|
1598
1781
|
return resolveEffectiveLink({
|
|
@@ -1603,44 +1786,32 @@ function resolveLink(ontology, working, objects) {
|
|
|
1603
1786
|
targetEndpointExists: Boolean(target && resolveObject(ontology, target))
|
|
1604
1787
|
});
|
|
1605
1788
|
}
|
|
1789
|
+
function resolveLinkSlot(ontology, working, objects) {
|
|
1790
|
+
return resolveEffectiveLinkSlot({
|
|
1791
|
+
scope: working.ref,
|
|
1792
|
+
source: working.source,
|
|
1793
|
+
override: working.override,
|
|
1794
|
+
endpointExists: (ref) => {
|
|
1795
|
+
const object = objects.get(objectRefKey(ref));
|
|
1796
|
+
return Boolean(object && resolveObject(ontology, object));
|
|
1797
|
+
}
|
|
1798
|
+
});
|
|
1799
|
+
}
|
|
1606
1800
|
function distinctCardinalityOneScopes(ontology, links, existing) {
|
|
1607
1801
|
const scopes = new Map;
|
|
1608
1802
|
for (const state of links) {
|
|
1609
|
-
const definition = ontology.resolveObjectType(state.ref.source.objectTypeId).links.find((candidate) => candidate.id === state.ref.linkId);
|
|
1610
1803
|
const key = linkScopeKey(state.ref.source, state.ref.linkId);
|
|
1611
|
-
if (
|
|
1804
|
+
if (linkCardinality(ontology, state.ref) === "one" && !existing.has(key)) {
|
|
1612
1805
|
scopes.set(key, { source: state.ref.source, linkId: state.ref.linkId });
|
|
1613
1806
|
}
|
|
1614
1807
|
}
|
|
1615
1808
|
return [...scopes.values()];
|
|
1616
1809
|
}
|
|
1617
|
-
function validateWorkingCardinality(
|
|
1618
|
-
const
|
|
1619
|
-
|
|
1620
|
-
effectiveByScope.set(scope, {
|
|
1621
|
-
count: snapshot.effectiveCount,
|
|
1622
|
-
source: snapshot.source,
|
|
1623
|
-
linkId: snapshot.linkId
|
|
1624
|
-
});
|
|
1625
|
-
}
|
|
1626
|
-
for (const working of links.values()) {
|
|
1627
|
-
if (!isKnownLinkRef(ontology, working.ref))
|
|
1628
|
-
continue;
|
|
1629
|
-
const scope = linkScopeKey(working.ref.source, working.ref.linkId);
|
|
1630
|
-
const state = effectiveByScope.get(scope);
|
|
1631
|
-
if (!state)
|
|
1632
|
-
continue;
|
|
1633
|
-
const before = working.before ? 1 : 0;
|
|
1634
|
-
const after = resolveLink(ontology, working, objects) ? 1 : 0;
|
|
1635
|
-
state.count += after - before;
|
|
1636
|
-
}
|
|
1637
|
-
for (const { count, source, linkId } of effectiveByScope.values()) {
|
|
1638
|
-
if (count <= 1)
|
|
1810
|
+
function validateWorkingCardinality(slots) {
|
|
1811
|
+
for (const { effectiveCount, ref } of slots.values()) {
|
|
1812
|
+
if (effectiveCount <= 1)
|
|
1639
1813
|
continue;
|
|
1640
|
-
|
|
1641
|
-
if (link?.cardinality === "one") {
|
|
1642
|
-
throw new MaterializationValidationError(`Link scope '${source.objectTypeId}.${linkId}' has cardinality one.`);
|
|
1643
|
-
}
|
|
1814
|
+
throw new MaterializationValidationError(`Link scope '${ref.source.objectTypeId}.${ref.linkId}' has cardinality one.`);
|
|
1644
1815
|
}
|
|
1645
1816
|
}
|
|
1646
1817
|
|
|
@@ -1648,29 +1819,38 @@ function validateWorkingCardinality(ontology, objects, links, scopes) {
|
|
|
1648
1819
|
async function loadEditWorkingState(context, storage, session, operations) {
|
|
1649
1820
|
const state = {
|
|
1650
1821
|
objects: new Map,
|
|
1651
|
-
links:
|
|
1652
|
-
|
|
1822
|
+
links: {
|
|
1823
|
+
edges: new Map,
|
|
1824
|
+
slots: new Map
|
|
1825
|
+
}
|
|
1653
1826
|
};
|
|
1654
1827
|
const readSet = buildEditReadSet(context.ontology, operations);
|
|
1655
1828
|
const explicitLinkKeys = new Set(readSet.links.map(linkRefKey));
|
|
1656
1829
|
const incidentLinks = new Map;
|
|
1657
|
-
const
|
|
1830
|
+
const loadedState = {
|
|
1831
|
+
objects: state.objects,
|
|
1832
|
+
links: {
|
|
1833
|
+
edges: new Map,
|
|
1834
|
+
slots: state.links.slots
|
|
1835
|
+
}
|
|
1836
|
+
};
|
|
1658
1837
|
const revivingObjects = new Set(operations.filter(isRevivingObjectOperation).map((operation) => objectRefKey(operation.ref)));
|
|
1659
1838
|
for await (const page of storage.streamState({
|
|
1660
1839
|
session,
|
|
1661
1840
|
requests: oneStateRequest(readSet),
|
|
1662
1841
|
pageRows: context.batching.statePageRows
|
|
1663
1842
|
})) {
|
|
1664
|
-
mergeWorkingState(
|
|
1843
|
+
mergeWorkingState(context.ontology, loadedState, page);
|
|
1665
1844
|
for (const link of page.links) {
|
|
1666
1845
|
const key = linkRefKey(link.ref);
|
|
1667
|
-
if (explicitLinkKeys.has(key) && !state.links.has(key)) {
|
|
1668
|
-
state.links.set(key,
|
|
1846
|
+
if (linkCardinality(context.ontology, link.ref) !== "one" && explicitLinkKeys.has(key) && !state.links.edges.has(key)) {
|
|
1847
|
+
state.links.edges.set(key, workingLinkEdgeFromState(link));
|
|
1669
1848
|
}
|
|
1670
1849
|
if (readSet.incidentObjects.length > 0)
|
|
1671
1850
|
incidentLinks.set(key, link);
|
|
1672
1851
|
}
|
|
1673
1852
|
}
|
|
1853
|
+
await mergeMissingLinkSlotEndpoints(context, storage, session, state);
|
|
1674
1854
|
await mergeIncidentState(context, storage, session, state, [...incidentLinks.values()], revivingObjects);
|
|
1675
1855
|
return state;
|
|
1676
1856
|
}
|
|
@@ -1701,9 +1881,20 @@ async function mergeIncidentState(context, storage, session, state, incidentStat
|
|
|
1701
1881
|
if (revivingObjects.has(objectRefKey(link.ref.source)) || revivingObjects.has(objectRefKey(link.ref.target))) {
|
|
1702
1882
|
return true;
|
|
1703
1883
|
}
|
|
1704
|
-
|
|
1884
|
+
if (linkCardinality(context.ontology, link.ref) === "one") {
|
|
1885
|
+
return Boolean(resolveEffectiveLinkSlotMember({
|
|
1886
|
+
ref: link.ref,
|
|
1887
|
+
source: link.source,
|
|
1888
|
+
override: usableLinkSlotOverride(link.slotOverride),
|
|
1889
|
+
endpointExists: (ref) => {
|
|
1890
|
+
const object = state.objects.get(objectRefKey(ref));
|
|
1891
|
+
return Boolean(object && resolveObject(context.ontology, object));
|
|
1892
|
+
}
|
|
1893
|
+
}));
|
|
1894
|
+
}
|
|
1895
|
+
return Boolean(resolveLinkEdge(context.ontology, workingLinkEdgeFromState(link), state.objects));
|
|
1705
1896
|
});
|
|
1706
|
-
const missingScopes = distinctCardinalityOneScopes(context.ontology, relevantStates, state.
|
|
1897
|
+
const missingScopes = distinctCardinalityOneScopes(context.ontology, relevantStates, state.links.slots);
|
|
1707
1898
|
if (missingScopes.length > 0) {
|
|
1708
1899
|
await mergeLoadedState(context, storage, session, state, {
|
|
1709
1900
|
objects: [],
|
|
@@ -1713,17 +1904,44 @@ async function mergeIncidentState(context, storage, session, state, incidentStat
|
|
|
1713
1904
|
points: []
|
|
1714
1905
|
});
|
|
1715
1906
|
}
|
|
1907
|
+
await mergeMissingLinkSlotEndpoints(context, storage, session, state);
|
|
1716
1908
|
for (const link of relevantStates) {
|
|
1909
|
+
if (linkCardinality(context.ontology, link.ref) === "one")
|
|
1910
|
+
continue;
|
|
1717
1911
|
const key = linkRefKey(link.ref);
|
|
1718
|
-
if (state.links.has(key))
|
|
1912
|
+
if (state.links.edges.has(key))
|
|
1719
1913
|
continue;
|
|
1720
|
-
state.links.set(key,
|
|
1914
|
+
state.links.edges.set(key, workingLinkEdgeFromState(link));
|
|
1915
|
+
}
|
|
1916
|
+
context.observeCoreBuffer?.("edits.incident-links", state.links.edges.size + state.links.slots.size);
|
|
1917
|
+
}
|
|
1918
|
+
async function mergeMissingLinkSlotEndpoints(context, storage, session, state) {
|
|
1919
|
+
const missing = new Map;
|
|
1920
|
+
for (const working of state.links.slots.values()) {
|
|
1921
|
+
const refs = [
|
|
1922
|
+
working.ref.source,
|
|
1923
|
+
working.source?.assertion.ref.target,
|
|
1924
|
+
working.override?.target,
|
|
1925
|
+
working.before?.ref.target
|
|
1926
|
+
];
|
|
1927
|
+
for (const ref of refs) {
|
|
1928
|
+
if (ref && !state.objects.has(objectRefKey(ref)))
|
|
1929
|
+
missing.set(objectRefKey(ref), ref);
|
|
1930
|
+
}
|
|
1721
1931
|
}
|
|
1722
|
-
|
|
1932
|
+
if (missing.size === 0)
|
|
1933
|
+
return;
|
|
1934
|
+
await mergeLoadedState(context, storage, session, state, {
|
|
1935
|
+
objects: [...missing.values()],
|
|
1936
|
+
links: [],
|
|
1937
|
+
linkScopes: [],
|
|
1938
|
+
incidentObjects: [],
|
|
1939
|
+
points: []
|
|
1940
|
+
});
|
|
1723
1941
|
}
|
|
1724
1942
|
async function mergeLoadedState(context, storage, session, state, request) {
|
|
1725
1943
|
const loaded = await loadState(context, storage, session, request);
|
|
1726
|
-
mergeWorkingState(
|
|
1944
|
+
mergeWorkingState(context.ontology, state, loaded);
|
|
1727
1945
|
}
|
|
1728
1946
|
|
|
1729
1947
|
// src/materializer/effective/diff.ts
|
|
@@ -1792,6 +2010,16 @@ function diffEffectiveLink(input) {
|
|
|
1792
2010
|
return null;
|
|
1793
2011
|
return updateLinkChange(input.before, input.resolved, input.commitId, input.committedAt);
|
|
1794
2012
|
}
|
|
2013
|
+
function diffEffectiveLinkSlot(input) {
|
|
2014
|
+
if (input.before && input.resolved && linkRefKey(input.before.ref) !== linkRefKey(input.resolved.ref)) {
|
|
2015
|
+
return [
|
|
2016
|
+
diffEffectiveLink({ ...input, resolved: null }),
|
|
2017
|
+
diffEffectiveLink({ ...input, before: null })
|
|
2018
|
+
];
|
|
2019
|
+
}
|
|
2020
|
+
const change = diffEffectiveLink(input);
|
|
2021
|
+
return change ? [change] : [];
|
|
2022
|
+
}
|
|
1795
2023
|
function createLinkChange(resolved, commitId, committedAt) {
|
|
1796
2024
|
const after = {
|
|
1797
2025
|
...resolved,
|
|
@@ -1973,7 +2201,7 @@ function applyObjectEdit(input) {
|
|
|
1973
2201
|
next = applyObjectUpsert(input, input.operation);
|
|
1974
2202
|
break;
|
|
1975
2203
|
case "object.patch":
|
|
1976
|
-
next =
|
|
2204
|
+
next = applyObjectPatch(input, input.operation);
|
|
1977
2205
|
break;
|
|
1978
2206
|
case "object.delete":
|
|
1979
2207
|
next = applyObjectDelete(input);
|
|
@@ -1984,7 +2212,47 @@ function applyObjectEdit(input) {
|
|
|
1984
2212
|
default:
|
|
1985
2213
|
throw new MaterializationValidationError("Expected an object edit operation.");
|
|
1986
2214
|
}
|
|
1987
|
-
|
|
2215
|
+
const editedAt = applyObjectEditTimes(input, next);
|
|
2216
|
+
const authority = transition(current, next);
|
|
2217
|
+
return {
|
|
2218
|
+
...authority,
|
|
2219
|
+
editedAt,
|
|
2220
|
+
changed: authority.changed || !sameStringRecord(input.editedAt, editedAt)
|
|
2221
|
+
};
|
|
2222
|
+
}
|
|
2223
|
+
function applyObjectEditTimes(input, next) {
|
|
2224
|
+
if (!next || next.kind === "delete")
|
|
2225
|
+
return {};
|
|
2226
|
+
const editedAt = input.operation.kind === "object.create" || input.authority?.kind === "delete" ? {} : { ...input.editedAt };
|
|
2227
|
+
switch (input.operation.kind) {
|
|
2228
|
+
case "object.create":
|
|
2229
|
+
case "object.upsert": {
|
|
2230
|
+
const properties = input.normalizedProperties ?? input.operation.properties;
|
|
2231
|
+
for (const propertyId of Object.keys(properties))
|
|
2232
|
+
editedAt[propertyId] = input.committedAt;
|
|
2233
|
+
break;
|
|
2234
|
+
}
|
|
2235
|
+
case "object.patch":
|
|
2236
|
+
for (const propertyId of input.operation.reset)
|
|
2237
|
+
delete editedAt[propertyId];
|
|
2238
|
+
for (const propertyId of input.operation.unset)
|
|
2239
|
+
editedAt[propertyId] = input.committedAt;
|
|
2240
|
+
for (const propertyId of Object.keys(input.normalizedSet ?? input.operation.set)) {
|
|
2241
|
+
editedAt[propertyId] = input.committedAt;
|
|
2242
|
+
}
|
|
2243
|
+
break;
|
|
2244
|
+
case "object.delete":
|
|
2245
|
+
return editedAt;
|
|
2246
|
+
case "object.restore":
|
|
2247
|
+
break;
|
|
2248
|
+
}
|
|
2249
|
+
return editedAt;
|
|
2250
|
+
}
|
|
2251
|
+
function sameStringRecord(left, right) {
|
|
2252
|
+
const leftKeys = Object.keys(left);
|
|
2253
|
+
if (leftKeys.length !== Object.keys(right).length)
|
|
2254
|
+
return false;
|
|
2255
|
+
return leftKeys.every((key) => left[key] === right[key]);
|
|
1988
2256
|
}
|
|
1989
2257
|
function applyObjectCreate(input, operation) {
|
|
1990
2258
|
if (input.sourceProperties || input.authority) {
|
|
@@ -2015,7 +2283,7 @@ function mergeUpsertIntoPatch(current, properties, hasSource) {
|
|
|
2015
2283
|
delete created[propertyId];
|
|
2016
2284
|
return { kind: "create", properties: { ...created, ...properties } };
|
|
2017
2285
|
}
|
|
2018
|
-
function
|
|
2286
|
+
function applyObjectPatch(input, operation) {
|
|
2019
2287
|
const current = input.authority;
|
|
2020
2288
|
if (!input.effectiveExists && current?.kind !== "patch") {
|
|
2021
2289
|
throw new MaterializationValidationError(`Object patch requires an effective object for ${operation.ref.objectTypeId}:${operation.ref.primaryId}.`);
|
|
@@ -2141,10 +2409,12 @@ function applyObjectOperation(context, state, operation, identity, journal) {
|
|
|
2141
2409
|
operation,
|
|
2142
2410
|
sourceProperties: working.source?.assertion.properties ?? null,
|
|
2143
2411
|
authority: working.override,
|
|
2412
|
+
editedAt: working.editedAt,
|
|
2413
|
+
committedAt: identity.committedAt,
|
|
2144
2414
|
effectiveExists: currentEffective !== null,
|
|
2145
2415
|
...normalized
|
|
2146
2416
|
});
|
|
2147
|
-
applyObjectTransition(context, state, working, transition2.next, journal);
|
|
2417
|
+
applyObjectTransition(context, state, working, transition2.next, transition2.editedAt, journal);
|
|
2148
2418
|
return objectOperationOutcome(operation, working, transition2.changed, context, identity);
|
|
2149
2419
|
}
|
|
2150
2420
|
function requireWorkingObject(state, operation) {
|
|
@@ -2171,21 +2441,25 @@ function validateObjectOperation(context, operation) {
|
|
|
2171
2441
|
return {};
|
|
2172
2442
|
}
|
|
2173
2443
|
}
|
|
2174
|
-
function applyObjectTransition(context, state, working, next, journal) {
|
|
2444
|
+
function applyObjectTransition(context, state, working, next, nextEditedAt, journal) {
|
|
2175
2445
|
const previous = working.override;
|
|
2446
|
+
const previousEditedAt = working.editedAt;
|
|
2176
2447
|
working.override = next;
|
|
2448
|
+
working.editedAt = { ...nextEditedAt };
|
|
2177
2449
|
try {
|
|
2178
2450
|
const resolved = resolveObject(context.ontology, working);
|
|
2179
2451
|
if (resolved)
|
|
2180
2452
|
validateEffectiveObject(context.ontology, resolved.ref, resolved.properties);
|
|
2181
|
-
validateWorkingCardinality(
|
|
2453
|
+
validateWorkingCardinality(state.links.slots);
|
|
2182
2454
|
} catch (error) {
|
|
2183
2455
|
working.override = previous;
|
|
2456
|
+
working.editedAt = previousEditedAt;
|
|
2184
2457
|
throw error;
|
|
2185
2458
|
}
|
|
2186
2459
|
journal?.push({
|
|
2187
2460
|
restore: () => {
|
|
2188
2461
|
working.override = previous;
|
|
2462
|
+
working.editedAt = previousEditedAt;
|
|
2189
2463
|
}
|
|
2190
2464
|
});
|
|
2191
2465
|
}
|
|
@@ -2211,10 +2485,13 @@ function objectOperationOutcome(operation, working, changed, context, identity)
|
|
|
2211
2485
|
return { ...outcome, object };
|
|
2212
2486
|
}
|
|
2213
2487
|
function applyLinkOperation(context, state, operation, cardinality, journal) {
|
|
2214
|
-
const working = requireWorkingLink(state, operation);
|
|
2215
2488
|
validateLinkEndpoints(context, state, operation);
|
|
2216
2489
|
const normalizedProperties = validateLinkOperation(context, operation);
|
|
2217
|
-
|
|
2490
|
+
if (cardinality === "one") {
|
|
2491
|
+
return applyLinkSlotOperation(context, state, operation, normalizedProperties, journal);
|
|
2492
|
+
}
|
|
2493
|
+
const working = requireWorkingLinkEdge(state, operation);
|
|
2494
|
+
const currentEffective = resolveLinkEdge(context.ontology, working, state.objects);
|
|
2218
2495
|
const transitionInput = {
|
|
2219
2496
|
operation,
|
|
2220
2497
|
hasSource: working.source !== null,
|
|
@@ -2222,11 +2499,51 @@ function applyLinkOperation(context, state, operation, cardinality, journal) {
|
|
|
2222
2499
|
effectiveExists: currentEffective !== null
|
|
2223
2500
|
};
|
|
2224
2501
|
const transition2 = applyLinkEdit({ ...transitionInput, normalizedProperties });
|
|
2225
|
-
|
|
2502
|
+
applyLinkEdgeTransition(working, transition2.next, journal);
|
|
2226
2503
|
return { id: operation.id, ok: true, authority: authorityOutcome(transition2.changed) };
|
|
2227
2504
|
}
|
|
2228
|
-
function
|
|
2229
|
-
const
|
|
2505
|
+
function applyLinkSlotOperation(context, state, operation, normalizedProperties, journal) {
|
|
2506
|
+
const key = linkScopeKey(operation.ref.source, operation.ref.linkId);
|
|
2507
|
+
const working = state.links.slots.get(key);
|
|
2508
|
+
if (!working) {
|
|
2509
|
+
throw new MaterializationValidationError("Link slot state was not loaded.");
|
|
2510
|
+
}
|
|
2511
|
+
const current = resolveLinkSlot(context.ontology, working, state.objects);
|
|
2512
|
+
const previous = working.override;
|
|
2513
|
+
let next = previous;
|
|
2514
|
+
switch (operation.kind) {
|
|
2515
|
+
case "link.upsert":
|
|
2516
|
+
if (current && linkRefKey(current.ref) !== linkRefKey(operation.ref)) {
|
|
2517
|
+
throw new MaterializationValidationError(`Link scope '${operation.ref.source.objectTypeId}.${operation.ref.linkId}' has cardinality one.`);
|
|
2518
|
+
}
|
|
2519
|
+
next = {
|
|
2520
|
+
kind: "set",
|
|
2521
|
+
target: operation.ref.target,
|
|
2522
|
+
...normalizedProperties !== undefined ? { properties: normalizedProperties } : {}
|
|
2523
|
+
};
|
|
2524
|
+
break;
|
|
2525
|
+
case "link.delete":
|
|
2526
|
+
if (current && linkRefKey(current.ref) === linkRefKey(operation.ref)) {
|
|
2527
|
+
next = { kind: "clear", target: operation.ref.target };
|
|
2528
|
+
}
|
|
2529
|
+
break;
|
|
2530
|
+
case "link.reset":
|
|
2531
|
+
if (previous && objectRefKey(previous.target) === objectRefKey(operation.ref.target)) {
|
|
2532
|
+
next = null;
|
|
2533
|
+
}
|
|
2534
|
+
break;
|
|
2535
|
+
}
|
|
2536
|
+
const changed = stableJsonStringify(previous) !== stableJsonStringify(next);
|
|
2537
|
+
working.override = next;
|
|
2538
|
+
journal?.push({
|
|
2539
|
+
restore: () => {
|
|
2540
|
+
working.override = previous;
|
|
2541
|
+
}
|
|
2542
|
+
});
|
|
2543
|
+
return { id: operation.id, ok: true, authority: authorityOutcome(changed) };
|
|
2544
|
+
}
|
|
2545
|
+
function requireWorkingLinkEdge(state, operation) {
|
|
2546
|
+
const working = state.links.edges.get(linkRefKey(operation.ref));
|
|
2230
2547
|
if (!working)
|
|
2231
2548
|
throw new MaterializationValidationError("Link state was not loaded.");
|
|
2232
2549
|
return working;
|
|
@@ -2247,17 +2564,9 @@ function validateLinkOperation(context, operation) {
|
|
|
2247
2564
|
return;
|
|
2248
2565
|
return validateLinkAuthorityProperties(context.ontology, operation.ref, operation.properties);
|
|
2249
2566
|
}
|
|
2250
|
-
function
|
|
2567
|
+
function applyLinkEdgeTransition(working, next, journal) {
|
|
2251
2568
|
const previous = working.override;
|
|
2252
2569
|
working.override = next;
|
|
2253
|
-
try {
|
|
2254
|
-
if (cardinality === "one") {
|
|
2255
|
-
validateWorkingCardinality(context.ontology, state.objects, state.links, state.scopeSnapshots);
|
|
2256
|
-
}
|
|
2257
|
-
} catch (error) {
|
|
2258
|
-
working.override = previous;
|
|
2259
|
-
throw error;
|
|
2260
|
-
}
|
|
2261
2570
|
journal?.push({
|
|
2262
2571
|
restore: () => {
|
|
2263
2572
|
working.override = previous;
|
|
@@ -2286,24 +2595,57 @@ function isObjectOperation2(operation) {
|
|
|
2286
2595
|
|
|
2287
2596
|
// src/materializer/edits/plan.ts
|
|
2288
2597
|
async function stageEditPlan(context, storage, session, state, planContext) {
|
|
2289
|
-
validateWorkingCardinality(
|
|
2598
|
+
validateWorkingCardinality(state.links.slots);
|
|
2290
2599
|
const objectChanges = [];
|
|
2291
2600
|
for (const working of sortedObjects(state.objects)) {
|
|
2292
|
-
const change = await
|
|
2601
|
+
const change = await stageObject(context, storage, session, working, planContext);
|
|
2293
2602
|
if (change)
|
|
2294
2603
|
objectChanges.push(change);
|
|
2295
2604
|
}
|
|
2296
2605
|
const linkChanges = [];
|
|
2297
|
-
for (const working of
|
|
2298
|
-
const change = await
|
|
2606
|
+
for (const working of sortedLinkEdges(state.links.edges)) {
|
|
2607
|
+
const change = await stageLinkEdge(context, storage, session, state.objects, working, planContext);
|
|
2299
2608
|
if (change)
|
|
2300
2609
|
linkChanges.push(change);
|
|
2301
2610
|
}
|
|
2611
|
+
for (const working of sortedLinkSlots(state.links.slots)) {
|
|
2612
|
+
linkChanges.push(...await stageLinkSlot(context, storage, session, state.objects, working, planContext));
|
|
2613
|
+
}
|
|
2302
2614
|
return { objects: objectChanges, links: linkChanges };
|
|
2303
2615
|
}
|
|
2304
|
-
async function
|
|
2616
|
+
async function stageLinkSlot(context, storage, session, objects, working, planContext) {
|
|
2617
|
+
const overrideItems = [];
|
|
2618
|
+
appendLinkSlotOverrideWork(overrideItems, working, planContext.identity);
|
|
2619
|
+
const resolved = resolveLinkSlot(context.ontology, working, objects);
|
|
2620
|
+
const changes = diffEffectiveLinkSlot({
|
|
2621
|
+
before: working.before,
|
|
2622
|
+
resolved,
|
|
2623
|
+
commitId: planContext.identity.commitId,
|
|
2624
|
+
committedAt: planContext.identity.committedAt
|
|
2625
|
+
});
|
|
2626
|
+
const representative = resolved?.ref ?? working.before?.ref ?? (working.override ? {
|
|
2627
|
+
source: working.ref.source,
|
|
2628
|
+
linkId: working.ref.linkId,
|
|
2629
|
+
target: working.override.target
|
|
2630
|
+
} : null);
|
|
2631
|
+
const scopeSortKey = linkScopeSortKey(working.ref.source, working.ref.linkId);
|
|
2632
|
+
const work = overrideItems.map((item) => planWork(item, scopeSortKey));
|
|
2633
|
+
if (representative) {
|
|
2634
|
+
work.push(classificationWork("link", linkRefKey(representative), linkRefSortKey(representative)));
|
|
2635
|
+
}
|
|
2636
|
+
for (const change of changes) {
|
|
2637
|
+
const effectiveItems = [];
|
|
2638
|
+
appendEffectiveLinkWork(effectiveItems, change);
|
|
2639
|
+
const sortKey = linkRefSortKey(change.ref);
|
|
2640
|
+
work.push(...effectiveItems.map((item) => planWork(item, sortKey)));
|
|
2641
|
+
work.push(eventWork(buildLinkEvent(context, planContext, change)));
|
|
2642
|
+
}
|
|
2643
|
+
await stageWorkBounded(context, storage, session, work);
|
|
2644
|
+
return changes;
|
|
2645
|
+
}
|
|
2646
|
+
async function stageObject(context, storage, session, working, planContext) {
|
|
2305
2647
|
const items = [];
|
|
2306
|
-
|
|
2648
|
+
appendObjectOverrideWork(items, working, planContext.identity);
|
|
2307
2649
|
const resolved = resolveObject(context.ontology, working);
|
|
2308
2650
|
if (resolved)
|
|
2309
2651
|
validateEffectiveObject(context.ontology, resolved.ref, resolved.properties);
|
|
@@ -2314,7 +2656,7 @@ async function stageObjectPlan(context, storage, session, working, planContext)
|
|
|
2314
2656
|
committedAt: planContext.identity.committedAt
|
|
2315
2657
|
});
|
|
2316
2658
|
if (change)
|
|
2317
|
-
|
|
2659
|
+
appendEffectiveObjectWork(items, change);
|
|
2318
2660
|
const sortKey = objectRefSortKey(working.ref);
|
|
2319
2661
|
const work = [
|
|
2320
2662
|
classificationWork("object", objectRefKey(working.ref), sortKey),
|
|
@@ -2326,10 +2668,10 @@ async function stageObjectPlan(context, storage, session, working, planContext)
|
|
|
2326
2668
|
await stageWorkBounded(context, storage, session, work);
|
|
2327
2669
|
return change;
|
|
2328
2670
|
}
|
|
2329
|
-
async function
|
|
2671
|
+
async function stageLinkEdge(context, storage, session, objects, working, planContext) {
|
|
2330
2672
|
const items = [];
|
|
2331
|
-
|
|
2332
|
-
const resolved =
|
|
2673
|
+
appendLinkEdgeOverrideWork(items, working, planContext.identity);
|
|
2674
|
+
const resolved = resolveLinkEdge(context.ontology, working, objects);
|
|
2333
2675
|
const change = diffEffectiveLink({
|
|
2334
2676
|
before: working.before,
|
|
2335
2677
|
resolved,
|
|
@@ -2337,7 +2679,7 @@ async function stageLinkPlan(context, storage, session, objects, working, planCo
|
|
|
2337
2679
|
committedAt: planContext.identity.committedAt
|
|
2338
2680
|
});
|
|
2339
2681
|
if (change)
|
|
2340
|
-
|
|
2682
|
+
appendEffectiveLinkWork(items, change);
|
|
2341
2683
|
const sortKey = linkRefSortKey(working.ref);
|
|
2342
2684
|
const work = [
|
|
2343
2685
|
classificationWork("link", linkRefKey(working.ref), sortKey),
|
|
@@ -2362,7 +2704,8 @@ function materializationEventContext(context, planContext) {
|
|
|
2362
2704
|
projectId: context.projectId,
|
|
2363
2705
|
commitId: planContext.identity.commitId,
|
|
2364
2706
|
committedAt: planContext.identity.committedAt,
|
|
2365
|
-
origin: planContext.origin
|
|
2707
|
+
origin: planContext.origin,
|
|
2708
|
+
correlationId: planContext.correlationId
|
|
2366
2709
|
};
|
|
2367
2710
|
if (planContext.actor === undefined)
|
|
2368
2711
|
return base;
|
|
@@ -2371,20 +2714,20 @@ function materializationEventContext(context, planContext) {
|
|
|
2371
2714
|
function sortedObjects(objects) {
|
|
2372
2715
|
return [...objects.values()].sort((left, right) => compareObjectRefs(left.ref, right.ref));
|
|
2373
2716
|
}
|
|
2374
|
-
function
|
|
2375
|
-
return [...
|
|
2717
|
+
function sortedLinkEdges(edges) {
|
|
2718
|
+
return [...edges.values()].sort((left, right) => compareLinkRefs(left.ref, right.ref));
|
|
2719
|
+
}
|
|
2720
|
+
function sortedLinkSlots(slots) {
|
|
2721
|
+
return [...slots.values()].sort((left, right) => linkScopeKey(left.ref.source, left.ref.linkId).localeCompare(linkScopeKey(right.ref.source, right.ref.linkId)));
|
|
2376
2722
|
}
|
|
2377
2723
|
|
|
2378
2724
|
// src/materializer/edits/commit.ts
|
|
2379
2725
|
async function commitEdits(context, raw) {
|
|
2380
2726
|
const command = prepareEditCommit(context, raw);
|
|
2381
|
-
const replay = await replayEditCommit(context, command);
|
|
2382
|
-
if (replay)
|
|
2383
|
-
return replay;
|
|
2384
2727
|
return executeEditCommit(context, command);
|
|
2385
2728
|
}
|
|
2386
2729
|
function prepareEditCommit(context, raw) {
|
|
2387
|
-
const input = normalizeOntologyEditCommit(raw);
|
|
2730
|
+
const input = normalizeOntologyEditCommit(raw.input);
|
|
2388
2731
|
const idempotencyKey = editIdempotencyKey(input);
|
|
2389
2732
|
const identity = createTimedCommitIdentity({
|
|
2390
2733
|
projectId: context.projectId,
|
|
@@ -2392,7 +2735,12 @@ function prepareEditCommit(context, raw) {
|
|
|
2392
2735
|
normalizedCallerIntent: input,
|
|
2393
2736
|
now: context.clock()
|
|
2394
2737
|
});
|
|
2395
|
-
return {
|
|
2738
|
+
return {
|
|
2739
|
+
input,
|
|
2740
|
+
identity,
|
|
2741
|
+
origin: input.source,
|
|
2742
|
+
execution: prepareMaterializerExecution(context.projectId, raw.scope)
|
|
2743
|
+
};
|
|
2396
2744
|
}
|
|
2397
2745
|
function editIdempotencyKey(input) {
|
|
2398
2746
|
if (input.source.kind === "action") {
|
|
@@ -2400,20 +2748,40 @@ function editIdempotencyKey(input) {
|
|
|
2400
2748
|
}
|
|
2401
2749
|
return createRuntimeIdempotencyKey(input.source.requestId);
|
|
2402
2750
|
}
|
|
2403
|
-
async function lockActionRunForMaterialization(storage, projectId, input) {
|
|
2751
|
+
async function lockActionRunForMaterialization(storage, projectId, input, execution) {
|
|
2404
2752
|
if (input.source.kind !== "action")
|
|
2405
2753
|
return;
|
|
2406
2754
|
if (!storage.actionRuns) {
|
|
2407
2755
|
throw new MaterializationValidationError("Storage does not provide Action run capabilities required by this commit.");
|
|
2408
2756
|
}
|
|
2409
|
-
await storage.actionRuns.lockForMaterialization({
|
|
2757
|
+
const run = await storage.actionRuns.lockForMaterialization({
|
|
2410
2758
|
projectId,
|
|
2411
2759
|
actionId: input.source.actionId,
|
|
2412
2760
|
runId: input.source.runId
|
|
2413
2761
|
});
|
|
2762
|
+
assertMaterializerRunExecution(execution, run.executionId, `Action run '${run.id}'`);
|
|
2414
2763
|
}
|
|
2415
|
-
function
|
|
2416
|
-
|
|
2764
|
+
async function validateMutationExecution(storage, projectId, input, execution) {
|
|
2765
|
+
if (input.source.kind !== "action") {
|
|
2766
|
+
assertRuntimeMutationExecution(execution);
|
|
2767
|
+
return;
|
|
2768
|
+
}
|
|
2769
|
+
assertTrustedPrimitiveMutationExecution(execution, {
|
|
2770
|
+
kind: "action",
|
|
2771
|
+
id: input.source.actionId,
|
|
2772
|
+
runId: input.source.runId
|
|
2773
|
+
});
|
|
2774
|
+
if (!storage.actionRuns) {
|
|
2775
|
+
throw new MaterializationValidationError("Storage does not provide Action run capabilities required by this commit.");
|
|
2776
|
+
}
|
|
2777
|
+
const run = await storage.actionRuns.getById({ projectId, id: input.source.runId });
|
|
2778
|
+
if (!run) {
|
|
2779
|
+
throw new MaterializationValidationError(`Action run '${input.source.runId}' was not found.`);
|
|
2780
|
+
}
|
|
2781
|
+
if (run.actionId !== input.source.actionId) {
|
|
2782
|
+
throw new MaterializationConflictError("run-correlation", `Action run '${run.id}' does not belong to action '${input.source.actionId}'.`);
|
|
2783
|
+
}
|
|
2784
|
+
assertMaterializerRunExecution(execution, run.executionId, `Action run '${run.id}'`);
|
|
2417
2785
|
}
|
|
2418
2786
|
async function executeEditCommit(context, command) {
|
|
2419
2787
|
return withSerializationRetry(context, () => context.storage.transaction((storage) => executeEditTransaction(context, storage, command), {
|
|
@@ -2421,10 +2789,12 @@ async function executeEditCommit(context, command) {
|
|
|
2421
2789
|
}));
|
|
2422
2790
|
}
|
|
2423
2791
|
async function executeEditTransaction(context, storage, command) {
|
|
2424
|
-
await
|
|
2425
|
-
|
|
2792
|
+
await ensureMaterializerExecution(storage.executions, command.execution);
|
|
2793
|
+
await validateMutationExecution(storage, context.projectId, command.input, command.execution);
|
|
2794
|
+
const replay = await replayCommit(context, command.identity, command.execution.executionId, storage);
|
|
2426
2795
|
if (replay)
|
|
2427
2796
|
return replay;
|
|
2797
|
+
await lockActionRunForMaterialization(storage, context.projectId, command.input, command.execution);
|
|
2428
2798
|
const session = await beginEditMaterialization(context, storage, command);
|
|
2429
2799
|
const workingState = await loadEditWorkingState(context, storage.ontology.materializations, session, command.input.operations);
|
|
2430
2800
|
const outcomes = applyEditOperations(context, workingState, command);
|
|
@@ -2459,6 +2829,7 @@ function buildEditCommit(context, command) {
|
|
|
2459
2829
|
id: command.identity.commitId,
|
|
2460
2830
|
idempotencyKey: command.identity.idempotencyKey,
|
|
2461
2831
|
requestHash: command.identity.requestHash,
|
|
2832
|
+
executionId: command.execution.executionId,
|
|
2462
2833
|
origin: command.origin,
|
|
2463
2834
|
ontologyRevision: context.projectionRegistry.ontologyRevision,
|
|
2464
2835
|
intent: {
|
|
@@ -2468,9 +2839,9 @@ function buildEditCommit(context, command) {
|
|
|
2468
2839
|
},
|
|
2469
2840
|
committedAt: command.identity.committedAt
|
|
2470
2841
|
};
|
|
2471
|
-
if (command.
|
|
2842
|
+
if (command.execution.actor === undefined)
|
|
2472
2843
|
return commit;
|
|
2473
|
-
return { ...commit, actor: command.
|
|
2844
|
+
return { ...commit, actor: command.execution.actor };
|
|
2474
2845
|
}
|
|
2475
2846
|
function editExpectations(input) {
|
|
2476
2847
|
if (input.mode === "atomic") {
|
|
@@ -2539,10 +2910,14 @@ function isRecoverableEditValidation(input, error) {
|
|
|
2539
2910
|
return error instanceof MaterializationValidationError;
|
|
2540
2911
|
}
|
|
2541
2912
|
function editPlanContext(command) {
|
|
2542
|
-
const context = {
|
|
2543
|
-
|
|
2913
|
+
const context = {
|
|
2914
|
+
identity: command.identity,
|
|
2915
|
+
origin: command.origin,
|
|
2916
|
+
correlationId: command.execution.correlationId
|
|
2917
|
+
};
|
|
2918
|
+
if (command.execution.actor === undefined)
|
|
2544
2919
|
return context;
|
|
2545
|
-
return { ...context, actor: command.
|
|
2920
|
+
return { ...context, actor: command.execution.actor };
|
|
2546
2921
|
}
|
|
2547
2922
|
async function finalizeEditMaterialization(storage, session, result) {
|
|
2548
2923
|
const applied = await storage.ontology.materializations.finalize({
|
|
@@ -2611,11 +2986,11 @@ async function finishProjectionRun(context, raw) {
|
|
|
2611
2986
|
}));
|
|
2612
2987
|
}
|
|
2613
2988
|
function prepareProjectionRunFinish(context, raw) {
|
|
2614
|
-
assertValidTerminalDecision(raw);
|
|
2615
|
-
const source = normalizeProjectionSourceRef(raw.source);
|
|
2616
|
-
const datasetVersion = normalizePinnedDatasetVersion(raw.datasetVersion);
|
|
2617
|
-
const
|
|
2618
|
-
const resolved = raw.protocol === "replacement" ? context.projectionRegistry.resolveSource(source.projectionId) : context.projectionRegistry.resolveTelemetry(source.projectionId);
|
|
2989
|
+
assertValidTerminalDecision(raw.input);
|
|
2990
|
+
const source = normalizeProjectionSourceRef(raw.input.source);
|
|
2991
|
+
const datasetVersion = normalizePinnedDatasetVersion(raw.input.datasetVersion);
|
|
2992
|
+
const projectionExecution = normalizeProjectionExecution(raw.input.execution);
|
|
2993
|
+
const resolved = raw.input.protocol === "replacement" ? context.projectionRegistry.resolveSource(source.projectionId) : context.projectionRegistry.resolveTelemetry(source.projectionId);
|
|
2619
2994
|
if (resolved.datasetId !== datasetVersion.datasetId) {
|
|
2620
2995
|
throw new MaterializationValidationError(`Projection '${resolved.projectionId}' requires dataset '${resolved.datasetId}'.`);
|
|
2621
2996
|
}
|
|
@@ -2626,20 +3001,28 @@ function prepareProjectionRunFinish(context, raw) {
|
|
|
2626
3001
|
});
|
|
2627
3002
|
return {
|
|
2628
3003
|
projectId: context.projectId,
|
|
2629
|
-
input: { ...raw, source, datasetVersion, execution },
|
|
3004
|
+
input: { ...raw.input, source, datasetVersion, execution: projectionExecution },
|
|
2630
3005
|
identity,
|
|
2631
3006
|
resolved,
|
|
2632
|
-
finishedAt: context.clock()
|
|
3007
|
+
finishedAt: new Date(raw.input.finishedAt ?? context.clock()),
|
|
3008
|
+
execution: prepareMaterializerExecution(context.projectId, raw.scope)
|
|
2633
3009
|
};
|
|
2634
3010
|
}
|
|
2635
3011
|
async function finishProjectionRunTransaction(storage, command) {
|
|
2636
|
-
|
|
3012
|
+
await ensureMaterializerExecution(storage.executions, command.execution);
|
|
3013
|
+
assertTrustedPrimitiveMutationExecution(command.execution, {
|
|
3014
|
+
kind: "projection",
|
|
3015
|
+
id: command.input.source.projectionId,
|
|
3016
|
+
runId: command.input.execution.projectionRunId
|
|
3017
|
+
});
|
|
3018
|
+
const { projectionRuns, run } = await lockProjectionRunForMaterialization(storage, {
|
|
2637
3019
|
projectId: command.projectId,
|
|
2638
3020
|
projectionRunId: command.input.execution.projectionRunId,
|
|
2639
3021
|
executionToken: command.input.execution.executionToken,
|
|
2640
3022
|
identity: command.identity,
|
|
2641
3023
|
resolved: command.resolved
|
|
2642
3024
|
});
|
|
3025
|
+
assertMaterializerRunExecution(command.execution, run.executionId, `Projection run '${run.id}'`);
|
|
2643
3026
|
if (command.input.protocol === "replacement") {
|
|
2644
3027
|
await assertReplacementTerminalDecision(storage, command);
|
|
2645
3028
|
}
|
|
@@ -2674,7 +3057,7 @@ function terminalDecision(input) {
|
|
|
2674
3057
|
return {
|
|
2675
3058
|
protocol: input.protocol,
|
|
2676
3059
|
status: input.status,
|
|
2677
|
-
...input.
|
|
3060
|
+
...input.error === undefined ? {} : { error: input.error }
|
|
2678
3061
|
};
|
|
2679
3062
|
}
|
|
2680
3063
|
if (input.protocol === "telemetry") {
|
|
@@ -2703,7 +3086,7 @@ async function assertReplacementTerminalDecision(storage, command) {
|
|
|
2703
3086
|
}
|
|
2704
3087
|
function assertReplacementCommitCorrelation(commit, command) {
|
|
2705
3088
|
const { input, identity } = command;
|
|
2706
|
-
if (commit.origin.kind !== "projection" || commit.intent.kind !== "projection" || commit.result.kind !== "projection" || commit.origin.projectionRunId !== input.execution.projectionRunId || commit.origin.projectionId !== input.source.projectionId || commit.intent.source.projectionId !== input.source.projectionId || !datasetVersionsEqual(commit.intent.datasetVersion, input.datasetVersion) || commit.ontologyRevision !== identity.ontologyRevision || commit.projectionRevision !== identity.projectionRevision || commit.ownershipHash !== identity.ownershipHash) {
|
|
3089
|
+
if (commit.origin.kind !== "projection" || commit.executionId !== command.execution.executionId || commit.intent.kind !== "projection" || commit.result.kind !== "projection" || commit.origin.projectionRunId !== input.execution.projectionRunId || commit.origin.projectionId !== input.source.projectionId || commit.intent.source.projectionId !== input.source.projectionId || !datasetVersionsEqual(commit.intent.datasetVersion, input.datasetVersion) || commit.ontologyRevision !== identity.ontologyRevision || commit.projectionRevision !== identity.projectionRevision || commit.ownershipHash !== identity.ownershipHash) {
|
|
2707
3090
|
throw new MaterializationConflictError("run-correlation", `Projection replacement run '${input.execution.projectionRunId}' commit identity does not match.`);
|
|
2708
3091
|
}
|
|
2709
3092
|
}
|
|
@@ -2763,7 +3146,22 @@ function validateObjectAssertion(ontology, resolved, policy, assertion) {
|
|
|
2763
3146
|
continue;
|
|
2764
3147
|
throw new MaterializationValidationError(`Projection '${resolved.projectionId}' asserted unowned property '${assertion.ref.objectTypeId}.${propertyId}'.`);
|
|
2765
3148
|
}
|
|
2766
|
-
|
|
3149
|
+
const conflictResolution = resolved.definition.conflictResolution ?? { strategy: "editsWin" };
|
|
3150
|
+
if (conflictResolution.strategy !== "mostRecent") {
|
|
3151
|
+
return { kind: "object", ref: assertion.ref, properties };
|
|
3152
|
+
}
|
|
3153
|
+
if (assertion.sourceUpdatedAt === undefined) {
|
|
3154
|
+
throw new MaterializationValidationError(`Projection '${resolved.projectionId}' requires source update timestamp ` + `'${conflictResolution.sourceTimestamp}' on every object assertion.`);
|
|
3155
|
+
}
|
|
3156
|
+
const primaryPropertyId = ontology.getPrimaryPropertyId(assertion.ref.objectTypeId);
|
|
3157
|
+
const absentSourcePropertyIds = [...owned].filter((propertyId) => propertyId !== primaryPropertyId && !Object.hasOwn(properties, propertyId)).sort();
|
|
3158
|
+
return {
|
|
3159
|
+
kind: "object",
|
|
3160
|
+
ref: assertion.ref,
|
|
3161
|
+
properties,
|
|
3162
|
+
sourceUpdatedAt: assertion.sourceUpdatedAt,
|
|
3163
|
+
...absentSourcePropertyIds.length === 0 ? {} : { absentSourcePropertyIds }
|
|
3164
|
+
};
|
|
2767
3165
|
}
|
|
2768
3166
|
function validateLinkAssertion(ontology, resolved, policy, assertion) {
|
|
2769
3167
|
const ownershipKey = linkOwnershipKey(assertion.ref.source.objectTypeId, assertion.ref.linkId);
|
|
@@ -2853,7 +3251,7 @@ function planReplacementObject(context, input, state, counts) {
|
|
|
2853
3251
|
}
|
|
2854
3252
|
function appendObjectChangeWork(work, sortKey, context, input, change) {
|
|
2855
3253
|
const items = [];
|
|
2856
|
-
|
|
3254
|
+
appendEffectiveObjectWork(items, change);
|
|
2857
3255
|
for (const item of items)
|
|
2858
3256
|
work.push(planWork(item, sortKey));
|
|
2859
3257
|
work.push(eventWork(buildObjectMaterializationEventDraft({
|
|
@@ -2861,6 +3259,7 @@ function appendObjectChangeWork(work, sortKey, context, input, change) {
|
|
|
2861
3259
|
commitId: input.identity.commitId,
|
|
2862
3260
|
committedAt: input.identity.committedAt,
|
|
2863
3261
|
origin: input.origin,
|
|
3262
|
+
correlationId: input.correlationId,
|
|
2864
3263
|
change
|
|
2865
3264
|
})));
|
|
2866
3265
|
}
|
|
@@ -2923,7 +3322,7 @@ function planLinkPage(context, input, page, endpointExistence, counts) {
|
|
|
2923
3322
|
return work;
|
|
2924
3323
|
}
|
|
2925
3324
|
function planReplacementLink(context, input, state, endpointExistence, counts) {
|
|
2926
|
-
const resolved = resolveReplacementLink(state, endpointExistence);
|
|
3325
|
+
const resolved = resolveReplacementLink(context, state, endpointExistence);
|
|
2927
3326
|
const work = cardinalityWork(context, state, resolved !== null);
|
|
2928
3327
|
if (!state.diffRequired)
|
|
2929
3328
|
return work;
|
|
@@ -2943,9 +3342,18 @@ function planReplacementLink(context, input, state, endpointExistence, counts) {
|
|
|
2943
3342
|
appendLinkChangeWork(work, sortKey, context, input, change);
|
|
2944
3343
|
return work;
|
|
2945
3344
|
}
|
|
2946
|
-
function resolveReplacementLink(state, endpointExistence) {
|
|
3345
|
+
function resolveReplacementLink(context, state, endpointExistence) {
|
|
2947
3346
|
if (!state.diffRequired)
|
|
2948
3347
|
return state.effective;
|
|
3348
|
+
const definition = context.ontology.resolveObjectType(state.ref.source.objectTypeId).links.find((candidate) => candidate.id === state.ref.linkId);
|
|
3349
|
+
if (definition?.cardinality === "one") {
|
|
3350
|
+
return resolveEffectiveLinkSlotMember({
|
|
3351
|
+
ref: state.ref,
|
|
3352
|
+
source: state.candidateSource,
|
|
3353
|
+
override: usableLinkSlotOverride(state.slotOverride),
|
|
3354
|
+
endpointExists: (ref) => endpointExistence.get(objectRefKey(ref)) ?? false
|
|
3355
|
+
});
|
|
3356
|
+
}
|
|
2949
3357
|
return resolveEffectiveLink({
|
|
2950
3358
|
ref: state.ref,
|
|
2951
3359
|
source: state.candidateSource,
|
|
@@ -2963,7 +3371,17 @@ function cardinalityWork(context, state, occupied) {
|
|
|
2963
3371
|
return [
|
|
2964
3372
|
{
|
|
2965
3373
|
kind: "cardinality",
|
|
2966
|
-
recordKey: `cardinality:${scopeSortKey}:${linkSortKey}`,
|
|
3374
|
+
recordKey: `cardinality:candidate:${scopeSortKey}:${linkSortKey}`,
|
|
3375
|
+
view: "candidate",
|
|
3376
|
+
scopeSortKey,
|
|
3377
|
+
linkSortKey,
|
|
3378
|
+
ref: state.ref,
|
|
3379
|
+
occupied: state.candidateSource !== null
|
|
3380
|
+
},
|
|
3381
|
+
{
|
|
3382
|
+
kind: "cardinality",
|
|
3383
|
+
recordKey: `cardinality:effective:${scopeSortKey}:${linkSortKey}`,
|
|
3384
|
+
view: "effective",
|
|
2967
3385
|
scopeSortKey,
|
|
2968
3386
|
linkSortKey,
|
|
2969
3387
|
ref: state.ref,
|
|
@@ -2973,7 +3391,7 @@ function cardinalityWork(context, state, occupied) {
|
|
|
2973
3391
|
}
|
|
2974
3392
|
function appendLinkChangeWork(work, sortKey, context, input, change) {
|
|
2975
3393
|
const items = [];
|
|
2976
|
-
|
|
3394
|
+
appendEffectiveLinkWork(items, change);
|
|
2977
3395
|
for (const item of items)
|
|
2978
3396
|
work.push(planWork(item, sortKey));
|
|
2979
3397
|
work.push(eventWork(buildLinkMaterializationEventDraft({
|
|
@@ -2981,6 +3399,7 @@ function appendLinkChangeWork(work, sortKey, context, input, change) {
|
|
|
2981
3399
|
commitId: input.identity.commitId,
|
|
2982
3400
|
committedAt: input.identity.committedAt,
|
|
2983
3401
|
origin: input.origin,
|
|
3402
|
+
correlationId: input.correlationId,
|
|
2984
3403
|
change
|
|
2985
3404
|
})));
|
|
2986
3405
|
}
|
|
@@ -2990,6 +3409,7 @@ function resolveReplacementObject(context, state) {
|
|
|
2990
3409
|
primaryPropertyId: context.ontology.getPrimaryPropertyId(state.ref.objectTypeId),
|
|
2991
3410
|
source: state.candidateSource,
|
|
2992
3411
|
override: state.override?.value ?? null,
|
|
3412
|
+
editedAt: storedObjectEditedAt(state.override),
|
|
2993
3413
|
latestTelemetry: state.latestTelemetry
|
|
2994
3414
|
});
|
|
2995
3415
|
}
|
|
@@ -3080,10 +3500,7 @@ async function stageProjectionMaterialization(context, input) {
|
|
|
3080
3500
|
// src/materializer/projections/replace.ts
|
|
3081
3501
|
async function replaceProjection(context, raw) {
|
|
3082
3502
|
const command = prepareProjectionReplacement(context, raw);
|
|
3083
|
-
await
|
|
3084
|
-
capabilityErrorMessage: "Storage does not provide projection run capabilities required by source replacement."
|
|
3085
|
-
});
|
|
3086
|
-
const replay = await replayProjectionCommit(context, command);
|
|
3503
|
+
const replay = await admitProjectionExecution(context, command);
|
|
3087
3504
|
if (replay)
|
|
3088
3505
|
return replay;
|
|
3089
3506
|
const candidate = await prepareProjectionCandidate(context, command);
|
|
@@ -3096,9 +3513,9 @@ async function replaceProjection(context, raw) {
|
|
|
3096
3513
|
}
|
|
3097
3514
|
}
|
|
3098
3515
|
function prepareProjectionReplacement(context, raw) {
|
|
3099
|
-
const source = normalizeProjectionSourceRef(raw.source);
|
|
3100
|
-
const datasetVersion = normalizePinnedDatasetVersion(raw.datasetVersion);
|
|
3101
|
-
const execution = normalizeProjectionExecution(raw.execution);
|
|
3516
|
+
const source = normalizeProjectionSourceRef(raw.input.source);
|
|
3517
|
+
const datasetVersion = normalizePinnedDatasetVersion(raw.input.datasetVersion);
|
|
3518
|
+
const execution = normalizeProjectionExecution(raw.input.execution);
|
|
3102
3519
|
const resolved = context.projectionRegistry.resolveSource(source.projectionId);
|
|
3103
3520
|
validateProjectionDataset(resolved, datasetVersion);
|
|
3104
3521
|
const projectionKind = sourceProjectionKind(resolved);
|
|
@@ -3116,15 +3533,16 @@ function prepareProjectionReplacement(context, raw) {
|
|
|
3116
3533
|
source,
|
|
3117
3534
|
datasetVersion,
|
|
3118
3535
|
execution,
|
|
3119
|
-
entries: raw.entries,
|
|
3536
|
+
entries: raw.input.entries,
|
|
3120
3537
|
resolved,
|
|
3121
3538
|
projectionKind,
|
|
3122
3539
|
runIdentity,
|
|
3123
|
-
identity
|
|
3540
|
+
identity,
|
|
3541
|
+
scopeExecution: prepareMaterializerExecution(context.projectId, raw.scope)
|
|
3124
3542
|
};
|
|
3125
|
-
if (raw.signal === undefined)
|
|
3543
|
+
if (raw.input.signal === undefined)
|
|
3126
3544
|
return command;
|
|
3127
|
-
return { ...command, signal: raw.signal };
|
|
3545
|
+
return { ...command, signal: raw.input.signal };
|
|
3128
3546
|
}
|
|
3129
3547
|
function validateProjectionDataset(resolved, datasetVersion) {
|
|
3130
3548
|
if (datasetVersion.datasetId === resolved.datasetId)
|
|
@@ -3137,7 +3555,12 @@ function sourceProjectionKind(resolved) {
|
|
|
3137
3555
|
return "link";
|
|
3138
3556
|
}
|
|
3139
3557
|
async function assertProjectionExecution(storage, projectId, command, options = {}) {
|
|
3140
|
-
|
|
3558
|
+
assertTrustedPrimitiveMutationExecution(command.scopeExecution, {
|
|
3559
|
+
kind: "projection",
|
|
3560
|
+
id: command.source.projectionId,
|
|
3561
|
+
runId: command.execution.projectionRunId
|
|
3562
|
+
});
|
|
3563
|
+
const locked = await lockProjectionRunForMaterialization(storage, {
|
|
3141
3564
|
projectId,
|
|
3142
3565
|
projectionRunId: command.execution.projectionRunId,
|
|
3143
3566
|
executionToken: command.execution.executionToken,
|
|
@@ -3145,14 +3568,15 @@ async function assertProjectionExecution(storage, projectId, command, options =
|
|
|
3145
3568
|
resolved: command.resolved,
|
|
3146
3569
|
...options
|
|
3147
3570
|
});
|
|
3571
|
+
assertMaterializerRunExecution(command.scopeExecution, locked.run.executionId, `Projection run '${locked.run.id}'`);
|
|
3148
3572
|
}
|
|
3149
|
-
async function
|
|
3150
|
-
const existing = await replayCommitRecord(context, command.identity);
|
|
3151
|
-
if (!existing)
|
|
3152
|
-
return null;
|
|
3573
|
+
async function admitProjectionExecution(context, command) {
|
|
3153
3574
|
return withSerializationRetry(context, () => context.storage.transaction(async (storage) => {
|
|
3154
|
-
await
|
|
3155
|
-
|
|
3575
|
+
await ensureMaterializerExecution(storage.executions, command.scopeExecution);
|
|
3576
|
+
await assertProjectionExecution(storage, context.projectId, command, {
|
|
3577
|
+
capabilityErrorMessage: "Storage does not provide projection run capabilities required by source replacement."
|
|
3578
|
+
});
|
|
3579
|
+
const commit = await replayCommitRecord(context, command.identity, command.scopeExecution.executionId, storage);
|
|
3156
3580
|
return commit ? projectionReplayResult(commit, command) : null;
|
|
3157
3581
|
}, { isolation: "serializable" }));
|
|
3158
3582
|
}
|
|
@@ -3214,8 +3638,9 @@ async function commitProjectionCandidate(context, command, ready) {
|
|
|
3214
3638
|
return withSerializationRetry(context, () => context.storage.transaction((storage) => executeProjectionTransaction(context, storage, command, ready), { isolation: "serializable" }));
|
|
3215
3639
|
}
|
|
3216
3640
|
async function executeProjectionTransaction(context, storage, command, ready) {
|
|
3641
|
+
await ensureMaterializerExecution(storage.executions, command.scopeExecution);
|
|
3217
3642
|
await assertProjectionExecution(storage, context.projectId, command);
|
|
3218
|
-
const replay = await replayCommitRecord(context, command.identity, storage);
|
|
3643
|
+
const replay = await replayCommitRecord(context, command.identity, command.scopeExecution.executionId, storage);
|
|
3219
3644
|
if (replay)
|
|
3220
3645
|
return projectionReplayResult(replay, command);
|
|
3221
3646
|
const origin = projectionOrigin(command);
|
|
@@ -3269,6 +3694,7 @@ function projectionCommit(projectId, command, identity, origin) {
|
|
|
3269
3694
|
id: identity.commitId,
|
|
3270
3695
|
idempotencyKey: identity.idempotencyKey,
|
|
3271
3696
|
requestHash: identity.requestHash,
|
|
3697
|
+
executionId: command.scopeExecution.executionId,
|
|
3272
3698
|
origin,
|
|
3273
3699
|
ontologyRevision: command.runIdentity.ontologyRevision,
|
|
3274
3700
|
projectionRevision: command.runIdentity.projectionRevision,
|
|
@@ -3283,7 +3709,8 @@ async function planReadyProjection(context, storage, session, command, ready, or
|
|
|
3283
3709
|
materializationId: ready.materializationId,
|
|
3284
3710
|
projectionKind: command.projectionKind,
|
|
3285
3711
|
identity: ready.identity,
|
|
3286
|
-
origin
|
|
3712
|
+
origin,
|
|
3713
|
+
correlationId: command.scopeExecution.correlationId
|
|
3287
3714
|
};
|
|
3288
3715
|
if (command.signal === undefined) {
|
|
3289
3716
|
return planProjectionReplacement(context, storage, session, input);
|
|
@@ -3326,7 +3753,7 @@ function shouldAbandonCandidate(error) {
|
|
|
3326
3753
|
return true;
|
|
3327
3754
|
if (error instanceof MaterializationCancellationError)
|
|
3328
3755
|
return true;
|
|
3329
|
-
return error instanceof MaterializationConflictError && error.kind === "run-correlation";
|
|
3756
|
+
return error instanceof MaterializationConflictError && (error.kind === "run-correlation" || error.kind === "idempotency");
|
|
3330
3757
|
}
|
|
3331
3758
|
function validateProjectionWatermark(active, next) {
|
|
3332
3759
|
if (!active)
|
|
@@ -3335,9 +3762,9 @@ function validateProjectionWatermark(active, next) {
|
|
|
3335
3762
|
}
|
|
3336
3763
|
|
|
3337
3764
|
// src/materializer/telemetry/plan.ts
|
|
3338
|
-
async function planTelemetryAppend(context, storage, session, input, identity, origin) {
|
|
3765
|
+
async function planTelemetryAppend(context, storage, session, input, identity, origin, event) {
|
|
3339
3766
|
const counts = emptyTelemetryCounts();
|
|
3340
|
-
const planContext = { input, identity, origin };
|
|
3767
|
+
const planContext = { input, identity, origin, event };
|
|
3341
3768
|
const objects = await loadTelemetryObjects(context, storage, session, input.points);
|
|
3342
3769
|
const existingPoints = await loadExistingPoints(context, storage, session, input.points);
|
|
3343
3770
|
for (const group of telemetryObjectGroups(input.points)) {
|
|
@@ -3505,7 +3932,7 @@ async function stageTelemetryObjectPlan(context, storage, session, planContext,
|
|
|
3505
3932
|
if (change) {
|
|
3506
3933
|
counts.latestObjectsChanged += 1;
|
|
3507
3934
|
const items = [];
|
|
3508
|
-
|
|
3935
|
+
appendEffectiveObjectWork(items, change);
|
|
3509
3936
|
work.push(...items.map((item) => planWork(item, sortKey)));
|
|
3510
3937
|
const eventContext = telemetryEventContext(context, planContext);
|
|
3511
3938
|
work.push(eventWork(buildObjectMaterializationEventDraft({ ...eventContext, change })));
|
|
@@ -3517,11 +3944,12 @@ function telemetryEventContext(context, planContext) {
|
|
|
3517
3944
|
projectId: context.projectId,
|
|
3518
3945
|
commitId: planContext.identity.commitId,
|
|
3519
3946
|
committedAt: planContext.identity.committedAt,
|
|
3520
|
-
origin: planContext.origin
|
|
3947
|
+
origin: planContext.origin,
|
|
3948
|
+
correlationId: planContext.event.correlationId
|
|
3521
3949
|
};
|
|
3522
|
-
if (planContext.
|
|
3950
|
+
if (planContext.event.actor === undefined)
|
|
3523
3951
|
return eventContext;
|
|
3524
|
-
return { ...eventContext, actor: planContext.
|
|
3952
|
+
return { ...eventContext, actor: planContext.event.actor };
|
|
3525
3953
|
}
|
|
3526
3954
|
function emptyTelemetryCounts() {
|
|
3527
3955
|
return {
|
|
@@ -3535,26 +3963,28 @@ function emptyTelemetryCounts() {
|
|
|
3535
3963
|
// src/materializer/telemetry/append.ts
|
|
3536
3964
|
async function appendTelemetry(context, raw) {
|
|
3537
3965
|
const command = prepareTelemetryAppend(context, raw);
|
|
3538
|
-
if (command.kind === "runtime") {
|
|
3539
|
-
const replay = await replayCommit(context, command.identity);
|
|
3540
|
-
if (replay)
|
|
3541
|
-
return replay;
|
|
3542
|
-
}
|
|
3543
3966
|
return executeTelemetryCommit(context, command);
|
|
3544
3967
|
}
|
|
3545
3968
|
function prepareTelemetryAppend(context, raw) {
|
|
3546
|
-
const rawInputPointCount = raw.points.length;
|
|
3969
|
+
const rawInputPointCount = raw.input.points.length;
|
|
3547
3970
|
const input = normalizeTelemetryAppend({
|
|
3548
|
-
...raw,
|
|
3549
|
-
points: raw.points.map((point) => validateTelemetryPoint(context.ontology, point))
|
|
3971
|
+
...raw.input,
|
|
3972
|
+
points: raw.input.points.map((point) => validateTelemetryPoint(context.ontology, point))
|
|
3550
3973
|
});
|
|
3551
3974
|
const inputPointCount = telemetryInputPointCount(input, rawInputPointCount);
|
|
3552
3975
|
validateTelemetryBatch(input, inputPointCount);
|
|
3553
3976
|
const ontologyRevision = context.projectionRegistry.ontologyRevision;
|
|
3977
|
+
const execution = prepareMaterializerExecution(context.projectId, raw.scope);
|
|
3554
3978
|
if (input.source.kind === "runtime") {
|
|
3555
|
-
return
|
|
3979
|
+
return {
|
|
3980
|
+
...prepareRuntimeTelemetry(context, input, input.source, inputPointCount, ontologyRevision),
|
|
3981
|
+
execution
|
|
3982
|
+
};
|
|
3556
3983
|
}
|
|
3557
|
-
return
|
|
3984
|
+
return {
|
|
3985
|
+
...prepareProjectionTelemetry(context, input, input.source, inputPointCount, ontologyRevision),
|
|
3986
|
+
execution
|
|
3987
|
+
};
|
|
3558
3988
|
}
|
|
3559
3989
|
function telemetryInputPointCount(input, rawInputPointCount) {
|
|
3560
3990
|
if (input.source.kind === "projection")
|
|
@@ -3634,13 +4064,18 @@ function projectionTelemetryCallerIntent(input, source, inputPointCount) {
|
|
|
3634
4064
|
inputPointCount,
|
|
3635
4065
|
points: input.points
|
|
3636
4066
|
};
|
|
3637
|
-
|
|
3638
|
-
return intent;
|
|
3639
|
-
return { ...intent, actor: input.actor };
|
|
4067
|
+
return intent;
|
|
3640
4068
|
}
|
|
3641
4069
|
async function assertTelemetryExecution(storage, projectId, command) {
|
|
3642
|
-
if (command.kind === "runtime")
|
|
4070
|
+
if (command.kind === "runtime") {
|
|
4071
|
+
assertRuntimeMutationExecution(command.execution);
|
|
3643
4072
|
return null;
|
|
4073
|
+
}
|
|
4074
|
+
assertTrustedPrimitiveMutationExecution(command.execution, {
|
|
4075
|
+
kind: "projection",
|
|
4076
|
+
id: command.source.projection.projectionId,
|
|
4077
|
+
runId: command.source.execution.projectionRunId
|
|
4078
|
+
});
|
|
3644
4079
|
const execution = await lockProjectionRunForMaterialization(storage, {
|
|
3645
4080
|
projectId,
|
|
3646
4081
|
projectionRunId: command.source.execution.projectionRunId,
|
|
@@ -3649,6 +4084,7 @@ async function assertTelemetryExecution(storage, projectId, command) {
|
|
|
3649
4084
|
resolved: command.resolvedProjection,
|
|
3650
4085
|
capabilityErrorMessage: "Storage does not provide projection run capabilities required by telemetry projection."
|
|
3651
4086
|
});
|
|
4087
|
+
assertMaterializerRunExecution(command.execution, execution.run.executionId, `Projection run '${execution.run.id}'`);
|
|
3652
4088
|
assertTelemetryBatchPosition(execution.run, command.source.batchOrdinal, command.source.sourceRowCount, command.source.inputExhausted);
|
|
3653
4089
|
return execution;
|
|
3654
4090
|
}
|
|
@@ -3686,8 +4122,9 @@ async function executeTelemetryCommit(context, command) {
|
|
|
3686
4122
|
return withSerializationRetry(context, () => context.storage.transaction((storage) => executeTelemetryTransaction(context, storage, command), { isolation: "serializable" }));
|
|
3687
4123
|
}
|
|
3688
4124
|
async function executeTelemetryTransaction(context, storage, command) {
|
|
4125
|
+
await ensureMaterializerExecution(storage.executions, command.execution);
|
|
3689
4126
|
const execution = await assertTelemetryExecution(storage, context.projectId, command);
|
|
3690
|
-
const replay = await replayCommitRecord(context, command.identity, storage);
|
|
4127
|
+
const replay = await replayCommitRecord(context, command.identity, command.execution.executionId, storage);
|
|
3691
4128
|
if (replay) {
|
|
3692
4129
|
if (command.kind === "projection" && execution) {
|
|
3693
4130
|
assertTelemetryReplayCheckpoint(execution.run, command.source.batchOrdinal);
|
|
@@ -3702,7 +4139,10 @@ async function executeTelemetryTransaction(context, storage, command) {
|
|
|
3702
4139
|
}
|
|
3703
4140
|
const origin = telemetryOrigin(command);
|
|
3704
4141
|
const session = await beginTelemetryMaterialization(context, storage, command, origin);
|
|
3705
|
-
const counts = await planTelemetryAppend(context, storage.ontology.materializations, session, command.input, command.identity, origin
|
|
4142
|
+
const counts = await planTelemetryAppend(context, storage.ontology.materializations, session, command.input, command.identity, origin, {
|
|
4143
|
+
correlationId: command.execution.correlationId,
|
|
4144
|
+
...command.execution.actor === undefined ? {} : { actor: command.execution.actor }
|
|
4145
|
+
});
|
|
3706
4146
|
await drainStagedWork(context, storage.ontology.materializations, session);
|
|
3707
4147
|
const eventCount = await drainStagedEvents(context, storage.ontology.materializations, session, command.identity);
|
|
3708
4148
|
const result = {
|
|
@@ -3749,6 +4189,7 @@ function telemetryCommit(projectId, command, origin) {
|
|
|
3749
4189
|
id: command.identity.commitId,
|
|
3750
4190
|
idempotencyKey: command.identity.idempotencyKey,
|
|
3751
4191
|
requestHash: command.identity.requestHash,
|
|
4192
|
+
executionId: command.execution.executionId,
|
|
3752
4193
|
origin,
|
|
3753
4194
|
ontologyRevision: command.ontologyRevision,
|
|
3754
4195
|
intent: telemetryCommitIntent(command),
|
|
@@ -3764,9 +4205,9 @@ function telemetryCommit(projectId, command, origin) {
|
|
|
3764
4205
|
};
|
|
3765
4206
|
}
|
|
3766
4207
|
function telemetryCommitActor(commit, command) {
|
|
3767
|
-
if (command.
|
|
4208
|
+
if (command.execution.actor === undefined)
|
|
3768
4209
|
return commit;
|
|
3769
|
-
return { ...commit, actor: command.
|
|
4210
|
+
return { ...commit, actor: command.execution.actor };
|
|
3770
4211
|
}
|
|
3771
4212
|
function telemetryCommitIntent(command) {
|
|
3772
4213
|
if (command.kind === "runtime") {
|
|
@@ -3817,12 +4258,30 @@ async function finalizeTelemetryMaterialization(storage, session, command, resul
|
|
|
3817
4258
|
|
|
3818
4259
|
// src/materializer/materializer.ts
|
|
3819
4260
|
class OntologyMaterializer {
|
|
3820
|
-
edits = {
|
|
4261
|
+
edits = {
|
|
4262
|
+
commit: (command) => commitEdits(this.context, command)
|
|
4263
|
+
};
|
|
3821
4264
|
projections = {
|
|
3822
|
-
replace: (
|
|
3823
|
-
finishRun: (
|
|
4265
|
+
replace: (command) => replaceProjection(this.context, command),
|
|
4266
|
+
finishRun: (command) => finishProjectionRun(this.context, command)
|
|
3824
4267
|
};
|
|
3825
|
-
telemetry = {
|
|
4268
|
+
telemetry = {
|
|
4269
|
+
append: (command) => appendTelemetry(this.context, command)
|
|
4270
|
+
};
|
|
4271
|
+
withScope(scope) {
|
|
4272
|
+
return Object.freeze({
|
|
4273
|
+
edits: Object.freeze({
|
|
4274
|
+
commit: (input) => this.edits.commit({ scope, input })
|
|
4275
|
+
}),
|
|
4276
|
+
projections: Object.freeze({
|
|
4277
|
+
replace: (input) => this.projections.replace({ scope, input }),
|
|
4278
|
+
finishRun: (input) => this.projections.finishRun({ scope, input })
|
|
4279
|
+
}),
|
|
4280
|
+
telemetry: Object.freeze({
|
|
4281
|
+
append: (input) => this.telemetry.append({ scope, input })
|
|
4282
|
+
})
|
|
4283
|
+
});
|
|
4284
|
+
}
|
|
3826
4285
|
context;
|
|
3827
4286
|
constructor(projectId, ontology, projectionRegistry, storage, dependencies = {}) {
|
|
3828
4287
|
this.context = createMaterializerContext({
|
|
@@ -3839,4 +4298,4 @@ function createOntologyMaterializer(input) {
|
|
|
3839
4298
|
}
|
|
3840
4299
|
export { computeOntologyRevision, computeProjectionRevision, computeProjectionOwnershipHash, ProjectionRegistry, createActionIdempotencyKey, createRuntimeIdempotencyKey, createProjectionIdempotencyKey, createRuntimeTelemetryIdempotencyKey, createProjectionTelemetryIdempotencyKey, createCommitIdentity, timestampCommitIdentity, createTimedCommitIdentity, createProjectionMaterializationId, createLinkScopeFingerprint, normalizeJsonProperties, normalizeOntologyEditCommit, normalizeProjectionExecution, normalizeProjectionSourceEntry, normalizeTelemetryAppend, OntologyMaterializer, createOntologyMaterializer };
|
|
3841
4300
|
|
|
3842
|
-
//# debugId=
|
|
4301
|
+
//# debugId=E68F145E5D3DE1BE64756E2164756E21
|