@sixb/core 0.1.7 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/delegated-admission.d.ts +24 -0
- package/dist/actions/delegated-admission.d.ts.map +1 -0
- package/dist/actions/descriptor.d.ts +29 -0
- package/dist/actions/descriptor.d.ts.map +1 -0
- package/dist/actions/execution.d.ts +5 -5
- package/dist/actions/execution.d.ts.map +1 -1
- package/dist/actions/index.js +36 -30
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/request.d.ts.map +1 -1
- package/dist/actions/run-authorization.d.ts +20 -0
- package/dist/actions/run-authorization.d.ts.map +1 -0
- package/dist/actions/run-dispatch.d.ts +3 -1
- package/dist/actions/run-dispatch.d.ts.map +1 -1
- package/dist/actions/worker.js +3 -3
- package/dist/actions/worker.js.map +1 -1
- package/dist/agents/adapters.d.ts +5 -122
- package/dist/agents/adapters.d.ts.map +1 -1
- package/dist/agents/authority.d.ts +1 -1
- package/dist/agents/authority.d.ts.map +1 -1
- package/dist/agents/context-resolution.d.ts.map +1 -1
- package/dist/agents/context.js +1 -1
- package/dist/agents/errors.d.ts +0 -9
- package/dist/agents/errors.d.ts.map +1 -1
- package/dist/agents/execution.d.ts.map +1 -1
- package/dist/agents/identity.d.ts +3 -0
- package/dist/agents/identity.d.ts.map +1 -0
- package/dist/agents/index.d.ts +3 -3
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +43 -43
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/message.d.ts +4 -5
- package/dist/agents/message.d.ts.map +1 -1
- package/dist/agents/model-loop.d.ts +2 -0
- package/dist/agents/model-loop.d.ts.map +1 -1
- package/dist/agents/request.d.ts.map +1 -1
- package/dist/agents/tool-definition.d.ts +0 -1
- package/dist/agents/tool-definition.d.ts.map +1 -1
- package/dist/agents/validation.d.ts +0 -4
- package/dist/agents/validation.d.ts.map +1 -1
- package/dist/ai-usage/execution.d.ts.map +1 -1
- package/dist/auth/index.js +8 -5
- package/dist/auth/index.js.map +1 -1
- package/dist/authorization/decision.d.ts +10 -2
- package/dist/authorization/decision.d.ts.map +1 -1
- package/dist/authorization/grant-kinds.d.ts +2 -1
- package/dist/authorization/grant-kinds.d.ts.map +1 -1
- package/dist/authorization/index.d.ts +1 -1
- package/dist/authorization/index.d.ts.map +1 -1
- package/dist/authorization/index.js +7 -4
- package/dist/authorization/index.js.map +1 -1
- package/dist/bootstrap/discovery.d.ts +7 -1
- package/dist/bootstrap/discovery.d.ts.map +1 -1
- package/dist/bootstrap/index.js +46 -39
- package/dist/bootstrap/index.js.map +1 -1
- package/dist/bootstrap/ontology-type-manifest.d.ts.map +1 -1
- package/dist/chunk-19jp6g9d.js +131 -0
- package/dist/chunk-19jp6g9d.js.map +11 -0
- package/dist/{chunk-x0qhkqje.js → chunk-2dw777qw.js} +50 -5
- package/dist/{chunk-x0qhkqje.js.map → chunk-2dw777qw.js.map} +4 -3
- package/dist/chunk-359jm1jw.js +147 -0
- package/dist/chunk-359jm1jw.js.map +10 -0
- package/dist/{chunk-2b5qtban.js → chunk-3xep5cjx.js} +56 -21
- package/dist/chunk-3xep5cjx.js.map +15 -0
- package/dist/{chunk-qjycjdj6.js → chunk-3z1qec12.js} +6 -8
- package/dist/{chunk-qjycjdj6.js.map → chunk-3z1qec12.js.map} +2 -2
- package/dist/{chunk-5jcdmjam.js → chunk-4jjp5k14.js} +1 -1
- package/dist/{chunk-n2arzn6e.js → chunk-4qfkag59.js} +44 -221
- package/dist/chunk-4qfkag59.js.map +20 -0
- package/dist/{chunk-rre42skh.js → chunk-4sm0aznx.js} +515 -80
- package/dist/{chunk-rre42skh.js.map → chunk-4sm0aznx.js.map} +11 -7
- package/dist/chunk-4yqmp43v.js +159 -0
- package/dist/chunk-4yqmp43v.js.map +11 -0
- package/dist/{chunk-atmkaf60.js → chunk-5e3pq99w.js} +2 -6
- package/dist/{chunk-atmkaf60.js.map → chunk-5e3pq99w.js.map} +3 -3
- package/dist/{chunk-agsvg9ar.js → chunk-5ntny1qx.js} +1 -1
- package/dist/{chunk-z2sery1b.js → chunk-9nbmsvn5.js} +60 -20
- package/dist/chunk-9nbmsvn5.js.map +11 -0
- package/dist/{chunk-e4rvtvpw.js → chunk-aa2pen2v.js} +250 -78
- package/dist/chunk-aa2pen2v.js.map +34 -0
- package/dist/{chunk-64sr682n.js → chunk-ajnan18g.js} +11 -8
- package/dist/chunk-ajnan18g.js.map +12 -0
- package/dist/{chunk-9aehf39w.js → chunk-f26bck4t.js} +4 -4
- package/dist/{chunk-7ds9620f.js → chunk-fvt9rjsa.js} +23 -7
- package/dist/chunk-fvt9rjsa.js.map +10 -0
- package/dist/{chunk-kt81c11h.js → chunk-gbejpkex.js} +5 -5
- package/dist/{chunk-kt81c11h.js.map → chunk-gbejpkex.js.map} +1 -1
- package/dist/{chunk-vjjv9mrb.js → chunk-gzasd5b6.js} +5 -5
- package/dist/{chunk-vjjv9mrb.js.map → chunk-gzasd5b6.js.map} +3 -3
- package/dist/{chunk-d63tybny.js → chunk-h0k55pc7.js} +4 -4
- package/dist/{chunk-d63tybny.js.map → chunk-h0k55pc7.js.map} +1 -1
- package/dist/chunk-h5vqbfmd.js +1537 -0
- package/dist/chunk-h5vqbfmd.js.map +19 -0
- package/dist/{chunk-3kv70xwp.js → chunk-j1sbhm7p.js} +18 -2
- package/dist/chunk-j1sbhm7p.js.map +10 -0
- package/dist/{chunk-hdz94br2.js → chunk-k522z7v6.js} +10 -5
- package/dist/chunk-k522z7v6.js.map +10 -0
- package/dist/{chunk-wjgm6jjt.js → chunk-mth82m8t.js} +128 -94
- package/dist/chunk-mth82m8t.js.map +14 -0
- package/dist/{chunk-qv38twt8.js → chunk-mwsxn98e.js} +46 -25
- package/dist/{chunk-qv38twt8.js.map → chunk-mwsxn98e.js.map} +6 -6
- package/dist/chunk-n4khvw9n.js +111 -0
- package/dist/chunk-n4khvw9n.js.map +11 -0
- package/dist/{chunk-qjzp9xyb.js → chunk-nn0tekr1.js} +6 -8
- package/dist/chunk-nn0tekr1.js.map +12 -0
- package/dist/chunk-nx7k8tpr.js +436 -0
- package/dist/chunk-nx7k8tpr.js.map +12 -0
- package/dist/{chunk-08twe8m6.js → chunk-p1rzczbt.js} +1 -1
- package/dist/{chunk-37wk412q.js → chunk-p1x242ad.js} +587 -70
- package/dist/chunk-p1x242ad.js.map +25 -0
- package/dist/{chunk-tn7xcs2n.js → chunk-pc7ys28c.js} +68 -5
- package/dist/chunk-pc7ys28c.js.map +14 -0
- package/dist/{chunk-3fqt22c4.js → chunk-q0k9nc5a.js} +280 -88
- package/dist/chunk-q0k9nc5a.js.map +14 -0
- package/dist/chunk-r8jrnexe.js +403 -0
- package/dist/chunk-r8jrnexe.js.map +10 -0
- package/dist/{chunk-gbrpsx4m.js → chunk-rafagrwr.js} +30 -2
- package/dist/chunk-rafagrwr.js.map +11 -0
- package/dist/{chunk-xdpwpkha.js → chunk-rv2hkwwa.js} +1 -1
- package/dist/{chunk-6ed5bwnd.js → chunk-sbzzr4kx.js} +1203 -691
- package/dist/{chunk-6ed5bwnd.js.map → chunk-sbzzr4kx.js.map} +15 -9
- package/dist/{chunk-d2ndstdf.js → chunk-v1xppd0y.js} +13 -11
- package/dist/{chunk-d2ndstdf.js.map → chunk-v1xppd0y.js.map} +2 -2
- package/dist/chunk-v4en4jc2.js +252 -0
- package/dist/chunk-v4en4jc2.js.map +10 -0
- package/dist/{chunk-1kamz6j0.js → chunk-w1tvjszy.js} +1 -1
- package/dist/{chunk-rp1mvzb4.js → chunk-w9tg6yyb.js} +11 -6
- package/dist/{chunk-rp1mvzb4.js.map → chunk-w9tg6yyb.js.map} +3 -3
- package/dist/{chunk-4nxeacx7.js → chunk-wdage1eb.js} +1 -1
- package/dist/{chunk-ha58tjtt.js → chunk-wtf06et8.js} +9 -5
- package/dist/{chunk-ha58tjtt.js.map → chunk-wtf06et8.js.map} +3 -3
- package/dist/{chunk-h0knpbz5.js → chunk-xajtptbw.js} +782 -211
- package/dist/chunk-xajtptbw.js.map +40 -0
- package/dist/{chunk-xc7hq65b.js → chunk-yp8ee62z.js} +49 -2
- package/dist/chunk-yp8ee62z.js.map +11 -0
- package/dist/chunk-z4ccwbkz.js +139 -0
- package/dist/chunk-z4ccwbkz.js.map +10 -0
- package/dist/datasets/builders.d.ts +11 -2
- package/dist/datasets/builders.d.ts.map +1 -1
- package/dist/datasets/changes.d.ts +14 -4
- package/dist/datasets/changes.d.ts.map +1 -1
- package/dist/datasets/execution.d.ts +15 -1
- package/dist/datasets/execution.d.ts.map +1 -1
- package/dist/datasets/index.d.ts +1 -0
- package/dist/datasets/index.d.ts.map +1 -1
- package/dist/datasets/sequence.d.ts +7 -0
- package/dist/datasets/sequence.d.ts.map +1 -0
- package/dist/datasets/types.d.ts +1 -0
- package/dist/datasets/types.d.ts.map +1 -1
- package/dist/datasets/validation.d.ts.map +1 -1
- package/dist/datasets/write.d.ts +37 -0
- package/dist/datasets/write.d.ts.map +1 -0
- package/dist/datasets/write.js +17 -0
- package/dist/datasets/write.js.map +9 -0
- package/dist/events/execution.d.ts.map +1 -1
- package/dist/events/types/datasets.d.ts +2 -6
- package/dist/events/types/datasets.d.ts.map +1 -1
- package/dist/execution/agent.d.ts.map +1 -1
- package/dist/execution/agent.js +39 -32
- package/dist/execution/agent.js.map +1 -1
- package/dist/execution/authorization.d.ts +58 -20
- package/dist/execution/authorization.d.ts.map +1 -1
- package/dist/execution/authorized-object-reader.d.ts +69 -0
- package/dist/execution/authorized-object-reader.d.ts.map +1 -0
- package/dist/execution/durable.d.ts.map +1 -1
- package/dist/execution/index.d.ts +1 -1
- package/dist/execution/index.d.ts.map +1 -1
- package/dist/execution/primitive.js +39 -32
- package/dist/execution/primitive.js.map +2 -2
- package/dist/execution/request.d.ts +11 -0
- package/dist/execution/request.d.ts.map +1 -1
- package/dist/execution/request.js +76 -40
- package/dist/execution/request.js.map +3 -3
- package/dist/execution/scopes.d.ts +16 -0
- package/dist/execution/scopes.d.ts.map +1 -1
- package/dist/execution/types.d.ts +9 -0
- package/dist/execution/types.d.ts.map +1 -1
- package/dist/http/api-routes.d.ts +2 -0
- package/dist/http/api-routes.d.ts.map +1 -1
- package/dist/http/index.js +1 -1
- package/dist/index.d.ts +8 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +92 -78
- package/dist/index.js.map +1 -1
- package/dist/lake-storage/definition-updates.d.ts.map +1 -1
- package/dist/lake-storage/errors.d.ts +5 -1
- package/dist/lake-storage/errors.d.ts.map +1 -1
- package/dist/lake-storage/in-memory.d.ts +1 -0
- package/dist/lake-storage/in-memory.d.ts.map +1 -1
- package/dist/lake-storage/index.d.ts +6 -1
- package/dist/lake-storage/index.d.ts.map +1 -1
- package/dist/lake-storage/index.js +24 -7
- package/dist/lake-storage/index.js.map +1 -1
- package/dist/lake-storage/merge-validation.d.ts.map +1 -1
- package/dist/lake-storage/merge.d.ts +13 -2
- package/dist/lake-storage/merge.d.ts.map +1 -1
- package/dist/lake-storage/source-ordering.d.ts +19 -0
- package/dist/lake-storage/source-ordering.d.ts.map +1 -0
- package/dist/lake-storage/sql-transforms.d.ts +2 -1
- package/dist/lake-storage/sql-transforms.d.ts.map +1 -1
- package/dist/lake-storage/types.d.ts +10 -5
- package/dist/lake-storage/types.d.ts.map +1 -1
- package/dist/lake-storage/version-inputs.d.ts +4 -0
- package/dist/lake-storage/version-inputs.d.ts.map +1 -0
- package/dist/materializer/index.js +25 -22
- package/dist/materializer/index.js.map +1 -1
- package/dist/objects/authorized-ontology-view.d.ts +25 -0
- package/dist/objects/authorized-ontology-view.d.ts.map +1 -0
- package/dist/objects/execution.d.ts +1 -1
- package/dist/objects/execution.d.ts.map +1 -1
- package/dist/objects/index.js +29 -26
- package/dist/objects/index.js.map +1 -1
- package/dist/objects/link/authorization.d.ts +2 -7
- package/dist/objects/link/authorization.d.ts.map +1 -1
- package/dist/objects/query/executor.d.ts +4 -2
- package/dist/objects/query/executor.d.ts.map +1 -1
- package/dist/objects/query/index.js +24 -21
- package/dist/objects/query/index.js.map +1 -1
- package/dist/objects/query/links.d.ts +22 -1
- package/dist/objects/query/links.d.ts.map +1 -1
- package/dist/objects/query/selected-read-admission.d.ts +27 -0
- package/dist/objects/query/selected-read-admission.d.ts.map +1 -0
- package/dist/objects/query/validate.d.ts +60 -2
- package/dist/objects/query/validate.d.ts.map +1 -1
- package/dist/objects/sdk/object-handle.d.ts.map +1 -1
- package/dist/objects/sdk/object-set.d.ts.map +1 -1
- package/dist/objects/sdk/runtime-query-executor.d.ts +2 -7
- package/dist/objects/sdk/runtime-query-executor.d.ts.map +1 -1
- package/dist/objects/sdk/telemetry-channel.d.ts.map +1 -1
- package/dist/objects/service/list-service.d.ts +2 -3
- package/dist/objects/service/list-service.d.ts.map +1 -1
- package/dist/objects/telemetry/history.d.ts +8 -6
- package/dist/objects/telemetry/history.d.ts.map +1 -1
- package/dist/objects/telemetry/index.d.ts +2 -2
- package/dist/objects/telemetry/index.d.ts.map +1 -1
- package/dist/objects/telemetry/workload.d.ts +11 -0
- package/dist/objects/telemetry/workload.d.ts.map +1 -0
- package/dist/ontology/index.d.ts +2 -1
- package/dist/ontology/index.d.ts.map +1 -1
- package/dist/ontology/index.js +13 -12
- package/dist/ontology/index.js.map +1 -1
- package/dist/ontology/inference/index.d.ts +2 -1
- package/dist/ontology/inference/index.d.ts.map +1 -1
- package/dist/ontology/internal.d.ts +0 -1
- package/dist/ontology/internal.d.ts.map +1 -1
- package/dist/ontology/internal.js +5 -10
- package/dist/ontology/internal.js.map +3 -3
- package/dist/ontology/json-schema.d.ts +10 -6
- package/dist/ontology/json-schema.d.ts.map +1 -1
- package/dist/ontology/link-path-selection.d.ts +35 -0
- package/dist/ontology/link-path-selection.d.ts.map +1 -0
- package/dist/ontology/refs.d.ts +2 -0
- package/dist/ontology/refs.d.ts.map +1 -1
- package/dist/ontology/tokens.d.ts +2 -1
- package/dist/ontology/tokens.d.ts.map +1 -1
- package/dist/pipelines/execution.d.ts.map +1 -1
- package/dist/pipelines/index.js +27 -24
- package/dist/pipelines/index.js.map +1 -1
- package/dist/pipelines/request.d.ts.map +1 -1
- package/dist/projections/execution.d.ts.map +1 -1
- package/dist/projections/internal.js +25 -22
- package/dist/projections/internal.js.map +1 -1
- package/dist/projections/run-dispatch.d.ts.map +1 -1
- package/dist/rules/execution.d.ts.map +1 -1
- package/dist/runtime/create.d.ts +4 -1
- package/dist/runtime/create.d.ts.map +1 -1
- package/dist/runtime/definitions.d.ts +2 -0
- package/dist/runtime/definitions.d.ts.map +1 -1
- package/dist/runtime/host.d.ts +2 -0
- package/dist/runtime/host.d.ts.map +1 -1
- package/dist/runtime/internal.d.ts +1 -0
- package/dist/runtime/internal.d.ts.map +1 -1
- package/dist/runtime/resolve-definitions.d.ts +2 -0
- package/dist/runtime/resolve-definitions.d.ts.map +1 -1
- package/dist/runtime/sixb.d.ts +4 -0
- package/dist/runtime/sixb.d.ts.map +1 -1
- package/dist/runtime/types.d.ts +3 -0
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/schedules/execution.d.ts +2 -1
- package/dist/schedules/execution.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 +7 -2
- package/dist/security/grants.d.ts.map +1 -1
- package/dist/security/index.d.ts +1 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/registry.d.ts +1 -0
- package/dist/security/registry.d.ts.map +1 -1
- package/dist/security/types.d.ts +7 -1
- package/dist/security/types.d.ts.map +1 -1
- package/dist/security/validation.d.ts +2 -0
- package/dist/security/validation.d.ts.map +1 -1
- package/dist/shares/access-plan.d.ts +22 -0
- package/dist/shares/access-plan.d.ts.map +1 -0
- package/dist/shares/builders.d.ts +14 -0
- package/dist/shares/builders.d.ts.map +1 -0
- package/dist/shares/compiler.d.ts +14 -0
- package/dist/shares/compiler.d.ts.map +1 -0
- package/dist/shares/errors.d.ts +4 -0
- package/dist/shares/errors.d.ts.map +1 -0
- package/dist/shares/execution.d.ts +57 -0
- package/dist/shares/execution.d.ts.map +1 -0
- package/dist/shares/index.d.ts +10 -0
- package/dist/shares/index.d.ts.map +1 -0
- package/dist/shares/internal.d.ts +3 -0
- package/dist/shares/internal.d.ts.map +1 -0
- package/dist/shares/internal.js +239 -0
- package/dist/shares/internal.js.map +10 -0
- package/dist/shares/intersection.d.ts +9 -0
- package/dist/shares/intersection.d.ts.map +1 -0
- package/dist/shares/session-protocol.d.ts +41 -0
- package/dist/shares/session-protocol.d.ts.map +1 -0
- package/dist/shares/types.d.ts +51 -0
- package/dist/shares/types.d.ts.map +1 -0
- package/dist/shares/validation.d.ts +11 -0
- package/dist/shares/validation.d.ts.map +1 -0
- package/dist/storage/action-runs/provider.js +2 -2
- package/dist/storage/agents/provider.js +2 -2
- package/dist/storage/executions/in-memory.d.ts +3 -0
- package/dist/storage/executions/in-memory.d.ts.map +1 -1
- package/dist/storage/executions/provider.d.ts +4 -1
- package/dist/storage/executions/provider.d.ts.map +1 -1
- package/dist/storage/executions/provider.js +23 -3
- package/dist/storage/executions/provider.js.map +3 -3
- package/dist/storage/executions/run-link.d.ts +7 -0
- package/dist/storage/executions/run-link.d.ts.map +1 -1
- package/dist/storage/executions/validation.d.ts +6 -0
- package/dist/storage/executions/validation.d.ts.map +1 -1
- package/dist/storage/in-memory/index.d.ts +8 -0
- package/dist/storage/in-memory/index.d.ts.map +1 -1
- package/dist/storage/index.d.ts +8 -2
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +65 -36
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/objects/execution-limits.d.ts +25 -0
- package/dist/storage/objects/execution-limits.d.ts.map +1 -0
- package/dist/storage/objects/guard.d.ts +16 -0
- package/dist/storage/objects/guard.d.ts.map +1 -0
- package/dist/storage/objects/in-memory/index.d.ts +3 -0
- package/dist/storage/objects/in-memory/index.d.ts.map +1 -0
- package/dist/storage/objects/in-memory/keys.d.ts +10 -0
- package/dist/storage/objects/in-memory/keys.d.ts.map +1 -0
- package/dist/storage/objects/in-memory/query.d.ts +31 -0
- package/dist/storage/objects/in-memory/query.d.ts.map +1 -0
- package/dist/storage/objects/in-memory/read-scope.d.ts +18 -0
- package/dist/storage/objects/in-memory/read-scope.d.ts.map +1 -0
- package/dist/storage/objects/in-memory/read-source.d.ts +10 -0
- package/dist/storage/objects/in-memory/read-source.d.ts.map +1 -0
- package/dist/storage/objects/in-memory/selected-reader.d.ts +9 -0
- package/dist/storage/objects/in-memory/selected-reader.d.ts.map +1 -0
- package/dist/storage/objects/{in-memory.d.ts → in-memory/storage.d.ts} +13 -10
- package/dist/storage/objects/in-memory/storage.d.ts.map +1 -0
- package/dist/storage/objects/index.d.ts +4 -1
- package/dist/storage/objects/index.d.ts.map +1 -1
- package/dist/storage/objects/keys.d.ts +1 -1
- package/dist/storage/objects/keys.d.ts.map +1 -1
- package/dist/storage/objects/read-scope.d.ts +25 -0
- package/dist/storage/objects/read-scope.d.ts.map +1 -0
- package/dist/storage/objects/types.d.ts +114 -22
- package/dist/storage/objects/types.d.ts.map +1 -1
- package/dist/storage/operation-scope.d.ts +3 -0
- package/dist/storage/operation-scope.d.ts.map +1 -1
- package/dist/storage/operation-scope.js +4 -2
- package/dist/storage/operation-scope.js.map +1 -1
- package/dist/storage/pipeline-runs/provider.js +2 -2
- package/dist/storage/projection-runs/provider.js +2 -2
- package/dist/storage/share-grants/errors.d.ts +8 -0
- package/dist/storage/share-grants/errors.d.ts.map +1 -0
- package/dist/storage/share-grants/in-memory.d.ts +11 -0
- package/dist/storage/share-grants/in-memory.d.ts.map +1 -0
- package/dist/storage/share-grants/index.d.ts +5 -0
- package/dist/storage/share-grants/index.d.ts.map +1 -0
- package/dist/storage/share-grants/provider.d.ts +4 -0
- package/dist/storage/share-grants/provider.d.ts.map +1 -0
- package/dist/storage/share-grants/provider.js +24 -0
- package/dist/storage/share-grants/provider.js.map +9 -0
- package/dist/storage/share-grants/record.d.ts +11 -0
- package/dist/storage/share-grants/record.d.ts.map +1 -0
- package/dist/storage/share-grants/types.d.ts +97 -0
- package/dist/storage/share-grants/types.d.ts.map +1 -0
- package/dist/storage/share-sessions/errors.d.ts +8 -0
- package/dist/storage/share-sessions/errors.d.ts.map +1 -0
- package/dist/storage/share-sessions/in-memory.d.ts +14 -0
- package/dist/storage/share-sessions/in-memory.d.ts.map +1 -0
- package/dist/storage/share-sessions/index.d.ts +5 -0
- package/dist/storage/share-sessions/index.d.ts.map +1 -0
- package/dist/storage/share-sessions/provider.d.ts +3 -0
- package/dist/storage/share-sessions/provider.d.ts.map +1 -0
- package/dist/storage/share-sessions/provider.js +20 -0
- package/dist/storage/share-sessions/provider.js.map +9 -0
- package/dist/storage/share-sessions/record.d.ts +8 -0
- package/dist/storage/share-sessions/record.d.ts.map +1 -0
- package/dist/storage/share-sessions/types.d.ts +50 -0
- package/dist/storage/share-sessions/types.d.ts.map +1 -0
- package/dist/storage/sync-runs/provider.js +2 -2
- package/dist/storage/transaction.d.ts +2 -1
- package/dist/storage/transaction.d.ts.map +1 -1
- package/dist/storage/types.d.ts +8 -0
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/webhook-runs/provider.js +2 -2
- package/dist/storage/workflow-runs/provider.js +10 -7
- package/dist/storage/workflow-runs/provider.js.map +1 -1
- package/dist/syncs/execution.d.ts.map +1 -1
- package/dist/syncs/index.js +27 -24
- package/dist/syncs/index.js.map +1 -1
- package/dist/syncs/request.d.ts.map +1 -1
- package/dist/testing/dataset-sequence-contract.d.ts +4 -0
- package/dist/testing/dataset-sequence-contract.d.ts.map +1 -0
- package/dist/testing/effective-storage-contract.d.ts.map +1 -1
- package/dist/testing/execution-storage-contract.d.ts +4 -0
- package/dist/testing/execution-storage-contract.d.ts.map +1 -1
- package/dist/testing/index.d.ts +3 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +2555 -908
- package/dist/testing/index.js.map +11 -7
- package/dist/testing/lake-merge-storage-contract.d.ts +1 -0
- package/dist/testing/lake-merge-storage-contract.d.ts.map +1 -1
- package/dist/testing/lake-storage-contract.d.ts.map +1 -1
- package/dist/testing/object-read-scope-contract.d.ts +22 -0
- package/dist/testing/object-read-scope-contract.d.ts.map +1 -0
- package/dist/testing/share-grant-storage-contract.d.ts +10 -0
- package/dist/testing/share-grant-storage-contract.d.ts.map +1 -0
- package/dist/testing/share-session-storage-contract.d.ts +9 -0
- package/dist/testing/share-session-storage-contract.d.ts.map +1 -0
- package/dist/webhooks/internal.js +24 -21
- package/dist/webhooks/internal.js.map +2 -2
- package/dist/workflows/execution.d.ts.map +1 -1
- package/dist/workflows/index.js +42 -35
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/request.d.ts.map +1 -1
- package/package.json +25 -1
- package/src/actions/delegated-admission.ts +72 -0
- package/src/actions/descriptor.ts +58 -0
- package/src/actions/execution.ts +99 -24
- package/src/actions/request.ts +136 -19
- package/src/actions/run-authorization.ts +53 -0
- package/src/actions/run-dispatch.ts +8 -1
- package/src/agents/adapters.ts +30 -420
- package/src/agents/authority.ts +3 -4
- package/src/agents/context-resolution.ts +1 -4
- package/src/agents/errors.ts +0 -10
- package/src/agents/execution.ts +13 -5
- package/src/agents/identity.ts +4 -0
- package/src/agents/index.ts +1 -20
- package/src/agents/message.ts +4 -5
- package/src/agents/model-loop.ts +54 -6
- package/src/agents/request.ts +16 -3
- package/src/agents/tool-definition.ts +0 -19
- package/src/agents/validation.ts +6 -65
- package/src/ai-usage/execution.ts +4 -11
- package/src/authorization/decision.ts +29 -14
- package/src/authorization/grant-kinds.ts +10 -0
- package/src/authorization/index.ts +1 -0
- package/src/bootstrap/discovery.ts +3 -0
- package/src/bootstrap/ontology-type-manifest.ts +12 -6
- package/src/datasets/builders.ts +23 -2
- package/src/datasets/changes.ts +16 -4
- package/src/datasets/execution.ts +76 -5
- package/src/datasets/index.ts +1 -0
- package/src/datasets/sequence.ts +77 -0
- package/src/datasets/types.ts +1 -0
- package/src/datasets/validation.ts +26 -0
- package/src/datasets/write.ts +240 -0
- package/src/events/execution.ts +57 -7
- package/src/events/types/datasets.ts +2 -6
- package/src/execution/agent.ts +1 -4
- package/src/execution/authorization.ts +470 -90
- package/src/execution/authorized-object-reader.ts +695 -0
- package/src/execution/durable.ts +10 -2
- package/src/execution/index.ts +1 -0
- package/src/execution/request.ts +63 -13
- package/src/execution/scopes.ts +36 -6
- package/src/execution/types.ts +8 -0
- package/src/http/api-routes.ts +45 -0
- package/src/index.ts +36 -15
- package/src/lake-storage/definition-updates.ts +9 -0
- package/src/lake-storage/errors.ts +6 -1
- package/src/lake-storage/in-memory.ts +53 -17
- package/src/lake-storage/index.ts +10 -1
- package/src/lake-storage/merge-validation.ts +12 -2
- package/src/lake-storage/merge.ts +40 -2
- package/src/lake-storage/source-ordering.ts +95 -0
- package/src/lake-storage/sql-transforms.ts +2 -1
- package/src/lake-storage/types.ts +10 -5
- package/src/lake-storage/version-inputs.ts +14 -0
- package/src/objects/authorized-ontology-view.ts +512 -0
- package/src/objects/execution.ts +98 -143
- package/src/objects/link/authorization.ts +3 -2
- package/src/objects/query/executor.ts +45 -34
- package/src/objects/query/links.ts +84 -25
- package/src/objects/query/selected-read-admission.ts +310 -0
- package/src/objects/query/validate.ts +353 -36
- package/src/objects/sdk/object-handle.ts +2 -8
- package/src/objects/sdk/object-set.ts +10 -11
- package/src/objects/sdk/runtime-query-executor.ts +8 -28
- package/src/objects/sdk/telemetry-channel.ts +11 -7
- package/src/objects/service/list-service.ts +15 -29
- package/src/objects/telemetry/history.ts +297 -17
- package/src/objects/telemetry/index.ts +2 -2
- package/src/objects/telemetry/workload.ts +79 -0
- package/src/ontology/index.ts +7 -1
- package/src/ontology/inference/index.ts +4 -1
- package/src/ontology/internal.ts +0 -1
- package/src/ontology/json-schema.ts +13 -12
- package/src/ontology/link-path-selection.ts +193 -0
- package/src/ontology/refs.ts +19 -0
- package/src/ontology/tokens.ts +15 -8
- package/src/pipelines/execution.ts +30 -7
- package/src/pipelines/request.ts +5 -0
- package/src/projections/execution.ts +72 -11
- package/src/projections/run-dispatch.ts +6 -12
- package/src/rules/execution.ts +20 -8
- package/src/runtime/create.ts +5 -1
- package/src/runtime/definitions.ts +2 -0
- package/src/runtime/host.ts +25 -6
- package/src/runtime/internal.ts +1 -0
- package/src/runtime/resolve-definitions.ts +9 -0
- package/src/runtime/sixb.ts +23 -2
- package/src/runtime/types.ts +3 -0
- package/src/schedules/execution.ts +24 -2
- package/src/security/every.ts +4 -0
- package/src/security/grants.ts +45 -3
- package/src/security/index.ts +1 -0
- package/src/security/registry.ts +3 -0
- package/src/security/types.ts +8 -0
- package/src/security/validation.ts +3 -0
- package/src/shares/access-plan.ts +225 -0
- package/src/shares/builders.ts +381 -0
- package/src/shares/compiler.ts +359 -0
- package/src/shares/errors.ts +3 -0
- package/src/shares/execution.ts +394 -0
- package/src/shares/index.ts +28 -0
- package/src/shares/internal.ts +9 -0
- package/src/shares/intersection.ts +178 -0
- package/src/shares/session-protocol.ts +258 -0
- package/src/shares/types.ts +76 -0
- package/src/shares/validation.ts +40 -0
- package/src/storage/executions/in-memory.ts +9 -1
- package/src/storage/executions/provider.ts +30 -1
- package/src/storage/executions/run-link.ts +29 -0
- package/src/storage/executions/validation.ts +46 -1
- package/src/storage/in-memory/index.ts +21 -2
- package/src/storage/index.ts +51 -0
- package/src/storage/objects/execution-limits.ts +283 -0
- package/src/storage/objects/guard.ts +55 -0
- package/src/storage/objects/in-memory/index.ts +2 -0
- package/src/storage/objects/in-memory/keys.ts +46 -0
- package/src/storage/objects/in-memory/query.ts +754 -0
- package/src/storage/objects/in-memory/read-scope.ts +211 -0
- package/src/storage/objects/in-memory/read-source.ts +10 -0
- package/src/storage/objects/in-memory/selected-reader.ts +252 -0
- package/src/storage/objects/in-memory/storage.ts +589 -0
- package/src/storage/objects/index.ts +21 -0
- package/src/storage/objects/keys.ts +1 -1
- package/src/storage/objects/read-scope.ts +672 -0
- package/src/storage/objects/types.ts +123 -19
- package/src/storage/operation-scope.ts +16 -0
- package/src/storage/share-grants/errors.ts +14 -0
- package/src/storage/share-grants/in-memory.ts +107 -0
- package/src/storage/share-grants/index.ts +14 -0
- package/src/storage/share-grants/provider.ts +11 -0
- package/src/storage/share-grants/record.ts +347 -0
- package/src/storage/share-grants/types.ts +112 -0
- package/src/storage/share-sessions/errors.ts +14 -0
- package/src/storage/share-sessions/in-memory.ts +105 -0
- package/src/storage/share-sessions/index.ts +11 -0
- package/src/storage/share-sessions/provider.ts +9 -0
- package/src/storage/share-sessions/record.ts +176 -0
- package/src/storage/share-sessions/types.ts +57 -0
- package/src/storage/transaction.ts +14 -2
- package/src/storage/types.ts +27 -0
- package/src/syncs/execution.ts +25 -5
- package/src/syncs/request.ts +5 -0
- package/src/testing/dataset-sequence-contract.ts +373 -0
- package/src/testing/effective-storage-contract.ts +34 -0
- package/src/testing/execution-storage-contract.ts +79 -0
- package/src/testing/index.ts +16 -0
- package/src/testing/lake-merge-storage-contract.ts +3 -0
- package/src/testing/lake-storage-contract.ts +58 -0
- package/src/testing/object-read-scope-contract.ts +939 -0
- package/src/testing/share-grant-storage-contract.ts +325 -0
- package/src/testing/share-session-storage-contract.ts +235 -0
- package/src/workflows/execution.ts +53 -14
- package/src/workflows/request.ts +5 -0
- package/dist/chunk-2b5qtban.js.map +0 -14
- package/dist/chunk-37wk412q.js.map +0 -23
- package/dist/chunk-3fqt22c4.js.map +0 -14
- package/dist/chunk-3kv70xwp.js.map +0 -10
- package/dist/chunk-64sr682n.js.map +0 -12
- package/dist/chunk-7ds9620f.js.map +0 -10
- package/dist/chunk-dqn23610.js +0 -72
- package/dist/chunk-dqn23610.js.map +0 -11
- package/dist/chunk-e4rvtvpw.js.map +0 -34
- package/dist/chunk-gbrpsx4m.js.map +0 -11
- package/dist/chunk-h0knpbz5.js.map +0 -38
- package/dist/chunk-hdz94br2.js.map +0 -10
- package/dist/chunk-n2arzn6e.js.map +0 -20
- package/dist/chunk-qjzp9xyb.js.map +0 -12
- package/dist/chunk-tn7xcs2n.js.map +0 -13
- package/dist/chunk-wjgm6jjt.js.map +0 -13
- package/dist/chunk-xc7hq65b.js.map +0 -10
- package/dist/chunk-y35ma3mj.js +0 -551
- package/dist/chunk-y35ma3mj.js.map +0 -15
- package/dist/chunk-z2sery1b.js.map +0 -11
- package/dist/storage/objects/in-memory.d.ts.map +0 -1
- package/src/storage/objects/in-memory.ts +0 -1241
- /package/dist/{chunk-5jcdmjam.js.map → chunk-4jjp5k14.js.map} +0 -0
- /package/dist/{chunk-agsvg9ar.js.map → chunk-5ntny1qx.js.map} +0 -0
- /package/dist/{chunk-9aehf39w.js.map → chunk-f26bck4t.js.map} +0 -0
- /package/dist/{chunk-08twe8m6.js.map → chunk-p1rzczbt.js.map} +0 -0
- /package/dist/{chunk-xdpwpkha.js.map → chunk-rv2hkwwa.js.map} +0 -0
- /package/dist/{chunk-1kamz6j0.js.map → chunk-w1tvjszy.js.map} +0 -0
- /package/dist/{chunk-4nxeacx7.js.map → chunk-wdage1eb.js.map} +0 -0
|
@@ -0,0 +1,695 @@
|
|
|
1
|
+
import { assertAuthorized, isAllowed } from "../authorization"
|
|
2
|
+
import { AuthorizationError } from "../authorization/errors"
|
|
3
|
+
import type { AuthorizationContext } from "../authorization/types"
|
|
4
|
+
import {
|
|
5
|
+
type AuthorizedOntologySelection,
|
|
6
|
+
type AuthorizedOntologyView,
|
|
7
|
+
createAuthorizedOntologyView,
|
|
8
|
+
} from "../objects/authorized-ontology-view"
|
|
9
|
+
import {
|
|
10
|
+
countObjects,
|
|
11
|
+
type ExecuteObjectCountInput,
|
|
12
|
+
type ExecuteObjectCountResult,
|
|
13
|
+
type ExecuteObjectExistsInput,
|
|
14
|
+
type ExecuteObjectExistsResult,
|
|
15
|
+
type ExecuteObjectFacetsInput,
|
|
16
|
+
type ExecuteObjectFacetsResult,
|
|
17
|
+
type ExecuteObjectQueryInput,
|
|
18
|
+
type ExecuteObjectQueryLinksInput,
|
|
19
|
+
type ExecuteObjectQueryLinksResult,
|
|
20
|
+
type ExecuteObjectQueryResult,
|
|
21
|
+
executeObjectQuery,
|
|
22
|
+
executeObjectQueryLinks,
|
|
23
|
+
existsObjects,
|
|
24
|
+
facetObjects,
|
|
25
|
+
} from "../objects/query"
|
|
26
|
+
import { ObjectQueryValidationError } from "../objects/query/errors"
|
|
27
|
+
import { validateObjectFacetRequests } from "../objects/query/executor"
|
|
28
|
+
import type { ObjectQuery } from "../objects/query/ir"
|
|
29
|
+
import { preflightObjectQueryLinks } from "../objects/query/links"
|
|
30
|
+
import {
|
|
31
|
+
createSelectedObjectQueryAdmission,
|
|
32
|
+
type SelectedObjectQueryAdmission,
|
|
33
|
+
} from "../objects/query/selected-read-admission"
|
|
34
|
+
import {
|
|
35
|
+
type AdmittedObjectQuery,
|
|
36
|
+
validateObjectQuery,
|
|
37
|
+
validateObjectQueryWithAdmission,
|
|
38
|
+
} from "../objects/query/validate"
|
|
39
|
+
import {
|
|
40
|
+
admitTelemetryHistoryReadWorkload,
|
|
41
|
+
type TelemetryHistoryReadAdmission,
|
|
42
|
+
type TelemetryHistoryReadWorkloadInput,
|
|
43
|
+
} from "../objects/telemetry/workload"
|
|
44
|
+
import type { OntologyRegistry } from "../ontology"
|
|
45
|
+
import type {
|
|
46
|
+
CompiledObjectReadStep,
|
|
47
|
+
LinkBatchKey,
|
|
48
|
+
ObjectFacetRequest,
|
|
49
|
+
ObjectLinkRow,
|
|
50
|
+
ObjectReadStorage,
|
|
51
|
+
ObjectStorage,
|
|
52
|
+
} from "../storage"
|
|
53
|
+
import { assertObjectReadOutputWithinLimit, MAX_OBJECT_READ_FACETS } from "../storage"
|
|
54
|
+
import { captureExecutionScope, resolveExecutionScopeAuthorization } from "./authorization"
|
|
55
|
+
import type { ExecutionScope, RuntimeAuthorization } from "./types"
|
|
56
|
+
|
|
57
|
+
type RuntimeReadAuthorization = {
|
|
58
|
+
readonly projectId: string
|
|
59
|
+
readonly runtimeAuthorization: RuntimeAuthorization
|
|
60
|
+
readonly authorization?: AuthorizationContext
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
type ResolvedExecutionAuthority = ReturnType<typeof resolveExecutionScopeAuthorization>
|
|
64
|
+
type GetObjectInput = Omit<Parameters<ObjectReadStorage["getByPrimaryId"]>[0], "projectId">
|
|
65
|
+
type GetObjectsInput = Omit<Parameters<ObjectReadStorage["getByPrimaryIdBatch"]>[0], "projectId">
|
|
66
|
+
type SelectObjectPropertiesInput = Parameters<ObjectReadStorage["selectsObjectProperties"]>[0]
|
|
67
|
+
type CanReadObjectPropertyInput = SelectObjectPropertiesInput["items"][number]
|
|
68
|
+
type CanReadObjectPropertiesBatchInput = Omit<SelectObjectPropertiesInput, "projectId">
|
|
69
|
+
type ListObjectsInput = Omit<Parameters<ObjectReadStorage["list"]>[0], "projectId">
|
|
70
|
+
type ListLinksInput = Omit<Parameters<ObjectReadStorage["listLinks"]>[0], "projectId">
|
|
71
|
+
type ListLinksBatchInput = Omit<Parameters<ObjectReadStorage["listLinksBatch"]>[0], "projectId">
|
|
72
|
+
|
|
73
|
+
const readerConstructionKey = Object.freeze({})
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Core-owned object read boundary for one exact execution authority.
|
|
77
|
+
*
|
|
78
|
+
* The implementation class is intentionally private to this module. Its private fields make the
|
|
79
|
+
* exported instance type nominal, while the construction key prevents code that discovers the
|
|
80
|
+
* JavaScript constructor through an instance from manufacturing another reader.
|
|
81
|
+
*/
|
|
82
|
+
class AuthorizedObjectReaderImpl {
|
|
83
|
+
readonly #authorization: RuntimeAuthorization
|
|
84
|
+
readonly #authority: ResolvedExecutionAuthority
|
|
85
|
+
readonly #runtime: RuntimeReadAuthorization
|
|
86
|
+
readonly #ontology: OntologyRegistry
|
|
87
|
+
#ontologyView?: AuthorizedOntologyView
|
|
88
|
+
readonly #storage: ObjectReadStorage
|
|
89
|
+
readonly #delegatedObjectTypeIds?: ReadonlySet<string>
|
|
90
|
+
readonly #delegatedLinkDefinitions?: ReadonlySet<string>
|
|
91
|
+
readonly #delegatedQueryAdmission?: SelectedObjectQueryAdmission
|
|
92
|
+
|
|
93
|
+
constructor(
|
|
94
|
+
key: typeof readerConstructionKey,
|
|
95
|
+
input: {
|
|
96
|
+
readonly scope: ExecutionScope
|
|
97
|
+
readonly ontology: OntologyRegistry
|
|
98
|
+
readonly storage: ObjectReadStorage
|
|
99
|
+
readonly authority: ResolvedExecutionAuthority
|
|
100
|
+
}
|
|
101
|
+
) {
|
|
102
|
+
if (key !== readerConstructionKey) {
|
|
103
|
+
throw new Error("[Sixb] AuthorizedObjectReader can only be created by Core.")
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
this.#authorization = input.scope.authorization
|
|
107
|
+
this.#authority = input.authority
|
|
108
|
+
this.#ontology = input.ontology
|
|
109
|
+
this.#storage = input.storage
|
|
110
|
+
this.#delegatedObjectTypeIds =
|
|
111
|
+
input.authority.type === "delegated"
|
|
112
|
+
? new Set(input.authority.objectRead.scope.objects.map((object) => object.objectTypeId))
|
|
113
|
+
: undefined
|
|
114
|
+
this.#delegatedLinkDefinitions =
|
|
115
|
+
input.authority.type === "delegated"
|
|
116
|
+
? new Set(input.authority.objectRead.scope.steps.map(delegatedLinkDefinitionKey))
|
|
117
|
+
: undefined
|
|
118
|
+
this.#delegatedQueryAdmission =
|
|
119
|
+
input.authority.type === "delegated"
|
|
120
|
+
? createSelectedObjectQueryAdmission(input.authority.objectRead.scope)
|
|
121
|
+
: undefined
|
|
122
|
+
this.#runtime = Object.freeze({
|
|
123
|
+
projectId: input.scope.execution.projectId,
|
|
124
|
+
runtimeAuthorization: input.scope.authorization,
|
|
125
|
+
...(input.authority.type === "principal" ? { authorization: input.authority.context } : {}),
|
|
126
|
+
})
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
static assertBound(reader: AuthorizedObjectReaderImpl, scope: ExecutionScope): void {
|
|
130
|
+
const capturedScope = captureExecutionScope(scope)
|
|
131
|
+
resolveExecutionScopeAuthorization(reader.#runtime.projectId, capturedScope)
|
|
132
|
+
if (capturedScope.authorization !== reader.#authorization) {
|
|
133
|
+
throw new Error(
|
|
134
|
+
"[Sixb] AuthorizedObjectReader is not bound to this exact execution authority."
|
|
135
|
+
)
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
static ontologyView(reader: AuthorizedObjectReaderImpl): AuthorizedOntologyView {
|
|
140
|
+
const authority = reader.#authority
|
|
141
|
+
reader.#ontologyView ??= createAuthorizedOntologyView({
|
|
142
|
+
ontology: reader.#ontology,
|
|
143
|
+
selection: ontologySelectionForAuthority(authority, reader.#ontology),
|
|
144
|
+
...(authority.type === "delegated"
|
|
145
|
+
? {
|
|
146
|
+
assertOutputWithinLimit: (value: unknown) =>
|
|
147
|
+
assertObjectReadOutputWithinLimit(value, authority.objectRead.limits),
|
|
148
|
+
}
|
|
149
|
+
: {}),
|
|
150
|
+
})
|
|
151
|
+
return reader.#ontologyView
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/** Project identity carried by this nominal reader capability. */
|
|
155
|
+
get projectId(): string {
|
|
156
|
+
return this.#runtime.projectId
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
async getByPrimaryId(input: GetObjectInput): ReturnType<ObjectReadStorage["getByPrimaryId"]> {
|
|
160
|
+
const request = snapshotReadValue({
|
|
161
|
+
objectTypeId: input.objectTypeId,
|
|
162
|
+
primaryId: input.primaryId,
|
|
163
|
+
})
|
|
164
|
+
this.#assertObjectTypesViewable([request.objectTypeId])
|
|
165
|
+
return detachReadResult(
|
|
166
|
+
await this.#storage.getByPrimaryId({
|
|
167
|
+
...request,
|
|
168
|
+
projectId: this.#runtime.projectId,
|
|
169
|
+
})
|
|
170
|
+
)
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
async getByPrimaryIdBatch(
|
|
174
|
+
input: GetObjectsInput
|
|
175
|
+
): ReturnType<ObjectReadStorage["getByPrimaryIdBatch"]> {
|
|
176
|
+
const request = snapshotReadValue({
|
|
177
|
+
items: input.items.map((item) => ({
|
|
178
|
+
objectTypeId: item.objectTypeId,
|
|
179
|
+
primaryId: item.primaryId,
|
|
180
|
+
})),
|
|
181
|
+
})
|
|
182
|
+
this.#assertObjectTypesViewable(request.items.map((item) => item.objectTypeId))
|
|
183
|
+
return detachReadResult(
|
|
184
|
+
await this.#storage.getByPrimaryIdBatch({
|
|
185
|
+
...request,
|
|
186
|
+
projectId: this.#runtime.projectId,
|
|
187
|
+
})
|
|
188
|
+
)
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
async canReadObjectProperty(input: CanReadObjectPropertyInput): Promise<boolean> {
|
|
192
|
+
const request = snapshotReadValue({
|
|
193
|
+
objectTypeId: input.objectTypeId,
|
|
194
|
+
primaryId: input.primaryId,
|
|
195
|
+
propertyId: input.propertyId,
|
|
196
|
+
})
|
|
197
|
+
this.#assertObjectTypesViewable([request.objectTypeId])
|
|
198
|
+
if (this.#authority.type !== "delegated") return true
|
|
199
|
+
const [readable] = await this.#storage.selectsObjectProperties({
|
|
200
|
+
projectId: this.#runtime.projectId,
|
|
201
|
+
items: [request],
|
|
202
|
+
})
|
|
203
|
+
return readable ?? false
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
async canReadObjectPropertiesBatch(
|
|
207
|
+
input: CanReadObjectPropertiesBatchInput
|
|
208
|
+
): Promise<readonly boolean[]> {
|
|
209
|
+
const request = snapshotReadValue({
|
|
210
|
+
items: input.items.map((item) => ({
|
|
211
|
+
objectTypeId: item.objectTypeId,
|
|
212
|
+
primaryId: item.primaryId,
|
|
213
|
+
propertyId: item.propertyId,
|
|
214
|
+
})),
|
|
215
|
+
})
|
|
216
|
+
this.#assertObjectTypesViewable(request.items.map((item) => item.objectTypeId))
|
|
217
|
+
if (this.#authority.type !== "delegated") return request.items.map(() => true)
|
|
218
|
+
return detachReadResult(
|
|
219
|
+
await this.#storage.selectsObjectProperties({
|
|
220
|
+
...request,
|
|
221
|
+
projectId: this.#runtime.projectId,
|
|
222
|
+
})
|
|
223
|
+
)
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
async list(input: ListObjectsInput): ReturnType<ObjectReadStorage["list"]> {
|
|
227
|
+
const request = snapshotReadValue({
|
|
228
|
+
objectTypeId:
|
|
229
|
+
typeof input.objectTypeId === "string"
|
|
230
|
+
? input.objectTypeId
|
|
231
|
+
: input.objectTypeId === undefined
|
|
232
|
+
? undefined
|
|
233
|
+
: [...input.objectTypeId],
|
|
234
|
+
primaryIdPrefix: input.primaryIdPrefix,
|
|
235
|
+
primaryIdSuffix: input.primaryIdSuffix,
|
|
236
|
+
updatedAfter: input.updatedAfter,
|
|
237
|
+
updatedBefore: input.updatedBefore,
|
|
238
|
+
createdAfter: input.createdAfter,
|
|
239
|
+
createdBefore: input.createdBefore,
|
|
240
|
+
limit: input.limit,
|
|
241
|
+
offset: input.offset,
|
|
242
|
+
orderBy: input.orderBy,
|
|
243
|
+
order: input.order,
|
|
244
|
+
})
|
|
245
|
+
const objectTypeId = this.#resolveListObjectTypes(request.objectTypeId)
|
|
246
|
+
|
|
247
|
+
// An empty type selection means "none", never "all". Short-circuiting here prevents a
|
|
248
|
+
// provider with different empty-array semantics from turning a principal read into a broad one.
|
|
249
|
+
if (Array.isArray(objectTypeId) && objectTypeId.length === 0) {
|
|
250
|
+
return { objects: [], hasMore: false, total: 0 }
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return detachReadResult(
|
|
254
|
+
await this.#storage.list({
|
|
255
|
+
...request,
|
|
256
|
+
...(objectTypeId === undefined ? {} : { objectTypeId }),
|
|
257
|
+
projectId: this.#runtime.projectId,
|
|
258
|
+
})
|
|
259
|
+
)
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
async listLinks(input: ListLinksInput): ReturnType<ObjectReadStorage["listLinks"]> {
|
|
263
|
+
const request = snapshotReadValue({
|
|
264
|
+
objectTypeId: input.objectTypeId,
|
|
265
|
+
objectId: input.objectId,
|
|
266
|
+
linkId: input.linkId,
|
|
267
|
+
direction: input.direction,
|
|
268
|
+
})
|
|
269
|
+
this.#assertObjectTypesViewable([request.objectTypeId])
|
|
270
|
+
const links = detachReadResult(
|
|
271
|
+
await this.#storage.listLinks({
|
|
272
|
+
...request,
|
|
273
|
+
projectId: this.#runtime.projectId,
|
|
274
|
+
})
|
|
275
|
+
)
|
|
276
|
+
return links.filter((link) => this.#isLinkViewable(link))
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
async listLinksBatch(
|
|
280
|
+
input: ListLinksBatchInput
|
|
281
|
+
): ReturnType<ObjectReadStorage["listLinksBatch"]> {
|
|
282
|
+
const request = snapshotReadValue({
|
|
283
|
+
direction: input.direction,
|
|
284
|
+
items: input.items.map((item) => ({
|
|
285
|
+
objectTypeId: item.objectTypeId,
|
|
286
|
+
objectId: item.objectId,
|
|
287
|
+
linkId: item.linkId,
|
|
288
|
+
})),
|
|
289
|
+
})
|
|
290
|
+
this.#assertObjectTypesViewable(request.items.map((item) => item.objectTypeId))
|
|
291
|
+
const pages = detachReadResult(
|
|
292
|
+
await this.#storage.listLinksBatch({
|
|
293
|
+
...request,
|
|
294
|
+
projectId: this.#runtime.projectId,
|
|
295
|
+
})
|
|
296
|
+
)
|
|
297
|
+
const filtered = new Map<LinkBatchKey, ObjectLinkRow[]>()
|
|
298
|
+
for (const [key, links] of pages) {
|
|
299
|
+
filtered.set(
|
|
300
|
+
key,
|
|
301
|
+
links.filter((link) => this.#isLinkViewable(link))
|
|
302
|
+
)
|
|
303
|
+
}
|
|
304
|
+
return filtered
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
async executeQuery(
|
|
308
|
+
input: Omit<ExecuteObjectQueryInput, "projectId">
|
|
309
|
+
): Promise<ExecuteObjectQueryResult> {
|
|
310
|
+
const query = snapshotAuthoredQuery(input.query)
|
|
311
|
+
const includeTotal = snapshotReadValue(input.includeTotal)
|
|
312
|
+
const executionQuery = this.#admitDelegatedQuery(query)?.query ?? query
|
|
313
|
+
return detachReadResult(
|
|
314
|
+
await executeObjectQuery(
|
|
315
|
+
{
|
|
316
|
+
query: executionQuery,
|
|
317
|
+
...(includeTotal === undefined ? {} : { includeTotal }),
|
|
318
|
+
projectId: this.#runtime.projectId,
|
|
319
|
+
},
|
|
320
|
+
this.#queryExecutorOptions()
|
|
321
|
+
)
|
|
322
|
+
)
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
async queryLinks(
|
|
326
|
+
input: Omit<ExecuteObjectQueryLinksInput, "projectId">
|
|
327
|
+
): Promise<ExecuteObjectQueryLinksResult> {
|
|
328
|
+
const query = snapshotAuthoredQuery(input.query)
|
|
329
|
+
const request = snapshotReadValue({
|
|
330
|
+
direction: input.direction,
|
|
331
|
+
linkId: input.linkId,
|
|
332
|
+
includeObjects: input.includeObjects,
|
|
333
|
+
pageSize: input.pageSize,
|
|
334
|
+
pageToken: input.pageToken,
|
|
335
|
+
})
|
|
336
|
+
let executionQuery = query
|
|
337
|
+
const admission = this.#delegatedQueryAdmission
|
|
338
|
+
if (admission) {
|
|
339
|
+
const preflight = preflightObjectQueryLinks(
|
|
340
|
+
{ query, ...request, projectId: this.#runtime.projectId },
|
|
341
|
+
{ ontology: this.#ontology }
|
|
342
|
+
)
|
|
343
|
+
const admitted = validateObjectQueryWithAdmission(
|
|
344
|
+
preflight.validated.query,
|
|
345
|
+
{ ontology: this.#ontology, normalize: false },
|
|
346
|
+
admission
|
|
347
|
+
)
|
|
348
|
+
admission.assertIncidentEdgeSelected({
|
|
349
|
+
state: admitted.admissionState,
|
|
350
|
+
...(preflight.linkId === undefined ? {} : { linkId: preflight.linkId }),
|
|
351
|
+
direction: preflight.direction,
|
|
352
|
+
path: "$.linkId",
|
|
353
|
+
})
|
|
354
|
+
executionQuery = admitted.query
|
|
355
|
+
}
|
|
356
|
+
const result = detachReadResult(
|
|
357
|
+
await executeObjectQueryLinks(
|
|
358
|
+
{ query: executionQuery, ...request, projectId: this.#runtime.projectId },
|
|
359
|
+
this.#queryExecutorOptions()
|
|
360
|
+
)
|
|
361
|
+
)
|
|
362
|
+
|
|
363
|
+
// Link pagination is computed by the provider-facing executor. Filtering afterward would make
|
|
364
|
+
// its cursor and hasMore metadata describe hidden rows, so a provider contract violation must
|
|
365
|
+
// fail closed instead of returning a partially filtered page.
|
|
366
|
+
if (
|
|
367
|
+
result.objects.some((row) => !this.#isObjectTypeViewable(row.objectTypeId)) ||
|
|
368
|
+
result.links.some((link) => !this.#isLinkViewable(link))
|
|
369
|
+
) {
|
|
370
|
+
throw new Error("[Sixb] Object storage returned a link page outside its authorized scope.")
|
|
371
|
+
}
|
|
372
|
+
return result
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
async count(
|
|
376
|
+
input: Omit<ExecuteObjectCountInput, "projectId">
|
|
377
|
+
): Promise<ExecuteObjectCountResult> {
|
|
378
|
+
const query = snapshotAuthoredQuery(input.query)
|
|
379
|
+
const executionQuery = this.#admitDelegatedQuery(query)?.query ?? query
|
|
380
|
+
return detachReadResult(
|
|
381
|
+
await countObjects(
|
|
382
|
+
{ query: executionQuery, projectId: this.#runtime.projectId },
|
|
383
|
+
this.#queryExecutorOptions()
|
|
384
|
+
)
|
|
385
|
+
)
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
async exists(
|
|
389
|
+
input: Omit<ExecuteObjectExistsInput, "projectId">
|
|
390
|
+
): Promise<ExecuteObjectExistsResult> {
|
|
391
|
+
const query = snapshotAuthoredQuery(input.query)
|
|
392
|
+
const executionQuery = this.#admitDelegatedQuery(query)?.query ?? query
|
|
393
|
+
return detachReadResult(
|
|
394
|
+
await existsObjects(
|
|
395
|
+
{ query: executionQuery, projectId: this.#runtime.projectId },
|
|
396
|
+
this.#queryExecutorOptions()
|
|
397
|
+
)
|
|
398
|
+
)
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
async facet(
|
|
402
|
+
input: Omit<ExecuteObjectFacetsInput, "projectId">
|
|
403
|
+
): Promise<ExecuteObjectFacetsResult> {
|
|
404
|
+
const query = snapshotAuthoredQuery(input.query)
|
|
405
|
+
const facets = snapshotFacetRequests(input.facets)
|
|
406
|
+
let executionQuery = query
|
|
407
|
+
let executionFacets = facets
|
|
408
|
+
const admission = this.#delegatedQueryAdmission
|
|
409
|
+
if (admission) {
|
|
410
|
+
// Terminal arguments are ordinary validation errors, not an authorization oracle. Validate
|
|
411
|
+
// them against the canonical result shape before raising any delegated-scope denial.
|
|
412
|
+
const validated = validateObjectQuery(query, { ontology: this.#ontology })
|
|
413
|
+
const normalizedFacets = validateObjectFacetRequests(facets, validated.result.objectTypeIds, {
|
|
414
|
+
ontology: this.#ontology,
|
|
415
|
+
})
|
|
416
|
+
const admitted = validateObjectQueryWithAdmission(
|
|
417
|
+
validated.query,
|
|
418
|
+
{ ontology: this.#ontology, normalize: false },
|
|
419
|
+
admission
|
|
420
|
+
)
|
|
421
|
+
normalizedFacets.forEach((facet, index) => {
|
|
422
|
+
admission.assertPropertySelected({
|
|
423
|
+
state: admitted.admissionState,
|
|
424
|
+
propertyId: facet.propertyId,
|
|
425
|
+
use: "facet",
|
|
426
|
+
path: `$.facets[${index}].propertyId`,
|
|
427
|
+
})
|
|
428
|
+
})
|
|
429
|
+
executionQuery = admitted.query
|
|
430
|
+
executionFacets = normalizedFacets
|
|
431
|
+
}
|
|
432
|
+
return detachReadResult(
|
|
433
|
+
await facetObjects(
|
|
434
|
+
{
|
|
435
|
+
query: executionQuery,
|
|
436
|
+
facets: executionFacets,
|
|
437
|
+
projectId: this.#runtime.projectId,
|
|
438
|
+
},
|
|
439
|
+
this.#queryExecutorOptions()
|
|
440
|
+
)
|
|
441
|
+
)
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
/** Enforce the delegated response budget without exposing or recombining its limits. */
|
|
445
|
+
assertVisibleOutputWithinLimit(value: unknown): void {
|
|
446
|
+
if (this.#authority.type !== "delegated") return
|
|
447
|
+
assertObjectReadOutputWithinLimit(value, this.#authority.objectRead.limits)
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/** Admit adjacent telemetry work without exposing which authority policy was selected. */
|
|
451
|
+
admitTelemetryHistoryRead(
|
|
452
|
+
input: TelemetryHistoryReadWorkloadInput
|
|
453
|
+
): TelemetryHistoryReadAdmission {
|
|
454
|
+
return admitTelemetryHistoryReadWorkload(input, this.#authority.type === "delegated")
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
#queryExecutorOptions() {
|
|
458
|
+
if (this.#authority.type === "delegated") {
|
|
459
|
+
// The selected storage instance is the private execution capability. Passing the delegated
|
|
460
|
+
// runtime token into the generic executor would either reject this admitted query or tempt a
|
|
461
|
+
// forgeable bypass flag; neither is needed at this nominal boundary.
|
|
462
|
+
return { ontology: this.#ontology, storage: this.#storage }
|
|
463
|
+
}
|
|
464
|
+
return {
|
|
465
|
+
ontology: this.#ontology,
|
|
466
|
+
storage: this.#storage,
|
|
467
|
+
runtimeAuthorization: this.#runtime.runtimeAuthorization,
|
|
468
|
+
...(this.#runtime.authorization === undefined
|
|
469
|
+
? {}
|
|
470
|
+
: { authorization: this.#runtime.authorization }),
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
#admitDelegatedQuery(query: ObjectQuery): AdmittedObjectQuery | undefined {
|
|
475
|
+
if (!this.#delegatedQueryAdmission) return undefined
|
|
476
|
+
return validateObjectQueryWithAdmission(
|
|
477
|
+
query,
|
|
478
|
+
{ ontology: this.#ontology },
|
|
479
|
+
this.#delegatedQueryAdmission
|
|
480
|
+
)
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
#assertObjectTypesViewable(objectTypeIds: readonly string[]): void {
|
|
484
|
+
if (this.#authority.type === "delegated") {
|
|
485
|
+
for (const objectTypeId of new Set(objectTypeIds)) {
|
|
486
|
+
if (this.#delegatedObjectTypeIds?.has(objectTypeId)) continue
|
|
487
|
+
throw new AuthorizationError(
|
|
488
|
+
`delegated:object.view:${objectTypeId}`,
|
|
489
|
+
`[Sixb] Delegated authorization does not select object type '${objectTypeId}'.`
|
|
490
|
+
)
|
|
491
|
+
}
|
|
492
|
+
return
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
for (const objectTypeId of new Set(objectTypeIds)) {
|
|
496
|
+
assertAuthorized(this.#runtime, { kind: "object.view", objectTypeId })
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
#resolveListObjectTypes(
|
|
501
|
+
requested: ListObjectsInput["objectTypeId"]
|
|
502
|
+
): ListObjectsInput["objectTypeId"] {
|
|
503
|
+
if (requested !== undefined) {
|
|
504
|
+
const objectTypeIds = typeof requested === "string" ? [requested] : [...new Set(requested)]
|
|
505
|
+
for (const objectTypeId of objectTypeIds) {
|
|
506
|
+
this.#ontology.resolveObjectType(objectTypeId)
|
|
507
|
+
}
|
|
508
|
+
this.#assertObjectTypesViewable(objectTypeIds)
|
|
509
|
+
return typeof requested === "string" ? requested : objectTypeIds
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
if (this.#authority.type === "unrestricted") return undefined
|
|
513
|
+
return this.#ontology
|
|
514
|
+
.listObjectTypes()
|
|
515
|
+
.map((objectType) => objectType.id)
|
|
516
|
+
.filter((objectTypeId) => this.#isObjectTypeViewable(objectTypeId))
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
#isObjectTypeViewable(objectTypeId: string): boolean {
|
|
520
|
+
if (this.#authority.type === "delegated") {
|
|
521
|
+
return this.#delegatedObjectTypeIds?.has(objectTypeId) ?? false
|
|
522
|
+
}
|
|
523
|
+
return isAllowed(this.#runtime.authorization, { kind: "object.view", objectTypeId })
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
#isLinkViewable(link: ObjectLinkRow): boolean {
|
|
527
|
+
if (
|
|
528
|
+
!this.#isObjectTypeViewable(link.sourceTypeId) ||
|
|
529
|
+
!this.#isObjectTypeViewable(link.targetTypeId)
|
|
530
|
+
) {
|
|
531
|
+
return false
|
|
532
|
+
}
|
|
533
|
+
return (
|
|
534
|
+
this.#delegatedLinkDefinitions?.has(delegatedLinkDefinitionKey(link)) ??
|
|
535
|
+
this.#authority.type !== "delegated"
|
|
536
|
+
)
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
Object.freeze(AuthorizedObjectReaderImpl.prototype)
|
|
541
|
+
Object.freeze(AuthorizedObjectReaderImpl)
|
|
542
|
+
|
|
543
|
+
export type AuthorizedObjectReader = AuthorizedObjectReaderImpl
|
|
544
|
+
|
|
545
|
+
/** Build the sole application-facing object reader for one registered execution scope. */
|
|
546
|
+
export function createAuthorizedObjectReader(input: {
|
|
547
|
+
readonly scope: ExecutionScope
|
|
548
|
+
readonly ontology: OntologyRegistry
|
|
549
|
+
readonly objectStorage: ObjectStorage
|
|
550
|
+
}): AuthorizedObjectReader {
|
|
551
|
+
const scope = captureExecutionScope(input.scope)
|
|
552
|
+
const projectId = scope.execution.projectId
|
|
553
|
+
const authority = resolveExecutionScopeAuthorization(projectId, scope)
|
|
554
|
+
const storage = objectStorageForAuthority(authority, input.objectStorage)
|
|
555
|
+
const reader = new AuthorizedObjectReaderImpl(readerConstructionKey, {
|
|
556
|
+
scope,
|
|
557
|
+
ontology: input.ontology,
|
|
558
|
+
storage,
|
|
559
|
+
authority,
|
|
560
|
+
})
|
|
561
|
+
Object.freeze(reader)
|
|
562
|
+
return reader
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
/** Reject recombining an authorized reader with any other execution authority. */
|
|
566
|
+
export function assertAuthorizedObjectReaderBinding(input: {
|
|
567
|
+
readonly reader: AuthorizedObjectReader
|
|
568
|
+
readonly scope: ExecutionScope
|
|
569
|
+
}): void {
|
|
570
|
+
AuthorizedObjectReaderImpl.assertBound(input.reader, input.scope)
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
/** Return inert metadata projected from the exact authority already owned by the reader. */
|
|
574
|
+
export function getAuthorizedOntologyView(reader: AuthorizedObjectReader): AuthorizedOntologyView {
|
|
575
|
+
return AuthorizedObjectReaderImpl.ontologyView(reader)
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
function objectStorageForAuthority(
|
|
579
|
+
authority: ResolvedExecutionAuthority,
|
|
580
|
+
objectStorage: ObjectStorage
|
|
581
|
+
): ObjectReadStorage {
|
|
582
|
+
switch (authority.type) {
|
|
583
|
+
case "principal":
|
|
584
|
+
case "unrestricted":
|
|
585
|
+
return objectStorage
|
|
586
|
+
case "delegated":
|
|
587
|
+
return objectStorage.createSelectedReadScope({
|
|
588
|
+
projectId: authority.projectId,
|
|
589
|
+
scope: authority.objectRead.scope,
|
|
590
|
+
limits: authority.objectRead.limits,
|
|
591
|
+
})
|
|
592
|
+
default:
|
|
593
|
+
return assertNever(authority)
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
function assertNever(value: never): never {
|
|
598
|
+
throw new Error(
|
|
599
|
+
`[Sixb] Unsupported object reader authority '${String((value as { type?: unknown }).type)}'.`
|
|
600
|
+
)
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
function ontologySelectionForAuthority(
|
|
604
|
+
authority: ResolvedExecutionAuthority,
|
|
605
|
+
ontology: OntologyRegistry
|
|
606
|
+
): AuthorizedOntologySelection {
|
|
607
|
+
switch (authority.type) {
|
|
608
|
+
case "unrestricted":
|
|
609
|
+
return { kind: "all" }
|
|
610
|
+
case "principal":
|
|
611
|
+
return {
|
|
612
|
+
kind: "types",
|
|
613
|
+
objectTypeIds: ontology
|
|
614
|
+
.listObjectTypes()
|
|
615
|
+
.filter((objectType) =>
|
|
616
|
+
isAllowed(authority.context, {
|
|
617
|
+
kind: "object.view",
|
|
618
|
+
objectTypeId: objectType.id,
|
|
619
|
+
})
|
|
620
|
+
)
|
|
621
|
+
.map((objectType) => objectType.id),
|
|
622
|
+
}
|
|
623
|
+
case "delegated":
|
|
624
|
+
return { kind: "selected", scope: authority.objectRead.scope }
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
function delegatedLinkDefinitionKey(
|
|
629
|
+
input:
|
|
630
|
+
| Pick<CompiledObjectReadStep, "sourceObjectTypeId" | "linkId" | "targetObjectTypeId">
|
|
631
|
+
| Pick<ObjectLinkRow, "sourceTypeId" | "linkId" | "targetTypeId">
|
|
632
|
+
): string {
|
|
633
|
+
return "sourceObjectTypeId" in input
|
|
634
|
+
? JSON.stringify([input.sourceObjectTypeId, input.linkId, input.targetObjectTypeId])
|
|
635
|
+
: JSON.stringify([input.sourceTypeId, input.linkId, input.targetTypeId])
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
/**
|
|
639
|
+
* Storage providers may optimize trusted reads with live references. Values crossing the
|
|
640
|
+
* application-facing authorization boundary must not retain them.
|
|
641
|
+
*/
|
|
642
|
+
function detachReadResult<T>(value: T): T {
|
|
643
|
+
return structuredClone(value)
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
/** Capture caller-owned values before authorization and execution. */
|
|
647
|
+
function snapshotReadValue<T>(value: T): T {
|
|
648
|
+
return structuredClone(value)
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
/** Bound and capture facet arguments before reading any caller-owned element. */
|
|
652
|
+
function snapshotFacetRequests(facets: readonly ObjectFacetRequest[]): ObjectFacetRequest[] {
|
|
653
|
+
if (!Array.isArray(facets)) {
|
|
654
|
+
throw new ObjectQueryValidationError([
|
|
655
|
+
{
|
|
656
|
+
path: "$.facets",
|
|
657
|
+
code: "invalid_facets",
|
|
658
|
+
message: "facets must be an array",
|
|
659
|
+
},
|
|
660
|
+
])
|
|
661
|
+
}
|
|
662
|
+
const length = facets.length
|
|
663
|
+
if (!Number.isSafeInteger(length) || length > MAX_OBJECT_READ_FACETS) {
|
|
664
|
+
throw new ObjectQueryValidationError([
|
|
665
|
+
{
|
|
666
|
+
path: "$.facets",
|
|
667
|
+
code: "too_many_facets",
|
|
668
|
+
message: `facets must include at most ${MAX_OBJECT_READ_FACETS} facet requests`,
|
|
669
|
+
},
|
|
670
|
+
])
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
const snapshot: ObjectFacetRequest[] = []
|
|
674
|
+
for (let index = 0; index < length; index += 1) {
|
|
675
|
+
const facet = facets[index]
|
|
676
|
+
snapshot.push({ propertyId: facet.propertyId, limit: facet.limit })
|
|
677
|
+
}
|
|
678
|
+
return snapshot
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
/** Capture one serializable query before either authorization or execution sees it. */
|
|
682
|
+
function snapshotAuthoredQuery(query: ObjectQuery): ObjectQuery {
|
|
683
|
+
try {
|
|
684
|
+
return structuredClone(query)
|
|
685
|
+
} catch (error) {
|
|
686
|
+
if (error instanceof ObjectQueryValidationError) throw error
|
|
687
|
+
throw new ObjectQueryValidationError([
|
|
688
|
+
{
|
|
689
|
+
path: "$",
|
|
690
|
+
code: "query_not_cloneable",
|
|
691
|
+
message: "Object query must contain only structured-cloneable data",
|
|
692
|
+
},
|
|
693
|
+
])
|
|
694
|
+
}
|
|
695
|
+
}
|