@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,672 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
CompiledObjectReadObjectSelection,
|
|
3
|
+
CompiledObjectReadRoot,
|
|
4
|
+
CompiledObjectReadStep,
|
|
5
|
+
CompiledSelectedObjectReadScope,
|
|
6
|
+
ObjectReadLinkDefinitionSelection,
|
|
7
|
+
ObjectReadLinkSelection,
|
|
8
|
+
ObjectReadNode,
|
|
9
|
+
ObjectReadObjectSelection,
|
|
10
|
+
ObjectReadRoot,
|
|
11
|
+
SelectedObjectReadScope,
|
|
12
|
+
} from "./types"
|
|
13
|
+
|
|
14
|
+
/** Admission bounds applied before a raw selection is normalized or allocated by a provider. */
|
|
15
|
+
export const OBJECT_READ_SCOPE_LIMITS = Object.freeze({
|
|
16
|
+
maxDepth: 32,
|
|
17
|
+
maxNodes: 512,
|
|
18
|
+
maxObjectSelections: 4_096,
|
|
19
|
+
maxSteps: 2_048,
|
|
20
|
+
maxPropertyOccurrences: 16_384,
|
|
21
|
+
maxIdentifierCharacters: 1_000_000,
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Validate, detach, normalize, and flatten a finite selection exactly once.
|
|
26
|
+
*
|
|
27
|
+
* Every path occurrence receives its own node id. Reusing only `(sourceType, linkId)` would lose
|
|
28
|
+
* provenance and let an object reached through one branch borrow nested authority from another.
|
|
29
|
+
*/
|
|
30
|
+
export function compileSelectedObjectReadScope(
|
|
31
|
+
rawScope: SelectedObjectReadScope
|
|
32
|
+
): CompiledSelectedObjectReadScope {
|
|
33
|
+
const scope = captureSelectedObjectReadScope(rawScope)
|
|
34
|
+
if (!isRecord(scope) || scope.kind !== "selected" || !Array.isArray(scope.roots)) {
|
|
35
|
+
throw invalidScope("scope must be a selected scope with a roots array")
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const roots: CompiledObjectReadRoot[] = []
|
|
39
|
+
const objects: CompiledObjectReadObjectSelection[] = []
|
|
40
|
+
const steps: CompiledObjectReadStep[] = []
|
|
41
|
+
const visiting = new Set<object>()
|
|
42
|
+
let nextNodeId = 0
|
|
43
|
+
let concreteStepCount = 0
|
|
44
|
+
let objectSelectionCount = 0
|
|
45
|
+
let propertyOccurrenceCount = 0
|
|
46
|
+
let identifierCharacterCount = 0
|
|
47
|
+
let compiledPropertyOccurrenceCount = 0
|
|
48
|
+
let compiledIdentifierCharacterCount = 0
|
|
49
|
+
|
|
50
|
+
const addIdentifier = (value: unknown, path: string): string => {
|
|
51
|
+
const identifier = nonEmptyString(value, path)
|
|
52
|
+
identifierCharacterCount += identifier.length
|
|
53
|
+
if (identifierCharacterCount > OBJECT_READ_SCOPE_LIMITS.maxIdentifierCharacters) {
|
|
54
|
+
throw invalidScope(
|
|
55
|
+
`scope exceeds the maximum of ${OBJECT_READ_SCOPE_LIMITS.maxIdentifierCharacters} identifier characters`
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
return identifier
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const addPropertyOccurrences = (count: number): void => {
|
|
62
|
+
propertyOccurrenceCount += count
|
|
63
|
+
if (propertyOccurrenceCount > OBJECT_READ_SCOPE_LIMITS.maxPropertyOccurrences) {
|
|
64
|
+
throw invalidScope(
|
|
65
|
+
`scope exceeds the maximum of ${OBJECT_READ_SCOPE_LIMITS.maxPropertyOccurrences} selected property occurrences`
|
|
66
|
+
)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const addCompiledPropertyOccurrences = (count: number): void => {
|
|
71
|
+
compiledPropertyOccurrenceCount += count
|
|
72
|
+
if (compiledPropertyOccurrenceCount > OBJECT_READ_SCOPE_LIMITS.maxPropertyOccurrences) {
|
|
73
|
+
throw invalidScope(
|
|
74
|
+
`scope exceeds the maximum of ${OBJECT_READ_SCOPE_LIMITS.maxPropertyOccurrences} selected property occurrences after compilation`
|
|
75
|
+
)
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const addCompiledIdentifierCharacters = (count: number): void => {
|
|
80
|
+
compiledIdentifierCharacterCount += count
|
|
81
|
+
if (compiledIdentifierCharacterCount > OBJECT_READ_SCOPE_LIMITS.maxIdentifierCharacters) {
|
|
82
|
+
throw invalidScope(
|
|
83
|
+
`scope exceeds the maximum of ${OBJECT_READ_SCOPE_LIMITS.maxIdentifierCharacters} identifier characters after compilation`
|
|
84
|
+
)
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const visitNode = (node: ObjectReadNode, path: string, depth: number): number => {
|
|
89
|
+
if (!isRecord(node) || !Array.isArray(node.objects) || !Array.isArray(node.links)) {
|
|
90
|
+
throw invalidScope(`${path} must contain object and link selections`)
|
|
91
|
+
}
|
|
92
|
+
if (depth > OBJECT_READ_SCOPE_LIMITS.maxDepth) {
|
|
93
|
+
throw invalidScope(
|
|
94
|
+
`${path} exceeds the maximum link depth of ${OBJECT_READ_SCOPE_LIMITS.maxDepth}`
|
|
95
|
+
)
|
|
96
|
+
}
|
|
97
|
+
if (nextNodeId >= OBJECT_READ_SCOPE_LIMITS.maxNodes) {
|
|
98
|
+
throw invalidScope(
|
|
99
|
+
`scope exceeds the maximum of ${OBJECT_READ_SCOPE_LIMITS.maxNodes} selection nodes`
|
|
100
|
+
)
|
|
101
|
+
}
|
|
102
|
+
if (visiting.has(node)) throw invalidScope(`${path} contains a cyclic selection node`)
|
|
103
|
+
visiting.add(node)
|
|
104
|
+
|
|
105
|
+
const nodeId = nextNodeId++
|
|
106
|
+
try {
|
|
107
|
+
objectSelectionCount += node.objects.length
|
|
108
|
+
if (objectSelectionCount > OBJECT_READ_SCOPE_LIMITS.maxObjectSelections) {
|
|
109
|
+
throw invalidScope(
|
|
110
|
+
`scope exceeds the maximum of ${OBJECT_READ_SCOPE_LIMITS.maxObjectSelections} object selections`
|
|
111
|
+
)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
for (const [objectIndex, object] of node.objects.entries()) {
|
|
115
|
+
const objectPath = `${path}.objects[${objectIndex}]`
|
|
116
|
+
if (!isRecord(object) || !Array.isArray(object.propertyIds)) {
|
|
117
|
+
throw invalidScope(`${objectPath} must contain an object type and property ids`)
|
|
118
|
+
}
|
|
119
|
+
addIdentifier(object.objectTypeId, `${objectPath}.objectTypeId`)
|
|
120
|
+
addPropertyOccurrences(object.propertyIds.length)
|
|
121
|
+
for (const [propertyIndex, propertyId] of object.propertyIds.entries()) {
|
|
122
|
+
addIdentifier(propertyId, `${objectPath}.propertyIds[${propertyIndex}]`)
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const normalizedObjects = normalizeObjects(node.objects, `${path}.objects`)
|
|
127
|
+
if (normalizedObjects.length === 0) {
|
|
128
|
+
throw invalidScope(`${path}.objects must contain at least one concrete object type`)
|
|
129
|
+
}
|
|
130
|
+
for (const object of normalizedObjects) {
|
|
131
|
+
addCompiledPropertyOccurrences(object.propertyIds.length)
|
|
132
|
+
addCompiledIdentifierCharacters(
|
|
133
|
+
object.objectTypeId.length + identifierCharacters(object.propertyIds)
|
|
134
|
+
)
|
|
135
|
+
objects.push(Object.freeze({ nodeId, ...object }))
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
for (const [linkIndex, link] of node.links.entries()) {
|
|
139
|
+
const linkPath = `${path}.links[${linkIndex}]`
|
|
140
|
+
if (!isRecord(link) || !Array.isArray(link.definitions) || !isRecord(link.target)) {
|
|
141
|
+
throw invalidScope(`${linkPath} must contain definitions and a target node`)
|
|
142
|
+
}
|
|
143
|
+
if (link.definitions.length === 0) {
|
|
144
|
+
throw invalidScope(`${linkPath}.definitions must not be empty`)
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const definitions = normalizeConcreteDefinitions(
|
|
148
|
+
link.definitions,
|
|
149
|
+
`${linkPath}.definitions`,
|
|
150
|
+
addIdentifier,
|
|
151
|
+
addPropertyOccurrences,
|
|
152
|
+
addCompiledPropertyOccurrences,
|
|
153
|
+
addCompiledIdentifierCharacters,
|
|
154
|
+
() => {
|
|
155
|
+
concreteStepCount += 1
|
|
156
|
+
if (concreteStepCount > OBJECT_READ_SCOPE_LIMITS.maxSteps) {
|
|
157
|
+
throw invalidScope(
|
|
158
|
+
`scope exceeds the maximum of ${OBJECT_READ_SCOPE_LIMITS.maxSteps} concrete link steps`
|
|
159
|
+
)
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
)
|
|
163
|
+
const parentTypes = new Set(normalizedObjects.map((object) => object.objectTypeId))
|
|
164
|
+
for (const definition of definitions) {
|
|
165
|
+
if (!parentTypes.has(definition.sourceObjectTypeId)) {
|
|
166
|
+
throw invalidScope(
|
|
167
|
+
`${linkPath} selects source type '${definition.sourceObjectTypeId}' outside its parent node`
|
|
168
|
+
)
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const childNodeId = visitNode(
|
|
173
|
+
link.target as unknown as ObjectReadNode,
|
|
174
|
+
`${linkPath}.target`,
|
|
175
|
+
depth + 1
|
|
176
|
+
)
|
|
177
|
+
const childTypes = new Set(
|
|
178
|
+
objects
|
|
179
|
+
.filter((object) => object.nodeId === childNodeId)
|
|
180
|
+
.map((object) => object.objectTypeId)
|
|
181
|
+
)
|
|
182
|
+
const targetTypes = new Set(definitions.map((definition) => definition.targetObjectTypeId))
|
|
183
|
+
if (!setsEqual(childTypes, targetTypes)) {
|
|
184
|
+
throw invalidScope(
|
|
185
|
+
`${linkPath}.target object types must exactly match its definition target types`
|
|
186
|
+
)
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
for (const definition of definitions) {
|
|
190
|
+
steps.push(
|
|
191
|
+
Object.freeze({
|
|
192
|
+
nodeId: childNodeId,
|
|
193
|
+
parentNodeId: nodeId,
|
|
194
|
+
...definition,
|
|
195
|
+
})
|
|
196
|
+
)
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
} finally {
|
|
200
|
+
visiting.delete(node)
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return nodeId
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
for (const [rootIndex, root] of scope.roots.entries()) {
|
|
207
|
+
const path = `roots[${rootIndex}]`
|
|
208
|
+
if (!isRecord(root) || !isRecord(root.anchor) || !isRecord(root.node)) {
|
|
209
|
+
throw invalidScope(`${path} must contain an exact anchor and a selection node`)
|
|
210
|
+
}
|
|
211
|
+
const objectTypeId = addIdentifier(root.anchor.objectTypeId, `${path}.anchor.objectTypeId`)
|
|
212
|
+
const primaryId = addIdentifier(root.anchor.primaryId, `${path}.anchor.primaryId`)
|
|
213
|
+
addCompiledIdentifierCharacters(objectTypeId.length + primaryId.length)
|
|
214
|
+
const nodeId = visitNode(root.node as unknown as ObjectReadNode, `${path}.node`, 0)
|
|
215
|
+
if (
|
|
216
|
+
!objects.some((object) => object.nodeId === nodeId && object.objectTypeId === objectTypeId)
|
|
217
|
+
) {
|
|
218
|
+
throw invalidScope(`${path}.anchor type '${objectTypeId}' is not selected by its root node`)
|
|
219
|
+
}
|
|
220
|
+
roots.push(Object.freeze({ nodeId, objectTypeId, primaryId }))
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return Object.freeze({
|
|
224
|
+
kind: "selected",
|
|
225
|
+
roots: Object.freeze(roots),
|
|
226
|
+
objects: Object.freeze(objects),
|
|
227
|
+
steps: Object.freeze(steps),
|
|
228
|
+
})
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
interface ScopeCaptureState {
|
|
232
|
+
readonly visiting: Set<object>
|
|
233
|
+
nodeCount: number
|
|
234
|
+
objectSelectionCount: number
|
|
235
|
+
concreteStepCount: number
|
|
236
|
+
propertyOccurrenceCount: number
|
|
237
|
+
identifierCharacterCount: number
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
interface CapturedArray {
|
|
241
|
+
readonly value: readonly unknown[]
|
|
242
|
+
readonly length: number
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Read every caller-controlled property once and detach it before another getter can mutate it.
|
|
247
|
+
* The compiler only ever observes the resulting plain, deeply frozen snapshot.
|
|
248
|
+
*/
|
|
249
|
+
export function captureSelectedObjectReadScope(value: unknown): SelectedObjectReadScope {
|
|
250
|
+
if (!isRecord(value)) {
|
|
251
|
+
throw invalidScope("scope must be a selected scope with a roots array")
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
const kind = value.kind
|
|
255
|
+
if (kind !== "selected") {
|
|
256
|
+
throw invalidScope("scope must be a selected scope with a roots array")
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
const rootsValue = value.roots
|
|
260
|
+
const rootsSource = captureArray(rootsValue, "roots")
|
|
261
|
+
if (rootsSource.length > OBJECT_READ_SCOPE_LIMITS.maxNodes) {
|
|
262
|
+
throw invalidScope(
|
|
263
|
+
`scope exceeds the maximum of ${OBJECT_READ_SCOPE_LIMITS.maxNodes} selection nodes`
|
|
264
|
+
)
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
const state: ScopeCaptureState = {
|
|
268
|
+
visiting: new Set<object>(),
|
|
269
|
+
nodeCount: 0,
|
|
270
|
+
objectSelectionCount: 0,
|
|
271
|
+
concreteStepCount: 0,
|
|
272
|
+
propertyOccurrenceCount: 0,
|
|
273
|
+
identifierCharacterCount: 0,
|
|
274
|
+
}
|
|
275
|
+
const roots: ObjectReadRoot[] = []
|
|
276
|
+
for (let rootIndex = 0; rootIndex < rootsSource.length; rootIndex += 1) {
|
|
277
|
+
const path = `roots[${rootIndex}]`
|
|
278
|
+
const rootValue = rootsSource.value[rootIndex]
|
|
279
|
+
if (!isRecord(rootValue)) {
|
|
280
|
+
throw invalidScope(`${path} must contain an exact anchor and a selection node`)
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
const anchorValue = rootValue.anchor
|
|
284
|
+
if (!isRecord(anchorValue)) {
|
|
285
|
+
throw invalidScope(`${path} must contain an exact anchor and a selection node`)
|
|
286
|
+
}
|
|
287
|
+
const objectTypeId = captureIdentifier(
|
|
288
|
+
state,
|
|
289
|
+
anchorValue.objectTypeId,
|
|
290
|
+
`${path}.anchor.objectTypeId`
|
|
291
|
+
)
|
|
292
|
+
const primaryId = captureIdentifier(state, anchorValue.primaryId, `${path}.anchor.primaryId`)
|
|
293
|
+
const anchor = Object.freeze({ objectTypeId, primaryId })
|
|
294
|
+
|
|
295
|
+
const nodeValue = rootValue.node
|
|
296
|
+
if (!isRecord(nodeValue)) {
|
|
297
|
+
throw invalidScope(`${path} must contain an exact anchor and a selection node`)
|
|
298
|
+
}
|
|
299
|
+
const node = captureNode(state, nodeValue, `${path}.node`, 0)
|
|
300
|
+
roots.push(Object.freeze({ anchor, node }))
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
return Object.freeze({ kind, roots: Object.freeze(roots) })
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
function captureNode(
|
|
307
|
+
state: ScopeCaptureState,
|
|
308
|
+
value: Record<string, unknown>,
|
|
309
|
+
path: string,
|
|
310
|
+
depth: number
|
|
311
|
+
): ObjectReadNode {
|
|
312
|
+
if (depth > OBJECT_READ_SCOPE_LIMITS.maxDepth) {
|
|
313
|
+
throw invalidScope(
|
|
314
|
+
`${path} exceeds the maximum link depth of ${OBJECT_READ_SCOPE_LIMITS.maxDepth}`
|
|
315
|
+
)
|
|
316
|
+
}
|
|
317
|
+
if (state.nodeCount >= OBJECT_READ_SCOPE_LIMITS.maxNodes) {
|
|
318
|
+
throw invalidScope(
|
|
319
|
+
`scope exceeds the maximum of ${OBJECT_READ_SCOPE_LIMITS.maxNodes} selection nodes`
|
|
320
|
+
)
|
|
321
|
+
}
|
|
322
|
+
if (state.visiting.has(value)) {
|
|
323
|
+
throw invalidScope(`${path} contains a cyclic selection node`)
|
|
324
|
+
}
|
|
325
|
+
state.visiting.add(value)
|
|
326
|
+
state.nodeCount += 1
|
|
327
|
+
|
|
328
|
+
try {
|
|
329
|
+
const objectsValue = value.objects
|
|
330
|
+
const objectsSource = captureArray(objectsValue, `${path}.objects`)
|
|
331
|
+
state.objectSelectionCount = reserveCount(
|
|
332
|
+
state.objectSelectionCount,
|
|
333
|
+
objectsSource.length,
|
|
334
|
+
OBJECT_READ_SCOPE_LIMITS.maxObjectSelections,
|
|
335
|
+
`scope exceeds the maximum of ${OBJECT_READ_SCOPE_LIMITS.maxObjectSelections} object selections`
|
|
336
|
+
)
|
|
337
|
+
const objects: ObjectReadObjectSelection[] = []
|
|
338
|
+
for (let objectIndex = 0; objectIndex < objectsSource.length; objectIndex += 1) {
|
|
339
|
+
const objectPath = `${path}.objects[${objectIndex}]`
|
|
340
|
+
const objectValue = objectsSource.value[objectIndex]
|
|
341
|
+
if (!isRecord(objectValue)) {
|
|
342
|
+
throw invalidScope(`${objectPath} must contain an object type and property ids`)
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
const objectTypeId = captureIdentifier(
|
|
346
|
+
state,
|
|
347
|
+
objectValue.objectTypeId,
|
|
348
|
+
`${objectPath}.objectTypeId`
|
|
349
|
+
)
|
|
350
|
+
const propertyIdsValue = objectValue.propertyIds
|
|
351
|
+
const propertyIds = capturePropertyIds(state, propertyIdsValue, `${objectPath}.propertyIds`)
|
|
352
|
+
objects.push(Object.freeze({ objectTypeId, propertyIds }))
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
const linksValue = value.links
|
|
356
|
+
const linksSource = captureArray(linksValue, `${path}.links`)
|
|
357
|
+
if (linksSource.length > OBJECT_READ_SCOPE_LIMITS.maxNodes - state.nodeCount) {
|
|
358
|
+
throw invalidScope(
|
|
359
|
+
`scope exceeds the maximum of ${OBJECT_READ_SCOPE_LIMITS.maxNodes} selection nodes`
|
|
360
|
+
)
|
|
361
|
+
}
|
|
362
|
+
const links: ObjectReadLinkSelection[] = []
|
|
363
|
+
for (let linkIndex = 0; linkIndex < linksSource.length; linkIndex += 1) {
|
|
364
|
+
const linkPath = `${path}.links[${linkIndex}]`
|
|
365
|
+
const linkValue = linksSource.value[linkIndex]
|
|
366
|
+
if (!isRecord(linkValue)) {
|
|
367
|
+
throw invalidScope(`${linkPath} must contain definitions and a target node`)
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
const definitionsValue = linkValue.definitions
|
|
371
|
+
const definitionsSource = captureArray(definitionsValue, `${linkPath}.definitions`)
|
|
372
|
+
if (definitionsSource.length === 0) {
|
|
373
|
+
throw invalidScope(`${linkPath}.definitions must not be empty`)
|
|
374
|
+
}
|
|
375
|
+
if (definitionsSource.length > OBJECT_READ_SCOPE_LIMITS.maxSteps - state.concreteStepCount) {
|
|
376
|
+
throw invalidScope(
|
|
377
|
+
`scope exceeds the maximum of ${OBJECT_READ_SCOPE_LIMITS.maxSteps} concrete link steps`
|
|
378
|
+
)
|
|
379
|
+
}
|
|
380
|
+
const definitions: ObjectReadLinkDefinitionSelection[] = []
|
|
381
|
+
for (
|
|
382
|
+
let definitionIndex = 0;
|
|
383
|
+
definitionIndex < definitionsSource.length;
|
|
384
|
+
definitionIndex += 1
|
|
385
|
+
) {
|
|
386
|
+
const definitionPath = `${linkPath}.definitions[${definitionIndex}]`
|
|
387
|
+
const definitionValue = definitionsSource.value[definitionIndex]
|
|
388
|
+
definitions.push(captureDefinition(state, definitionValue, definitionPath))
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
const targetValue = linkValue.target
|
|
392
|
+
if (!isRecord(targetValue)) {
|
|
393
|
+
throw invalidScope(`${linkPath} must contain definitions and a target node`)
|
|
394
|
+
}
|
|
395
|
+
const target = captureNode(state, targetValue, `${linkPath}.target`, depth + 1)
|
|
396
|
+
links.push(Object.freeze({ definitions: Object.freeze(definitions), target }))
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
return Object.freeze({ objects: Object.freeze(objects), links: Object.freeze(links) })
|
|
400
|
+
} finally {
|
|
401
|
+
state.visiting.delete(value)
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
function captureDefinition(
|
|
406
|
+
state: ScopeCaptureState,
|
|
407
|
+
value: unknown,
|
|
408
|
+
path: string
|
|
409
|
+
): ObjectReadLinkDefinitionSelection {
|
|
410
|
+
if (!isRecord(value)) {
|
|
411
|
+
throw invalidScope(`${path} must contain a concrete link definition`)
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
const sourceObjectTypeId = captureIdentifier(
|
|
415
|
+
state,
|
|
416
|
+
value.sourceObjectTypeId,
|
|
417
|
+
`${path}.sourceObjectTypeId`
|
|
418
|
+
)
|
|
419
|
+
const linkId = captureIdentifier(state, value.linkId, `${path}.linkId`)
|
|
420
|
+
|
|
421
|
+
const targetObjectTypeIdsValue = value.targetObjectTypeIds
|
|
422
|
+
const targetObjectTypeIdsSource = captureArray(
|
|
423
|
+
targetObjectTypeIdsValue,
|
|
424
|
+
`${path}.targetObjectTypeIds`
|
|
425
|
+
)
|
|
426
|
+
if (targetObjectTypeIdsSource.length === 0) {
|
|
427
|
+
throw invalidScope(`${path}.targetObjectTypeIds must not be empty`)
|
|
428
|
+
}
|
|
429
|
+
state.concreteStepCount = reserveCount(
|
|
430
|
+
state.concreteStepCount,
|
|
431
|
+
targetObjectTypeIdsSource.length,
|
|
432
|
+
OBJECT_READ_SCOPE_LIMITS.maxSteps,
|
|
433
|
+
`scope exceeds the maximum of ${OBJECT_READ_SCOPE_LIMITS.maxSteps} concrete link steps`
|
|
434
|
+
)
|
|
435
|
+
const targetObjectTypeIds = captureIdentifiers(
|
|
436
|
+
state,
|
|
437
|
+
targetObjectTypeIdsSource,
|
|
438
|
+
`${path}.targetObjectTypeIds`
|
|
439
|
+
)
|
|
440
|
+
|
|
441
|
+
const propertyIdsValue = value.propertyIds
|
|
442
|
+
const propertyIds = capturePropertyIds(state, propertyIdsValue, `${path}.propertyIds`)
|
|
443
|
+
return Object.freeze({ sourceObjectTypeId, linkId, targetObjectTypeIds, propertyIds })
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
function capturePropertyIds(
|
|
447
|
+
state: ScopeCaptureState,
|
|
448
|
+
value: unknown,
|
|
449
|
+
path: string
|
|
450
|
+
): readonly string[] {
|
|
451
|
+
const source = captureArray(value, path)
|
|
452
|
+
state.propertyOccurrenceCount = reserveCount(
|
|
453
|
+
state.propertyOccurrenceCount,
|
|
454
|
+
source.length,
|
|
455
|
+
OBJECT_READ_SCOPE_LIMITS.maxPropertyOccurrences,
|
|
456
|
+
`scope exceeds the maximum of ${OBJECT_READ_SCOPE_LIMITS.maxPropertyOccurrences} selected property occurrences`
|
|
457
|
+
)
|
|
458
|
+
return captureIdentifiers(state, source, path)
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
function captureIdentifiers(
|
|
462
|
+
state: ScopeCaptureState,
|
|
463
|
+
source: CapturedArray,
|
|
464
|
+
path: string
|
|
465
|
+
): readonly string[] {
|
|
466
|
+
const identifiers: string[] = []
|
|
467
|
+
for (let index = 0; index < source.length; index += 1) {
|
|
468
|
+
identifiers.push(captureIdentifier(state, source.value[index], `${path}[${index}]`))
|
|
469
|
+
}
|
|
470
|
+
return Object.freeze(identifiers)
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
function captureIdentifier(state: ScopeCaptureState, value: unknown, path: string): string {
|
|
474
|
+
const identifier = nonEmptyString(value, path)
|
|
475
|
+
state.identifierCharacterCount = reserveCount(
|
|
476
|
+
state.identifierCharacterCount,
|
|
477
|
+
identifier.length,
|
|
478
|
+
OBJECT_READ_SCOPE_LIMITS.maxIdentifierCharacters,
|
|
479
|
+
`scope exceeds the maximum of ${OBJECT_READ_SCOPE_LIMITS.maxIdentifierCharacters} identifier characters`
|
|
480
|
+
)
|
|
481
|
+
return identifier
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
function captureArray(value: unknown, path: string): CapturedArray {
|
|
485
|
+
if (!Array.isArray(value)) {
|
|
486
|
+
throw invalidScope(`${path} must be an array`)
|
|
487
|
+
}
|
|
488
|
+
const array = value as readonly unknown[]
|
|
489
|
+
const length = array.length
|
|
490
|
+
if (!Number.isSafeInteger(length) || length < 0) {
|
|
491
|
+
throw invalidScope(`${path}.length must be a non-negative safe integer`)
|
|
492
|
+
}
|
|
493
|
+
return { value: array, length }
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
function reserveCount(current: number, count: number, limit: number, message: string): number {
|
|
497
|
+
if (count > limit - current) throw invalidScope(message)
|
|
498
|
+
return current + count
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
/** Fail closed when a project-bound selected reader is accidentally reused across projects. */
|
|
502
|
+
export function assertObjectReaderProject(
|
|
503
|
+
expectedProjectId: string,
|
|
504
|
+
actualProjectId: string
|
|
505
|
+
): void {
|
|
506
|
+
if (actualProjectId !== expectedProjectId) {
|
|
507
|
+
throw new Error(
|
|
508
|
+
`[Sixb] Object reader belongs to project '${expectedProjectId}', not '${actualProjectId}'.`
|
|
509
|
+
)
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
interface ConcreteDefinition {
|
|
514
|
+
readonly sourceObjectTypeId: string
|
|
515
|
+
readonly linkId: string
|
|
516
|
+
readonly targetObjectTypeId: string
|
|
517
|
+
readonly propertyIds: readonly string[]
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
function normalizeConcreteDefinitions(
|
|
521
|
+
definitions: readonly ObjectReadLinkDefinitionSelection[],
|
|
522
|
+
path: string,
|
|
523
|
+
addIdentifier: (value: unknown, path: string) => string,
|
|
524
|
+
addPropertyOccurrences: (count: number) => void,
|
|
525
|
+
addCompiledPropertyOccurrences: (count: number) => void,
|
|
526
|
+
addCompiledIdentifierCharacters: (count: number) => void,
|
|
527
|
+
addConcreteStep: () => void
|
|
528
|
+
): readonly ConcreteDefinition[] {
|
|
529
|
+
const propertiesByDefinition = new Map<
|
|
530
|
+
string,
|
|
531
|
+
{
|
|
532
|
+
sourceObjectTypeId: string
|
|
533
|
+
linkId: string
|
|
534
|
+
targetObjectTypeId: string
|
|
535
|
+
properties: Set<string>
|
|
536
|
+
}
|
|
537
|
+
>()
|
|
538
|
+
|
|
539
|
+
for (const [index, definition] of definitions.entries()) {
|
|
540
|
+
const definitionPath = `${path}[${index}]`
|
|
541
|
+
if (
|
|
542
|
+
!isRecord(definition) ||
|
|
543
|
+
!Array.isArray(definition.targetObjectTypeIds) ||
|
|
544
|
+
!Array.isArray(definition.propertyIds)
|
|
545
|
+
) {
|
|
546
|
+
throw invalidScope(`${definitionPath} must contain a concrete link definition`)
|
|
547
|
+
}
|
|
548
|
+
const sourceObjectTypeId = addIdentifier(
|
|
549
|
+
definition.sourceObjectTypeId,
|
|
550
|
+
`${definitionPath}.sourceObjectTypeId`
|
|
551
|
+
)
|
|
552
|
+
const linkId = addIdentifier(definition.linkId, `${definitionPath}.linkId`)
|
|
553
|
+
if (definition.targetObjectTypeIds.length === 0) {
|
|
554
|
+
throw invalidScope(`${definitionPath}.targetObjectTypeIds must not be empty`)
|
|
555
|
+
}
|
|
556
|
+
addPropertyOccurrences(definition.propertyIds.length)
|
|
557
|
+
let propertyIdentifierCharacters = 0
|
|
558
|
+
for (const [propertyIndex, propertyId] of definition.propertyIds.entries()) {
|
|
559
|
+
propertyIdentifierCharacters += addIdentifier(
|
|
560
|
+
propertyId,
|
|
561
|
+
`${definitionPath}.propertyIds[${propertyIndex}]`
|
|
562
|
+
).length
|
|
563
|
+
}
|
|
564
|
+
let targetIdentifierCharacters = 0
|
|
565
|
+
for (const [targetIndex, value] of definition.targetObjectTypeIds.entries()) {
|
|
566
|
+
addConcreteStep()
|
|
567
|
+
targetIdentifierCharacters += addIdentifier(
|
|
568
|
+
value,
|
|
569
|
+
`${definitionPath}.targetObjectTypeIds[${targetIndex}]`
|
|
570
|
+
).length
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
// Reserve the complete concrete expansion before allocating collision-safe keys or copying
|
|
574
|
+
// properties into per-target sets. One compact raw definition may otherwise amplify its
|
|
575
|
+
// source/link/property identifiers once per target beyond the provider-neutral scope caps.
|
|
576
|
+
addCompiledPropertyOccurrences(
|
|
577
|
+
definition.propertyIds.length * definition.targetObjectTypeIds.length
|
|
578
|
+
)
|
|
579
|
+
const repeatedIdentifierCharacters =
|
|
580
|
+
sourceObjectTypeId.length + linkId.length + propertyIdentifierCharacters
|
|
581
|
+
addCompiledIdentifierCharacters(
|
|
582
|
+
repeatedIdentifierCharacters * definition.targetObjectTypeIds.length +
|
|
583
|
+
targetIdentifierCharacters
|
|
584
|
+
)
|
|
585
|
+
|
|
586
|
+
for (const [targetIndex, value] of definition.targetObjectTypeIds.entries()) {
|
|
587
|
+
const targetObjectTypeId = nonEmptyString(
|
|
588
|
+
value,
|
|
589
|
+
`${definitionPath}.targetObjectTypeIds[${targetIndex}]`
|
|
590
|
+
)
|
|
591
|
+
const key = JSON.stringify([sourceObjectTypeId, linkId, targetObjectTypeId])
|
|
592
|
+
const normalized = propertiesByDefinition.get(key) ?? {
|
|
593
|
+
sourceObjectTypeId,
|
|
594
|
+
linkId,
|
|
595
|
+
targetObjectTypeId,
|
|
596
|
+
properties: new Set<string>(),
|
|
597
|
+
}
|
|
598
|
+
for (const [propertyIndex, propertyId] of definition.propertyIds.entries()) {
|
|
599
|
+
normalized.properties.add(
|
|
600
|
+
nonEmptyString(propertyId, `${definitionPath}.propertyIds[${propertyIndex}]`)
|
|
601
|
+
)
|
|
602
|
+
}
|
|
603
|
+
propertiesByDefinition.set(key, normalized)
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
return [...propertiesByDefinition.values()]
|
|
608
|
+
.sort(
|
|
609
|
+
(left, right) =>
|
|
610
|
+
left.sourceObjectTypeId.localeCompare(right.sourceObjectTypeId) ||
|
|
611
|
+
left.linkId.localeCompare(right.linkId) ||
|
|
612
|
+
left.targetObjectTypeId.localeCompare(right.targetObjectTypeId)
|
|
613
|
+
)
|
|
614
|
+
.map(({ properties, ...definition }) =>
|
|
615
|
+
Object.freeze({
|
|
616
|
+
...definition,
|
|
617
|
+
propertyIds: Object.freeze([...properties].sort()),
|
|
618
|
+
})
|
|
619
|
+
)
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
function identifierCharacters(values: readonly string[]): number {
|
|
623
|
+
return values.reduce((total, value) => total + value.length, 0)
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
function normalizeObjects(
|
|
627
|
+
selections: readonly ObjectReadObjectSelection[],
|
|
628
|
+
path: string
|
|
629
|
+
): readonly ObjectReadObjectSelection[] {
|
|
630
|
+
const propertiesByType = new Map<string, Set<string>>()
|
|
631
|
+
for (const [index, selection] of selections.entries()) {
|
|
632
|
+
if (!isRecord(selection) || !Array.isArray(selection.propertyIds)) {
|
|
633
|
+
throw invalidScope(`${path}[${index}] must contain an object type and property ids`)
|
|
634
|
+
}
|
|
635
|
+
const objectTypeId = nonEmptyString(selection.objectTypeId, `${path}[${index}].objectTypeId`)
|
|
636
|
+
const properties = propertiesByType.get(objectTypeId) ?? new Set<string>()
|
|
637
|
+
for (const propertyId of normalizeIds(selection.propertyIds, `${path}[${index}].propertyIds`)) {
|
|
638
|
+
properties.add(propertyId)
|
|
639
|
+
}
|
|
640
|
+
propertiesByType.set(objectTypeId, properties)
|
|
641
|
+
}
|
|
642
|
+
return [...propertiesByType]
|
|
643
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
644
|
+
.map(([objectTypeId, properties]) =>
|
|
645
|
+
Object.freeze({ objectTypeId, propertyIds: Object.freeze([...properties].sort()) })
|
|
646
|
+
)
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
function normalizeIds(values: readonly string[], path: string): string[] {
|
|
650
|
+
return [
|
|
651
|
+
...new Set(values.map((value, index) => nonEmptyString(value, `${path}[${index}]`))),
|
|
652
|
+
].sort()
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
function nonEmptyString(value: unknown, path: string): string {
|
|
656
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
657
|
+
throw invalidScope(`${path} must be a non-empty string`)
|
|
658
|
+
}
|
|
659
|
+
return value
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
function setsEqual(left: ReadonlySet<string>, right: ReadonlySet<string>): boolean {
|
|
663
|
+
return left.size === right.size && [...left].every((value) => right.has(value))
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
667
|
+
return typeof value === "object" && value !== null
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
function invalidScope(message: string): Error {
|
|
671
|
+
return new Error(`[Sixb] Invalid object read scope: ${message}.`)
|
|
672
|
+
}
|