@sixb/core 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -23
- package/dist/actions/commit-edits.d.ts +0 -2
- package/dist/actions/commit-edits.d.ts.map +1 -1
- package/dist/actions/execution.d.ts +21 -0
- package/dist/actions/execution.d.ts.map +1 -0
- package/dist/actions/index.d.ts +1 -1
- package/dist/actions/index.d.ts.map +1 -1
- package/dist/actions/index.js +34 -23
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/registry.d.ts +16 -7
- package/dist/actions/registry.d.ts.map +1 -1
- package/dist/actions/request.d.ts +3 -2
- package/dist/actions/request.d.ts.map +1 -1
- package/dist/actions/run-dispatch.d.ts +21 -0
- package/dist/actions/run-dispatch.d.ts.map +1 -0
- package/dist/actions/types/context.d.ts +2 -2
- package/dist/actions/types/context.d.ts.map +1 -1
- package/dist/actions/validation.d.ts +1 -1
- package/dist/actions/validation.d.ts.map +1 -1
- package/dist/actions/worker.js +4 -4
- package/dist/actions/worker.js.map +1 -1
- package/dist/agents/adapters.d.ts +10 -0
- package/dist/agents/adapters.d.ts.map +1 -1
- package/dist/agents/authority.d.ts +31 -0
- package/dist/agents/authority.d.ts.map +1 -0
- package/dist/agents/builders.d.ts +8 -1
- package/dist/agents/builders.d.ts.map +1 -1
- package/dist/agents/context.js +2 -2
- package/dist/agents/dispatch.d.ts.map +1 -1
- package/dist/agents/errors.d.ts +16 -1
- package/dist/agents/errors.d.ts.map +1 -1
- package/dist/agents/execution.d.ts +45 -0
- package/dist/agents/execution.d.ts.map +1 -0
- package/dist/agents/index.d.ts +10 -10
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +81 -14
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/prompt.d.ts.map +1 -1
- package/dist/agents/request.d.ts +6 -2
- package/dist/agents/request.d.ts.map +1 -1
- package/dist/agents/streams.d.ts +29 -3
- package/dist/agents/streams.d.ts.map +1 -1
- package/dist/agents/streams.js +22 -3
- package/dist/agents/streams.js.map +1 -1
- package/dist/agents/tool-definition.d.ts +9 -0
- package/dist/agents/tool-definition.d.ts.map +1 -0
- package/dist/agents/types.d.ts +64 -0
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/agents/validation.d.ts +16 -3
- package/dist/agents/validation.d.ts.map +1 -1
- package/dist/auth/attribution.d.ts +17 -0
- package/dist/auth/attribution.d.ts.map +1 -0
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +9 -5
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/runtime.d.ts +4 -4
- package/dist/auth/runtime.d.ts.map +1 -1
- package/dist/authorization/decision.d.ts +24 -11
- package/dist/authorization/decision.d.ts.map +1 -1
- package/dist/authorization/grant-kinds.d.ts +2 -1
- package/dist/authorization/grant-kinds.d.ts.map +1 -1
- package/dist/authorization/index.d.ts +1 -1
- package/dist/authorization/index.d.ts.map +1 -1
- package/dist/authorization/index.js +8 -4
- package/dist/authorization/index.js.map +1 -1
- package/dist/blob-storage/browser.js +3 -2
- package/dist/blob-storage/browser.js.map +1 -1
- package/dist/blob-storage/execution.d.ts +16 -0
- package/dist/blob-storage/execution.d.ts.map +1 -0
- package/dist/blob-storage/index.js +4 -3
- package/dist/blob-storage/index.js.map +1 -1
- package/dist/blob-storage/validation.d.ts.map +1 -1
- package/dist/bootstrap/discovery.d.ts +90 -24
- package/dist/bootstrap/discovery.d.ts.map +1 -1
- package/dist/bootstrap/index.d.ts +2 -1
- package/dist/bootstrap/index.d.ts.map +1 -1
- package/dist/bootstrap/index.js +59 -59
- package/dist/bootstrap/index.js.map +1 -1
- package/dist/broker/in-memory.d.ts.map +1 -1
- package/dist/broker/index.js +2 -2
- package/dist/broker/types.d.ts +5 -0
- package/dist/broker/types.d.ts.map +1 -1
- package/dist/chunk-0172wgm9.js +333 -0
- package/dist/chunk-0172wgm9.js.map +11 -0
- package/dist/chunk-0k4avqr2.js +317 -0
- package/dist/chunk-0k4avqr2.js.map +11 -0
- package/dist/chunk-0mbx247x.js +2922 -0
- package/dist/chunk-0mbx247x.js.map +43 -0
- package/dist/chunk-34bqh420.js +1168 -0
- package/dist/chunk-34bqh420.js.map +23 -0
- package/dist/{chunk-mx84y05q.js → chunk-3j7573mj.js} +2 -2
- package/dist/{chunk-mx84y05q.js.map → chunk-3j7573mj.js.map} +2 -2
- package/dist/{chunk-45tw90k7.js → chunk-4gz41why.js} +1 -1
- package/dist/chunk-4x43bkbp.js +55 -0
- package/dist/chunk-4x43bkbp.js.map +11 -0
- package/dist/{chunk-xqbtf4wn.js → chunk-57r1cpxx.js} +3 -2
- package/dist/{chunk-xqbtf4wn.js.map → chunk-57r1cpxx.js.map} +3 -3
- package/dist/chunk-57zpb99z.js +194 -0
- package/dist/chunk-57zpb99z.js.map +10 -0
- package/dist/{chunk-dhmj53mx.js → chunk-5egfka8j.js} +13 -33
- package/dist/chunk-5egfka8j.js.map +15 -0
- package/dist/chunk-5gd7tpv6.js +28 -0
- package/dist/chunk-5gd7tpv6.js.map +11 -0
- package/dist/{chunk-867jxh7c.js → chunk-5sz8ta9r.js} +6 -295
- package/dist/chunk-5sz8ta9r.js.map +16 -0
- package/dist/chunk-62c7t4jc.js +27 -0
- package/dist/chunk-62c7t4jc.js.map +11 -0
- package/dist/{chunk-8r8cw2xw.js → chunk-63te770v.js} +40 -5
- package/dist/{chunk-8r8cw2xw.js.map → chunk-63te770v.js.map} +3 -3
- package/dist/chunk-663csy96.js +34 -0
- package/dist/chunk-663csy96.js.map +10 -0
- package/dist/{chunk-xz5g49bp.js → chunk-6gjqgd3d.js} +3 -1
- package/dist/chunk-6gjqgd3d.js.map +11 -0
- package/dist/chunk-7pc8b818.js +128 -0
- package/dist/chunk-7pc8b818.js.map +13 -0
- package/dist/{chunk-f2b5e2gf.js → chunk-85j5ybfj.js} +18 -3
- package/dist/{chunk-f2b5e2gf.js.map → chunk-85j5ybfj.js.map} +3 -3
- package/dist/{chunk-vj723r3p.js → chunk-8b55ygje.js} +1 -1
- package/dist/chunk-8m5ejdpn.js +33 -0
- package/dist/chunk-8m5ejdpn.js.map +10 -0
- package/dist/chunk-8ryen3p3.js +118 -0
- package/dist/chunk-8ryen3p3.js.map +10 -0
- package/dist/chunk-979ww6b3.js +298 -0
- package/dist/chunk-979ww6b3.js.map +12 -0
- package/dist/{chunk-ya6brh8a.js → chunk-9t8f5xfx.js} +10 -5
- package/dist/chunk-9t8f5xfx.js.map +11 -0
- package/dist/{chunk-r65yscvk.js → chunk-a31h57d5.js} +131 -13
- package/dist/chunk-a31h57d5.js.map +13 -0
- package/dist/chunk-bct7hmfc.js +402 -0
- package/dist/chunk-bct7hmfc.js.map +14 -0
- package/dist/chunk-bh6k3nc6.js +164 -0
- package/dist/chunk-bh6k3nc6.js.map +12 -0
- package/dist/{chunk-t72dvahb.js → chunk-bhxaq2nn.js} +61 -44
- package/dist/chunk-bhxaq2nn.js.map +12 -0
- package/dist/{chunk-jdwx7vzs.js → chunk-c6qd89g5.js} +240 -143
- package/dist/chunk-c6qd89g5.js.map +15 -0
- package/dist/{chunk-2s6sydsh.js → chunk-ckxfnx7f.js} +294 -4
- package/dist/chunk-ckxfnx7f.js.map +13 -0
- package/dist/chunk-cy0n5dms.js +27 -0
- package/dist/chunk-cy0n5dms.js.map +11 -0
- package/dist/chunk-dsrkgtnh.js +50 -0
- package/dist/chunk-dsrkgtnh.js.map +10 -0
- package/dist/{chunk-50kv63vj.js → chunk-dysw7nsm.js} +118 -26
- package/dist/chunk-dysw7nsm.js.map +14 -0
- package/dist/chunk-ezake7g1.js +32 -0
- package/dist/chunk-ezake7g1.js.map +11 -0
- package/dist/{chunk-yxss87qa.js → chunk-f2rt4vkh.js} +48 -29
- package/dist/chunk-f2rt4vkh.js.map +14 -0
- package/dist/{chunk-q4qzq0ea.js → chunk-fmx1sz2h.js} +117 -56
- package/dist/chunk-fmx1sz2h.js.map +15 -0
- package/dist/chunk-g9t3kdtx.js +90 -0
- package/dist/chunk-g9t3kdtx.js.map +10 -0
- package/dist/{chunk-c3zd880g.js → chunk-ghteq96b.js} +8 -8
- package/dist/{chunk-c3zd880g.js.map → chunk-ghteq96b.js.map} +4 -4
- package/dist/chunk-h9kxd41f.js +271 -0
- package/dist/chunk-h9kxd41f.js.map +11 -0
- package/dist/chunk-htq0qh7z.js +59 -0
- package/dist/chunk-htq0qh7z.js.map +11 -0
- package/dist/{chunk-dcgrzj1t.js → chunk-jaj13078.js} +121 -9
- package/dist/chunk-jaj13078.js.map +38 -0
- package/dist/{chunk-t358gywy.js → chunk-k9pts48t.js} +81 -58
- package/dist/chunk-k9pts48t.js.map +35 -0
- package/dist/chunk-n8herkry.js +3294 -0
- package/dist/chunk-n8herkry.js.map +35 -0
- package/dist/chunk-nf4r78r4.js +44 -0
- package/dist/chunk-nf4r78r4.js.map +10 -0
- package/dist/{chunk-2gpr6jsz.js → chunk-nnyp53zt.js} +14 -34
- package/dist/chunk-nnyp53zt.js.map +13 -0
- package/dist/chunk-nten49ta.js +404 -0
- package/dist/chunk-nten49ta.js.map +12 -0
- package/dist/chunk-qvybnnpe.js +137 -0
- package/dist/chunk-qvybnnpe.js.map +10 -0
- package/dist/{chunk-tsk2bxs3.js → chunk-rnshztfq.js} +13 -13
- package/dist/{chunk-tsk2bxs3.js.map → chunk-rnshztfq.js.map} +3 -3
- package/dist/chunk-sa4340y1.js +607 -0
- package/dist/chunk-sa4340y1.js.map +14 -0
- package/dist/{chunk-yvef9xwc.js → chunk-st4xgxey.js} +583 -251
- package/dist/chunk-st4xgxey.js.map +45 -0
- package/dist/{chunk-1vffvydj.js → chunk-t8t39h7v.js} +6 -6
- package/dist/chunk-t8t39h7v.js.map +10 -0
- package/dist/chunk-t9xghkva.js +28 -0
- package/dist/chunk-t9xghkva.js.map +10 -0
- package/dist/chunk-vp1vc6ee.js +35 -0
- package/dist/chunk-vp1vc6ee.js.map +11 -0
- package/dist/{chunk-p6r5g77m.js → chunk-vybf6pkp.js} +1 -1
- package/dist/{chunk-wj01s5hr.js → chunk-wtmzkcht.js} +4 -3
- package/dist/chunk-wtmzkcht.js.map +11 -0
- package/dist/{chunk-v5c085yp.js → chunk-xhy826cz.js} +3 -2
- package/dist/chunk-xhy826cz.js.map +10 -0
- package/dist/chunk-xkthy56g.js +33 -0
- package/dist/chunk-xkthy56g.js.map +11 -0
- package/dist/{chunk-aebzcsxr.js → chunk-ys1nse2v.js} +2178 -382
- package/dist/chunk-ys1nse2v.js.map +56 -0
- package/dist/{chunk-5yny9z0e.js → chunk-z3zp0bj1.js} +1 -1
- package/dist/chunk-zcnhxkvd.js +7 -0
- package/dist/chunk-zcnhxkvd.js.map +10 -0
- package/dist/chunk-zg9yryhz.js +252 -0
- package/dist/chunk-zg9yryhz.js.map +12 -0
- package/dist/chunk-zqqz8052.js +3 -0
- package/dist/{storage/projection-runs/lifecycle.js.map → chunk-zqqz8052.js.map} +1 -1
- package/dist/{chunk-4pycxcj3.js → chunk-zqysyfjt.js} +6 -9
- package/dist/{chunk-4pycxcj3.js.map → chunk-zqysyfjt.js.map} +3 -3
- package/dist/connectors/builders.d.ts +2 -1
- package/dist/connectors/builders.d.ts.map +1 -1
- package/dist/connectors/connections/authorizations.d.ts +64 -0
- package/dist/connectors/connections/authorizations.d.ts.map +1 -0
- package/dist/connectors/connections/capability.d.ts +7 -0
- package/dist/connectors/connections/capability.d.ts.map +1 -0
- package/dist/connectors/connections/command-context.d.ts +23 -0
- package/dist/connectors/connections/command-context.d.ts.map +1 -0
- package/dist/connectors/connections/contracts.d.ts +127 -0
- package/dist/connectors/connections/contracts.d.ts.map +1 -0
- package/dist/connectors/connections/credential-codec.d.ts +15 -0
- package/dist/connectors/connections/credential-codec.d.ts.map +1 -0
- package/dist/connectors/connections/credential-mutations.d.ts +63 -0
- package/dist/connectors/connections/credential-mutations.d.ts.map +1 -0
- package/dist/connectors/connections/execution.d.ts +20 -0
- package/dist/connectors/connections/execution.d.ts.map +1 -0
- package/dist/connectors/connections/internal.d.ts +5 -0
- package/dist/connectors/connections/internal.d.ts.map +1 -0
- package/dist/connectors/connections/internal.js +16 -0
- package/dist/connectors/connections/internal.js.map +9 -0
- package/dist/connectors/connections/provider-operation.d.ts +7 -0
- package/dist/connectors/connections/provider-operation.d.ts.map +1 -0
- package/dist/connectors/connections/request.d.ts +84 -0
- package/dist/connectors/connections/request.d.ts.map +1 -0
- package/dist/connectors/connections/runs.d.ts +51 -0
- package/dist/connectors/connections/runs.d.ts.map +1 -0
- package/dist/connectors/connections/service.d.ts +52 -0
- package/dist/connectors/connections/service.d.ts.map +1 -0
- package/dist/connectors/connections/storage-boundary.d.ts +3 -0
- package/dist/connectors/connections/storage-boundary.d.ts.map +1 -0
- package/dist/connectors/connections/tokens.d.ts +32 -0
- package/dist/connectors/connections/tokens.d.ts.map +1 -0
- package/dist/connectors/connections/validation.d.ts +27 -0
- package/dist/connectors/connections/validation.d.ts.map +1 -0
- package/dist/connectors/connections/views.d.ts +7 -0
- package/dist/connectors/connections/views.d.ts.map +1 -0
- package/dist/connectors/credentials.d.ts +25 -0
- package/dist/connectors/credentials.d.ts.map +1 -0
- package/dist/connectors/errors.d.ts +35 -3
- package/dist/connectors/errors.d.ts.map +1 -1
- package/dist/connectors/execution.d.ts +19 -0
- package/dist/connectors/execution.d.ts.map +1 -0
- package/dist/connectors/index.d.ts +5 -3
- package/dist/connectors/index.d.ts.map +1 -1
- package/dist/connectors/service.d.ts +23 -0
- package/dist/connectors/service.d.ts.map +1 -0
- package/dist/connectors/types.d.ts +94 -2
- package/dist/connectors/types.d.ts.map +1 -1
- package/dist/datasets/builders.d.ts +18 -5
- package/dist/datasets/builders.d.ts.map +1 -1
- package/dist/datasets/changes.d.ts +18 -0
- package/dist/datasets/changes.d.ts.map +1 -0
- package/dist/datasets/execution.d.ts +8 -0
- package/dist/datasets/execution.d.ts.map +1 -0
- package/dist/datasets/index.d.ts +3 -1
- package/dist/datasets/index.d.ts.map +1 -1
- package/dist/datasets/types.d.ts +2 -0
- package/dist/datasets/types.d.ts.map +1 -1
- package/dist/datasets/validation.d.ts.map +1 -1
- package/dist/error-reporting/capability.d.ts +4 -49
- package/dist/error-reporting/capability.d.ts.map +1 -1
- package/dist/error-reporting/internal.d.ts +2 -2
- package/dist/error-reporting/internal.d.ts.map +1 -1
- package/dist/error-reporting/internal.js +10 -4
- package/dist/error-reporting/internal.js.map +1 -1
- package/dist/error-reporting/reporter.d.ts +4 -1
- package/dist/error-reporting/reporter.d.ts.map +1 -1
- package/dist/error-reporting/reports.d.ts +64 -0
- package/dist/error-reporting/reports.d.ts.map +1 -0
- package/dist/error-reporting/types.d.ts +88 -34
- package/dist/error-reporting/types.d.ts.map +1 -1
- package/dist/errors/catalog.d.ts +141 -0
- package/dist/errors/catalog.d.ts.map +1 -0
- package/dist/errors/internal.d.ts +68 -0
- package/dist/errors/internal.d.ts.map +1 -0
- package/dist/errors/internal.js +29 -0
- package/dist/errors/internal.js.map +9 -0
- package/dist/errors/types.d.ts +20 -0
- package/dist/errors/types.d.ts.map +1 -0
- package/dist/events/definitions.d.ts +0 -1
- package/dist/events/definitions.d.ts.map +1 -1
- package/dist/events/execution.d.ts +13 -0
- package/dist/events/execution.d.ts.map +1 -0
- package/dist/events/index.d.ts +3 -2
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +10 -8
- package/dist/events/index.js.map +1 -1
- package/dist/events/outbox-dispatcher.d.ts +4 -2
- package/dist/events/outbox-dispatcher.d.ts.map +1 -1
- package/dist/events/{runtime.d.ts → service.d.ts} +13 -14
- package/dist/events/service.d.ts.map +1 -0
- package/dist/events/types/pipelines.d.ts +4 -1
- package/dist/events/types/pipelines.d.ts.map +1 -1
- package/dist/events/types/syncs.d.ts +3 -0
- package/dist/events/types/syncs.d.ts.map +1 -1
- package/dist/events/types/workflows.d.ts +4 -2
- package/dist/events/types/workflows.d.ts.map +1 -1
- package/dist/execution/agent.d.ts +42 -0
- package/dist/execution/agent.d.ts.map +1 -0
- package/dist/execution/agent.js +70 -0
- package/dist/execution/agent.js.map +9 -0
- package/dist/execution/authorization.d.ts +60 -0
- package/dist/execution/authorization.d.ts.map +1 -0
- package/dist/execution/dispatch.d.ts +8 -0
- package/dist/execution/dispatch.d.ts.map +1 -0
- package/dist/execution/durable.d.ts +37 -0
- package/dist/execution/durable.d.ts.map +1 -0
- package/dist/execution/index.d.ts +2 -0
- package/dist/execution/index.d.ts.map +1 -0
- package/dist/execution/primitive.d.ts +21 -0
- package/dist/execution/primitive.d.ts.map +1 -0
- package/dist/execution/primitive.js +88 -0
- package/dist/execution/primitive.js.map +10 -0
- package/dist/execution/request.d.ts +38 -0
- package/dist/execution/request.d.ts.map +1 -0
- package/dist/execution/request.js +97 -0
- package/dist/execution/request.js.map +10 -0
- package/dist/execution/scopes.d.ts +30 -0
- package/dist/execution/scopes.d.ts.map +1 -0
- package/dist/execution/types.d.ts +111 -0
- package/dist/execution/types.d.ts.map +1 -0
- package/dist/http/api-routes.d.ts.map +1 -1
- package/dist/http/index.js +1 -1
- package/dist/index.d.ts +35 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +142 -111
- package/dist/index.js.map +1 -1
- package/dist/json.d.ts +8 -2
- package/dist/json.d.ts.map +1 -1
- package/dist/lake-storage/definition-updates.d.ts.map +1 -1
- package/dist/lake-storage/in-memory.d.ts +15 -1
- package/dist/lake-storage/in-memory.d.ts.map +1 -1
- package/dist/lake-storage/index.d.ts +3 -1
- package/dist/lake-storage/index.d.ts.map +1 -1
- package/dist/lake-storage/index.js +15 -7
- package/dist/lake-storage/index.js.map +1 -1
- package/dist/lake-storage/merge-validation.d.ts +10 -0
- package/dist/lake-storage/merge-validation.d.ts.map +1 -0
- package/dist/lake-storage/merge.d.ts +32 -0
- package/dist/lake-storage/merge.d.ts.map +1 -0
- package/dist/lake-storage/types.d.ts +3 -1
- package/dist/lake-storage/types.d.ts.map +1 -1
- package/dist/logging/execution.d.ts +9 -0
- package/dist/logging/execution.d.ts.map +1 -0
- package/dist/logging/index.d.ts +1 -1
- package/dist/logging/index.d.ts.map +1 -1
- package/dist/logging/index.js +8 -8
- package/dist/logging/index.js.map +1 -1
- package/dist/logging/{runtime.d.ts → service.d.ts} +7 -7
- package/dist/logging/{runtime.d.ts.map → service.d.ts.map} +1 -1
- package/dist/logging/types.js +2 -2
- package/dist/materialization/events.d.ts +1 -0
- package/dist/materialization/events.d.ts.map +1 -1
- package/dist/materialization/index.d.ts +1 -1
- package/dist/materialization/index.d.ts.map +1 -1
- package/dist/materialization/index.js +2 -2
- package/dist/materialization/model.d.ts +26 -17
- package/dist/materialization/model.d.ts.map +1 -1
- package/dist/materializer/edits/commit.d.ts +2 -1
- package/dist/materializer/edits/commit.d.ts.map +1 -1
- package/dist/materializer/edits/load-state.d.ts +1 -1
- package/dist/materializer/edits/load-state.d.ts.map +1 -1
- package/dist/materializer/edits/operations.d.ts +1 -13
- package/dist/materializer/edits/operations.d.ts.map +1 -1
- package/dist/materializer/edits/plan.d.ts +2 -1
- package/dist/materializer/edits/plan.d.ts.map +1 -1
- package/dist/materializer/edits/working-state.d.ts +36 -8
- package/dist/materializer/edits/working-state.d.ts.map +1 -1
- package/dist/materializer/effective/build-events.d.ts +1 -0
- package/dist/materializer/effective/build-events.d.ts.map +1 -1
- package/dist/materializer/effective/diff.d.ts +7 -0
- package/dist/materializer/effective/diff.d.ts.map +1 -1
- package/dist/materializer/effective/load-state.d.ts +0 -2
- package/dist/materializer/effective/load-state.d.ts.map +1 -1
- package/dist/materializer/effective/resolve.d.ts +17 -2
- package/dist/materializer/effective/resolve.d.ts.map +1 -1
- package/dist/materializer/execution/commit-lifecycle.d.ts +2 -2
- package/dist/materializer/execution/commit-lifecycle.d.ts.map +1 -1
- package/dist/materializer/execution/plan-stream.d.ts.map +1 -1
- package/dist/materializer/execution/scope.d.ts +26 -0
- package/dist/materializer/execution/scope.d.ts.map +1 -0
- package/dist/materializer/execution/work-executor.d.ts.map +1 -1
- package/dist/materializer/execution/work-records.d.ts +6 -5
- package/dist/materializer/execution/work-records.d.ts.map +1 -1
- package/dist/materializer/index.d.ts +2 -2
- package/dist/materializer/index.d.ts.map +1 -1
- package/dist/materializer/index.js +30 -18
- package/dist/materializer/index.js.map +1 -1
- package/dist/materializer/materializer.d.ts +37 -5
- package/dist/materializer/materializer.d.ts.map +1 -1
- package/dist/materializer/projections/finish-run.d.ts +2 -1
- package/dist/materializer/projections/finish-run.d.ts.map +1 -1
- package/dist/materializer/projections/replace.d.ts +2 -1
- package/dist/materializer/projections/replace.d.ts.map +1 -1
- package/dist/materializer/projections/replacement-plan.d.ts +1 -0
- package/dist/materializer/projections/replacement-plan.d.ts.map +1 -1
- package/dist/materializer/shared/batching.d.ts.map +1 -1
- package/dist/materializer/shared/normalize.d.ts.map +1 -1
- package/dist/materializer/telemetry/append.d.ts +2 -1
- package/dist/materializer/telemetry/append.d.ts.map +1 -1
- package/dist/materializer/telemetry/plan.d.ts +7 -1
- package/dist/materializer/telemetry/plan.d.ts.map +1 -1
- package/dist/objects/action/request.d.ts +3 -3
- package/dist/objects/action/request.d.ts.map +1 -1
- package/dist/objects/context/index.d.ts +1 -1
- package/dist/objects/context/index.d.ts.map +1 -1
- package/dist/objects/context/types.d.ts +5 -0
- package/dist/objects/context/types.d.ts.map +1 -1
- package/dist/objects/execution.d.ts +100 -0
- package/dist/objects/execution.d.ts.map +1 -0
- package/dist/objects/index.js +37 -24
- package/dist/objects/index.js.map +1 -1
- package/dist/objects/materializer-adapter.d.ts +1 -1
- package/dist/objects/materializer-adapter.d.ts.map +1 -1
- package/dist/objects/query/executor.d.ts +3 -8
- package/dist/objects/query/executor.d.ts.map +1 -1
- package/dist/objects/query/index.d.ts +2 -2
- package/dist/objects/query/index.d.ts.map +1 -1
- package/dist/objects/query/index.js +9 -13
- package/dist/objects/query/index.js.map +1 -1
- package/dist/objects/query/planner.d.ts +0 -3
- package/dist/objects/query/planner.d.ts.map +1 -1
- package/dist/objects/sdk/object-handle.d.ts +2 -2
- package/dist/objects/sdk/object-handle.d.ts.map +1 -1
- package/dist/objects/sdk/object-set.d.ts +2 -0
- package/dist/objects/sdk/object-set.d.ts.map +1 -1
- package/dist/objects/sdk/runtime-query-executor.d.ts +2 -0
- package/dist/objects/sdk/runtime-query-executor.d.ts.map +1 -1
- package/dist/objects/sdk/telemetry-channel.d.ts.map +1 -1
- package/dist/objects/service/action-service.d.ts +3 -2
- package/dist/objects/service/action-service.d.ts.map +1 -1
- package/dist/objects/service/list-service.d.ts +1 -1
- package/dist/objects/telemetry/history.d.ts +2 -0
- package/dist/objects/telemetry/history.d.ts.map +1 -1
- package/dist/objects/telemetry/write-batch.d.ts.map +1 -1
- package/dist/ontology/index.d.ts +1 -1
- package/dist/ontology/index.d.ts.map +1 -1
- package/dist/ontology/index.js +5 -5
- package/dist/ontology/internal.js +7 -6
- package/dist/ontology/internal.js.map +3 -3
- package/dist/ontology/registry.d.ts +15 -2
- package/dist/ontology/registry.d.ts.map +1 -1
- package/dist/ontology/validation/normalize.d.ts.map +1 -1
- package/dist/pipelines/execution.d.ts +19 -0
- package/dist/pipelines/execution.d.ts.map +1 -0
- package/dist/pipelines/index.d.ts +1 -0
- package/dist/pipelines/index.d.ts.map +1 -1
- package/dist/pipelines/index.js +66 -0
- package/dist/pipelines/index.js.map +9 -0
- package/dist/pipelines/request.d.ts +6 -9
- package/dist/pipelines/request.d.ts.map +1 -1
- package/dist/pipelines/run-dispatch.d.ts +47 -0
- package/dist/pipelines/run-dispatch.d.ts.map +1 -0
- package/dist/projections/builders.d.ts +0 -2
- package/dist/projections/builders.d.ts.map +1 -1
- package/dist/projections/capability.d.ts +7 -0
- package/dist/projections/capability.d.ts.map +1 -0
- package/dist/projections/execution.d.ts +19 -0
- package/dist/projections/execution.d.ts.map +1 -0
- package/dist/projections/index.d.ts +3 -1
- package/dist/projections/index.d.ts.map +1 -1
- package/dist/projections/internal.d.ts +4 -10
- package/dist/projections/internal.d.ts.map +1 -1
- package/dist/projections/internal.js +42 -6
- package/dist/projections/internal.js.map +1 -1
- package/dist/projections/ownership.d.ts +2 -2
- package/dist/projections/ownership.d.ts.map +1 -1
- package/dist/projections/registry.d.ts +21 -11
- package/dist/projections/registry.d.ts.map +1 -1
- package/dist/projections/revision.d.ts +2 -2
- package/dist/projections/revision.d.ts.map +1 -1
- package/dist/projections/run-dispatch.d.ts +37 -0
- package/dist/projections/run-dispatch.d.ts.map +1 -0
- package/dist/projections/run-id.d.ts +3 -0
- package/dist/projections/run-id.d.ts.map +1 -0
- package/dist/projections/types.d.ts +3 -0
- package/dist/projections/types.d.ts.map +1 -1
- package/dist/projections/validation.d.ts +2 -2
- package/dist/projections/validation.d.ts.map +1 -1
- package/dist/queues/in-memory.d.ts +11 -10
- package/dist/queues/in-memory.d.ts.map +1 -1
- package/dist/queues/index.d.ts +1 -1
- package/dist/queues/index.d.ts.map +1 -1
- package/dist/queues/index.js +1 -1
- package/dist/queues/types.d.ts +52 -42
- package/dist/queues/types.d.ts.map +1 -1
- package/dist/rules/execution.d.ts +14 -0
- package/dist/rules/execution.d.ts.map +1 -0
- package/dist/rules/index.d.ts +1 -1
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/validation.d.ts +1 -2
- package/dist/rules/validation.d.ts.map +1 -1
- package/dist/runtime/ai-usage.d.ts +8 -0
- package/dist/runtime/ai-usage.d.ts.map +1 -0
- package/dist/runtime/create.d.ts +7 -5
- package/dist/runtime/create.d.ts.map +1 -1
- package/dist/runtime/definitions.d.ts +35 -0
- package/dist/runtime/definitions.d.ts.map +1 -0
- package/dist/runtime/host.d.ts +123 -0
- package/dist/runtime/host.d.ts.map +1 -0
- package/dist/runtime/index.d.ts +6 -5
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/internal.d.ts +4 -0
- package/dist/runtime/internal.d.ts.map +1 -1
- package/dist/runtime/internal.js +6 -2
- package/dist/runtime/internal.js.map +1 -1
- package/dist/runtime/ontology-mutations.d.ts +4 -2
- package/dist/runtime/ontology-mutations.d.ts.map +1 -1
- package/dist/runtime/resolve-definitions.d.ts +42 -0
- package/dist/runtime/resolve-definitions.d.ts.map +1 -0
- package/dist/runtime/sixb.d.ts +43 -219
- package/dist/runtime/sixb.d.ts.map +1 -1
- package/dist/runtime/types.d.ts +16 -216
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/scheduler/index.d.ts +1 -1
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +3 -6
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/runtime.d.ts +7 -2
- package/dist/scheduler/runtime.d.ts.map +1 -1
- package/dist/schedules/execution.d.ts +6 -0
- package/dist/schedules/execution.d.ts.map +1 -0
- package/dist/schedules/index.js +9 -7
- package/dist/schedules/index.js.map +1 -1
- package/dist/schedules/types.d.ts +1 -3
- package/dist/schedules/types.d.ts.map +1 -1
- package/dist/security/every.d.ts +4 -1
- package/dist/security/every.d.ts.map +1 -1
- package/dist/security/grants.d.ts +4 -1
- package/dist/security/grants.d.ts.map +1 -1
- package/dist/security/index.d.ts +3 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/registry.d.ts +42 -0
- package/dist/security/registry.d.ts.map +1 -0
- package/dist/security/types.d.ts +7 -12
- package/dist/security/types.d.ts.map +1 -1
- package/dist/security/validation.d.ts +2 -0
- package/dist/security/validation.d.ts.map +1 -1
- package/dist/storage/action-runs/failure.d.ts +7 -0
- package/dist/storage/action-runs/failure.d.ts.map +1 -0
- package/dist/storage/action-runs/failure.js +14 -0
- package/dist/storage/action-runs/failure.js.map +9 -0
- package/dist/storage/action-runs/idempotency.d.ts.map +1 -1
- package/dist/storage/action-runs/in-memory.d.ts +3 -1
- package/dist/storage/action-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/action-runs/index.d.ts +2 -1
- package/dist/storage/action-runs/index.d.ts.map +1 -1
- package/dist/storage/action-runs/provider.d.ts +10 -0
- package/dist/storage/action-runs/provider.d.ts.map +1 -0
- package/dist/storage/action-runs/provider.js +13 -0
- package/dist/storage/action-runs/provider.js.map +9 -0
- package/dist/storage/action-runs/types.d.ts +37 -18
- package/dist/storage/action-runs/types.d.ts.map +1 -1
- package/dist/storage/agents/errors.d.ts +1 -1
- package/dist/storage/agents/errors.d.ts.map +1 -1
- package/dist/storage/agents/in-memory.d.ts +4 -1
- package/dist/storage/agents/in-memory.d.ts.map +1 -1
- package/dist/storage/agents/index.d.ts +2 -2
- package/dist/storage/agents/index.d.ts.map +1 -1
- package/dist/storage/agents/provider.d.ts +10 -0
- package/dist/storage/agents/provider.d.ts.map +1 -0
- package/dist/storage/agents/provider.js +17 -0
- package/dist/storage/agents/provider.js.map +9 -0
- package/dist/storage/agents/types.d.ts +13 -22
- package/dist/storage/agents/types.d.ts.map +1 -1
- package/dist/storage/ai-usage/errors.d.ts +8 -0
- package/dist/storage/ai-usage/errors.d.ts.map +1 -0
- package/dist/storage/ai-usage/in-memory.d.ts +28 -0
- package/dist/storage/ai-usage/in-memory.d.ts.map +1 -0
- package/dist/storage/ai-usage/index.d.ts +8 -0
- package/dist/storage/ai-usage/index.d.ts.map +1 -0
- package/dist/storage/ai-usage/record.d.ts +6 -0
- package/dist/storage/ai-usage/record.d.ts.map +1 -0
- package/dist/storage/ai-usage/types.d.ts +89 -0
- package/dist/storage/ai-usage/types.d.ts.map +1 -0
- package/dist/storage/ai-usage/usage.d.ts +11 -0
- package/dist/storage/ai-usage/usage.d.ts.map +1 -0
- package/dist/storage/auth/types.d.ts +1 -0
- package/dist/storage/auth/types.d.ts.map +1 -1
- package/dist/storage/connector-connections/errors.d.ts +12 -0
- package/dist/storage/connector-connections/errors.d.ts.map +1 -0
- package/dist/storage/connector-connections/in-memory.d.ts +81 -0
- package/dist/storage/connector-connections/in-memory.d.ts.map +1 -0
- package/dist/storage/connector-connections/index.d.ts +7 -0
- package/dist/storage/connector-connections/index.d.ts.map +1 -0
- package/dist/storage/connector-connections/provider/authorizations.d.ts +20 -0
- package/dist/storage/connector-connections/provider/authorizations.d.ts.map +1 -0
- package/dist/storage/connector-connections/provider/connections.d.ts +17 -0
- package/dist/storage/connector-connections/provider/connections.d.ts.map +1 -0
- package/dist/storage/connector-connections/provider/runs.d.ts +14 -0
- package/dist/storage/connector-connections/provider/runs.d.ts.map +1 -0
- package/dist/storage/connector-connections/provider/shared.d.ts +74 -0
- package/dist/storage/connector-connections/provider/shared.d.ts.map +1 -0
- package/dist/storage/connector-connections/provider.d.ts +49 -0
- package/dist/storage/connector-connections/provider.d.ts.map +1 -0
- package/dist/storage/connector-connections/provider.js +1025 -0
- package/dist/storage/connector-connections/provider.js.map +14 -0
- package/dist/storage/connector-connections/types.d.ts +402 -0
- package/dist/storage/connector-connections/types.d.ts.map +1 -0
- package/dist/storage/executions/errors.d.ts +8 -0
- package/dist/storage/executions/errors.d.ts.map +1 -0
- package/dist/storage/executions/in-memory.d.ts +21 -0
- package/dist/storage/executions/in-memory.d.ts.map +1 -0
- package/dist/storage/executions/index.d.ts +5 -0
- package/dist/storage/executions/index.d.ts.map +1 -0
- package/dist/storage/executions/provider.d.ts +29 -0
- package/dist/storage/executions/provider.d.ts.map +1 -0
- package/dist/storage/executions/provider.js +208 -0
- package/dist/storage/executions/provider.js.map +10 -0
- package/dist/storage/executions/run-link.d.ts +24 -0
- package/dist/storage/executions/run-link.d.ts.map +1 -0
- package/dist/storage/executions/types.d.ts +62 -0
- package/dist/storage/executions/types.d.ts.map +1 -0
- package/dist/storage/executions/validation.d.ts +13 -0
- package/dist/storage/executions/validation.d.ts.map +1 -0
- package/dist/storage/in-memory/index.d.ts +20 -5
- package/dist/storage/in-memory/index.d.ts.map +1 -1
- package/dist/storage/index.d.ts +28 -17
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +90 -27
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/ontology/commits.d.ts +1 -0
- package/dist/storage/ontology/commits.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/index.d.ts +1 -0
- package/dist/storage/ontology/in-memory/index.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/materializations-state.d.ts +3 -2
- package/dist/storage/ontology/in-memory/materializations-state.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/materializations-work.d.ts +2 -2
- package/dist/storage/ontology/in-memory/materializations-work.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/materializations.d.ts +3 -1
- package/dist/storage/ontology/in-memory/materializations.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/shared-state.d.ts +7 -2
- package/dist/storage/ontology/in-memory/shared-state.d.ts.map +1 -1
- package/dist/storage/ontology/index.d.ts +3 -2
- package/dist/storage/ontology/index.d.ts.map +1 -1
- package/dist/storage/ontology/materializations.d.ts +50 -5
- package/dist/storage/ontology/materializations.d.ts.map +1 -1
- package/dist/storage/ontology/outbox.d.ts +8 -2
- package/dist/storage/ontology/outbox.d.ts.map +1 -1
- package/dist/storage/ontology/provider-work.d.ts.map +1 -1
- package/dist/storage/ontology/provider.d.ts +5 -22
- package/dist/storage/ontology/provider.d.ts.map +1 -1
- package/dist/storage/ontology/provider.js +6 -7
- package/dist/storage/ontology/provider.js.map +1 -1
- package/dist/storage/operation-scope.d.ts.map +1 -1
- package/dist/storage/operation-scope.js +1 -1
- package/dist/storage/pipeline-runs/idempotency.d.ts +3 -0
- package/dist/storage/pipeline-runs/idempotency.d.ts.map +1 -0
- package/dist/storage/pipeline-runs/in-memory.d.ts +5 -1
- package/dist/storage/pipeline-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/pipeline-runs/index.d.ts +3 -1
- package/dist/storage/pipeline-runs/index.d.ts.map +1 -1
- package/dist/storage/pipeline-runs/provider.d.ts +10 -0
- package/dist/storage/pipeline-runs/provider.d.ts.map +1 -0
- package/dist/storage/pipeline-runs/provider.js +11 -0
- package/dist/storage/pipeline-runs/provider.js.map +9 -0
- package/dist/storage/pipeline-runs/types.d.ts +30 -14
- package/dist/storage/pipeline-runs/types.d.ts.map +1 -1
- package/dist/storage/projection-runs/in-memory.d.ts +8 -3
- package/dist/storage/projection-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/projection-runs/index.d.ts +2 -2
- package/dist/storage/projection-runs/index.d.ts.map +1 -1
- package/dist/storage/projection-runs/lifecycle.d.ts +14 -8
- package/dist/storage/projection-runs/lifecycle.d.ts.map +1 -1
- package/dist/storage/projection-runs/provider.d.ts +13 -0
- package/dist/storage/projection-runs/provider.d.ts.map +1 -0
- package/dist/storage/projection-runs/{lifecycle.js → provider.js} +15 -4
- package/dist/storage/projection-runs/provider.js.map +9 -0
- package/dist/storage/projection-runs/types.d.ts +28 -11
- package/dist/storage/projection-runs/types.d.ts.map +1 -1
- package/dist/storage/run-listing.d.ts +8 -9
- package/dist/storage/run-listing.d.ts.map +1 -1
- package/dist/storage/sync-runs/idempotency.d.ts +3 -0
- package/dist/storage/sync-runs/idempotency.d.ts.map +1 -0
- package/dist/storage/sync-runs/in-memory.d.ts +5 -1
- package/dist/storage/sync-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/sync-runs/index.d.ts +3 -1
- package/dist/storage/sync-runs/index.d.ts.map +1 -1
- package/dist/storage/sync-runs/provider.d.ts +10 -0
- package/dist/storage/sync-runs/provider.d.ts.map +1 -0
- package/dist/storage/sync-runs/provider.js +11 -0
- package/dist/storage/sync-runs/provider.js.map +9 -0
- package/dist/storage/sync-runs/types.d.ts +35 -14
- package/dist/storage/sync-runs/types.d.ts.map +1 -1
- package/dist/storage/types.d.ts +20 -15
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/webhook-runs/errors.d.ts +3 -0
- package/dist/storage/webhook-runs/errors.d.ts.map +1 -1
- package/dist/storage/webhook-runs/in-memory.d.ts +13 -1
- package/dist/storage/webhook-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/webhook-runs/index.d.ts +3 -2
- package/dist/storage/webhook-runs/index.d.ts.map +1 -1
- package/dist/storage/webhook-runs/provider.d.ts +10 -0
- package/dist/storage/webhook-runs/provider.d.ts.map +1 -0
- package/dist/storage/webhook-runs/provider.js +11 -0
- package/dist/storage/webhook-runs/provider.js.map +9 -0
- package/dist/storage/webhook-runs/types.d.ts +37 -11
- package/dist/storage/webhook-runs/types.d.ts.map +1 -1
- package/dist/storage/workflow-runs/in-memory.d.ts +6 -2
- package/dist/storage/workflow-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/workflow-runs/index.d.ts +2 -1
- package/dist/storage/workflow-runs/index.d.ts.map +1 -1
- package/dist/storage/workflow-runs/provider.d.ts +19 -0
- package/dist/storage/workflow-runs/provider.d.ts.map +1 -0
- package/dist/storage/workflow-runs/provider.js +19 -0
- package/dist/storage/workflow-runs/provider.js.map +9 -0
- package/dist/storage/workflow-runs/types.d.ts +30 -30
- package/dist/storage/workflow-runs/types.d.ts.map +1 -1
- package/dist/syncs/builders.d.ts +11 -3
- package/dist/syncs/builders.d.ts.map +1 -1
- package/dist/syncs/execution.d.ts +18 -0
- package/dist/syncs/execution.d.ts.map +1 -0
- package/dist/syncs/index.d.ts +3 -1
- package/dist/syncs/index.d.ts.map +1 -1
- package/dist/syncs/index.js +65 -0
- package/dist/syncs/index.js.map +9 -0
- package/dist/syncs/request.d.ts +6 -16
- package/dist/syncs/request.d.ts.map +1 -1
- package/dist/syncs/run-dispatch.d.ts +47 -0
- package/dist/syncs/run-dispatch.d.ts.map +1 -0
- package/dist/syncs/sources.d.ts +8 -0
- package/dist/syncs/sources.d.ts.map +1 -0
- package/dist/syncs/types.d.ts +34 -22
- package/dist/syncs/types.d.ts.map +1 -1
- package/dist/syncs/validation.d.ts +14 -0
- package/dist/syncs/validation.d.ts.map +1 -0
- package/dist/testing/action-execution.d.ts +12 -0
- package/dist/testing/action-execution.d.ts.map +1 -0
- package/dist/testing/agent-execution.d.ts +14 -0
- package/dist/testing/agent-execution.d.ts.map +1 -0
- package/dist/testing/agent-storage-contract.d.ts +10 -3
- package/dist/testing/agent-storage-contract.d.ts.map +1 -1
- package/dist/testing/ai-usage-storage-contract.d.ts +13 -0
- package/dist/testing/ai-usage-storage-contract.d.ts.map +1 -0
- package/dist/testing/auth-storage-contract.d.ts.map +1 -1
- package/dist/testing/broker-contract.d.ts.map +1 -1
- package/dist/testing/connector-connection-storage-contract.d.ts +16 -0
- package/dist/testing/connector-connection-storage-contract.d.ts.map +1 -0
- package/dist/testing/execution-storage-contract.d.ts +15 -0
- package/dist/testing/execution-storage-contract.d.ts.map +1 -0
- package/dist/testing/execution.d.ts +23 -0
- package/dist/testing/execution.d.ts.map +1 -0
- package/dist/testing/index.d.ts +13 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +4270 -1484
- package/dist/testing/index.js.map +27 -14
- package/dist/testing/lake-merge-storage-contract.d.ts +7 -0
- package/dist/testing/lake-merge-storage-contract.d.ts.map +1 -0
- package/dist/testing/lake-storage-contract.d.ts.map +1 -1
- package/dist/testing/materializer-fixture.d.ts +2 -2
- package/dist/testing/materializer-fixture.d.ts.map +1 -1
- package/dist/testing/materializer-storage-contract.d.ts.map +1 -1
- package/dist/testing/ontology-contract-fixture.d.ts +1 -0
- package/dist/testing/ontology-contract-fixture.d.ts.map +1 -1
- package/dist/testing/ontology-storage-contract.d.ts.map +1 -1
- package/dist/testing/pipeline-execution.d.ts +16 -0
- package/dist/testing/pipeline-execution.d.ts.map +1 -0
- package/dist/testing/projection-execution.d.ts +20 -0
- package/dist/testing/projection-execution.d.ts.map +1 -0
- package/dist/testing/projection-run-storage-contract.d.ts +9 -4
- package/dist/testing/projection-run-storage-contract.d.ts.map +1 -1
- package/dist/testing/queues-contract.d.ts.map +1 -1
- package/dist/testing/sync-execution.d.ts +16 -0
- package/dist/testing/sync-execution.d.ts.map +1 -0
- package/dist/testing/webhook-execution.d.ts +12 -0
- package/dist/testing/webhook-execution.d.ts.map +1 -0
- package/dist/testing/webhook-run-storage-contract.d.ts +11 -0
- package/dist/testing/webhook-run-storage-contract.d.ts.map +1 -0
- package/dist/testing/workflow-execution.d.ts +23 -0
- package/dist/testing/workflow-execution.d.ts.map +1 -0
- package/dist/webhooks/index.d.ts +2 -1
- package/dist/webhooks/index.d.ts.map +1 -1
- package/dist/webhooks/internal.d.ts +2 -0
- package/dist/webhooks/internal.d.ts.map +1 -0
- package/dist/webhooks/internal.js +150 -0
- package/dist/webhooks/internal.js.map +10 -0
- package/dist/webhooks/registry.d.ts +18 -4
- package/dist/webhooks/registry.d.ts.map +1 -1
- package/dist/webhooks/run-admission.d.ts +25 -0
- package/dist/webhooks/run-admission.d.ts.map +1 -0
- package/dist/webhooks/types.d.ts +8 -5
- package/dist/webhooks/types.d.ts.map +1 -1
- package/dist/workers/index.js +18 -19
- package/dist/workers/index.js.map +4 -4
- package/dist/workers/queue-delivery.d.ts +7 -7
- package/dist/workers/queue-delivery.d.ts.map +1 -1
- package/dist/workers/queue-worker.d.ts +30 -11
- package/dist/workers/queue-worker.d.ts.map +1 -1
- package/dist/workflows/execution.d.ts +49 -0
- package/dist/workflows/execution.d.ts.map +1 -0
- package/dist/workflows/failure.d.ts +28 -0
- package/dist/workflows/failure.d.ts.map +1 -0
- package/dist/workflows/index.d.ts +4 -2
- package/dist/workflows/index.d.ts.map +1 -1
- package/dist/workflows/index.js +63 -35
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/request.d.ts +2 -1
- package/dist/workflows/request.d.ts.map +1 -1
- package/dist/workflows/run-dispatch.d.ts +59 -0
- package/dist/workflows/run-dispatch.d.ts.map +1 -0
- package/dist/workflows/types.d.ts +38 -8
- package/dist/workflows/types.d.ts.map +1 -1
- package/package.json +107 -5
- package/src/actions/commit-edits.ts +0 -3
- package/src/actions/execution.ts +83 -0
- package/src/actions/index.ts +1 -1
- package/src/actions/registry.ts +22 -10
- package/src/actions/request.ts +55 -177
- package/src/actions/run-dispatch.ts +276 -0
- package/src/actions/types/context.ts +2 -4
- package/src/actions/validation.ts +2 -2
- package/src/agents/adapters.ts +8 -12
- package/src/agents/authority.ts +189 -0
- package/src/agents/builders.ts +53 -3
- package/src/agents/dispatch.ts +1 -6
- package/src/agents/errors.ts +24 -0
- package/src/agents/execution.ts +254 -0
- package/src/agents/index.ts +37 -5
- package/src/agents/prompt.ts +17 -5
- package/src/agents/request.ts +153 -13
- package/src/agents/streams.ts +150 -3
- package/src/agents/tool-definition.ts +93 -0
- package/src/agents/types.ts +99 -0
- package/src/agents/validation.ts +289 -5
- package/src/auth/attribution.ts +48 -0
- package/src/auth/index.ts +1 -0
- package/src/auth/runtime.ts +5 -5
- package/src/authorization/decision.ts +75 -14
- package/src/authorization/grant-kinds.ts +9 -0
- package/src/authorization/index.ts +2 -0
- package/src/blob-storage/execution.ts +78 -0
- package/src/blob-storage/validation.ts +2 -10
- package/src/bootstrap/discovery.ts +88 -268
- package/src/bootstrap/index.ts +2 -13
- package/src/broker/in-memory.ts +8 -1
- package/src/broker/types.ts +5 -0
- package/src/connectors/builders.ts +37 -2
- package/src/connectors/connections/authorizations.ts +646 -0
- package/src/connectors/connections/capability.ts +59 -0
- package/src/connectors/connections/command-context.ts +98 -0
- package/src/connectors/connections/contracts.ts +208 -0
- package/src/connectors/connections/credential-codec.ts +48 -0
- package/src/connectors/connections/credential-mutations.ts +574 -0
- package/src/connectors/connections/execution.ts +138 -0
- package/src/connectors/connections/internal.ts +17 -0
- package/src/connectors/connections/provider-operation.ts +41 -0
- package/src/connectors/connections/request.ts +447 -0
- package/src/connectors/connections/runs.ts +702 -0
- package/src/connectors/connections/service.ts +644 -0
- package/src/connectors/connections/storage-boundary.ts +13 -0
- package/src/connectors/connections/tokens.ts +292 -0
- package/src/connectors/connections/validation.ts +316 -0
- package/src/connectors/connections/views.ts +37 -0
- package/src/connectors/credentials.ts +149 -0
- package/src/connectors/errors.ts +111 -3
- package/src/connectors/execution.ts +157 -0
- package/src/connectors/index.ts +26 -2
- package/src/connectors/service.ts +142 -0
- package/src/connectors/types.ts +156 -7
- package/src/datasets/builders.ts +49 -5
- package/src/datasets/changes.ts +13 -0
- package/src/datasets/execution.ts +24 -0
- package/src/datasets/index.ts +3 -0
- package/src/datasets/types.ts +5 -0
- package/src/datasets/validation.ts +53 -11
- package/src/error-reporting/capability.ts +33 -106
- package/src/error-reporting/internal.ts +3 -1
- package/src/error-reporting/reporter.ts +19 -3
- package/src/error-reporting/reports.ts +172 -0
- package/src/error-reporting/types.ts +97 -43
- package/src/errors/catalog.ts +149 -0
- package/src/errors/internal.ts +322 -0
- package/src/errors/types.ts +21 -0
- package/src/events/definitions.ts +0 -4
- package/src/events/execution.ts +45 -0
- package/src/events/index.ts +15 -14
- package/src/events/outbox-dispatcher.ts +53 -18
- package/src/events/{runtime.ts → service.ts} +19 -23
- package/src/events/types/pipelines.ts +4 -1
- package/src/events/types/syncs.ts +3 -0
- package/src/events/types/workflows.ts +4 -2
- package/src/execution/agent.ts +130 -0
- package/src/execution/authorization.ts +409 -0
- package/src/execution/dispatch.ts +7 -0
- package/src/execution/durable.ts +193 -0
- package/src/execution/index.ts +12 -0
- package/src/execution/primitive.ts +50 -0
- package/src/execution/request.ts +109 -0
- package/src/execution/scopes.ts +198 -0
- package/src/execution/types.ts +113 -0
- package/src/http/api-routes.ts +42 -7
- package/src/index.ts +127 -10
- package/src/json.ts +11 -8
- package/src/lake-storage/definition-updates.ts +21 -0
- package/src/lake-storage/in-memory.ts +284 -2
- package/src/lake-storage/index.ts +14 -0
- package/src/lake-storage/merge-validation.ts +117 -0
- package/src/lake-storage/merge.ts +35 -0
- package/src/lake-storage/types.ts +3 -1
- package/src/logging/execution.ts +28 -0
- package/src/logging/index.ts +4 -4
- package/src/logging/{runtime.ts → service.ts} +7 -7
- package/src/materialization/events.ts +1 -0
- package/src/materialization/index.ts +2 -0
- package/src/materialization/model.ts +30 -18
- package/src/materializer/README.md +9 -13
- package/src/materializer/edits/commit.ts +85 -28
- package/src/materializer/edits/load-state.ts +79 -16
- package/src/materializer/edits/operations.ts +72 -36
- package/src/materializer/edits/plan.ts +95 -22
- package/src/materializer/edits/working-state.ts +86 -55
- package/src/materializer/effective/build-events.ts +2 -0
- package/src/materializer/effective/diff.ts +22 -0
- package/src/materializer/effective/load-state.ts +0 -31
- package/src/materializer/effective/resolve.ts +62 -0
- package/src/materializer/execution/commit-lifecycle.ts +9 -1
- package/src/materializer/execution/plan-stream.ts +33 -9
- package/src/materializer/execution/scope.ts +95 -0
- package/src/materializer/execution/work-executor.ts +6 -2
- package/src/materializer/execution/work-records.ts +39 -6
- package/src/materializer/index.ts +9 -1
- package/src/materializer/materializer.ts +67 -5
- package/src/materializer/projections/finish-run.ts +29 -11
- package/src/materializer/projections/replace.ts +55 -22
- package/src/materializer/projections/replacement-plan.ts +37 -7
- package/src/materializer/shared/batching.ts +4 -1
- package/src/materializer/shared/normalize.ts +0 -19
- package/src/materializer/telemetry/append.ts +57 -26
- package/src/materializer/telemetry/plan.ts +15 -6
- package/src/objects/action/request.ts +5 -5
- package/src/objects/context/index.ts +1 -0
- package/src/objects/context/types.ts +6 -0
- package/src/objects/execution.ts +346 -0
- package/src/objects/materializer-adapter.ts +1 -23
- package/src/objects/query/executor.ts +15 -29
- package/src/objects/query/index.ts +1 -2
- package/src/objects/query/planner.ts +0 -6
- package/src/objects/sdk/object-handle.ts +2 -2
- package/src/objects/sdk/object-set.ts +17 -7
- package/src/objects/sdk/runtime-query-executor.ts +9 -2
- package/src/objects/sdk/telemetry-channel.ts +5 -1
- package/src/objects/service/action-service.ts +5 -2
- package/src/objects/service/list-service.ts +1 -1
- package/src/objects/telemetry/history.ts +8 -3
- package/src/objects/telemetry/write-batch.ts +0 -2
- package/src/ontology/index.ts +6 -1
- package/src/ontology/json-schema.ts +2 -1
- package/src/ontology/registry.ts +16 -2
- package/src/ontology/validation/normalize.ts +9 -15
- package/src/pipelines/execution.ts +105 -0
- package/src/pipelines/index.ts +7 -0
- package/src/pipelines/request.ts +32 -26
- package/src/pipelines/run-dispatch.ts +308 -0
- package/src/projections/builders.ts +0 -9
- package/src/projections/capability.ts +37 -0
- package/src/projections/execution.ts +85 -0
- package/src/projections/index.ts +2 -1
- package/src/projections/internal.ts +17 -60
- package/src/projections/ownership.ts +2 -2
- package/src/projections/registry.ts +26 -11
- package/src/projections/revision.ts +7 -5
- package/src/projections/run-dispatch.ts +497 -0
- package/src/projections/run-id.ts +20 -0
- package/src/projections/types.ts +12 -0
- package/src/projections/validation.ts +3 -3
- package/src/queues/in-memory.ts +37 -11
- package/src/queues/index.ts +9 -2
- package/src/queues/types.ts +70 -45
- package/src/rules/execution.ts +49 -0
- package/src/rules/index.ts +0 -1
- package/src/rules/validation.ts +2 -6
- package/src/runtime/ai-usage.ts +17 -0
- package/src/runtime/create.ts +28 -68
- package/src/runtime/definitions.ts +44 -0
- package/src/runtime/host.ts +377 -0
- package/src/runtime/index.ts +5 -13
- package/src/runtime/internal.ts +12 -0
- package/src/runtime/ontology-mutations.ts +5 -3
- package/src/runtime/resolve-definitions.ts +238 -0
- package/src/runtime/sixb.ts +95 -807
- package/src/runtime/types.ts +17 -290
- package/src/scheduler/index.ts +1 -1
- package/src/scheduler/runtime.ts +37 -6
- package/src/schedules/execution.ts +14 -0
- package/src/schedules/types.ts +0 -8
- package/src/security/every.ts +4 -0
- package/src/security/grants.ts +13 -1
- package/src/security/index.ts +3 -1
- package/src/security/registry.ts +107 -0
- package/src/security/types.ts +8 -12
- package/src/security/validation.ts +7 -0
- package/src/storage/action-runs/failure.ts +64 -0
- package/src/storage/action-runs/idempotency.ts +3 -1
- package/src/storage/action-runs/in-memory.ts +39 -9
- package/src/storage/action-runs/index.ts +3 -0
- package/src/storage/action-runs/provider.ts +25 -0
- package/src/storage/action-runs/types.ts +61 -27
- package/src/storage/agents/errors.ts +1 -0
- package/src/storage/agents/in-memory.ts +49 -11
- package/src/storage/agents/index.ts +2 -1
- package/src/storage/agents/provider.ts +27 -0
- package/src/storage/agents/types.ts +19 -19
- package/src/storage/ai-usage/errors.ts +13 -0
- package/src/storage/ai-usage/in-memory.ts +162 -0
- package/src/storage/ai-usage/index.ts +21 -0
- package/src/storage/ai-usage/record.ts +74 -0
- package/src/storage/ai-usage/types.ts +102 -0
- package/src/storage/ai-usage/usage.ts +104 -0
- package/src/storage/auth/types.ts +1 -0
- package/src/storage/connector-connections/errors.ts +24 -0
- package/src/storage/connector-connections/in-memory.ts +1377 -0
- package/src/storage/connector-connections/index.ts +66 -0
- package/src/storage/connector-connections/provider/authorizations.ts +446 -0
- package/src/storage/connector-connections/provider/connections.ts +291 -0
- package/src/storage/connector-connections/provider/runs.ts +369 -0
- package/src/storage/connector-connections/provider/shared.ts +342 -0
- package/src/storage/connector-connections/provider.ts +219 -0
- package/src/storage/connector-connections/types.ts +546 -0
- package/src/storage/executions/errors.ts +21 -0
- package/src/storage/executions/in-memory.ts +75 -0
- package/src/storage/executions/index.ts +16 -0
- package/src/storage/executions/provider.ts +292 -0
- package/src/storage/executions/run-link.ts +70 -0
- package/src/storage/executions/types.ts +49 -0
- package/src/storage/executions/validation.ts +370 -0
- package/src/storage/in-memory/index.ts +50 -16
- package/src/storage/index.ts +155 -15
- package/src/storage/ontology/commits.ts +1 -0
- package/src/storage/ontology/in-memory/index.ts +2 -0
- package/src/storage/ontology/in-memory/materializations-finalization.ts +2 -1
- package/src/storage/ontology/in-memory/materializations-state.ts +10 -0
- package/src/storage/ontology/in-memory/materializations-work.ts +2 -1
- package/src/storage/ontology/in-memory/materializations.ts +131 -9
- package/src/storage/ontology/in-memory/outbox.ts +1 -1
- package/src/storage/ontology/in-memory/shared-state.ts +12 -1
- package/src/storage/ontology/index.ts +6 -0
- package/src/storage/ontology/materializations.ts +50 -4
- package/src/storage/ontology/outbox.ts +13 -2
- package/src/storage/ontology/provider-header-validation.ts +1 -0
- package/src/storage/ontology/provider-work.ts +33 -14
- package/src/storage/ontology/provider.ts +72 -52
- package/src/storage/operation-scope.ts +1 -0
- package/src/storage/pipeline-runs/idempotency.ts +14 -0
- package/src/storage/pipeline-runs/in-memory.ts +88 -8
- package/src/storage/pipeline-runs/index.ts +5 -1
- package/src/storage/pipeline-runs/provider.ts +25 -0
- package/src/storage/pipeline-runs/types.ts +37 -14
- package/src/storage/projection-runs/in-memory.ts +93 -24
- package/src/storage/projection-runs/index.ts +4 -0
- package/src/storage/projection-runs/lifecycle.ts +165 -36
- package/src/storage/projection-runs/provider.ts +34 -0
- package/src/storage/projection-runs/types.ts +34 -11
- package/src/storage/run-listing.ts +22 -13
- package/src/storage/sync-runs/idempotency.ts +18 -0
- package/src/storage/sync-runs/in-memory.ts +92 -9
- package/src/storage/sync-runs/index.ts +5 -1
- package/src/storage/sync-runs/provider.ts +25 -0
- package/src/storage/sync-runs/types.ts +44 -15
- package/src/storage/types.ts +45 -17
- package/src/storage/webhook-runs/errors.ts +14 -0
- package/src/storage/webhook-runs/in-memory.ts +84 -9
- package/src/storage/webhook-runs/index.ts +5 -1
- package/src/storage/webhook-runs/provider.ts +30 -0
- package/src/storage/webhook-runs/types.ts +52 -11
- package/src/storage/workflow-runs/in-memory.ts +91 -55
- package/src/storage/workflow-runs/index.ts +2 -0
- package/src/storage/workflow-runs/provider.ts +70 -0
- package/src/storage/workflow-runs/types.ts +38 -25
- package/src/syncs/builders.ts +33 -15
- package/src/syncs/execution.ts +78 -0
- package/src/syncs/index.ts +14 -0
- package/src/syncs/request.ts +32 -43
- package/src/syncs/run-dispatch.ts +312 -0
- package/src/syncs/sources.ts +20 -0
- package/src/syncs/types.ts +75 -25
- package/src/syncs/validation.ts +77 -0
- package/src/testing/action-execution.ts +61 -0
- package/src/testing/agent-execution.ts +81 -0
- package/src/testing/agent-storage-contract.ts +158 -63
- package/src/testing/ai-usage-storage-contract.ts +528 -0
- package/src/testing/auth-storage-contract.ts +17 -1
- package/src/testing/broker-contract.ts +16 -1
- package/src/testing/connector-connection-storage-contract.ts +1052 -0
- package/src/testing/execution-storage-contract.ts +435 -0
- package/src/testing/execution.ts +48 -0
- package/src/testing/index.ts +56 -0
- package/src/testing/lake-merge-storage-contract.ts +302 -0
- package/src/testing/lake-storage-contract.ts +23 -0
- package/src/testing/materializer-fixture.ts +11 -3
- package/src/testing/materializer-storage-contract.ts +213 -11
- package/src/testing/ontology-contract-fixture.ts +35 -2
- package/src/testing/ontology-storage-contract.ts +75 -14
- package/src/testing/pipeline-execution.ts +64 -0
- package/src/testing/projection-execution.ts +98 -0
- package/src/testing/projection-run-storage-contract.ts +215 -29
- package/src/testing/queues-contract.ts +40 -51
- package/src/testing/sync-execution.ts +61 -0
- package/src/testing/webhook-execution.ts +47 -0
- package/src/testing/webhook-run-storage-contract.ts +240 -0
- package/src/testing/workflow-execution.ts +77 -0
- package/src/webhooks/index.ts +2 -1
- package/src/webhooks/internal.ts +5 -0
- package/src/webhooks/registry.ts +60 -36
- package/src/webhooks/run-admission.ts +172 -0
- package/src/webhooks/types.ts +8 -5
- package/src/workers/queue-delivery.ts +25 -22
- package/src/workers/queue-worker.ts +62 -32
- package/src/workflows/execution.ts +292 -0
- package/src/workflows/failure.ts +63 -0
- package/src/workflows/index.ts +10 -1
- package/src/workflows/request.ts +39 -118
- package/src/workflows/run-dispatch.ts +359 -0
- package/src/workflows/snapshot.ts +1 -10
- package/src/workflows/types.ts +39 -8
- package/dist/actions/runtime.d.ts +0 -11
- package/dist/actions/runtime.d.ts.map +0 -1
- package/dist/agents/runtime.d.ts +0 -41
- package/dist/agents/runtime.d.ts.map +0 -1
- package/dist/chunk-0fygrz37.js +0 -354
- package/dist/chunk-0fygrz37.js.map +0 -17
- package/dist/chunk-0psb6kdw.js +0 -989
- package/dist/chunk-0psb6kdw.js.map +0 -15
- package/dist/chunk-1vffvydj.js.map +0 -10
- package/dist/chunk-2gpr6jsz.js.map +0 -13
- package/dist/chunk-2s6sydsh.js.map +0 -12
- package/dist/chunk-50kv63vj.js.map +0 -12
- package/dist/chunk-590dejbp.js +0 -49
- package/dist/chunk-590dejbp.js.map +0 -10
- package/dist/chunk-867jxh7c.js.map +0 -19
- package/dist/chunk-aebzcsxr.js.map +0 -48
- package/dist/chunk-btpe64e4.js +0 -554
- package/dist/chunk-btpe64e4.js.map +0 -13
- package/dist/chunk-dcgrzj1t.js.map +0 -36
- package/dist/chunk-dhmj53mx.js.map +0 -16
- package/dist/chunk-hsv43v58.js +0 -1390
- package/dist/chunk-hsv43v58.js.map +0 -21
- package/dist/chunk-jdwx7vzs.js.map +0 -14
- package/dist/chunk-k25jm1x5.js +0 -102
- package/dist/chunk-k25jm1x5.js.map +0 -10
- package/dist/chunk-k41ajtz7.js +0 -352
- package/dist/chunk-k41ajtz7.js.map +0 -13
- package/dist/chunk-k6j72mtt.js +0 -9
- package/dist/chunk-k6j72mtt.js.map +0 -10
- package/dist/chunk-nvamz5dv.js +0 -819
- package/dist/chunk-nvamz5dv.js.map +0 -21
- package/dist/chunk-pv1yad91.js +0 -1165
- package/dist/chunk-pv1yad91.js.map +0 -27
- package/dist/chunk-q4qzq0ea.js.map +0 -14
- package/dist/chunk-r65yscvk.js.map +0 -11
- package/dist/chunk-t358gywy.js.map +0 -34
- package/dist/chunk-t72dvahb.js.map +0 -12
- package/dist/chunk-v5c085yp.js.map +0 -10
- package/dist/chunk-wj01s5hr.js.map +0 -11
- package/dist/chunk-wxhdnwh4.js +0 -37
- package/dist/chunk-wxhdnwh4.js.map +0 -10
- package/dist/chunk-xz5g49bp.js.map +0 -11
- package/dist/chunk-ya6brh8a.js.map +0 -11
- package/dist/chunk-yvef9xwc.js.map +0 -44
- package/dist/chunk-yxss87qa.js.map +0 -14
- package/dist/connectors/runtime.d.ts +0 -13
- package/dist/connectors/runtime.d.ts.map +0 -1
- package/dist/events/runtime.d.ts.map +0 -1
- package/dist/objects/contexts.d.ts +0 -45
- package/dist/objects/contexts.d.ts.map +0 -1
- package/dist/objects/helpers.d.ts +0 -7
- package/dist/objects/helpers.d.ts.map +0 -1
- package/dist/runtime/scoped.d.ts +0 -158
- package/dist/runtime/scoped.d.ts.map +0 -1
- package/dist/security/runtime.d.ts +0 -16
- package/dist/security/runtime.d.ts.map +0 -1
- package/dist/storage/webhook-deliveries/in-memory.d.ts +0 -18
- package/dist/storage/webhook-deliveries/in-memory.d.ts.map +0 -1
- package/dist/storage/webhook-deliveries/index.d.ts +0 -3
- package/dist/storage/webhook-deliveries/index.d.ts.map +0 -1
- package/dist/storage/webhook-deliveries/types.d.ts +0 -43
- package/dist/storage/webhook-deliveries/types.d.ts.map +0 -1
- package/dist/workflows/runtime.d.ts +0 -33
- package/dist/workflows/runtime.d.ts.map +0 -1
- package/src/actions/runtime.ts +0 -31
- package/src/agents/runtime.ts +0 -124
- package/src/connectors/runtime.ts +0 -100
- package/src/objects/contexts.ts +0 -64
- package/src/objects/helpers.ts +0 -18
- package/src/runtime/scoped.ts +0 -436
- package/src/security/runtime.ts +0 -101
- package/src/storage/webhook-deliveries/in-memory.ts +0 -108
- package/src/storage/webhook-deliveries/index.ts +0 -9
- package/src/storage/webhook-deliveries/types.ts +0 -41
- package/src/workflows/runtime.ts +0 -68
- /package/dist/{chunk-45tw90k7.js.map → chunk-4gz41why.js.map} +0 -0
- /package/dist/{chunk-vj723r3p.js.map → chunk-8b55ygje.js.map} +0 -0
- /package/dist/{chunk-p6r5g77m.js.map → chunk-vybf6pkp.js.map} +0 -0
- /package/dist/{chunk-5yny9z0e.js.map → chunk-z3zp0bj1.js.map} +0 -0
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/objects/query/planner.ts", "../src/objects/query/validate.ts", "../src/objects/query/executor.ts", "../src/objects/query/explain.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"import type { ObjectQueryCapabilities, ObjectQueryScalarOperation } from \"../../storage\"\nimport type { ObjectQueryPlanningIssue } from \"./errors\"\nimport type { ObjectExpansion, ObjectQuery, ObjectQueryPredicate, ObjectQuerySortField } from \"./ir\"\n\nexport type ObjectQueryPlanMode = \"pushdown\" | \"fallback\" | \"rejected\"\nexport type ObjectQueryProviderOperation =\n | \"queryObjects\"\n | \"countObjects\"\n | \"existsObjects\"\n | \"facetObjects\"\n\nexport interface ObjectQueryPlan {\n mode: ObjectQueryPlanMode\n query: ObjectQuery\n providerIssues: readonly ObjectQueryPlanningIssue[]\n fallbackIssues: readonly ObjectQueryPlanningIssue[]\n issues: readonly ObjectQueryPlanningIssue[]\n fallback?: {\n maxRows: number\n requiresExplicitBound: boolean\n }\n}\n\nexport interface ObjectQueryPlanningOptions {\n capabilities: ObjectQueryCapabilities\n operation?: ObjectQueryProviderOperation\n hasQueryObjects?: boolean\n hasCountObjects?: boolean\n hasExistsObjects?: boolean\n hasFacetObjects?: boolean\n allowFallback?: boolean\n maxFallbackRows?: number\n requiresExplicitFallbackBound?: boolean\n}\n\nconst DEFAULT_MAX_FALLBACK_ROWS = 1_000\n\n// Fallback executes over ObjectStorage.list and is intentionally narrower than\n// provider pushdown. Complex semantics stay provider-owned and cannot become\n// accidental full scans.\nconst fallbackNodeKinds = new Set<ObjectQuery[\"kind\"]>([\n \"start\",\n \"filter\",\n \"sort\",\n \"limit\",\n \"page\",\n \"project\",\n \"expand\",\n])\n\nexport class QueryPlanner {\n plan(query: ObjectQuery, options: ObjectQueryPlanningOptions): ObjectQueryPlan {\n return planObjectQuery(query, options)\n }\n}\n\nexport function planObjectQuery(\n query: ObjectQuery,\n options: ObjectQueryPlanningOptions\n): ObjectQueryPlan {\n const operation = options.operation ?? \"queryObjects\"\n // Providers get first refusal. Fallback is considered only after the provider\n // declares that pushdown is unavailable or incomplete for this query.\n const providerIssues = collectProviderIssues(query, options.capabilities, {\n operation,\n hasImplementation: hasProviderImplementation(operation, options),\n })\n\n if (providerIssues.length === 0) {\n return {\n mode: \"pushdown\",\n query,\n providerIssues,\n fallbackIssues: [],\n issues: [],\n }\n }\n\n const fallbackIssues = collectFallbackIssues(query, options)\n const issues = [...providerIssues, ...fallbackIssues]\n\n if (fallbackIssues.length === 0) {\n return {\n mode: \"fallback\",\n query,\n providerIssues,\n fallbackIssues,\n issues: [],\n fallback: {\n maxRows: options.maxFallbackRows ?? DEFAULT_MAX_FALLBACK_ROWS,\n requiresExplicitBound: options.requiresExplicitFallbackBound !== false,\n },\n }\n }\n\n return {\n mode: \"rejected\",\n query,\n providerIssues,\n fallbackIssues,\n issues,\n }\n}\n\nfunction collectProviderIssues(\n query: ObjectQuery,\n capabilities: ObjectQueryCapabilities,\n options: { operation: ObjectQueryProviderOperation; hasImplementation: boolean }\n): ObjectQueryPlanningIssue[] {\n const issues: ObjectQueryPlanningIssue[] = []\n\n // Capability maps are allowlists: missing flags mean unsupported.\n collectOperationProviderIssues(capabilities, options, issues)\n\n collectNodeProviderIssues(query, \"$\", capabilities, issues)\n return issues\n}\n\nfunction collectOperationProviderIssues(\n capabilities: ObjectQueryCapabilities,\n options: { operation: ObjectQueryProviderOperation; hasImplementation: boolean },\n issues: ObjectQueryPlanningIssue[]\n): void {\n const enabled =\n options.operation === \"queryObjects\"\n ? capabilities.queryObjects === true\n : options.operation === \"countObjects\"\n ? capabilities.countObjects === true\n : options.operation === \"existsObjects\"\n ? capabilities.existsObjects === true\n : capabilities.facetObjects === true\n\n if (!enabled) {\n const code = `${operationIssuePrefix(options.operation)}_not_enabled`\n addIssue(\n issues,\n \"$\",\n code,\n `Object storage capabilities do not enable ${options.operation} pushdown`\n )\n }\n\n if (options.hasImplementation) return\n\n const code = `${operationIssuePrefix(options.operation)}_not_implemented`\n addIssue(issues, \"$\", code, `Object storage does not implement ${options.operation}`)\n}\n\nfunction hasProviderImplementation(\n operation: ObjectQueryProviderOperation,\n options: ObjectQueryPlanningOptions\n): boolean {\n switch (operation) {\n case \"queryObjects\":\n return options.hasQueryObjects === true\n case \"countObjects\":\n return options.hasCountObjects === true\n case \"existsObjects\":\n return options.hasExistsObjects === true\n case \"facetObjects\":\n return options.hasFacetObjects === true\n }\n}\n\nfunction operationIssuePrefix(operation: ObjectQueryProviderOperation): string {\n switch (operation) {\n case \"queryObjects\":\n return \"query_objects\"\n case \"countObjects\":\n return \"count_objects\"\n case \"existsObjects\":\n return \"exists_objects\"\n case \"facetObjects\":\n return \"facet_objects\"\n }\n}\n\nfunction collectNodeProviderIssues(\n query: ObjectQuery,\n path: string,\n capabilities: ObjectQueryCapabilities,\n issues: ObjectQueryPlanningIssue[]\n): void {\n if (capabilities.nodes?.[query.kind] !== true) {\n addIssue(\n issues,\n path,\n \"query_node_not_supported\",\n `Provider does not support query node '${query.kind}'`\n )\n }\n\n switch (query.kind) {\n case \"start\":\n if (query.includeSubtypes === true && capabilities.features?.includeSubtypes !== true) {\n addIssue(\n issues,\n path,\n \"include_subtypes_not_supported\",\n \"Provider does not support start.includeSubtypes expansion\"\n )\n }\n return\n case \"filter\":\n collectPredicateProviderIssues(query.predicate, `${path}.predicate`, capabilities, issues)\n collectNodeProviderIssues(query.input, `${path}.input`, capabilities, issues)\n return\n case \"text\":\n case \"vector\":\n case \"project\":\n collectNodeProviderIssues(query.input, `${path}.input`, capabilities, issues)\n return\n case \"limit\":\n collectProviderMaxLimitIssues(query.limit, path, capabilities, issues)\n collectNodeProviderIssues(query.input, `${path}.input`, capabilities, issues)\n return\n case \"page\":\n collectProviderMaxPageSizeIssues(query.pageSize, path, capabilities, issues)\n collectNodeProviderIssues(query.input, `${path}.input`, capabilities, issues)\n return\n case \"traverse\":\n if (capabilities.traversalDirections?.[query.direction] !== true) {\n addIssue(\n issues,\n path,\n \"traversal_direction_not_supported\",\n `Provider does not support ${query.direction} traversal`\n )\n }\n collectNodeProviderIssues(query.input, `${path}.input`, capabilities, issues)\n return\n case \"set\":\n if (capabilities.setOps?.[query.op] !== true) {\n addIssue(\n issues,\n path,\n \"set_operation_not_supported\",\n `Provider does not support set operation '${query.op}'`\n )\n }\n query.inputs.forEach((input, index) => {\n collectNodeProviderIssues(input, `${path}.inputs[${index}]`, capabilities, issues)\n })\n return\n case \"sort\":\n query.fields.forEach((field, index) => {\n collectSortProviderIssues(field, `${path}.fields[${index}]`, capabilities, issues)\n })\n collectNodeProviderIssues(query.input, `${path}.input`, capabilities, issues)\n return\n case \"expand\":\n query.expansions.forEach((expansion, index) => {\n collectExpansionProviderIssues(\n expansion,\n `${path}.expansions[${index}]`,\n capabilities,\n issues\n )\n })\n collectNodeProviderIssues(query.input, `${path}.input`, capabilities, issues)\n return\n }\n}\n\n// An expansion only pushes down once core has resolved its cardinality; an\n// unresolved one (e.g. a polymorphic parent whose branches disagree) keeps the\n// whole query on the bounded fallback, which re-derives cardinality per row.\nfunction collectExpansionProviderIssues(\n expansion: ObjectExpansion,\n path: string,\n capabilities: ObjectQueryCapabilities,\n issues: ObjectQueryPlanningIssue[]\n): void {\n if (expansion.cardinality === undefined) {\n addIssue(\n issues,\n path,\n \"expand_cardinality_unresolved\",\n `Provider cannot push down expansion '${expansion.linkId}' without a resolved cardinality`\n )\n }\n\n expansion.orderBy?.forEach((field, index) => {\n collectSortProviderIssues(field, `${path}.orderBy[${index}]`, capabilities, issues)\n })\n\n expansion.expand?.forEach((nested, index) => {\n collectExpansionProviderIssues(nested, `${path}.expand[${index}]`, capabilities, issues)\n })\n}\n\nfunction collectPredicateProviderIssues(\n predicate: ObjectQueryPredicate,\n path: string,\n capabilities: ObjectQueryCapabilities,\n issues: ObjectQueryPlanningIssue[]\n): void {\n const scalarOperation = predicateScalarOperation(predicate)\n if (\n \"scalarKind\" in predicate &&\n predicate.scalarKind !== undefined &&\n scalarOperation !== undefined &&\n capabilities.scalarOperations?.[predicate.scalarKind]?.[scalarOperation] !== true\n ) {\n addIssue(\n issues,\n path,\n \"scalar_operation_not_supported\",\n `Provider does not support ${scalarOperation} for '${predicate.scalarKind}' values`\n )\n }\n\n if (capabilities.predicateOps?.[predicate.op] !== true) {\n addIssue(\n issues,\n path,\n \"predicate_operation_not_supported\",\n `Provider does not support predicate operation '${predicate.op}'`\n )\n }\n\n switch (predicate.op) {\n case \"and\":\n case \"or\":\n predicate.items.forEach((item, index) => {\n collectPredicateProviderIssues(item, `${path}.items[${index}]`, capabilities, issues)\n })\n return\n case \"not\":\n collectPredicateProviderIssues(predicate.item, `${path}.item`, capabilities, issues)\n return\n default:\n return\n }\n}\n\nfunction predicateScalarOperation(\n predicate: ObjectQueryPredicate\n): ObjectQueryScalarOperation | undefined {\n switch (predicate.op) {\n case \"eq\":\n case \"neq\":\n case \"in\":\n return \"equality\"\n case \"lt\":\n case \"lte\":\n case \"gt\":\n case \"gte\":\n return \"ordering\"\n default:\n return undefined\n }\n}\n\nfunction collectSortProviderIssues(\n field: ObjectQuerySortField,\n path: string,\n capabilities: ObjectQueryCapabilities,\n issues: ObjectQueryPlanningIssue[]\n): void {\n if (\n field.kind === \"property\" &&\n field.scalarKind !== undefined &&\n capabilities.scalarOperations?.[field.scalarKind]?.ordering !== true\n ) {\n addIssue(\n issues,\n path,\n \"scalar_operation_not_supported\",\n `Provider does not support ordering for '${field.scalarKind}' values`\n )\n }\n\n if (capabilities.sortKinds?.[field.kind] === true) return\n addIssue(\n issues,\n path,\n \"sort_kind_not_supported\",\n `Provider does not support sort kind '${field.kind}'`\n )\n}\n\nfunction collectProviderMaxLimitIssues(\n limit: number,\n path: string,\n capabilities: ObjectQueryCapabilities,\n issues: ObjectQueryPlanningIssue[]\n): void {\n const maxLimit = capabilities.limits?.maxLimit\n if (maxLimit === undefined) return\n\n if (!Number.isInteger(maxLimit) || maxLimit < 0) {\n addIssue(\n issues,\n path,\n \"invalid_provider_limit_capability\",\n \"Provider limit capability maxLimit must be a non-negative integer\"\n )\n return\n }\n\n if (limit > maxLimit) {\n addIssue(issues, path, \"provider_limit_too_large\", `Provider supports limit up to ${maxLimit}`)\n }\n}\n\nfunction collectProviderMaxPageSizeIssues(\n pageSize: number,\n path: string,\n capabilities: ObjectQueryCapabilities,\n issues: ObjectQueryPlanningIssue[]\n): void {\n const maxPageSize = capabilities.limits?.maxPageSize\n if (maxPageSize === undefined) return\n\n if (!Number.isInteger(maxPageSize) || maxPageSize <= 0) {\n addIssue(\n issues,\n path,\n \"invalid_provider_page_size_capability\",\n \"Provider limit capability maxPageSize must be a positive integer\"\n )\n return\n }\n\n if (pageSize > maxPageSize) {\n addIssue(\n issues,\n path,\n \"provider_page_size_too_large\",\n `Provider supports pageSize up to ${maxPageSize}`\n )\n }\n}\n\nfunction collectFallbackIssues(\n query: ObjectQuery,\n options: ObjectQueryPlanningOptions\n): ObjectQueryPlanningIssue[] {\n const issues: ObjectQueryPlanningIssue[] = []\n\n if (options.allowFallback === false) {\n addIssue(issues, \"$\", \"fallback_disabled\", \"Object query fallback is disabled\")\n return issues\n }\n\n const maxFallbackRows = options.maxFallbackRows ?? DEFAULT_MAX_FALLBACK_ROWS\n if (!Number.isInteger(maxFallbackRows) || maxFallbackRows <= 0) {\n addIssue(issues, \"$\", \"invalid_fallback_bound\", \"maxFallbackRows must be a positive integer\")\n }\n\n // The result bound protects API callers from unbounded fallback responses.\n // The executor still enforces maxFallbackRows on the source scan separately.\n if (options.requiresExplicitFallbackBound !== false && !hasExplicitResultBound(query)) {\n addIssue(\n issues,\n \"$\",\n \"fallback_requires_bound\",\n \"Fallback requires an explicit limit or page node\"\n )\n }\n\n collectFallbackNodeIssues(query, \"$\", issues)\n return issues\n}\n\nfunction collectFallbackNodeIssues(\n query: ObjectQuery,\n path: string,\n issues: ObjectQueryPlanningIssue[]\n): void {\n if (!fallbackNodeKinds.has(query.kind)) {\n addIssue(\n issues,\n path,\n \"fallback_node_not_supported\",\n `Fallback does not support query node '${query.kind}'`\n )\n }\n\n switch (query.kind) {\n case \"start\":\n return\n case \"filter\":\n case \"limit\":\n case \"page\":\n case \"project\":\n case \"expand\":\n collectFallbackNodeIssues(query.input, `${path}.input`, issues)\n return\n case \"sort\":\n query.fields.forEach((field, index) => {\n if (field.kind === \"relevance\") {\n addIssue(\n issues,\n `${path}.fields[${index}]`,\n \"fallback_sort_kind_not_supported\",\n \"Fallback does not support relevance sorting\"\n )\n }\n })\n collectFallbackNodeIssues(query.input, `${path}.input`, issues)\n return\n case \"text\":\n case \"vector\":\n case \"traverse\":\n collectFallbackNodeIssues(query.input, `${path}.input`, issues)\n return\n case \"set\":\n query.inputs.forEach((input, index) => {\n collectFallbackNodeIssues(input, `${path}.inputs[${index}]`, issues)\n })\n return\n }\n}\n\nfunction hasExplicitResultBound(query: ObjectQuery): boolean {\n switch (query.kind) {\n case \"limit\":\n case \"page\":\n return true\n case \"start\":\n return false\n case \"set\":\n return query.inputs.some(hasExplicitResultBound)\n default:\n return hasExplicitResultBound(query.input)\n }\n}\n\nfunction addIssue(\n issues: ObjectQueryPlanningIssue[],\n path: string,\n code: string,\n message: string\n): void {\n issues.push({ path, code, message })\n}\n",
|
|
6
|
-
"import type { ObjectType, OntologyRegistry, Property, Schema, ValueType } from \"../../ontology\"\nimport { normalizeDecimalValue } from \"../../ontology\"\nimport { formatUnknownObjectTypeMessage } from \"../../ontology/errors\"\nimport { validatePropertyValue, validateSchemaValue } from \"../../ontology/validation\"\nimport { ObjectQueryValidationError } from \"./errors\"\nimport type {\n ObjectExpansion,\n ObjectQuery,\n ObjectQueryPredicate,\n ObjectQueryResultShape,\n ObjectQuerySortField,\n QueryScalarKind,\n} from \"./ir\"\nimport { normalizeObjectQuery } from \"./normalize\"\n\nexport interface ObjectQueryValidationIssue {\n path: string\n code: string\n message: string\n}\n\nexport interface ValidatedObjectQuery {\n query: ObjectQuery\n result: ObjectQueryResultShape\n /** Every object type the query touches, including intermediate traversal types. */\n touchedObjectTypeIds: readonly string[]\n}\n\nexport interface ObjectQueryValidationOptions {\n ontology: OntologyRegistry\n maxLimit?: number\n maxPageSize?: number\n normalize?: boolean\n}\n\ntype QueryValidationContext = Required<\n Pick<ObjectQueryValidationOptions, \"maxLimit\" | \"maxPageSize\">\n> & {\n ontology: OntologyRegistry\n valueTypesById: ReadonlyMap<string, ValueType>\n issues: ObjectQueryValidationIssue[]\n touchedObjectTypeIds: Set<string>\n}\n\ninterface QueryValidationResult {\n result: ObjectQueryResultShape\n query: ObjectQuery\n}\n\ninterface TextFieldResolution {\n fieldsByObjectType?: Record<string, string[]>\n}\n\nconst DEFAULT_MAX_LIMIT = 1_000\nconst DEFAULT_MAX_PAGE_SIZE = 1_000\n\nexport function validateObjectQuery(\n query: ObjectQuery,\n options: ObjectQueryValidationOptions\n): ValidatedObjectQuery {\n const normalized = options.normalize === false ? query : normalizeObjectQuery(query)\n const ctx = createValidationContext(options)\n const validation = validateQueryNode(normalized, \"$\", ctx)\n\n if (ctx.issues.length > 0) {\n throw new ObjectQueryValidationError(ctx.issues)\n }\n\n return {\n query: validation.query,\n result: validation.result,\n touchedObjectTypeIds: [...ctx.touchedObjectTypeIds],\n }\n}\n\nexport function collectObjectQueryValidationIssues(\n query: ObjectQuery,\n options: ObjectQueryValidationOptions\n): readonly ObjectQueryValidationIssue[] {\n const normalized = options.normalize === false ? query : normalizeObjectQuery(query)\n const ctx = createValidationContext(options)\n validateQueryNode(normalized, \"$\", ctx)\n return ctx.issues\n}\n\nexport function resolveObjectQueryResultShape(\n query: ObjectQuery,\n options: ObjectQueryValidationOptions\n): ObjectQueryResultShape {\n return validateObjectQuery(query, options).result\n}\n\nfunction createValidationContext(options: ObjectQueryValidationOptions): QueryValidationContext {\n return {\n ontology: options.ontology,\n valueTypesById: options.ontology.getValueTypesById(),\n maxLimit: options.maxLimit ?? DEFAULT_MAX_LIMIT,\n maxPageSize: options.maxPageSize ?? DEFAULT_MAX_PAGE_SIZE,\n issues: [],\n touchedObjectTypeIds: new Set<string>(),\n }\n}\n\nfunction validateQueryNode(\n query: ObjectQuery,\n path: string,\n ctx: QueryValidationContext\n): QueryValidationResult {\n const validation = dispatchQueryNode(query, path, ctx)\n\n // Record every intermediate result shape so callers can authorize all\n // object types a query touches, not just the types it returns.\n for (const objectTypeId of validation.result.objectTypeIds) {\n ctx.touchedObjectTypeIds.add(objectTypeId)\n }\n\n return validation\n}\n\nfunction dispatchQueryNode(\n query: ObjectQuery,\n path: string,\n ctx: QueryValidationContext\n): QueryValidationResult {\n switch (query.kind) {\n case \"start\":\n return validateStart(query.objectTypeId, query.includeSubtypes, path, ctx)\n case \"filter\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n const predicate = validatePredicate(query.predicate, input.result, `${path}.predicate`, ctx)\n return { result: input.result, query: { ...query, input: input.query, predicate } }\n }\n case \"text\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n const textFields = validateTextQuery(query.query, query.fields, input.result, path, ctx)\n return {\n result: input.result,\n query: {\n ...query,\n input: input.query,\n fields: query.fields,\n fieldsByObjectType: query.fields ? undefined : textFields.fieldsByObjectType,\n },\n }\n }\n case \"vector\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n validateVectorQuery(query.vector, query.propertyId, query.k, input.result, path, ctx)\n return { result: input.result, query: { ...query, input: input.query } }\n }\n case \"traverse\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n return {\n result: validateTraverse(\n query.linkId,\n query.direction,\n query.sourceObjectTypeId,\n input.result,\n path,\n ctx\n ),\n query: { ...query, input: input.query },\n }\n }\n case \"set\":\n return validateSet(query.inputs, query.op, path, ctx)\n case \"sort\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n const fields = validateSortFields(query.fields, input.result, path, ctx)\n return { result: input.result, query: { ...query, input: input.query, fields } }\n }\n case \"limit\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n validateLimit(query.limit, path, ctx)\n return { result: input.result, query: { ...query, input: input.query } }\n }\n case \"page\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n validatePage(query.pageSize, query.pageToken, path, ctx)\n return { result: input.result, query: { ...query, input: input.query } }\n }\n case \"project\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n validateProjection(query.properties, input.result, path, ctx)\n return { result: input.result, query: { ...query, input: input.query } }\n }\n case \"expand\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n // expand is output-shaping: it attaches links without changing the matched\n // set, so the result type is the input's result type.\n const expansions = validateExpansions(\n query.expansions,\n input.result,\n `${path}.expansions`,\n ctx\n )\n return { result: input.result, query: { ...query, input: input.query, expansions } }\n }\n }\n}\n\nfunction validateStart(\n objectTypeId: string,\n includeSubtypes: boolean | undefined,\n path: string,\n ctx: QueryValidationContext\n): QueryValidationResult {\n if (!objectTypeId) {\n addIssue(ctx, path, \"missing_object_type\", \"start.objectTypeId is required\")\n return { result: { objectTypeIds: [] }, query: { kind: \"start\", objectTypeId } }\n }\n\n if (!ctx.ontology.getObjectTypeById(objectTypeId)) {\n addIssue(ctx, path, \"unknown_object_type\", formatUnknownObjectTypeMessage(objectTypeId))\n return { result: { objectTypeIds: [] }, query: { kind: \"start\", objectTypeId } }\n }\n\n const objectTypeIds = includeSubtypes\n ? uniqueStrings([objectTypeId, ...ctx.ontology.listSubTypes(objectTypeId)])\n : [objectTypeId]\n\n return { result: { objectTypeIds }, query: { kind: \"start\", objectTypeId, includeSubtypes } }\n}\n\nfunction validatePredicate(\n predicate: ObjectQueryPredicate,\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext\n): ObjectQueryPredicate {\n switch (predicate.op) {\n case \"and\":\n case \"or\":\n if (predicate.items.length === 0) {\n addIssue(\n ctx,\n path,\n \"empty_predicate_group\",\n `Predicate '${predicate.op}' must not be empty`\n )\n }\n return {\n ...predicate,\n items: predicate.items.map((item, index) =>\n validatePredicate(item, shape, `${path}.items[${index}]`, ctx)\n ),\n }\n case \"not\":\n return {\n ...predicate,\n item: validatePredicate(predicate.item, shape, `${path}.item`, ctx),\n }\n case \"eq\":\n case \"neq\":\n case \"lt\":\n case \"lte\":\n case \"gt\":\n case \"gte\": {\n const { scalarKind: _authoredScalarKind, ...authoredPredicate } = predicate\n const scalarKind = resolveAndValidatePredicateProperty(\n predicate.propertyId,\n predicate.op,\n shape,\n path,\n ctx\n )\n validatePredicateValue(predicate.propertyId, predicate.value, shape, path, ctx)\n return {\n ...authoredPredicate,\n value: normalizeObjectQueryValue(predicate.value, scalarKind),\n ...(scalarKind ? { scalarKind } : {}),\n }\n }\n case \"in\": {\n const { scalarKind: _authoredScalarKind, ...authoredPredicate } = predicate\n const scalarKind = resolveAndValidatePredicateProperty(\n predicate.propertyId,\n predicate.op,\n shape,\n path,\n ctx\n )\n if (predicate.values.length === 0) {\n addIssue(ctx, path, \"empty_in_values\", \"Predicate 'in' must include at least one value\")\n }\n predicate.values.forEach((value, index) => {\n validatePredicateValue(predicate.propertyId, value, shape, `${path}.values[${index}]`, ctx)\n })\n return {\n ...authoredPredicate,\n values: predicate.values.map((value) => normalizeObjectQueryValue(value, scalarKind)),\n ...(scalarKind ? { scalarKind } : {}),\n }\n }\n case \"exists\":\n resolveAndValidatePredicateProperty(predicate.propertyId, predicate.op, shape, path, ctx)\n if (typeof predicate.value !== \"boolean\") {\n addIssue(ctx, path, \"invalid_exists_value\", \"Predicate 'exists' value must be boolean\")\n }\n return predicate\n case \"contains\":\n resolveAndValidatePredicateProperty(predicate.propertyId, predicate.op, shape, path, ctx)\n validateContainsValue(predicate.propertyId, predicate.value, shape, path, ctx)\n return predicate\n }\n}\n\nfunction resolveAndValidatePredicateProperty(\n propertyId: string,\n op: ObjectQueryPredicate[\"op\"],\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext\n): QueryScalarKind | undefined {\n const properties = getPropertiesForResult(propertyId, shape, path, ctx)\n if (properties.length === 0) return undefined\n const schemas: Schema[] = []\n\n for (const { objectType, property } of properties) {\n const schema = resolveSchemaForProperty(property, objectType.id, ctx, path)\n if (schema) schemas.push(schema)\n\n if (isPrimaryExactPredicate(property, op)) {\n continue\n }\n\n if (property.query?.searchable !== true || property.query.filterable !== true) {\n addIssue(\n ctx,\n path,\n \"property_not_filterable\",\n `Property '${propertyId}' on '${objectType.id}' must set query.searchable: true and query.filterable: true before it can be used in predicates`\n )\n continue\n }\n\n if (!schema) continue\n\n if ((op === \"lt\" || op === \"lte\" || op === \"gt\" || op === \"gte\") && !isSortableSchema(schema)) {\n addIssue(\n ctx,\n path,\n \"operator_not_supported_for_schema\",\n `Predicate '${op}' cannot be used with property '${propertyId}' on '${objectType.id}' because its schema is not orderable`\n )\n }\n\n if ((op === \"eq\" || op === \"neq\" || op === \"in\" || op === \"exists\") && !isExactSchema(schema)) {\n addIssue(\n ctx,\n path,\n \"operator_not_supported_for_schema\",\n `Predicate '${op}' cannot be used with property '${propertyId}' on '${objectType.id}' because its schema cannot be exact-matched`\n )\n }\n\n if (op === \"contains\" && !isContainsSchema(schema)) {\n addIssue(\n ctx,\n path,\n \"operator_not_supported_for_schema\",\n `Predicate 'contains' cannot be used with property '${propertyId}' on '${objectType.id}' because its schema is not string, array, or map`\n )\n }\n }\n\n if (op === \"exists\" || op === \"contains\") return undefined\n return resolveCommonQueryScalarKind(schemas, propertyId, path, ctx)\n}\n\nfunction normalizeObjectQueryValue(value: unknown, scalarKind: QueryScalarKind | undefined) {\n if (scalarKind !== \"decimal\" || typeof value !== \"string\") return value\n try {\n return normalizeDecimalValue(value)\n } catch {\n return value\n }\n}\n\nfunction resolveCommonQueryScalarKind(\n schemas: readonly Schema[],\n propertyId: string,\n path: string,\n ctx: QueryValidationContext\n): QueryScalarKind | undefined {\n const scalarKinds = schemas.map(queryScalarKindForSchema)\n if (scalarKinds.length === 0 || scalarKinds.some((kind) => kind === undefined)) {\n return undefined\n }\n\n const resolvedKinds = new Set(scalarKinds)\n if (resolvedKinds.size === 1) return scalarKinds[0]\n\n addIssue(\n ctx,\n path,\n \"incompatible_property_scalar_kinds\",\n `Property '${propertyId}' resolves to incompatible scalar schemas: ${[...resolvedKinds].join(\n \", \"\n )}`\n )\n return undefined\n}\n\nfunction queryScalarKindForSchema(schema: Schema): QueryScalarKind | undefined {\n if (typeof schema === \"string\") return schema === \"fileRef\" ? undefined : schema\n if (schema.type === \"enum\") return schema.valueType === \"integer\" ? \"integer\" : \"string\"\n return undefined\n}\n\nfunction validatePredicateValue(\n propertyId: string,\n value: unknown,\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext\n): void {\n for (const { objectType, property } of getPropertiesForResult(propertyId, shape, path, ctx, {\n reportMissing: false,\n })) {\n try {\n validatePropertyValue(property, value, `${objectType.id}.${property.id}`, ctx.valueTypesById)\n } catch (error) {\n addIssue(\n ctx,\n path,\n \"invalid_predicate_value\",\n error instanceof Error\n ? error.message\n : `Invalid value for property '${property.id}' on '${objectType.id}'`\n )\n }\n }\n}\n\nfunction validateContainsValue(\n propertyId: string,\n value: unknown,\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext\n): void {\n for (const { objectType, property } of getPropertiesForResult(propertyId, shape, path, ctx, {\n reportMissing: false,\n })) {\n const schema = resolveSchemaForProperty(property, objectType.id, ctx, path)\n if (!schema) continue\n\n if (typeof schema === \"string\") {\n if (schema === \"string\" || schema === \"uuid\") {\n if (typeof value !== \"string\") {\n addIssue(\n ctx,\n path,\n \"invalid_contains_value\",\n `Predicate 'contains' value for '${objectType.id}.${property.id}' must be a string`\n )\n }\n }\n continue\n }\n\n if (schema.type === \"array\") {\n try {\n validateSchemaValue(\n schema.items,\n value,\n `${objectType.id}.${property.id}[]`,\n ctx.valueTypesById\n )\n } catch (error) {\n addIssue(\n ctx,\n path,\n \"invalid_contains_value\",\n error instanceof Error\n ? error.message\n : `Invalid contains value for '${objectType.id}.${property.id}'`\n )\n }\n continue\n }\n\n if (schema.type === \"map\" && typeof value !== \"string\") {\n addIssue(\n ctx,\n path,\n \"invalid_contains_value\",\n `Predicate 'contains' value for '${objectType.id}.${property.id}' must be a map key string`\n )\n }\n }\n}\n\nfunction validateTextQuery(\n query: string,\n fields: readonly string[] | undefined,\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext\n): TextFieldResolution {\n if (query.trim().length === 0) {\n addIssue(ctx, path, \"empty_text_query\", \"Text query must not be empty\")\n }\n\n const fieldsByObjectType: Record<string, string[]> | undefined = fields ? undefined : {}\n\n for (const objectType of getObjectTypesForResult(shape, ctx)) {\n const fieldIds = fields ?? objectType.search?.defaultText\n if (!fieldIds || fieldIds.length === 0) {\n addIssue(\n ctx,\n path,\n \"missing_text_fields\",\n `Object type '${objectType.id}' must define search.defaultText or the text query must specify fields`\n )\n continue\n }\n\n if (fieldsByObjectType) fieldsByObjectType[objectType.id] = uniqueStrings(fieldIds)\n\n for (const fieldId of fieldIds) {\n const property = getProperty(objectType, fieldId)\n if (!property) {\n addIssue(\n ctx,\n path,\n \"unknown_text_field\",\n `Text query references unknown property '${fieldId}' on '${objectType.id}'`\n )\n continue\n }\n\n assertStaticSearchProperty(objectType.id, property, \"text query\", path, ctx)\n assertQueryFlag(objectType.id, property, \"text\", \"text query\", path, ctx)\n const schema = resolveSchemaForProperty(property, objectType.id, ctx, path)\n if (schema && !isTextSchema(schema)) {\n addIssue(\n ctx,\n path,\n \"text_field_not_string_like\",\n `Text query field '${fieldId}' on '${objectType.id}' must be string-like`\n )\n }\n }\n }\n\n return fieldsByObjectType ? { fieldsByObjectType } : {}\n}\n\nfunction validateVectorQuery(\n vector: readonly number[],\n propertyId: string,\n k: number,\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext\n): void {\n if (!Number.isInteger(k) || k <= 0) {\n addIssue(ctx, path, \"invalid_vector_k\", \"Vector query k must be a positive integer\")\n }\n\n if (vector.length === 0) {\n addIssue(ctx, path, \"empty_vector\", \"Vector query vector must not be empty\")\n }\n\n if (vector.some((value) => typeof value !== \"number\" || !Number.isFinite(value))) {\n addIssue(ctx, path, \"invalid_vector_value\", \"Vector query vector values must be finite numbers\")\n }\n\n for (const objectType of getObjectTypesForResult(shape, ctx)) {\n const property = getProperty(objectType, propertyId)\n if (!property) {\n addIssue(\n ctx,\n path,\n \"unknown_vector_property\",\n `Vector query references unknown property '${propertyId}' on '${objectType.id}'`\n )\n continue\n }\n\n assertStaticSearchProperty(objectType.id, property, \"vector query\", path, ctx)\n assertQueryFlag(objectType.id, property, \"vector\", \"vector query\", path, ctx)\n\n if (objectType.search?.vector?.property !== propertyId) {\n addIssue(\n ctx,\n path,\n \"vector_profile_missing\",\n `Object type '${objectType.id}' must declare search.vector.property '${propertyId}' before vector search can use it`\n )\n }\n\n const schema = resolveSchemaForProperty(property, objectType.id, ctx, path)\n if (schema && !isVectorSchema(schema, ctx)) {\n addIssue(\n ctx,\n path,\n \"vector_property_not_numeric_array\",\n `Vector query property '${propertyId}' on '${objectType.id}' must be a numeric array`\n )\n }\n }\n}\n\nfunction validateTraverse(\n linkId: string,\n direction: \"outgoing\" | \"incoming\",\n sourceObjectTypeId: string | undefined,\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext\n): ObjectQueryResultShape {\n if (!linkId) {\n addIssue(ctx, path, \"missing_link_id\", \"traverse.linkId is required\")\n return { objectTypeIds: [] }\n }\n\n if (direction === \"outgoing\") {\n if (sourceObjectTypeId !== undefined) {\n addIssue(\n ctx,\n path,\n \"traverse_source_not_applicable\",\n \"traverse.sourceObjectTypeId only applies to incoming traversal\"\n )\n }\n return validateOutgoingTraverse(linkId, shape, path, ctx)\n }\n\n return validateIncomingTraverse(linkId, sourceObjectTypeId, shape, path, ctx)\n}\n\nfunction validateOutgoingTraverse(\n linkId: string,\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext\n): ObjectQueryResultShape {\n const targetTypeIds: string[] = []\n\n for (const objectType of getObjectTypesForResult(shape, ctx)) {\n const link = objectType.links.find((candidate) => candidate.id === linkId)\n if (!link) {\n addIssue(\n ctx,\n path,\n \"unknown_link\",\n `Outgoing traversal references unknown link '${linkId}' on '${objectType.id}'`\n )\n continue\n }\n\n if (link.targetObjectTypeId === \"*\") {\n addIssue(\n ctx,\n path,\n \"wildcard_traverse_target\",\n `Outgoing traversal over wildcard link '${objectType.id}.${linkId}' cannot infer a target object type`\n )\n continue\n }\n\n const declaredTargets = Array.isArray(link.targetObjectTypeId)\n ? link.targetObjectTypeId\n : [link.targetObjectTypeId]\n\n for (const targetId of declaredTargets) {\n if (!ctx.ontology.getObjectTypeById(targetId)) {\n addIssue(\n ctx,\n path,\n \"unknown_link_target\",\n `Outgoing traversal over '${objectType.id}.${linkId}' targets unknown object type '${targetId}'`\n )\n } else {\n targetTypeIds.push(targetId)\n }\n }\n }\n\n return { objectTypeIds: uniqueStrings(targetTypeIds) }\n}\n\nfunction validateIncomingTraverse(\n linkId: string,\n sourceObjectTypeId: string | undefined,\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext\n): ObjectQueryResultShape {\n let candidateTypes = ctx.ontology.listObjectTypes()\n if (sourceObjectTypeId !== undefined) {\n const sourceType = ctx.ontology.getObjectTypeById(sourceObjectTypeId)\n if (!sourceType) {\n addIssue(\n ctx,\n path,\n \"unknown_traverse_source\",\n `Incoming traversal references unknown source object type '${sourceObjectTypeId}'`\n )\n return { objectTypeIds: [] }\n }\n candidateTypes = [sourceType]\n }\n\n const sourceTypeIds: string[] = []\n\n for (const sourceType of candidateTypes) {\n const link = sourceType.links.find((candidate) => candidate.id === linkId)\n if (!link) continue\n\n if (link.targetObjectTypeId === \"*\") {\n sourceTypeIds.push(sourceType.id)\n continue\n }\n\n const matches = shape.objectTypeIds.some((targetTypeId) =>\n ctx.ontology.isValidLinkTarget(link.targetObjectTypeId, targetTypeId)\n )\n if (matches) sourceTypeIds.push(sourceType.id)\n }\n\n if (sourceTypeIds.length === 0) {\n addIssue(\n ctx,\n path,\n \"incoming_link_not_found\",\n `Incoming traversal found no source object types with link '${linkId}' targeting ${shape.objectTypeIds.join(\n \" | \"\n )}`\n )\n }\n\n return { objectTypeIds: uniqueStrings(sourceTypeIds) }\n}\n\nfunction validateExpansions(\n expansions: readonly ObjectExpansion[],\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext\n): ObjectExpansion[] {\n return expansions.map((expansion, index) =>\n validateExpansion(expansion, shape, `${path}[${index}]`, ctx)\n )\n}\n\nfunction validateExpansion(\n expansion: ObjectExpansion,\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext\n): ObjectExpansion {\n if (!expansion.linkId) {\n addIssue(ctx, path, \"missing_expand_link\", \"expand.linkId is required\")\n return expansion\n }\n\n const targetShape =\n expansion.direction === \"incoming\"\n ? resolveIncomingExpansionTargets(\n expansion.linkId,\n expansion.sourceObjectTypeId,\n shape,\n path,\n ctx\n )\n : resolveOutgoingExpansionTargets(\n expansion.linkId,\n expansion.sourceObjectTypeId,\n shape,\n path,\n ctx\n )\n\n // Expansion targets are touched types: the principal must be able to `view`\n // every type a query hydrates, exactly like `start`/`traverse`. `dispatch`'s\n // automatic fold only covers result types, and expansion targets are not in\n // the result — so add them here (recursively, via the nested call below).\n for (const targetTypeId of targetShape.objectTypeIds) {\n ctx.touchedObjectTypeIds.add(targetTypeId)\n }\n\n validateExpansionLimit(expansion.limit, path, ctx)\n const orderBy = expansion.orderBy\n ? validateSortFields(expansion.orderBy, targetShape, `${path}.orderBy`, ctx)\n : undefined\n const expand = expansion.expand\n ? validateExpansions(expansion.expand, targetShape, `${path}.expand`, ctx)\n : undefined\n\n return { ...expansion, orderBy, expand }\n}\n\nfunction resolveOutgoingExpansionTargets(\n linkId: string,\n sourceObjectTypeId: string | undefined,\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext\n): ObjectQueryResultShape {\n if (sourceObjectTypeId !== undefined) {\n addIssue(\n ctx,\n path,\n \"expand_source_not_applicable\",\n \"expand.sourceObjectTypeId only applies to incoming expansion\"\n )\n }\n\n const targetTypeIds: string[] = []\n let foundOnAnyType = false\n\n for (const objectType of getObjectTypesForResult(shape, ctx)) {\n const link = objectType.links.find((candidate) => candidate.id === linkId)\n if (!link) continue\n foundOnAnyType = true\n\n if (link.targetObjectTypeId === \"*\") {\n addIssue(\n ctx,\n path,\n \"wildcard_expand_target\",\n `Expansion over wildcard link '${objectType.id}.${linkId}' cannot infer a target object type`\n )\n continue\n }\n\n const declaredTargets = Array.isArray(link.targetObjectTypeId)\n ? link.targetObjectTypeId\n : [link.targetObjectTypeId]\n\n for (const targetId of declaredTargets) {\n if (!ctx.ontology.getObjectTypeById(targetId)) {\n addIssue(\n ctx,\n path,\n \"unknown_expand_target\",\n `Expansion over '${objectType.id}.${linkId}' targets unknown object type '${targetId}'`\n )\n } else {\n targetTypeIds.push(targetId)\n }\n }\n }\n\n // A link absent from every result type is the \"abandoned by a later traverse\"\n // case: expands hoist above traverse, so an expand on a type the traverse\n // replaced cannot resolve its link on the final result type.\n if (!foundOnAnyType) {\n addIssue(\n ctx,\n path,\n \"unknown_expand_link\",\n `Expansion references link '${linkId}' not present on result type ${shape.objectTypeIds.join(\n \" | \"\n )} (an expand abandoned by a later traverse?)`\n )\n }\n\n return { objectTypeIds: uniqueStrings(targetTypeIds) }\n}\n\nfunction resolveIncomingExpansionTargets(\n linkId: string,\n sourceObjectTypeId: string | undefined,\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext\n): ObjectQueryResultShape {\n let candidateTypes = ctx.ontology.listObjectTypes()\n if (sourceObjectTypeId !== undefined) {\n const sourceType = ctx.ontology.getObjectTypeById(sourceObjectTypeId)\n if (!sourceType) {\n addIssue(\n ctx,\n path,\n \"unknown_expand_source\",\n `Incoming expansion references unknown source object type '${sourceObjectTypeId}'`\n )\n return { objectTypeIds: [] }\n }\n candidateTypes = [sourceType]\n }\n\n const sourceTypeIds: string[] = []\n\n for (const sourceType of candidateTypes) {\n const link = sourceType.links.find((candidate) => candidate.id === linkId)\n if (!link) continue\n\n if (link.targetObjectTypeId === \"*\") {\n sourceTypeIds.push(sourceType.id)\n continue\n }\n\n const matches = shape.objectTypeIds.some((targetTypeId) =>\n ctx.ontology.isValidLinkTarget(link.targetObjectTypeId, targetTypeId)\n )\n if (matches) sourceTypeIds.push(sourceType.id)\n }\n\n if (sourceTypeIds.length === 0) {\n addIssue(\n ctx,\n path,\n \"incoming_expand_link_not_found\",\n `Incoming expansion found no source object types with link '${linkId}' targeting ${shape.objectTypeIds.join(\n \" | \"\n )}`\n )\n }\n\n return { objectTypeIds: uniqueStrings(sourceTypeIds) }\n}\n\nfunction validateExpansionLimit(\n limit: number | undefined,\n path: string,\n ctx: QueryValidationContext\n): void {\n if (limit === undefined) return\n if (!Number.isInteger(limit) || limit < 0) {\n addIssue(\n ctx,\n `${path}.limit`,\n \"invalid_expand_limit\",\n \"expand.limit must be a non-negative integer\"\n )\n }\n}\n\nfunction validateSet(\n inputs: readonly ObjectQuery[],\n op: \"union\" | \"intersect\" | \"subtract\",\n path: string,\n ctx: QueryValidationContext\n): QueryValidationResult {\n if (inputs.length === 0) {\n addIssue(ctx, path, \"empty_set\", `Set operation '${op}' must include at least one input`)\n return { result: { objectTypeIds: [] }, query: { kind: \"set\", op, inputs } }\n }\n\n const results = inputs.map((input, index) =>\n validateQueryNode(input, `${path}.inputs[${index}]`, ctx)\n )\n const first = results[0]?.result ?? { objectTypeIds: [] }\n const expected = keyForTypeIds(first.objectTypeIds)\n\n results.forEach((result, index) => {\n if (keyForTypeIds(result.result.objectTypeIds) !== expected) {\n addIssue(\n ctx,\n `${path}.inputs[${index}]`,\n \"incompatible_set_input\",\n `Set operation '${op}' inputs must produce the same object type set`\n )\n }\n })\n\n return {\n result: first,\n query: { kind: \"set\", op, inputs: results.map((result) => result.query) },\n }\n}\n\nfunction validateSortFields(\n fields: readonly ObjectQuerySortField[],\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext\n): ObjectQuerySortField[] {\n if (fields.length === 0) {\n addIssue(ctx, path, \"empty_sort\", \"Sort must include at least one field\")\n return []\n }\n\n const seen = new Set<string>()\n return fields.map((field, index) => {\n if (field.direction && field.direction !== \"asc\" && field.direction !== \"desc\") {\n addIssue(\n ctx,\n `${path}.fields[${index}]`,\n \"invalid_sort_direction\",\n \"Sort direction must be asc or desc\"\n )\n }\n\n const key = field.kind === \"property\" ? `property:${field.propertyId}` : \"relevance\"\n if (seen.has(key)) {\n addIssue(\n ctx,\n `${path}.fields[${index}]`,\n \"duplicate_sort_field\",\n `Duplicate sort field '${key}'`\n )\n }\n seen.add(key)\n\n if (field.kind === \"relevance\") return field\n\n const { scalarKind: _authoredScalarKind, ...authoredField } = field\n\n const schemas: Schema[] = []\n\n for (const { objectType, property } of getPropertiesForResult(\n field.propertyId,\n shape,\n `${path}.fields[${index}]`,\n ctx\n )) {\n if (property.query?.searchable !== true || property.query.sortable !== true) {\n addIssue(\n ctx,\n `${path}.fields[${index}]`,\n \"property_not_sortable\",\n `Property '${property.id}' on '${objectType.id}' must set query.searchable: true and query.sortable: true before it can be sorted`\n )\n continue\n }\n\n const schema = resolveSchemaForProperty(\n property,\n objectType.id,\n ctx,\n `${path}.fields[${index}]`\n )\n if (schema) schemas.push(schema)\n if (schema && !isSortableSchema(schema)) {\n addIssue(\n ctx,\n `${path}.fields[${index}]`,\n \"sort_field_not_orderable\",\n `Sort field '${property.id}' on '${objectType.id}' is not orderable`\n )\n }\n }\n\n const scalarKind = resolveCommonQueryScalarKind(\n schemas,\n field.propertyId,\n `${path}.fields[${index}]`,\n ctx\n )\n return { ...authoredField, ...(scalarKind ? { scalarKind } : {}) }\n })\n}\n\nfunction validateLimit(limit: number, path: string, ctx: QueryValidationContext): void {\n if (!Number.isInteger(limit) || limit < 0) {\n addIssue(ctx, path, \"invalid_limit\", \"limit must be a non-negative integer\")\n } else if (limit > ctx.maxLimit) {\n addIssue(ctx, path, \"limit_too_large\", `limit must be <= ${ctx.maxLimit}`)\n }\n}\n\nfunction validatePage(\n pageSize: number,\n pageToken: string | undefined,\n path: string,\n ctx: QueryValidationContext\n): void {\n if (!Number.isInteger(pageSize) || pageSize <= 0) {\n addIssue(ctx, path, \"invalid_page_size\", \"pageSize must be a positive integer\")\n } else if (pageSize > ctx.maxPageSize) {\n addIssue(ctx, path, \"page_size_too_large\", `pageSize must be <= ${ctx.maxPageSize}`)\n }\n\n if (pageToken !== undefined && pageToken.length === 0) {\n addIssue(ctx, path, \"empty_page_token\", \"pageToken must not be empty when provided\")\n }\n}\n\nfunction validateProjection(\n properties: readonly string[] | undefined,\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext\n): void {\n if (!properties) return\n if (properties.length === 0) {\n addIssue(ctx, path, \"empty_projection\", \"project.properties must not be empty when provided\")\n }\n\n const seen = new Set<string>()\n properties.forEach((propertyId, index) => {\n if (seen.has(propertyId)) {\n addIssue(\n ctx,\n `${path}.properties[${index}]`,\n \"duplicate_projection_property\",\n `Duplicate projected property '${propertyId}'`\n )\n }\n seen.add(propertyId)\n getPropertiesForResult(propertyId, shape, `${path}.properties[${index}]`, ctx)\n })\n}\n\nfunction getObjectTypesForResult(\n shape: ObjectQueryResultShape,\n ctx: QueryValidationContext\n): ObjectType[] {\n const objectTypes: ObjectType[] = []\n for (const objectTypeId of shape.objectTypeIds) {\n const objectType = ctx.ontology.getObjectTypeById(objectTypeId)\n if (objectType) objectTypes.push(objectType)\n }\n return objectTypes\n}\n\nfunction getPropertiesForResult(\n propertyId: string,\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext,\n options: { reportMissing?: boolean } = {}\n): { objectType: ObjectType; property: Property }[] {\n const results: { objectType: ObjectType; property: Property }[] = []\n\n for (const objectType of getObjectTypesForResult(shape, ctx)) {\n const property = getProperty(objectType, propertyId)\n if (!property) {\n if (options.reportMissing === false) {\n continue\n }\n addIssue(\n ctx,\n path,\n \"unknown_property\",\n `Property '${propertyId}' does not exist on object type '${objectType.id}'`\n )\n continue\n }\n results.push({ objectType, property })\n }\n\n return results\n}\n\nfunction getProperty(objectType: ObjectType, propertyId: string): Property | undefined {\n return objectType.properties.find((property) => property.id === propertyId)\n}\n\nfunction assertStaticSearchProperty(\n objectTypeId: string,\n property: Property,\n context: string,\n path: string,\n ctx: QueryValidationContext\n): void {\n if (property.mode === \"telemetry\") {\n addIssue(\n ctx,\n path,\n \"telemetry_search_property\",\n `${context} references telemetry property '${property.id}' on '${objectTypeId}'. Search can only reference static properties because telemetry latest values are not object-query indexed.`\n )\n }\n}\n\nfunction assertQueryFlag(\n objectTypeId: string,\n property: Property,\n flag: \"text\" | \"vector\",\n context: string,\n path: string,\n ctx: QueryValidationContext\n): void {\n if (property.query?.searchable === true && property.query[flag] === true) return\n addIssue(\n ctx,\n path,\n \"query_field_not_enabled\",\n `${context} field '${property.id}' on '${objectTypeId}' must set query.searchable: true and query.${flag}: true`\n )\n}\n\nfunction resolveSchemaForProperty(\n property: Property,\n objectTypeId: string,\n ctx: QueryValidationContext,\n path: string\n): Schema | null {\n try {\n return resolveSchema(property.schema, ctx.valueTypesById)\n } catch (error) {\n addIssue(\n ctx,\n path,\n \"unresolved_property_schema\",\n error instanceof Error\n ? error.message\n : `Could not resolve schema for '${objectTypeId}.${property.id}'`\n )\n return null\n }\n}\n\nfunction resolveSchema(\n schema: Schema,\n valueTypesById: ReadonlyMap<string, ValueType>,\n seenValueTypeIds = new Set<string>()\n): Schema {\n if (typeof schema === \"string\") return schema\n if (schema.type !== \"valueTypeRef\") return schema\n if (seenValueTypeIds.has(schema.valueTypeId)) {\n throw new Error(`Circular valueTypeRef '${schema.valueTypeId}'`)\n }\n\n const resolved = schema._resolved ?? valueTypesById.get(schema.valueTypeId)?.schema\n if (!resolved) {\n throw new Error(`Unknown valueTypeRef '${schema.valueTypeId}'`)\n }\n\n seenValueTypeIds.add(schema.valueTypeId)\n return resolveSchema(resolved, valueTypesById, seenValueTypeIds)\n}\n\nfunction isPrimaryExactPredicate(property: Property, op: ObjectQueryPredicate[\"op\"]): boolean {\n return property.primary === true && (op === \"eq\" || op === \"in\")\n}\n\nfunction isTextSchema(schema: Schema): boolean {\n if (schema === \"string\") return true\n return typeof schema !== \"string\" && schema.type === \"enum\" && schema.valueType === \"string\"\n}\n\nfunction isExactSchema(schema: Schema): boolean {\n if (typeof schema === \"string\") return schema !== \"fileRef\"\n return schema.type === \"enum\"\n}\n\nfunction isSortableSchema(schema: Schema): boolean {\n if (typeof schema === \"string\") {\n return (\n schema === \"string\" ||\n schema === \"uuid\" ||\n schema === \"integer\" ||\n schema === \"double\" ||\n schema === \"decimal\" ||\n schema === \"date\" ||\n schema === \"timestamp\"\n )\n }\n return schema.type === \"enum\"\n}\n\nfunction isContainsSchema(schema: Schema): boolean {\n return (\n schema === \"string\" ||\n schema === \"uuid\" ||\n (typeof schema !== \"string\" && (schema.type === \"array\" || schema.type === \"map\"))\n )\n}\n\nfunction isVectorSchema(schema: Schema, ctx: QueryValidationContext): boolean {\n if (typeof schema === \"string\") return false\n if (schema.type !== \"array\") return false\n const itemSchema = resolveSchema(schema.items, ctx.valueTypesById)\n return itemSchema === \"integer\" || itemSchema === \"double\" || itemSchema === \"decimal\"\n}\n\nfunction keyForTypeIds(typeIds: readonly string[]): string {\n return uniqueStrings(typeIds).sort().join(\"\\0\")\n}\n\nfunction uniqueStrings(values: readonly string[]): string[] {\n return [...new Set(values)]\n}\n\nfunction addIssue(ctx: QueryValidationContext, path: string, code: string, message: string): void {\n ctx.issues.push({ path, code, message })\n}\n",
|
|
7
|
-
"import { type AuthorizationContext, assertAuthorized } from \"../../authorization\"\nimport type { OntologyRegistry } from \"../../ontology\"\nimport type {\n CountObjectsResult,\n ExistsObjectsResult,\n ExpandedLinkValue,\n ExpandedObjectRow,\n FacetObjectsResult,\n ObjectFacetRequest,\n ObjectFacetResult,\n ObjectLinkRow,\n ObjectQueryCapabilities,\n ObjectRow,\n ObjectRowLinks,\n ObjectStorage,\n QueryObjectsResult,\n} from \"../../storage\"\nimport {\n ObjectQueryExecutionError,\n ObjectQueryPlanningError,\n ObjectQueryValidationError,\n} from \"./errors\"\nimport type {\n ObjectExpansion,\n ObjectQuery,\n ObjectQueryPredicate,\n ObjectQueryResultShape,\n ObjectQuerySortField,\n} from \"./ir\"\nimport { normalizeObjectQuery } from \"./normalize\"\nimport { type ObjectQueryPlan, type ObjectQueryPlanningOptions, planObjectQuery } from \"./planner\"\nimport { compareQueryScalarValues, queryScalarValuesEqual } from \"./scalar-values\"\nimport {\n type ObjectQueryValidationIssue,\n resolveObjectQueryResultShape,\n type ValidatedObjectQuery,\n validateObjectQuery,\n} from \"./validate\"\n\nexport interface QueryExecutorOptions\n extends Omit<\n ObjectQueryPlanningOptions,\n | \"capabilities\"\n | \"operation\"\n | \"hasQueryObjects\"\n | \"hasCountObjects\"\n | \"hasExistsObjects\"\n | \"hasFacetObjects\"\n > {\n ontology: OntologyRegistry\n storage: ObjectStorage\n maxLimit?: number\n maxPageSize?: number\n maxFacetLimit?: number\n /**\n * Per-parent cap on how many links a single `expand` hydrates, applied as a\n * top-N trim after `orderBy` (mirrors `maxLimit` for the result set). An\n * expansion's own `limit` narrows this further; the cap is the backstop.\n */\n maxExpansionFanout?: number\n /** When present, every object type the query touches must be viewable. */\n authorization?: AuthorizationContext\n}\n\nexport interface ExecuteObjectQueryInput {\n projectId: string\n query: ObjectQuery\n includeTotal?: boolean\n}\n\nexport interface ExecuteObjectQueryResult extends QueryObjectsResult {\n plan: ObjectQueryPlan\n}\n\nexport interface ExecuteObjectCountInput {\n projectId: string\n query: ObjectQuery\n}\n\nexport interface ExecuteObjectCountResult extends CountObjectsResult {\n plan: ObjectQueryPlan\n}\n\nexport interface ExecuteObjectExistsInput {\n projectId: string\n query: ObjectQuery\n}\n\nexport interface ExecuteObjectExistsResult extends ExistsObjectsResult {\n plan: ObjectQueryPlan\n}\n\nexport interface ExecuteObjectFacetsInput {\n projectId: string\n query: ObjectQuery\n facets: readonly ObjectFacetRequest[]\n}\n\nexport interface ExecuteObjectFacetsResult extends FacetObjectsResult {\n plan: ObjectQueryPlan\n}\n\ntype FallbackEntry = {\n row: ObjectRow\n order: number\n}\n\ntype FallbackEvaluation = {\n entries: FallbackEntry[]\n total: number\n hasMore: boolean\n nextPageToken?: string\n}\n\nconst DEFAULT_MAX_FALLBACK_ROWS = 1_000\nconst DEFAULT_MAX_FACET_LIMIT = 1_000\nconst DEFAULT_MAX_EXPANSION_FANOUT = 1_000\n\n// Fallback page tokens are local to the core executor. Provider page tokens are\n// opaque and should only be interpreted by the provider that returned them.\nconst PAGE_TOKEN_PREFIX = \"offset:\"\n\nexport class QueryExecutor {\n constructor(private readonly options: QueryExecutorOptions) {}\n\n async execute(input: ExecuteObjectQueryInput): Promise<ExecuteObjectQueryResult> {\n return executeObjectQuery(input, this.options)\n }\n\n async count(input: ExecuteObjectCountInput): Promise<ExecuteObjectCountResult> {\n return countObjects(input, this.options)\n }\n\n async exists(input: ExecuteObjectExistsInput): Promise<ExecuteObjectExistsResult> {\n return existsObjects(input, this.options)\n }\n\n async facets(input: ExecuteObjectFacetsInput): Promise<ExecuteObjectFacetsResult> {\n return facetObjects(input, this.options)\n }\n}\n\nexport async function executeObjectQuery(\n input: ExecuteObjectQueryInput,\n options: QueryExecutorOptions\n): Promise<ExecuteObjectQueryResult> {\n const normalized = normalizeObjectQuery(input.query)\n const validated = validateObjectQuery(normalized, {\n ontology: options.ontology,\n maxLimit: options.maxLimit,\n maxPageSize: options.maxPageSize,\n normalize: false,\n })\n assertQueryViewable(validated, options.authorization)\n const capabilities = options.storage.queryCapabilities()\n const hasQueryObjects = typeof options.storage.queryObjects === \"function\"\n const hasCountObjects = typeof options.storage.countObjects === \"function\"\n const hasExistsObjects = typeof options.storage.existsObjects === \"function\"\n const hasFacetObjects = typeof options.storage.facetObjects === \"function\"\n const plannedQuery = expandPushdownQuery(\n validated.query,\n options.ontology,\n capabilities,\n {\n hasQueryObjects,\n hasCountObjects,\n hasExistsObjects,\n hasFacetObjects,\n allowFallback: options.allowFallback,\n maxFallbackRows: options.maxFallbackRows,\n requiresExplicitFallbackBound: options.requiresExplicitFallbackBound,\n },\n options.maxExpansionFanout\n )\n const plan = planObjectQuery(plannedQuery, {\n capabilities,\n hasQueryObjects,\n hasCountObjects,\n hasExistsObjects,\n hasFacetObjects,\n allowFallback: options.allowFallback,\n maxFallbackRows: options.maxFallbackRows,\n requiresExplicitFallbackBound: options.requiresExplicitFallbackBound,\n })\n\n if (plan.mode === \"rejected\") {\n throw new ObjectQueryPlanningError(plan.issues)\n }\n\n if (plan.mode === \"pushdown\") {\n if (!options.storage.queryObjects) {\n throw new ObjectQueryPlanningError(plan.providerIssues)\n }\n const result = await options.storage.queryObjects({\n projectId: input.projectId,\n query: plan.query,\n includeTotal: input.includeTotal,\n })\n return { ...result, plan }\n }\n\n // The planner admits only the small fallback subset; unsupported cases below\n // remain as defensive guards against future planner drift.\n const fallback = await executeFallbackQuery(input.projectId, validated.query, options, {\n includeTotal: input.includeTotal,\n })\n return { ...fallback, plan }\n}\n\nexport async function countObjects(\n input: ExecuteObjectCountInput,\n options: QueryExecutorOptions\n): Promise<ExecuteObjectCountResult> {\n const normalized = normalizeObjectQuery(input.query)\n const validated = validateObjectQuery(normalized, {\n ontology: options.ontology,\n maxLimit: options.maxLimit,\n maxPageSize: options.maxPageSize,\n normalize: false,\n })\n assertQueryViewable(validated, options.authorization)\n const capabilities = options.storage.queryCapabilities()\n const hasQueryObjects = typeof options.storage.queryObjects === \"function\"\n const hasCountObjects = typeof options.storage.countObjects === \"function\"\n const hasExistsObjects = typeof options.storage.existsObjects === \"function\"\n const hasFacetObjects = typeof options.storage.facetObjects === \"function\"\n const aggregateQuery = stripOuterRowShape(validated.query)\n const plannedQuery = expandPushdownQuery(aggregateQuery, options.ontology, capabilities, {\n operation: \"countObjects\",\n hasQueryObjects,\n hasCountObjects,\n hasExistsObjects,\n hasFacetObjects,\n allowFallback: options.allowFallback,\n maxFallbackRows: options.maxFallbackRows,\n requiresExplicitFallbackBound: options.requiresExplicitFallbackBound,\n })\n const plan = planObjectQuery(plannedQuery, {\n capabilities,\n operation: \"countObjects\",\n hasQueryObjects,\n hasCountObjects,\n hasExistsObjects,\n hasFacetObjects,\n allowFallback: options.allowFallback,\n maxFallbackRows: options.maxFallbackRows,\n requiresExplicitFallbackBound: options.requiresExplicitFallbackBound,\n })\n\n if (plan.mode === \"rejected\") {\n throw new ObjectQueryPlanningError(plan.issues)\n }\n\n if (plan.mode === \"pushdown\") {\n if (!options.storage.countObjects) {\n throw new ObjectQueryPlanningError(plan.providerIssues)\n }\n const result = await options.storage.countObjects({\n projectId: input.projectId,\n query: plan.query,\n })\n return { ...result, plan }\n }\n\n const maxRows = options.maxFallbackRows ?? DEFAULT_MAX_FALLBACK_ROWS\n const evaluation = await evaluateFallbackQuery(input.projectId, aggregateQuery, options, maxRows)\n return { count: evaluation.total, plan }\n}\n\nexport async function existsObjects(\n input: ExecuteObjectExistsInput,\n options: QueryExecutorOptions\n): Promise<ExecuteObjectExistsResult> {\n const normalized = normalizeObjectQuery(input.query)\n const validated = validateObjectQuery(normalized, {\n ontology: options.ontology,\n maxLimit: options.maxLimit,\n maxPageSize: options.maxPageSize,\n normalize: false,\n })\n assertQueryViewable(validated, options.authorization)\n const capabilities = options.storage.queryCapabilities()\n const hasQueryObjects = typeof options.storage.queryObjects === \"function\"\n const hasCountObjects = typeof options.storage.countObjects === \"function\"\n const hasExistsObjects = typeof options.storage.existsObjects === \"function\"\n const hasFacetObjects = typeof options.storage.facetObjects === \"function\"\n const aggregateQuery = stripOuterRowShape(validated.query)\n const plannedQuery = expandPushdownQuery(aggregateQuery, options.ontology, capabilities, {\n operation: \"existsObjects\",\n hasQueryObjects,\n hasCountObjects,\n hasExistsObjects,\n hasFacetObjects,\n allowFallback: options.allowFallback,\n maxFallbackRows: options.maxFallbackRows,\n requiresExplicitFallbackBound: options.requiresExplicitFallbackBound,\n })\n const plan = planObjectQuery(plannedQuery, {\n capabilities,\n operation: \"existsObjects\",\n hasQueryObjects,\n hasCountObjects,\n hasExistsObjects,\n hasFacetObjects,\n allowFallback: options.allowFallback,\n maxFallbackRows: options.maxFallbackRows,\n requiresExplicitFallbackBound: options.requiresExplicitFallbackBound,\n })\n\n if (plan.mode === \"rejected\") {\n throw new ObjectQueryPlanningError(plan.issues)\n }\n\n if (plan.mode === \"pushdown\") {\n if (!options.storage.existsObjects) {\n throw new ObjectQueryPlanningError(plan.providerIssues)\n }\n const result = await options.storage.existsObjects({\n projectId: input.projectId,\n query: plan.query,\n })\n return { ...result, plan }\n }\n\n const maxRows = options.maxFallbackRows ?? DEFAULT_MAX_FALLBACK_ROWS\n const evaluation = await evaluateFallbackQuery(input.projectId, aggregateQuery, options, maxRows)\n return { exists: evaluation.total > 0, plan }\n}\n\nexport async function facetObjects(\n input: ExecuteObjectFacetsInput,\n options: QueryExecutorOptions\n): Promise<ExecuteObjectFacetsResult> {\n const normalized = normalizeObjectQuery(input.query)\n const validated = validateObjectQuery(normalized, {\n ontology: options.ontology,\n maxLimit: options.maxLimit,\n maxPageSize: options.maxPageSize,\n normalize: false,\n })\n assertQueryViewable(validated, options.authorization)\n const facets = validateFacetRequests(input.facets, validated.result.objectTypeIds, options)\n const aggregateQuery = stripOuterRowShape(validated.query)\n const capabilities = options.storage.queryCapabilities()\n const hasQueryObjects = typeof options.storage.queryObjects === \"function\"\n const hasCountObjects = typeof options.storage.countObjects === \"function\"\n const hasExistsObjects = typeof options.storage.existsObjects === \"function\"\n const hasFacetObjects = typeof options.storage.facetObjects === \"function\"\n const plannedQuery = expandPushdownQuery(aggregateQuery, options.ontology, capabilities, {\n operation: \"facetObjects\",\n hasQueryObjects,\n hasCountObjects,\n hasExistsObjects,\n hasFacetObjects,\n allowFallback: options.allowFallback,\n maxFallbackRows: options.maxFallbackRows,\n requiresExplicitFallbackBound: options.requiresExplicitFallbackBound,\n })\n const plan = planObjectQuery(plannedQuery, {\n capabilities,\n operation: \"facetObjects\",\n hasQueryObjects,\n hasCountObjects,\n hasExistsObjects,\n hasFacetObjects,\n allowFallback: options.allowFallback,\n maxFallbackRows: options.maxFallbackRows,\n requiresExplicitFallbackBound: options.requiresExplicitFallbackBound,\n })\n\n if (plan.mode === \"rejected\") {\n throw new ObjectQueryPlanningError(plan.issues)\n }\n\n if (plan.mode === \"pushdown\") {\n if (!options.storage.facetObjects) {\n throw new ObjectQueryPlanningError(plan.providerIssues)\n }\n const result = await options.storage.facetObjects({\n projectId: input.projectId,\n query: plan.query,\n facets,\n })\n return { ...result, plan }\n }\n\n const maxRows = options.maxFallbackRows ?? DEFAULT_MAX_FALLBACK_ROWS\n const evaluation = await evaluateFallbackQuery(input.projectId, aggregateQuery, options, maxRows)\n return {\n facets: buildFacetResults(\n evaluation.entries.map((entry) => entry.row),\n facets\n ),\n plan,\n }\n}\n\n// Authorization happens at planning time: a scoped query must hold a view\n// grant for every object type it touches, before any storage call runs.\nfunction assertQueryViewable(\n validated: ValidatedObjectQuery,\n authorization: AuthorizationContext | undefined\n): void {\n assertAuthorized(\n { authorization },\n { kind: \"object.query\", touchedObjectTypeIds: validated.touchedObjectTypeIds }\n )\n}\n\ninterface ExpansionResolutionContext {\n ontology: OntologyRegistry\n maxExpansionFanout: number | undefined\n}\n\nfunction expandPushdownQuery(\n query: ObjectQuery,\n ontology: OntologyRegistry,\n capabilities: ObjectQueryCapabilities,\n planning: Omit<ObjectQueryPlanningOptions, \"capabilities\">,\n maxExpansionFanout?: number\n): ObjectQuery {\n // Resolve each expansion's cardinality and effective per-parent limit from the\n // ontology so a provider can push the graph read down without one. The planner\n // only admits expand pushdown once every expansion carries a cardinality, so a\n // mixed/unresolved expansion (e.g. a polymorphic parent whose branches\n // disagree) cleanly stays on the fallback.\n const ctx: ExpansionResolutionContext = { ontology, maxExpansionFanout }\n const annotated = resolveExpansions(query, ctx)\n const expanded = expandIncludeSubtypes(annotated, ontology)\n if (expanded === annotated) return annotated\n\n const plan = planObjectQuery(expanded, { ...planning, capabilities, allowFallback: false })\n return plan.mode === \"pushdown\" ? expanded : annotated\n}\n\n// Walk to the (normalized, outermost) expand node and annotate every expansion\n// with its resolved cardinality and bounded limit. Output-shaping only — never\n// changes which objects match — so it composes with `expandIncludeSubtypes`.\nfunction resolveExpansions(query: ObjectQuery, ctx: ExpansionResolutionContext): ObjectQuery {\n switch (query.kind) {\n case \"expand\": {\n const parentShape = safeResultShape(query.input, ctx.ontology)\n return {\n ...query,\n input: resolveExpansions(query.input, ctx),\n expansions: query.expansions.map((expansion) =>\n annotateExpansion(expansion, parentShape, ctx)\n ),\n }\n }\n case \"start\":\n return query\n case \"set\":\n return {\n ...query,\n inputs: query.inputs.map((input) => resolveExpansions(input, ctx)),\n }\n case \"filter\":\n case \"text\":\n case \"vector\":\n case \"traverse\":\n case \"sort\":\n case \"limit\":\n case \"page\":\n case \"project\":\n return { ...query, input: resolveExpansions(query.input, ctx) }\n }\n}\n\nfunction annotateExpansion(\n expansion: ObjectExpansion,\n parentShape: ObjectQueryResultShape,\n ctx: ExpansionResolutionContext\n): ObjectExpansion {\n const cardinality = resolveUniformCardinality(expansion, parentShape, ctx.ontology)\n // Bake the per-parent top-N the provider must apply: the authored limit clamped\n // by the fanout backstop (the fallback computes the same via\n // `effectiveExpansionFanout`). Always defined afterwards, so the compiler need\n // not re-derive the cap.\n const limit = effectiveExpansionFanout(expansion.limit, ctx.maxExpansionFanout)\n const base: ObjectExpansion = cardinality\n ? { ...expansion, cardinality, limit }\n : { ...expansion, limit }\n\n if (!expansion.expand || expansion.expand.length === 0) return base\n\n const targetShape = resolveExpansionTargetShape(expansion, parentShape, ctx.ontology)\n return {\n ...base,\n expand: expansion.expand.map((nested) => annotateExpansion(nested, targetShape, ctx)),\n }\n}\n\n// The attached value shape is uniform only when every parent type resolves the\n// link to the same cardinality. A non-declaring parent type contributes \"many\"\n// (matching the fallback's `link?.cardinality ?? \"many\"`); incoming is always\n// many-to-one. A mixed result returns undefined, keeping the query on fallback.\nfunction resolveUniformCardinality(\n expansion: ObjectExpansion,\n parentShape: ObjectQueryResultShape,\n ontology: OntologyRegistry\n): \"one\" | \"many\" | undefined {\n if (expansion.direction === \"incoming\") return \"many\"\n if (parentShape.objectTypeIds.length === 0) return undefined\n\n const cardinalities = new Set<\"one\" | \"many\">()\n for (const objectTypeId of parentShape.objectTypeIds) {\n const objectType = ontology.getObjectTypeById(objectTypeId)\n const link = objectType?.links.find((candidate) => candidate.id === expansion.linkId)\n cardinalities.add(link?.cardinality ?? \"many\")\n }\n return cardinalities.size === 1 ? [...cardinalities][0] : undefined\n}\n\n// The objects reached by an expansion are exactly the result of the equivalent\n// traverse, so reuse the shared shape resolver instead of re-deriving link\n// targets. Used to carry the parent context into nested expansions.\nfunction resolveExpansionTargetShape(\n expansion: ObjectExpansion,\n parentShape: ObjectQueryResultShape,\n ontology: OntologyRegistry\n): ObjectQueryResultShape {\n if (parentShape.objectTypeIds.length === 0) return { objectTypeIds: [] }\n\n const input: ObjectQuery =\n parentShape.objectTypeIds.length === 1\n ? { kind: \"start\", objectTypeId: parentShape.objectTypeIds[0] }\n : {\n kind: \"set\",\n op: \"union\",\n inputs: parentShape.objectTypeIds.map((objectTypeId) => ({\n kind: \"start\",\n objectTypeId,\n })),\n }\n const traverse: ObjectQuery = {\n kind: \"traverse\",\n input,\n linkId: expansion.linkId,\n direction: expansion.direction,\n ...(expansion.sourceObjectTypeId === undefined\n ? {}\n : { sourceObjectTypeId: expansion.sourceObjectTypeId }),\n }\n return safeResultShape(traverse, ontology)\n}\n\n// Cardinality resolution is a pushdown optimization, never a correctness\n// requirement: any failure to resolve a shape (the resolver throws on a query it\n// considers invalid) must degrade to \"unresolved\", which the planner reads as\n// \"keep this on the fallback\" rather than surfacing an error.\nfunction safeResultShape(query: ObjectQuery, ontology: OntologyRegistry): ObjectQueryResultShape {\n try {\n return resolveObjectQueryResultShape(query, { ontology })\n } catch {\n return { objectTypeIds: [] }\n }\n}\n\nfunction expandIncludeSubtypes(query: ObjectQuery, ontology: OntologyRegistry): ObjectQuery {\n switch (query.kind) {\n case \"start\": {\n if (query.includeSubtypes !== true) return query\n const objectTypeIds = [query.objectTypeId, ...ontology.listSubTypes(query.objectTypeId)]\n if (objectTypeIds.length === 1) return { kind: \"start\", objectTypeId: query.objectTypeId }\n return {\n kind: \"set\",\n op: \"union\",\n inputs: objectTypeIds.map((objectTypeId) => ({ kind: \"start\", objectTypeId })),\n }\n }\n case \"filter\":\n case \"text\":\n case \"vector\":\n case \"traverse\":\n case \"sort\":\n case \"limit\":\n case \"page\":\n case \"project\":\n case \"expand\":\n return { ...query, input: expandIncludeSubtypes(query.input, ontology) }\n case \"set\":\n return {\n ...query,\n inputs: query.inputs.map((input) => expandIncludeSubtypes(input, ontology)),\n }\n }\n}\n\nasync function executeFallbackQuery(\n projectId: string,\n query: ObjectQuery,\n options: QueryExecutorOptions,\n resultOptions: { includeTotal?: boolean }\n): Promise<QueryObjectsResult> {\n const maxRows = options.maxFallbackRows ?? DEFAULT_MAX_FALLBACK_ROWS\n const evaluation = await evaluateFallbackQuery(projectId, query, options, maxRows)\n return {\n objects: evaluation.entries.map((entry) => entry.row),\n hasMore: evaluation.hasMore,\n nextPageToken: evaluation.nextPageToken,\n ...(resultOptions.includeTotal === false ? {} : { total: evaluation.total }),\n }\n}\n\nasync function evaluateFallbackQuery(\n projectId: string,\n query: ObjectQuery,\n options: QueryExecutorOptions,\n maxRows: number\n): Promise<FallbackEvaluation> {\n switch (query.kind) {\n case \"start\":\n return evaluateFallbackStart(projectId, query, options, maxRows)\n case \"filter\": {\n const input = await evaluateFallbackQuery(projectId, query.input, options, maxRows)\n return completeFallbackEvaluation(\n input.entries.filter((entry) => matchesPredicate(entry.row, query.predicate))\n )\n }\n case \"sort\": {\n const input = await evaluateFallbackQuery(projectId, query.input, options, maxRows)\n return {\n ...input,\n entries: sortEntries(input.entries, query.fields),\n }\n }\n case \"limit\": {\n const input = await evaluateFallbackQuery(projectId, query.input, options, maxRows)\n const limit = Math.max(0, query.limit)\n return {\n entries: input.entries.slice(0, limit),\n total: input.entries.length,\n hasMore: limit < input.entries.length,\n }\n }\n case \"page\": {\n const input = await evaluateFallbackQuery(projectId, query.input, options, maxRows)\n const offset = decodePageOffset(query.pageToken)\n const pageSize = Math.max(0, query.pageSize)\n const nextOffset = offset + pageSize\n const hasMore = pageSize > 0 && nextOffset < input.entries.length\n return {\n entries: input.entries.slice(offset, nextOffset),\n total: input.entries.length,\n hasMore,\n nextPageToken: hasMore ? encodePageOffset(nextOffset) : undefined,\n }\n }\n case \"project\": {\n const input = await evaluateFallbackQuery(projectId, query.input, options, maxRows)\n if (!query.properties) return input\n const properties = query.properties\n return {\n ...input,\n entries: input.entries.map((entry) => ({\n ...entry,\n row: projectRow(entry.row, properties),\n })),\n }\n }\n case \"expand\": {\n // `expand` is output-shaping and normalized to the outermost layer: the\n // input produces the bounded parent set, then we attach hydrated links\n // without changing which objects match.\n const input = await evaluateFallbackQuery(projectId, query.input, options, maxRows)\n const enriched = await hydrateExpansions(\n projectId,\n input.entries.map((entry) => entry.row),\n query.expansions,\n options\n )\n return {\n ...input,\n entries: input.entries.map((entry, index) => ({ ...entry, row: enriched[index] })),\n }\n }\n case \"text\":\n case \"vector\":\n case \"traverse\":\n case \"set\":\n throw new ObjectQueryExecutionError(\n \"fallback_node_not_supported\",\n `Fallback execution does not support query node '${query.kind}'`\n )\n }\n}\n\n/**\n * A candidate neighbour for one parent under a single expansion: the object to\n * hydrate plus the metadata carried on the link edge. For outgoing expansions\n * the neighbour is the link target; for incoming it is the link source.\n */\ntype ExpansionEdge = {\n neighborTypeId: string\n neighborId: string\n edgeProperties?: Record<string, unknown>\n}\n\n// Attach `links` to each parent row by hydrating every expansion over the batch\n// storage primitives. Returns fresh rows — stored rows are read by reference, so\n// we never mutate them in place.\nasync function hydrateExpansions(\n projectId: string,\n parents: readonly ObjectRow[],\n expansions: readonly ObjectExpansion[],\n options: QueryExecutorOptions\n): Promise<ObjectRow[]> {\n if (expansions.length === 0) {\n return parents.map((parent) => ({ ...parent }))\n }\n\n const linksByParent: ObjectRowLinks[] = parents.map(() => ({}))\n for (const expansion of expansions) {\n const values = await hydrateExpansion(projectId, parents, expansion, options)\n values.forEach((value, index) => {\n // Keyed by link id, matching the `row.links.<linkId>` authoring surface.\n // Same-id expansions in opposing directions would collide here, but\n // normalization keeps them distinct and that pairing is not yet exposed.\n linksByParent[index][expansion.linkId] = value\n })\n }\n\n return parents.map((parent, index) => ({ ...parent, links: linksByParent[index] }))\n}\n\n// Resolve one expansion for every parent, returning a value aligned to `parents`.\nasync function hydrateExpansion(\n projectId: string,\n parents: readonly ObjectRow[],\n expansion: ObjectExpansion,\n options: QueryExecutorOptions\n): Promise<ExpandedLinkValue[]> {\n const edgesByParent =\n expansion.direction === \"incoming\"\n ? await collectIncomingEdges(projectId, parents, expansion, options)\n : await collectOutgoingEdges(projectId, parents, expansion, options)\n\n // Ordering is against target properties, so the target rows must be loaded\n // before the per-parent top-N trim can run.\n const baseTargets = await fetchExpansionTargets(projectId, edgesByParent, options)\n const trimmedByParent = edgesByParent.map((edges) =>\n trimExpansionEdges(edges, expansion, baseTargets, options)\n )\n\n const enrichedByKey = await enrichExpansionTargets(\n projectId,\n trimmedByParent,\n baseTargets,\n expansion,\n options\n )\n\n return parents.map((parent, index) => {\n const expanded: ExpandedObjectRow[] = []\n for (const edge of trimmedByParent[index]) {\n const target = enrichedByKey.get(targetKey(edge.neighborTypeId, edge.neighborId))\n // A dangling link (target removed) hydrates to nothing.\n if (!target) continue\n expanded.push(\n edge.edgeProperties && Object.keys(edge.edgeProperties).length > 0\n ? { ...target, linkProperties: edge.edgeProperties }\n : { ...target }\n )\n }\n return toLinkValue(expanded, expansionCardinality(parent, expansion, options))\n })\n}\n\nasync function collectOutgoingEdges(\n projectId: string,\n parents: readonly ObjectRow[],\n expansion: ObjectExpansion,\n options: QueryExecutorOptions\n): Promise<ExpansionEdge[][]> {\n const linksByKey = await options.storage.listLinksBatch({\n projectId,\n items: parents.map((parent) => ({\n objectTypeId: parent.objectTypeId,\n objectId: parent.primaryId,\n linkId: expansion.linkId,\n })),\n })\n\n return parents.map((parent) => {\n const links = linksByKey.get(`${parent.objectTypeId}:${parent.primaryId}:${expansion.linkId}`)\n if (!links) return []\n return links.map((link) => ({\n neighborTypeId: link.targetTypeId,\n neighborId: link.targetId,\n edgeProperties: link.properties,\n }))\n })\n}\n\nasync function collectIncomingEdges(\n projectId: string,\n parents: readonly ObjectRow[],\n expansion: ObjectExpansion,\n options: QueryExecutorOptions\n): Promise<ExpansionEdge[][]> {\n const incident = await options.storage.listIncidentLinksBatch({\n projectId,\n items: parents.map((parent) => ({\n objectTypeId: parent.objectTypeId,\n objectId: parent.primaryId,\n })),\n })\n\n // Index links that point AT a parent (incoming) by that parent. The incident\n // batch also returns outgoing links, so filter on the parent being the target.\n const byTarget = new Map<string, ObjectLinkRow[]>()\n for (const link of incident) {\n if (link.linkId !== expansion.linkId) continue\n if (expansion.sourceObjectTypeId && link.sourceTypeId !== expansion.sourceObjectTypeId) continue\n const key = targetKey(link.targetTypeId, link.targetId)\n const bucket = byTarget.get(key)\n if (bucket) bucket.push(link)\n else byTarget.set(key, [link])\n }\n\n return parents.map((parent) => {\n const links = byTarget.get(targetKey(parent.objectTypeId, parent.primaryId))\n if (!links) return []\n // For an incoming expansion the hydrated object is the link's source.\n return links.map((link) => ({\n neighborTypeId: link.sourceTypeId,\n neighborId: link.sourceId,\n edgeProperties: link.properties,\n }))\n })\n}\n\nasync function fetchExpansionTargets(\n projectId: string,\n edgesByParent: readonly ExpansionEdge[][],\n options: QueryExecutorOptions\n): Promise<Map<string, ObjectRow>> {\n const seen = new Set<string>()\n const items: { objectTypeId: string; primaryId: string }[] = []\n for (const edges of edgesByParent) {\n for (const edge of edges) {\n const key = targetKey(edge.neighborTypeId, edge.neighborId)\n if (seen.has(key)) continue\n seen.add(key)\n items.push({ objectTypeId: edge.neighborTypeId, primaryId: edge.neighborId })\n }\n }\n if (items.length === 0) return new Map()\n return options.storage.getByPrimaryIdBatch({ projectId, items })\n}\n\n// Recurse nested expansions over the unique retained targets so each target is\n// hydrated once even when shared across parents, then key them for lookup.\nasync function enrichExpansionTargets(\n projectId: string,\n trimmedByParent: readonly ExpansionEdge[][],\n baseTargets: Map<string, ObjectRow>,\n expansion: ObjectExpansion,\n options: QueryExecutorOptions\n): Promise<Map<string, ObjectRow>> {\n if (!expansion.expand || expansion.expand.length === 0) {\n return baseTargets\n }\n\n const uniqueTargets: ObjectRow[] = []\n const seen = new Set<string>()\n for (const edges of trimmedByParent) {\n for (const edge of edges) {\n const key = targetKey(edge.neighborTypeId, edge.neighborId)\n if (seen.has(key)) continue\n seen.add(key)\n const base = baseTargets.get(key)\n if (base) uniqueTargets.push(base)\n }\n }\n\n const enriched = await hydrateExpansions(projectId, uniqueTargets, expansion.expand, options)\n const enrichedByKey = new Map<string, ObjectRow>()\n for (const row of enriched) {\n enrichedByKey.set(targetKey(row.objectTypeId, row.primaryId), row)\n }\n return enrichedByKey\n}\n\nfunction trimExpansionEdges(\n edges: readonly ExpansionEdge[],\n expansion: ObjectExpansion,\n baseTargets: Map<string, ObjectRow>,\n options: QueryExecutorOptions\n): ExpansionEdge[] {\n let ordered = edges\n if (expansion.orderBy && expansion.orderBy.length > 0) {\n const fields = expansion.orderBy\n ordered = [...edges].sort((left, right) =>\n compareExpansionEdges(left, right, fields, baseTargets)\n )\n }\n\n const limit = effectiveExpansionFanout(expansion.limit, options.maxExpansionFanout)\n return ordered.length > limit ? ordered.slice(0, limit) : [...ordered]\n}\n\nfunction effectiveExpansionFanout(\n limit: number | undefined,\n maxExpansionFanout: number | undefined\n): number {\n const cap = maxExpansionFanout !== undefined ? maxExpansionFanout : DEFAULT_MAX_EXPANSION_FANOUT\n return limit !== undefined ? Math.min(limit, cap) : cap\n}\n\nfunction compareExpansionEdges(\n left: ExpansionEdge,\n right: ExpansionEdge,\n fields: readonly ObjectQuerySortField[],\n baseTargets: Map<string, ObjectRow>\n): number {\n const leftRow = baseTargets.get(targetKey(left.neighborTypeId, left.neighborId))\n const rightRow = baseTargets.get(targetKey(right.neighborTypeId, right.neighborId))\n for (const field of fields) {\n const comparison = compareRowsBySortField(leftRow, rightRow, field)\n if (comparison !== 0) return comparison\n }\n // Identity tiebreak keeps the trim deterministic for equal sort keys.\n return targetKey(left.neighborTypeId, left.neighborId).localeCompare(\n targetKey(right.neighborTypeId, right.neighborId)\n )\n}\n\nfunction compareRowsBySortField(\n left: ObjectRow | undefined,\n right: ObjectRow | undefined,\n field: ObjectQuerySortField\n): number {\n if (field.kind === \"relevance\") return 0\n\n const leftValue = left?.properties[field.propertyId]\n const rightValue = right?.properties[field.propertyId]\n const leftMissing = leftValue === undefined || leftValue === null\n const rightMissing = rightValue === undefined || rightValue === null\n if (leftMissing && rightMissing) return 0\n if (leftMissing) return 1\n if (rightMissing) return -1\n\n const comparison = compareQueryScalarValues(leftValue, rightValue, field.scalarKind)\n if (Number.isNaN(comparison)) return 0\n return field.direction === \"desc\" ? -comparison : comparison\n}\n\n// Outgoing cardinality comes from the parent type's link; incoming is inherently\n// many-to-one, so an incoming expansion always yields an array.\nfunction expansionCardinality(\n parent: ObjectRow,\n expansion: ObjectExpansion,\n options: QueryExecutorOptions\n): \"one\" | \"many\" {\n if (expansion.direction === \"incoming\") return \"many\"\n const objectType = options.ontology.getObjectTypeById(parent.objectTypeId)\n const link = objectType?.links.find((candidate) => candidate.id === expansion.linkId)\n return link?.cardinality ?? \"many\"\n}\n\nfunction toLinkValue(\n rows: readonly ExpandedObjectRow[],\n cardinality: \"one\" | \"many\"\n): ExpandedLinkValue {\n if (cardinality === \"one\") return rows[0] ?? null\n return rows\n}\n\nfunction targetKey(objectTypeId: string, id: string): string {\n return `${objectTypeId}:${id}`\n}\n\nasync function evaluateFallbackStart(\n projectId: string,\n query: Extract<ObjectQuery, { kind: \"start\" }>,\n options: QueryExecutorOptions,\n maxRows: number\n): Promise<FallbackEvaluation> {\n const objectTypeIds = query.includeSubtypes\n ? [query.objectTypeId, ...options.ontology.listSubTypes(query.objectTypeId)]\n : [query.objectTypeId]\n\n const result = await options.storage.list({\n projectId,\n objectTypeId: objectTypeIds,\n limit: maxRows + 1,\n orderBy: \"primaryId\",\n order: \"asc\",\n })\n // Request one extra row so the executor can prove the source scan stayed\n // within its bound even when the storage backend does not return total counts.\n if (result.objects.length > maxRows || result.hasMore || result.total > maxRows) {\n throw new ObjectQueryExecutionError(\n \"fallback_row_limit_exceeded\",\n `Fallback start '${query.objectTypeId}' exceeded maxFallbackRows=${maxRows}`,\n \"$.start\"\n )\n }\n\n return completeFallbackEvaluation(\n result.objects.map((row, index) => ({\n row,\n order: index,\n }))\n )\n}\n\nfunction completeFallbackEvaluation(entries: FallbackEntry[]): FallbackEvaluation {\n return {\n entries,\n total: entries.length,\n hasMore: false,\n }\n}\n\nfunction matchesPredicate(row: ObjectRow, predicate: ObjectQueryPredicate): boolean {\n switch (predicate.op) {\n case \"and\":\n return predicate.items.every((item) => matchesPredicate(row, item))\n case \"or\":\n return predicate.items.some((item) => matchesPredicate(row, item))\n case \"not\":\n return !matchesPredicate(row, predicate.item)\n case \"eq\":\n return queryScalarValuesEqual(\n row.properties[predicate.propertyId],\n predicate.value,\n predicate.scalarKind\n )\n case \"neq\":\n return !queryScalarValuesEqual(\n row.properties[predicate.propertyId],\n predicate.value,\n predicate.scalarKind\n )\n case \"lt\":\n return (\n compareQueryScalarValues(\n row.properties[predicate.propertyId],\n predicate.value,\n predicate.scalarKind\n ) < 0\n )\n case \"lte\":\n return (\n compareQueryScalarValues(\n row.properties[predicate.propertyId],\n predicate.value,\n predicate.scalarKind\n ) <= 0\n )\n case \"gt\":\n return (\n compareQueryScalarValues(\n row.properties[predicate.propertyId],\n predicate.value,\n predicate.scalarKind\n ) > 0\n )\n case \"gte\":\n return (\n compareQueryScalarValues(\n row.properties[predicate.propertyId],\n predicate.value,\n predicate.scalarKind\n ) >= 0\n )\n case \"in\":\n return predicate.values.some((value) =>\n queryScalarValuesEqual(row.properties[predicate.propertyId], value, predicate.scalarKind)\n )\n case \"exists\": {\n const exists =\n Object.hasOwn(row.properties, predicate.propertyId) &&\n row.properties[predicate.propertyId] !== undefined\n return predicate.value ? exists : !exists\n }\n case \"contains\":\n return containsValue(row.properties[predicate.propertyId], predicate.value)\n }\n}\n\nfunction containsValue(actual: unknown, expected: unknown): boolean {\n if (typeof actual === \"string\" && typeof expected === \"string\") {\n return actual.includes(expected)\n }\n\n if (Array.isArray(actual)) {\n return actual.some((item) => queryScalarValuesEqual(item, expected))\n }\n\n if (isPlainObject(actual) && typeof expected === \"string\") {\n return Object.hasOwn(actual, expected)\n }\n\n return false\n}\n\nfunction sortEntries(\n entries: readonly FallbackEntry[],\n fields: readonly ObjectQuerySortField[]\n): FallbackEntry[] {\n return [...entries].sort((left, right) => {\n for (const field of fields) {\n const comparison = compareSortField(left, right, field)\n if (comparison !== 0) return comparison\n }\n // Preserve storage order for true ties, then use identity as a deterministic\n // final fallback so tests and page tokens stay stable.\n return (\n left.order - right.order || rowIdentityKey(left.row).localeCompare(rowIdentityKey(right.row))\n )\n })\n}\n\nfunction compareSortField(\n left: FallbackEntry,\n right: FallbackEntry,\n field: ObjectQuerySortField\n): number {\n if (field.kind === \"relevance\") return 0\n\n const leftValue = left.row.properties[field.propertyId]\n const rightValue = right.row.properties[field.propertyId]\n const leftMissing = leftValue === undefined || leftValue === null\n const rightMissing = rightValue === undefined || rightValue === null\n if (leftMissing && rightMissing) return 0\n if (leftMissing) return 1\n if (rightMissing) return -1\n\n const comparison = compareQueryScalarValues(leftValue, rightValue, field.scalarKind)\n if (Number.isNaN(comparison)) return 0\n return field.direction === \"desc\" ? -comparison : comparison\n}\n\nfunction projectRow(row: ObjectRow, properties: readonly string[]): ObjectRow {\n const projected: Record<string, unknown> = {}\n for (const propertyId of properties) {\n if (Object.hasOwn(row.properties, propertyId)) {\n projected[propertyId] = row.properties[propertyId]\n }\n }\n return { ...row, properties: projected }\n}\n\nfunction stripOuterRowShape(query: ObjectQuery): ObjectQuery {\n switch (query.kind) {\n case \"limit\":\n case \"page\":\n case \"project\":\n case \"sort\":\n // `expand` is output-shaping: it attaches links but does not change which\n // objects match, so aggregates (count/exists/facets) ignore it.\n case \"expand\":\n return stripOuterRowShape(query.input)\n default:\n return query\n }\n}\n\nfunction validateFacetRequests(\n facets: readonly ObjectFacetRequest[],\n objectTypeIds: readonly string[],\n options: QueryExecutorOptions\n): ObjectFacetRequest[] {\n const issues: ObjectQueryValidationIssue[] = []\n const maxLimit = options.maxFacetLimit ?? DEFAULT_MAX_FACET_LIMIT\n\n if (facets.length === 0) {\n addFacetIssue(issues, \"$.facets\", \"empty_facets\", \"At least one facet is required\")\n }\n\n if (!Number.isInteger(maxLimit) || maxLimit <= 0) {\n addFacetIssue(\n issues,\n \"$.maxFacetLimit\",\n \"invalid_facet_bound\",\n \"maxFacetLimit must be positive\"\n )\n }\n\n const seenPropertyIds = new Set<string>()\n const normalizedFacets: ObjectFacetRequest[] = []\n\n facets.forEach((facet, index) => {\n const path = `$.facets[${index}]`\n const propertyId = typeof facet.propertyId === \"string\" ? facet.propertyId.trim() : \"\"\n\n if (!propertyId) {\n addFacetIssue(\n issues,\n `${path}.propertyId`,\n \"missing_facet_property\",\n \"Facet propertyId is required\"\n )\n } else if (seenPropertyIds.has(propertyId)) {\n addFacetIssue(\n issues,\n `${path}.propertyId`,\n \"duplicate_facet\",\n `Facet property '${propertyId}' is requested more than once`\n )\n } else {\n seenPropertyIds.add(propertyId)\n }\n\n if (!Number.isInteger(facet.limit) || facet.limit <= 0) {\n addFacetIssue(\n issues,\n `${path}.limit`,\n \"invalid_facet_limit\",\n \"Facet limit must be a positive integer\"\n )\n } else if (facet.limit > maxLimit) {\n addFacetIssue(\n issues,\n `${path}.limit`,\n \"facet_limit_too_large\",\n `Facet limit must be less than or equal to ${maxLimit}`\n )\n }\n\n if (!propertyId) return\n\n for (const objectTypeId of objectTypeIds) {\n const objectType = options.ontology.getObjectTypeById(objectTypeId)\n const property = objectType?.properties.find((candidate) => candidate.id === propertyId)\n\n if (!objectType || !property) {\n addFacetIssue(\n issues,\n `${path}.propertyId`,\n \"unknown_facet_property\",\n `Property '${propertyId}' is not defined on '${objectTypeId}'`\n )\n continue\n }\n\n if (property.query?.searchable !== true || property.query.facet !== true) {\n addFacetIssue(\n issues,\n `${path}.propertyId`,\n \"property_not_facetable\",\n `Property '${propertyId}' on '${objectTypeId}' must set query.searchable: true and query.facet: true before it can be used as a facet`\n )\n }\n }\n\n normalizedFacets.push({ propertyId, limit: facet.limit })\n })\n\n if (issues.length > 0) {\n throw new ObjectQueryValidationError(issues)\n }\n\n return normalizedFacets\n}\n\nfunction addFacetIssue(\n issues: ObjectQueryValidationIssue[],\n path: string,\n code: string,\n message: string\n): void {\n issues.push({ path, code, message })\n}\n\nfunction buildFacetResults(\n rows: readonly ObjectRow[],\n facets: readonly ObjectFacetRequest[]\n): ObjectFacetResult[] {\n return facets.map((facet) => ({\n propertyId: facet.propertyId,\n buckets: buildFacetBuckets(rows, facet),\n }))\n}\n\nfunction buildFacetBuckets(\n rows: readonly ObjectRow[],\n facet: ObjectFacetRequest\n): ObjectFacetResult[\"buckets\"] {\n const buckets = new Map<string, { value: unknown; count: number }>()\n\n for (const row of rows) {\n if (!Object.hasOwn(row.properties, facet.propertyId)) continue\n const value = row.properties[facet.propertyId]\n if (value === undefined) continue\n const key = facetValueKey(value)\n const existing = buckets.get(key)\n if (existing) {\n existing.count += 1\n } else {\n buckets.set(key, { value, count: 1 })\n }\n }\n\n return [...buckets.values()]\n .sort(\n (left, right) =>\n right.count - left.count ||\n facetValueSortKey(left.value).localeCompare(facetValueSortKey(right.value))\n )\n .slice(0, facet.limit)\n}\n\nfunction facetValueKey(value: unknown): string {\n return JSON.stringify(value) ?? String(value)\n}\n\nfunction facetValueSortKey(value: unknown): string {\n return JSON.stringify(value) ?? String(value)\n}\n\nfunction rowIdentityKey(row: ObjectRow): string {\n return `${row.objectTypeId}:${row.primaryId}`\n}\n\nfunction encodePageOffset(offset: number): string {\n return `${PAGE_TOKEN_PREFIX}${offset}`\n}\n\nfunction decodePageOffset(token: string | undefined): number {\n if (!token) return 0\n if (!token.startsWith(PAGE_TOKEN_PREFIX)) {\n throw new ObjectQueryExecutionError(\n \"invalid_page_token\",\n \"Fallback page token must use the offset token format\"\n )\n }\n\n const offset = Number(token.slice(PAGE_TOKEN_PREFIX.length))\n if (!Number.isInteger(offset) || offset < 0) {\n throw new ObjectQueryExecutionError(\n \"invalid_page_token\",\n \"Fallback page token contains an invalid offset\"\n )\n }\n return offset\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n",
|
|
8
|
-
"import type { OntologyRegistry } from \"../../ontology\"\nimport type {\n ObjectExpansion,\n ObjectQuery,\n ObjectQueryPredicate,\n ObjectQueryResultShape,\n ObjectQuerySortField,\n} from \"./ir\"\nimport { normalizeObjectQuery } from \"./normalize\"\nimport {\n collectObjectQueryValidationIssues,\n type ObjectQueryValidationIssue,\n validateObjectQuery,\n} from \"./validate\"\n\nexport interface ObjectQueryExplainOptions {\n ontology?: OntologyRegistry\n normalize?: boolean\n maxLimit?: number\n maxPageSize?: number\n}\n\nexport interface ObjectQueryExplanation {\n query: ObjectQuery\n normalizedQuery: ObjectQuery\n valid?: boolean\n result?: ObjectQueryResultShape\n issues: readonly ObjectQueryValidationIssue[]\n tree: ObjectQueryExplainNode\n}\n\nexport interface ObjectQueryExplainNode {\n path: string\n kind: ObjectQuery[\"kind\"]\n summary: string\n details: Record<string, unknown>\n children: readonly ObjectQueryExplainNode[]\n}\n\nexport function explainObjectQuery(\n query: ObjectQuery,\n options: ObjectQueryExplainOptions = {}\n): ObjectQueryExplanation {\n const normalizedQuery = options.normalize === false ? query : normalizeObjectQuery(query)\n const issues = options.ontology\n ? collectObjectQueryValidationIssues(normalizedQuery, {\n ontology: options.ontology,\n maxLimit: options.maxLimit,\n maxPageSize: options.maxPageSize,\n normalize: false,\n })\n : []\n\n const result =\n options.ontology && issues.length === 0\n ? validateObjectQuery(normalizedQuery, {\n ontology: options.ontology,\n maxLimit: options.maxLimit,\n maxPageSize: options.maxPageSize,\n normalize: false,\n }).result\n : undefined\n\n return {\n query,\n normalizedQuery,\n valid: options.ontology ? issues.length === 0 : undefined,\n result,\n issues,\n tree: buildExplainNode(normalizedQuery, \"$\"),\n }\n}\n\nfunction buildExplainNode(query: ObjectQuery, path: string): ObjectQueryExplainNode {\n switch (query.kind) {\n case \"start\":\n return {\n path,\n kind: query.kind,\n summary: `start ${query.objectTypeId}`,\n details: {\n objectTypeId: query.objectTypeId,\n includeSubtypes: query.includeSubtypes === true,\n },\n children: [],\n }\n case \"filter\":\n return {\n path,\n kind: query.kind,\n summary: `filter ${summarizePredicate(query.predicate)}`,\n details: { predicate: query.predicate },\n children: [buildExplainNode(query.input, `${path}.input`)],\n }\n case \"text\":\n return {\n path,\n kind: query.kind,\n summary: `text \"${query.query}\"`,\n details: {\n query: query.query,\n fields: query.fields,\n fieldsByObjectType: query.fieldsByObjectType,\n },\n children: [buildExplainNode(query.input, `${path}.input`)],\n }\n case \"vector\":\n return {\n path,\n kind: query.kind,\n summary: `vector ${query.propertyId} k=${query.k}`,\n details: { propertyId: query.propertyId, dimensions: query.vector.length, k: query.k },\n children: [buildExplainNode(query.input, `${path}.input`)],\n }\n case \"traverse\":\n return {\n path,\n kind: query.kind,\n summary:\n query.sourceObjectTypeId === undefined\n ? `traverse ${query.direction} ${query.linkId}`\n : `traverse ${query.direction} ${query.sourceObjectTypeId}.${query.linkId}`,\n details: {\n linkId: query.linkId,\n direction: query.direction,\n ...(query.sourceObjectTypeId === undefined\n ? {}\n : { sourceObjectTypeId: query.sourceObjectTypeId }),\n },\n children: [buildExplainNode(query.input, `${path}.input`)],\n }\n case \"set\":\n return {\n path,\n kind: query.kind,\n summary: `set ${query.op}`,\n details: { op: query.op, inputCount: query.inputs.length },\n children: query.inputs.map((input, index) =>\n buildExplainNode(input, `${path}.inputs[${index}]`)\n ),\n }\n case \"sort\":\n return {\n path,\n kind: query.kind,\n summary: `sort ${query.fields.map(summarizeSortField).join(\", \")}`,\n details: { fields: query.fields },\n children: [buildExplainNode(query.input, `${path}.input`)],\n }\n case \"limit\":\n return {\n path,\n kind: query.kind,\n summary: `limit ${query.limit}`,\n details: { limit: query.limit },\n children: [buildExplainNode(query.input, `${path}.input`)],\n }\n case \"page\":\n return {\n path,\n kind: query.kind,\n summary: `page ${query.pageSize}`,\n details: { pageSize: query.pageSize, hasPageToken: query.pageToken !== undefined },\n children: [buildExplainNode(query.input, `${path}.input`)],\n }\n case \"project\":\n return {\n path,\n kind: query.kind,\n summary: `project ${query.properties?.join(\", \") ?? \"*\"}`,\n details: { properties: query.properties },\n children: [buildExplainNode(query.input, `${path}.input`)],\n }\n case \"expand\":\n return {\n path,\n kind: query.kind,\n summary: `expand ${query.expansions.map(summarizeExpansion).join(\", \")}`,\n details: { expansions: query.expansions },\n children: [buildExplainNode(query.input, `${path}.input`)],\n }\n }\n}\n\nfunction summarizeExpansion(expansion: ObjectExpansion): string {\n const head = expansion.direction === \"incoming\" ? `<-${expansion.linkId}` : expansion.linkId\n const nested =\n expansion.expand && expansion.expand.length > 0\n ? `(${expansion.expand.map(summarizeExpansion).join(\", \")})`\n : \"\"\n return `${head}${nested}`\n}\n\nfunction summarizePredicate(predicate: ObjectQueryPredicate): string {\n switch (predicate.op) {\n case \"and\":\n case \"or\":\n return `${predicate.op}(${predicate.items.map(summarizePredicate).join(\", \")})`\n case \"not\":\n return `not(${summarizePredicate(predicate.item)})`\n case \"in\":\n return `${predicate.propertyId} in [${predicate.values.length}]`\n case \"exists\":\n return `${predicate.propertyId} exists=${predicate.value}`\n case \"contains\":\n return `${predicate.propertyId} contains`\n default:\n return `${predicate.propertyId} ${predicate.op}`\n }\n}\n\nfunction summarizeSortField(field: ObjectQuerySortField): string {\n if (field.kind === \"relevance\") return `relevance ${field.direction ?? \"desc\"}`\n return `${field.propertyId} ${field.direction ?? \"asc\"}`\n}\n"
|
|
9
|
-
],
|
|
10
|
-
"mappings": "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",
|
|
11
|
-
"debugId": "1EDFA79E601FFF1364756E2164756E21",
|
|
12
|
-
"names": []
|
|
13
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/lake-storage/errors.ts", "../src/lake-storage/definition-updates.ts", "../src/lake-storage/in-memory.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/**\n * Error for lake-storage invariants and invalid lake operations.\n */\nexport class LakeStorageError extends Error {\n readonly name = \"LakeStorageError\"\n}\n",
|
|
6
|
-
"import type { DatasetColumnDefinition, DatasetDefinition } from \"../datasets\"\nimport { LakeStorageError } from \"./errors\"\nimport type { LakeStorage } from \"./types\"\n\nexport type DatasetSchemaUpdatePlan =\n | { readonly kind: \"none\" }\n | {\n readonly kind: \"addNullableColumns\"\n readonly columns: readonly DatasetColumnDefinition[]\n }\n\nexport interface DatasetMetadataUpdatePlan {\n readonly descriptionChanged: boolean\n readonly partitionByChanged: boolean\n}\n\nexport interface DatasetDefinitionUpdatePlan {\n readonly existing: DatasetDefinition\n readonly requested: DatasetDefinition\n readonly definition: DatasetDefinition\n readonly schema: DatasetSchemaUpdatePlan\n readonly metadata: DatasetMetadataUpdatePlan\n readonly changed: boolean\n}\n\nconst SCHEMA_UPDATE_V1_POLICY =\n \"Dataset definition updates V1 support only adding nullable columns.\"\n\n/**\n * Build a provider-neutral update plan for two versions of the same dataset\n * definition. Core owns the definition diff; storage providers own how much of\n * the plan they can apply.\n */\nexport function planDatasetDefinitionUpdate(\n existing: DatasetDefinition,\n requested: DatasetDefinition\n): DatasetDefinitionUpdatePlan {\n assertSameDataset(existing, requested)\n\n const addedColumns = getAddedColumnsAfterValidatingExistingColumns(existing, requested)\n assertAddedColumnsAreNullable(requested.id, addedColumns)\n\n const schema = toSchemaUpdatePlan(addedColumns)\n const definition = mergeDatasetDefinition(existing, requested, addedColumns)\n const metadata: DatasetMetadataUpdatePlan = {\n descriptionChanged: existing.description !== definition.description,\n partitionByChanged: !areStringArraysEqual(existing.partitionBy, definition.partitionBy),\n }\n\n return {\n existing: structuredClone(existing),\n requested: structuredClone(requested),\n definition,\n schema,\n metadata,\n changed: schema.kind !== \"none\" || metadata.descriptionChanged || metadata.partitionByChanged,\n }\n}\n\n/**\n * Strict providers can use this helper when they do not support schema\n * evolution. Metadata-only compatible additions are still merged.\n */\nexport function mergeStrictDatasetDefinition(options: {\n readonly existing?: DatasetDefinition | null\n readonly next: DatasetDefinition\n}): DatasetDefinition {\n if (!options.existing) {\n return structuredClone(options.next)\n }\n\n const plan = planDatasetDefinitionUpdate(options.existing, options.next)\n if (plan.schema.kind !== \"none\") {\n throw new LakeStorageError(\n `[SixbLake] Dataset '${options.next.id}' cannot be redefined with an incompatible schema.`\n )\n }\n\n return structuredClone(plan.definition)\n}\n\nexport interface AssertLakeDatasetDefinitionsCompatibleOptions {\n readonly lakeStorage: LakeStorage\n readonly definitions: readonly DatasetDefinition[]\n}\n\nexport async function assertLakeDatasetDefinitionsCompatible(\n options: AssertLakeDatasetDefinitionsCompatibleOptions\n): Promise<void> {\n await options.lakeStorage.assertDatasetDefinitionsCompatible(options.definitions)\n}\n\nfunction assertSameDataset(existing: DatasetDefinition, requested: DatasetDefinition): void {\n if (existing.id !== requested.id) {\n throw new LakeStorageError(\n `[SixbLake] Cannot update dataset '${existing.id}' with definition for '${requested.id}'.`\n )\n }\n}\n\nfunction getAddedColumnsAfterValidatingExistingColumns(\n existing: DatasetDefinition,\n requested: DatasetDefinition\n): readonly DatasetColumnDefinition[] {\n const existingColumns = existing.schema.columns\n const requestedColumnsByName = new Map(\n requested.schema.columns.map((column) => [column.name, column])\n )\n\n // Existing columns are matched by name, not position. Developers can reorder\n // declarations for readability without implying a storage-level schema change.\n for (const existingColumn of existingColumns) {\n const requestedColumn = requestedColumnsByName.get(existingColumn.name)\n if (requestedColumn === undefined) {\n throwUnsupportedSchemaUpdate(\n requested.id,\n `dropping column '${existingColumn.name}' is not supported`\n )\n }\n\n assertExistingColumnUnchanged(requested.id, existingColumn, requestedColumn)\n }\n\n const existingColumnNames = new Set(existingColumns.map((column) => column.name))\n return requested.schema.columns.filter((column) => !existingColumnNames.has(column.name))\n}\n\nfunction assertAddedColumnsAreNullable(\n datasetId: string,\n addedColumns: readonly DatasetColumnDefinition[]\n): void {\n for (const column of addedColumns) {\n // Existing rows have no value for a new column. Until DatasetDefinition\n // supports defaults or backfills, only nullable columns are safe to add.\n if (!isNullable(column)) {\n throwUnsupportedSchemaUpdate(\n datasetId,\n `adding required column '${column.name}' is not supported`\n )\n }\n }\n}\n\nfunction assertExistingColumnUnchanged(\n datasetId: string,\n existing: DatasetColumnDefinition,\n requested: DatasetColumnDefinition\n): void {\n if (existing.type !== requested.type) {\n throwUnsupportedSchemaUpdate(\n datasetId,\n `changing column '${existing.name}' type from '${existing.type}' to '${requested.type}' is not supported`\n )\n }\n\n if (isNullable(existing) !== isNullable(requested)) {\n throwUnsupportedSchemaUpdate(\n datasetId,\n `changing column '${existing.name}' nullability is not supported`\n )\n }\n}\n\nfunction toSchemaUpdatePlan(\n addedColumns: readonly DatasetColumnDefinition[]\n): DatasetSchemaUpdatePlan {\n if (addedColumns.length === 0) {\n return { kind: \"none\" }\n }\n\n return {\n kind: \"addNullableColumns\",\n columns: cloneColumns(addedColumns),\n }\n}\n\nfunction mergeDatasetDefinition(\n existing: DatasetDefinition,\n requested: DatasetDefinition,\n addedColumns: readonly DatasetColumnDefinition[]\n): DatasetDefinition {\n assertCompatibleMetadataField(\n requested.id,\n \"description\",\n existing.description,\n requested.description\n )\n assertCompatibleMetadataField(\n requested.id,\n \"partitionBy\",\n existing.partitionBy,\n requested.partitionBy\n )\n\n const columns = [...cloneColumns(existing.schema.columns), ...cloneColumns(addedColumns)]\n const partitionBy = requested.partitionBy ?? existing.partitionBy\n const description = requested.description ?? existing.description\n\n return {\n kind: \"dataset\",\n id: requested.id,\n schema: { columns },\n ...(partitionBy !== undefined ? { partitionBy: [...partitionBy] } : {}),\n ...(description !== undefined ? { description } : {}),\n }\n}\n\nfunction assertCompatibleMetadataField(\n datasetId: string,\n field: \"description\" | \"partitionBy\",\n existing: string | readonly string[] | undefined,\n requested: string | readonly string[] | undefined\n): void {\n if (\n existing === undefined ||\n requested === undefined ||\n areDefinitionValuesEqual(existing, requested)\n ) {\n return\n }\n\n throw new LakeStorageError(\n `[SixbLake] Dataset '${datasetId}' cannot be redefined with an incompatible ${field}.`\n )\n}\n\nfunction areStringArraysEqual(\n left: readonly string[] | undefined,\n right: readonly string[] | undefined\n): boolean {\n if (left === undefined || right === undefined) {\n return left === right\n }\n\n return left.length === right.length && left.every((value, index) => value === right[index])\n}\n\nfunction areDefinitionValuesEqual(\n left: string | readonly string[],\n right: string | readonly string[]\n): boolean {\n if (typeof left === \"string\" || typeof right === \"string\") {\n return left === right\n }\n\n return areStringArraysEqual(left, right)\n}\n\nfunction isNullable(column: DatasetColumnDefinition): boolean {\n return column.nullable === true\n}\n\nfunction cloneColumns(\n columns: readonly DatasetColumnDefinition[]\n): readonly DatasetColumnDefinition[] {\n return columns.map((column) => ({ ...column }))\n}\n\nfunction throwUnsupportedSchemaUpdate(datasetId: string, detail: string): never {\n throw new LakeStorageError(\n `[SixbLake] Dataset '${datasetId}' cannot apply schema update because ${detail}. ${SCHEMA_UPDATE_V1_POLICY}`\n )\n}\n",
|
|
7
|
-
"import { randomUUID } from \"node:crypto\"\nimport type { DatasetDefinition, DatasetSchema } from \"../datasets\"\nimport { getDatasetRowValidationError } from \"../datasets/validation\"\nimport { mergeStrictDatasetDefinition } from \"./definition-updates\"\nimport { LakeStorageError } from \"./errors\"\nimport type {\n BeginDatasetWriteInput,\n CommitDatasetWriteInput,\n DatasetCatalogState,\n DatasetRow,\n DatasetVersion,\n DatasetWriteCommitResult,\n DatasetWriteMode,\n LakeStorage,\n LakeWriteSession,\n ReadDatasetRowsInput,\n} from \"./types\"\n\nfunction cloneDatasetDefinition(definition: DatasetDefinition): DatasetDefinition {\n return structuredClone(definition)\n}\n\nfunction cloneDatasetVersion(version: DatasetVersion): DatasetVersion {\n return {\n ...structuredClone(version),\n createdAt: new Date(version.createdAt),\n }\n}\n\nfunction cloneRow(row: DatasetRow): DatasetRow {\n return structuredClone(row)\n}\n\nfunction selectColumns(row: DatasetRow, columns?: readonly string[]): DatasetRow {\n if (!columns || columns.length === 0) {\n return cloneRow(row)\n }\n\n const selected: Record<string, unknown> = {}\n for (const column of columns) {\n selected[column] = row[column]\n }\n return selected\n}\n\n// Canonical content key for unchanged-write detection. JSON.stringify\n// serializes Date values via toJSON, matching how rows persist as JSON;\n// missing and undefined nullable values normalize to null. The unchanged-write\n// semantics are pinned by the shared lake-storage contract suite.\nfunction rowContentKey(row: DatasetRow, schema: DatasetSchema): string {\n return JSON.stringify(schema.columns.map((column) => row[column.name] ?? null))\n}\n\n// Order-insensitive multiset equality over canonical row keys.\nfunction sameRowContent(left: readonly string[], right: readonly string[]): boolean {\n if (left.length !== right.length) {\n return false\n }\n\n const sortedLeft = [...left].sort()\n const sortedRight = [...right].sort()\n return sortedLeft.every((key, index) => key === sortedRight[index])\n}\n\nfunction assertDatasetId(datasetId: string): void {\n if (datasetId.trim().length === 0) {\n throw new LakeStorageError(\"[LakeStorage] Dataset id must not be empty\")\n }\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\nclass InMemoryLakeWriteSession implements LakeWriteSession {\n private readonly rows: DatasetRow[] = []\n private closed = false\n\n constructor(\n private readonly storage: InMemoryLakeStorage,\n private readonly input: BeginDatasetWriteInput\n ) {}\n\n async writeRows(rows: Iterable<DatasetRow> | AsyncIterable<DatasetRow>): Promise<void> {\n this.assertOpen()\n\n for await (const row of rows) {\n const validationError = getDatasetRowValidationError(row, this.input.dataset)\n if (validationError) {\n throw new LakeStorageError(`[LakeStorage] ${validationError}`)\n }\n\n this.rows.push(cloneRow(row))\n }\n }\n\n async commit(input?: CommitDatasetWriteInput): Promise<DatasetWriteCommitResult> {\n this.assertOpen()\n this.closed = true\n return this.storage.commitWrite({\n write: this.input,\n rows: this.rows,\n commit: input,\n })\n }\n\n async abort(): Promise<void> {\n this.closed = true\n this.rows.length = 0\n }\n\n private assertOpen(): void {\n if (this.closed) {\n throw new LakeStorageError(\"[LakeStorage] Write session is already closed\")\n }\n }\n}\n\nexport class InMemoryLakeStorage implements LakeStorage {\n private readonly datasets = new Map<string, DatasetDefinition>()\n private readonly versionsByDataset = new Map<string, DatasetVersion[]>()\n private readonly rowsByVersionId = new Map<string, readonly DatasetRow[]>()\n private readonly latestVersionIdByDataset = new Map<string, string>()\n\n async createDataset(definition: DatasetDefinition): Promise<DatasetDefinition> {\n assertDatasetId(definition.id)\n const existing = this.datasets.get(definition.id)\n const stored = mergeStrictDatasetDefinition({\n existing,\n next: definition,\n })\n this.datasets.set(definition.id, stored)\n return cloneDatasetDefinition(stored)\n }\n\n async assertDatasetDefinitionsCompatible(\n definitions: readonly DatasetDefinition[]\n ): Promise<void> {\n const failures: string[] = []\n\n for (const definition of definitions) {\n try {\n assertDatasetId(definition.id)\n const existing = this.datasets.get(definition.id)\n if (!existing) {\n continue\n }\n\n mergeStrictDatasetDefinition({\n existing,\n next: definition,\n })\n } catch (error) {\n failures.push(`- ${definition.id}: ${errorMessage(error)}`)\n }\n }\n\n if (failures.length > 0) {\n const details = failures.join(\"\\n\")\n throw new LakeStorageError(\n `[SixbLake] Lake dataset definition check failed for ${failures.length} dataset(s).\\n${details}`\n )\n }\n }\n\n async getDataset(datasetId: string): Promise<DatasetDefinition | null> {\n const definition = this.datasets.get(datasetId)\n return definition ? cloneDatasetDefinition(definition) : null\n }\n\n async listDatasets(): Promise<readonly DatasetDefinition[]> {\n return [...this.datasets.values()].map((definition) => cloneDatasetDefinition(definition))\n }\n\n async listDatasetCatalogState(\n datasetIds: readonly string[]\n ): Promise<readonly DatasetCatalogState[]> {\n return Promise.all(\n datasetIds.map(async (datasetId) => {\n if (!this.datasets.has(datasetId)) {\n return { datasetId, materialized: false, latestVersion: null }\n }\n\n const latest = await this.getLatestVersion(datasetId)\n return {\n datasetId,\n materialized: true,\n latestVersion: latest\n ? {\n datasetId: latest.datasetId,\n versionId: latest.versionId,\n mode: latest.mode,\n createdAt: latest.createdAt,\n ...(latest.rowCount !== undefined ? { rowCount: latest.rowCount } : {}),\n }\n : null,\n }\n })\n )\n }\n\n async listVersions(datasetId: string, limit?: number): Promise<readonly DatasetVersion[]> {\n const versions = [...(this.versionsByDataset.get(datasetId) ?? [])]\n .sort((left, right) => right.createdAt.getTime() - left.createdAt.getTime())\n .map((version) => cloneDatasetVersion(version))\n\n return limit === undefined ? versions : versions.slice(0, Math.max(0, limit))\n }\n\n async beginWrite(input: BeginDatasetWriteInput): Promise<LakeWriteSession> {\n const definition = await this.getDataset(input.dataset.id)\n if (!definition) {\n throw new LakeStorageError(`[LakeStorage] Unknown dataset '${input.dataset.id}'`)\n }\n\n return new InMemoryLakeWriteSession(this, {\n ...input,\n dataset: definition,\n mode: input.mode ?? \"snapshot\",\n })\n }\n\n async getLatestVersion(datasetId: string): Promise<DatasetVersion | null> {\n const latestVersionId = this.latestVersionIdByDataset.get(datasetId)\n if (!latestVersionId) {\n return null\n }\n\n return this.getVersion(datasetId, latestVersionId)\n }\n\n async getVersion(datasetId: string, versionId: string): Promise<DatasetVersion | null> {\n const versions = this.versionsByDataset.get(datasetId) ?? []\n const version = versions.find((candidate) => candidate.versionId === versionId)\n return version ? cloneDatasetVersion(version) : null\n }\n\n async *readRows(input: ReadDatasetRowsInput): AsyncIterable<DatasetRow> {\n const definition = this.datasets.get(input.datasetId)\n if (!definition) {\n throw new LakeStorageError(`[LakeStorage] Unknown dataset '${input.datasetId}'`)\n }\n\n const version =\n input.versionId === undefined\n ? await this.getLatestVersion(input.datasetId)\n : await this.getVersion(input.datasetId, input.versionId)\n\n if (!version) {\n throw new LakeStorageError(\n `[LakeStorage] No committed version found for dataset '${input.datasetId}'`\n )\n }\n\n const offset = Math.max(0, input.offset ?? 0)\n const limit = input.limit === undefined ? undefined : Math.max(0, input.limit)\n const rows = this.rowsByVersionId\n .get(version.versionId)\n ?.slice(offset, limit === undefined ? undefined : offset + limit)\n\n for (const row of rows ?? []) {\n yield selectColumns(row, input.columns)\n }\n }\n\n async commitWrite(options: {\n write: BeginDatasetWriteInput\n rows: readonly DatasetRow[]\n commit?: CommitDatasetWriteInput\n }): Promise<DatasetWriteCommitResult> {\n const definition = this.datasets.get(options.write.dataset.id)\n if (!definition) {\n throw new LakeStorageError(`[LakeStorage] Unknown dataset '${options.write.dataset.id}'`)\n }\n\n const mode = options.write.mode ?? \"snapshot\"\n const latestVersion = await this.getLatestVersion(options.write.dataset.id)\n\n if (options.commit?.expectedLatestVersionId !== undefined) {\n const actual = latestVersion?.versionId\n if (actual !== options.commit.expectedLatestVersionId) {\n throw new LakeStorageError(\n `[LakeStorage] Optimistic commit failed for dataset '${options.write.dataset.id}': expected latest version '${options.commit.expectedLatestVersionId}', found '${actual ?? \"none\"}'`\n )\n }\n }\n\n // Content-identical snapshots and empty appends reuse the latest version\n // instead of creating a new one.\n if (\n latestVersion &&\n this.isUnchangedWrite(mode, latestVersion, options.rows, definition.schema)\n ) {\n return { ...latestVersion, outcome: \"unchanged\" }\n }\n\n const versionId = `ver_${randomUUID()}`\n const visibleRows =\n mode === \"append\"\n ? [...(this.rowsByVersionId.get(latestVersion?.versionId ?? \"\") ?? []), ...options.rows]\n : [...options.rows]\n\n const sizeBytes = new TextEncoder().encode(\n visibleRows.map((row) => JSON.stringify(row)).join(\"\\n\")\n ).byteLength\n\n const version: DatasetVersion = {\n datasetId: options.write.dataset.id,\n versionId,\n parentVersionId: mode === \"append\" ? latestVersion?.versionId : undefined,\n mode,\n createdAt: new Date(),\n schema: definition.schema,\n producer: options.write.producer ? structuredClone(options.write.producer) : undefined,\n inputs: options.write.inputs ? structuredClone(options.write.inputs) : undefined,\n rowCount: visibleRows.length,\n sizeBytes,\n }\n\n const versions = this.versionsByDataset.get(options.write.dataset.id) ?? []\n versions.push(version)\n this.versionsByDataset.set(options.write.dataset.id, versions)\n this.rowsByVersionId.set(\n versionId,\n visibleRows.map((row) => cloneRow(row))\n )\n this.latestVersionIdByDataset.set(options.write.dataset.id, versionId)\n\n return { ...cloneDatasetVersion(version), outcome: \"created\" }\n }\n\n private isUnchangedWrite(\n mode: DatasetWriteMode,\n latestVersion: DatasetVersion,\n rows: readonly DatasetRow[],\n schema: DatasetSchema\n ): boolean {\n if (mode === \"append\") {\n return rows.length === 0\n }\n\n const previousRows = this.rowsByVersionId.get(latestVersion.versionId) ?? []\n return sameRowContent(\n rows.map((row) => rowContentKey(row, schema)),\n previousRows.map((row) => rowContentKey(row, schema))\n )\n }\n}\n"
|
|
8
|
-
],
|
|
9
|
-
"mappings": "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",
|
|
10
|
-
"debugId": "ABB8A17B04F411C364756E2164756E21",
|
|
11
|
-
"names": []
|
|
12
|
-
}
|