@sixb/core 0.1.17 → 0.1.18
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/index.js +22 -19
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/read-facade.d.ts +1 -1
- package/dist/actions/validation.d.ts.map +1 -1
- package/dist/actions/worker.js +6 -2
- package/dist/actions/worker.js.map +3 -3
- package/dist/agents/adapters.d.ts +7 -0
- package/dist/agents/adapters.d.ts.map +1 -1
- package/dist/agents/authority.d.ts +7 -0
- package/dist/agents/authority.d.ts.map +1 -1
- package/dist/agents/context/entries.d.ts +10 -1
- package/dist/agents/context/entries.d.ts.map +1 -1
- package/dist/agents/context/index.d.ts +1 -1
- package/dist/agents/context/index.d.ts.map +1 -1
- package/dist/agents/context/index.js +4 -2
- package/dist/agents/context/index.js.map +1 -1
- package/dist/agents/context-compaction.d.ts.map +1 -1
- package/dist/agents/errors.d.ts +1 -1
- package/dist/agents/errors.d.ts.map +1 -1
- package/dist/agents/index.d.ts +6 -4
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +44 -37
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/message.d.ts +8 -1
- package/dist/agents/message.d.ts.map +1 -1
- package/dist/agents/request.d.ts +19 -5
- package/dist/agents/request.d.ts.map +1 -1
- package/dist/agents/skills.d.ts +41 -0
- package/dist/agents/skills.d.ts.map +1 -0
- package/dist/agents/streams/index.js +1 -1
- package/dist/agents/streams/internal.js +1 -1
- package/dist/agents/types.d.ts +33 -4
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/auth/index.js +9 -6
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/runtime.d.ts.map +1 -1
- package/dist/auth/types.d.ts +6 -0
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/authorization/index.js +5 -3
- package/dist/authorization/index.js.map +1 -1
- package/dist/authorization/resolve.d.ts +1 -1
- package/dist/authorization/resolve.d.ts.map +1 -1
- package/dist/authorization/types.d.ts +7 -0
- package/dist/authorization/types.d.ts.map +1 -1
- package/dist/blob-storage/browser.js +1 -1
- package/dist/blob-storage/execution.d.ts.map +1 -1
- package/dist/blob-storage/file-content.d.ts +18 -0
- package/dist/blob-storage/file-content.d.ts.map +1 -0
- package/dist/blob-storage/index.d.ts +1 -1
- package/dist/blob-storage/index.d.ts.map +1 -1
- package/dist/blob-storage/index.js +2 -2
- package/dist/blob-storage/internal.d.ts +2 -0
- package/dist/blob-storage/internal.d.ts.map +1 -1
- package/dist/blob-storage/internal.js +16 -4
- package/dist/blob-storage/internal.js.map +1 -1
- package/dist/blob-storage/media-type.d.ts +8 -0
- package/dist/blob-storage/media-type.d.ts.map +1 -0
- package/dist/blob-storage/types.d.ts +12 -1
- package/dist/blob-storage/types.d.ts.map +1 -1
- package/dist/blob-storage/validation.d.ts +6 -0
- package/dist/blob-storage/validation.d.ts.map +1 -1
- package/dist/bootstrap/agent-context.d.ts +33 -0
- package/dist/bootstrap/agent-context.d.ts.map +1 -0
- package/dist/bootstrap/discovery.d.ts +23 -3
- package/dist/bootstrap/discovery.d.ts.map +1 -1
- package/dist/bootstrap/index.d.ts +2 -1
- package/dist/bootstrap/index.d.ts.map +1 -1
- package/dist/bootstrap/index.js +284 -73
- package/dist/bootstrap/index.js.map +4 -3
- package/dist/bootstrap/ontology-type-manifest.d.ts.map +1 -1
- package/dist/{chunk-gf7yht60.js → chunk-1b1f2d5f.js} +23 -6
- package/dist/chunk-1b1f2d5f.js.map +12 -0
- package/dist/{chunk-9vx5e9g1.js → chunk-1sr8ryzk.js} +3 -3
- package/dist/chunk-1sr8ryzk.js.map +11 -0
- package/dist/{chunk-4gmng3vf.js → chunk-22v5bpz3.js} +1 -1
- package/dist/{chunk-s7ftxrdr.js → chunk-29yx306f.js} +20 -3
- package/dist/{chunk-s7ftxrdr.js.map → chunk-29yx306f.js.map} +3 -3
- package/dist/{chunk-4ra628t7.js → chunk-3zxk45er.js} +70 -6
- package/dist/{chunk-4ra628t7.js.map → chunk-3zxk45er.js.map} +5 -4
- package/dist/{chunk-2am3db31.js → chunk-48e3cn2d.js} +2 -2
- package/dist/{chunk-91kcnbf0.js → chunk-6gmfggss.js} +22 -9
- package/dist/chunk-6gmfggss.js.map +10 -0
- package/dist/{chunk-svabwqdq.js → chunk-6h5m9xjx.js} +43 -415
- package/dist/{chunk-svabwqdq.js.map → chunk-6h5m9xjx.js.map} +7 -11
- package/dist/{chunk-f1xh7a32.js → chunk-7hpdd6r9.js} +2 -2
- package/dist/{chunk-xyvy73tj.js → chunk-bs7sqkre.js} +8 -3
- package/dist/chunk-bs7sqkre.js.map +12 -0
- package/dist/{chunk-rb143ggb.js → chunk-bwjcehza.js} +1 -1
- package/dist/{chunk-t9shqx3w.js → chunk-d0eb5yy6.js} +143 -7
- package/dist/chunk-d0eb5yy6.js.map +14 -0
- package/dist/{chunk-vp3z1ckh.js → chunk-de4z2bj6.js} +5 -5
- package/dist/{chunk-3rrezgyc.js → chunk-dnmadg9k.js} +2 -2
- package/dist/chunk-enpsx8k5.js +127 -0
- package/dist/chunk-enpsx8k5.js.map +10 -0
- package/dist/{chunk-a7er86jd.js → chunk-ex496vct.js} +1 -1
- package/dist/{chunk-jnfxmr3f.js → chunk-f1zxad2t.js} +1 -1
- package/dist/{chunk-6wbm6ymz.js → chunk-fe52eczz.js} +271 -83
- package/dist/chunk-fe52eczz.js.map +49 -0
- package/dist/{chunk-10styjgk.js → chunk-fx93hd2n.js} +71 -29
- package/dist/chunk-fx93hd2n.js.map +20 -0
- package/dist/{chunk-9se093qz.js → chunk-gc4ntf7d.js} +4 -4
- package/dist/{chunk-9se093qz.js.map → chunk-gc4ntf7d.js.map} +1 -1
- package/dist/{chunk-98cw09sw.js → chunk-hkc3jct7.js} +4 -2
- package/dist/chunk-hkc3jct7.js.map +10 -0
- package/dist/{chunk-pja9jfz6.js → chunk-htr6wjmv.js} +115 -53
- package/dist/chunk-htr6wjmv.js.map +19 -0
- package/dist/{chunk-h3v76ams.js → chunk-jhm3zsa7.js} +25 -2
- package/dist/chunk-jhm3zsa7.js.map +12 -0
- package/dist/{chunk-52c5zb0z.js → chunk-k6hrnf35.js} +5 -5
- package/dist/chunk-k6hrnf35.js.map +10 -0
- package/dist/{chunk-c2rga5cx.js → chunk-mfs23znk.js} +1 -1
- package/dist/{chunk-7ecp4v7a.js → chunk-ny3xyvcn.js} +8 -2
- package/dist/{chunk-7ecp4v7a.js.map → chunk-ny3xyvcn.js.map} +3 -3
- package/dist/{chunk-fggq3d9k.js → chunk-p0dqwj3n.js} +5 -5
- package/dist/{chunk-cnb5kv05.js → chunk-p844e0rn.js} +23 -8
- package/dist/chunk-p844e0rn.js.map +19 -0
- package/dist/{chunk-dmn70ztd.js → chunk-pfp1txq2.js} +25 -6
- package/dist/chunk-pfp1txq2.js.map +11 -0
- package/dist/chunk-pqajwytd.js.map +2 -2
- package/dist/{chunk-5be2ath4.js → chunk-qkbx3tf6.js} +17 -128
- package/dist/{chunk-5be2ath4.js.map → chunk-qkbx3tf6.js.map} +6 -7
- package/dist/{chunk-sk0hcjsz.js → chunk-qkvz64nd.js} +2 -2
- package/dist/{chunk-w9yycd3t.js → chunk-qmnnhde6.js} +4 -8
- package/dist/{chunk-w9yycd3t.js.map → chunk-qmnnhde6.js.map} +3 -3
- package/dist/{chunk-5yd8cchh.js → chunk-qq90g05n.js} +8 -8
- package/dist/{chunk-5yd8cchh.js.map → chunk-qq90g05n.js.map} +1 -1
- package/dist/{chunk-tjjgy3z4.js → chunk-qxvp5epv.js} +66 -14
- package/dist/{chunk-tjjgy3z4.js.map → chunk-qxvp5epv.js.map} +9 -8
- package/dist/chunk-rdghfsss.js.map +2 -2
- package/dist/{chunk-rx7h5fdx.js → chunk-rt9p8m9t.js} +1 -1
- package/dist/{chunk-cd234ba4.js → chunk-rz53yb4v.js} +10 -5
- package/dist/chunk-rz53yb4v.js.map +14 -0
- package/dist/{chunk-xcy5ddha.js → chunk-s4jhg8a3.js} +351 -296
- package/dist/chunk-s4jhg8a3.js.map +15 -0
- package/dist/{chunk-69266efg.js → chunk-s54c868q.js} +12 -4
- package/dist/chunk-s54c868q.js.map +12 -0
- package/dist/{chunk-9g6jz9kk.js → chunk-tffvfy6s.js} +6 -5
- package/dist/{chunk-9g6jz9kk.js.map → chunk-tffvfy6s.js.map} +3 -3
- package/dist/{chunk-e67ynxcr.js → chunk-v6xpd60t.js} +3 -3
- package/dist/{chunk-jjrn5v0p.js → chunk-vgk3hknm.js} +1 -1
- package/dist/{chunk-5thzcb8g.js → chunk-vx2yp45y.js} +2 -2
- package/dist/{chunk-dam456ve.js → chunk-vz3gc1tm.js} +394 -31
- package/dist/{chunk-dam456ve.js.map → chunk-vz3gc1tm.js.map} +10 -7
- package/dist/chunk-xt1zt7gv.js +471 -0
- package/dist/chunk-xt1zt7gv.js.map +13 -0
- package/dist/{chunk-rpxz486p.js → chunk-y05543x6.js} +21 -5
- package/dist/{chunk-rpxz486p.js.map → chunk-y05543x6.js.map} +3 -3
- package/dist/{chunk-aq39q04r.js → chunk-y9jmd7e5.js} +4 -4
- package/dist/{chunk-aq39q04r.js.map → chunk-y9jmd7e5.js.map} +1 -1
- package/dist/{chunk-k4g51s47.js → chunk-yv9czyfr.js} +3 -3
- package/dist/{chunk-z5rnrmz1.js → chunk-yw9pyg66.js} +5 -3
- package/dist/chunk-yw9pyg66.js.map +11 -0
- package/dist/{chunk-vre348sb.js → chunk-za5yd58j.js} +2 -2
- package/dist/{chunk-23xs4qp9.js → chunk-zb77kjth.js} +3 -3
- package/dist/{chunk-33saed7g.js → chunk-zxawp1n2.js} +1 -1
- package/dist/datasets/builders.d.ts +12 -1
- package/dist/datasets/builders.d.ts.map +1 -1
- package/dist/datasets/execution.d.ts +27 -1
- package/dist/datasets/execution.d.ts.map +1 -1
- package/dist/datasets/index.d.ts +1 -1
- package/dist/datasets/index.d.ts.map +1 -1
- package/dist/datasets/types.d.ts +2 -0
- package/dist/datasets/types.d.ts.map +1 -1
- package/dist/datasets/write.d.ts +5 -0
- package/dist/datasets/write.d.ts.map +1 -1
- package/dist/datasets/write.js +10 -5
- package/dist/datasets/write.js.map +1 -1
- package/dist/edits/properties.d.ts.map +1 -1
- package/dist/events/execution.d.ts +2 -1
- package/dist/events/execution.d.ts.map +1 -1
- package/dist/events/types/objects.d.ts +5 -0
- package/dist/events/types/objects.d.ts.map +1 -1
- package/dist/execution/agent.d.ts +10 -0
- package/dist/execution/agent.d.ts.map +1 -1
- package/dist/execution/agent.js +39 -34
- package/dist/execution/agent.js.map +1 -1
- package/dist/execution/authorized-object-reader.d.ts +6 -1
- package/dist/execution/authorized-object-reader.d.ts.map +1 -1
- package/dist/execution/primitive.js +37 -34
- package/dist/execution/primitive.js.map +2 -2
- package/dist/execution/request.js +38 -35
- package/dist/execution/request.js.map +2 -2
- package/dist/http/api-routes.d.ts.map +1 -1
- package/dist/http/index.js +1 -1
- package/dist/index.d.ts +9 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +57 -52
- package/dist/index.js.map +1 -1
- package/dist/lake-storage/index.js +8 -5
- package/dist/lake-storage/index.js.map +1 -1
- package/dist/materializer/index.js +19 -16
- package/dist/materializer/index.js.map +1 -1
- package/dist/models/catalog.d.ts +1 -1
- package/dist/models/catalog.d.ts.map +1 -1
- package/dist/models/execution/binding.d.ts +6 -0
- package/dist/models/execution/binding.d.ts.map +1 -1
- package/dist/models/execution/index.js +19 -16
- package/dist/models/execution/index.js.map +1 -1
- package/dist/models/execution/model-call-recorder.d.ts +4 -0
- package/dist/models/execution/model-call-recorder.d.ts.map +1 -1
- package/dist/models/execution.d.ts.map +1 -1
- package/dist/models/index.js +1 -1
- package/dist/models/language-model.d.ts +6 -0
- package/dist/models/language-model.d.ts.map +1 -1
- package/dist/objects/context/index.d.ts +1 -1
- package/dist/objects/context/index.d.ts.map +1 -1
- package/dist/objects/context/types.d.ts +6 -0
- package/dist/objects/context/types.d.ts.map +1 -1
- package/dist/objects/execution.d.ts +2 -1
- package/dist/objects/execution.d.ts.map +1 -1
- package/dist/objects/index.js +23 -19
- package/dist/objects/index.js.map +1 -1
- package/dist/objects/materializer-adapter.d.ts.map +1 -1
- package/dist/objects/object/upsert-batch.d.ts.map +1 -1
- package/dist/objects/object/upsert.d.ts.map +1 -1
- package/dist/objects/property-clearance.d.ts +41 -0
- package/dist/objects/property-clearance.d.ts.map +1 -0
- package/dist/objects/query/executor.d.ts +3 -0
- package/dist/objects/query/executor.d.ts.map +1 -1
- package/dist/objects/query/index.js +18 -15
- package/dist/objects/query/index.js.map +1 -1
- package/dist/objects/query/validate.d.ts +10 -1
- package/dist/objects/query/validate.d.ts.map +1 -1
- package/dist/objects/sdk/file-handle.d.ts +6 -0
- package/dist/objects/sdk/file-handle.d.ts.map +1 -0
- package/dist/objects/sdk/object-handle.d.ts +2 -2
- package/dist/objects/sdk/object-handle.d.ts.map +1 -1
- package/dist/objects/sdk/object-set.d.ts +2 -0
- package/dist/objects/sdk/object-set.d.ts.map +1 -1
- package/dist/ontology/builders.d.ts +12 -1
- package/dist/ontology/builders.d.ts.map +1 -1
- package/dist/ontology/docs-markdown.d.ts +35 -0
- package/dist/ontology/docs-markdown.d.ts.map +1 -0
- package/dist/ontology/docs.d.ts +50 -0
- package/dist/ontology/docs.d.ts.map +1 -0
- package/dist/ontology/index.js +7 -4
- package/dist/ontology/index.js.map +1 -1
- package/dist/ontology/inference/index.d.ts +19 -0
- package/dist/ontology/inference/index.d.ts.map +1 -1
- package/dist/ontology/internal.d.ts +3 -1
- package/dist/ontology/internal.d.ts.map +1 -1
- package/dist/ontology/internal.js +276 -3
- package/dist/ontology/internal.js.map +4 -3
- package/dist/ontology/tokens.d.ts +8 -1
- package/dist/ontology/tokens.d.ts.map +1 -1
- package/dist/ontology/types.d.ts +5 -0
- package/dist/ontology/types.d.ts.map +1 -1
- package/dist/ontology/validation/index.d.ts +1 -1
- package/dist/ontology/validation/index.d.ts.map +1 -1
- package/dist/ontology/validation/schema.d.ts +7 -0
- package/dist/ontology/validation/schema.d.ts.map +1 -1
- package/dist/pipelines/index.js +21 -18
- package/dist/pipelines/index.js.map +1 -1
- package/dist/projections/internal.js +19 -16
- package/dist/projections/internal.js.map +1 -1
- package/dist/runtime/create.d.ts +11 -2
- package/dist/runtime/create.d.ts.map +1 -1
- package/dist/runtime/definitions.d.ts +3 -1
- package/dist/runtime/definitions.d.ts.map +1 -1
- package/dist/runtime/host.d.ts +13 -2
- package/dist/runtime/host.d.ts.map +1 -1
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/internal.js +21 -18
- package/dist/runtime/internal.js.map +1 -1
- package/dist/runtime/locale.d.ts +9 -0
- package/dist/runtime/locale.d.ts.map +1 -0
- package/dist/runtime/resolve-definitions.d.ts +4 -2
- package/dist/runtime/resolve-definitions.d.ts.map +1 -1
- package/dist/runtime/types.d.ts +30 -3
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/sandboxes/index.js +7 -6
- package/dist/sandboxes/index.js.map +1 -1
- package/dist/scheduler/index.js +1 -1
- package/dist/scheduler/runtime.d.ts +3 -0
- package/dist/scheduler/runtime.d.ts.map +1 -1
- package/dist/security/builders.d.ts +11 -2
- package/dist/security/builders.d.ts.map +1 -1
- package/dist/security/index.d.ts +4 -4
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/markings.d.ts +19 -0
- package/dist/security/markings.d.ts.map +1 -0
- package/dist/security/redactions.d.ts +4 -0
- package/dist/security/redactions.d.ts.map +1 -0
- package/dist/security/registry.d.ts +7 -1
- package/dist/security/registry.d.ts.map +1 -1
- package/dist/security/types.d.ts +25 -0
- package/dist/security/types.d.ts.map +1 -1
- package/dist/security/validation.d.ts +4 -1
- package/dist/security/validation.d.ts.map +1 -1
- package/dist/shares/internal.js +18 -15
- package/dist/shares/internal.js.map +2 -2
- package/dist/storage/agents/provider.d.ts.map +1 -1
- package/dist/storage/agents/provider.js +5 -4
- package/dist/storage/agents/provider.js.map +1 -1
- package/dist/storage/agents/types.d.ts +15 -9
- package/dist/storage/agents/types.d.ts.map +1 -1
- package/dist/storage/file-upload-sessions/provider.js +10 -7
- package/dist/storage/file-upload-sessions/provider.js.map +1 -1
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +18 -15
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/internal.js +4 -3
- package/dist/storage/internal.js.map +1 -1
- package/dist/storage/objects/types.d.ts +7 -0
- package/dist/storage/objects/types.d.ts.map +1 -1
- package/dist/storage/workflow-runs/provider.js +10 -7
- package/dist/storage/workflow-runs/provider.js.map +1 -1
- package/dist/syncs/index.js +22 -19
- package/dist/syncs/index.js.map +1 -1
- package/dist/testing/index.js +55 -53
- package/dist/testing/index.js.map +2 -2
- package/dist/webhooks/internal.js +19 -16
- package/dist/webhooks/internal.js.map +2 -2
- package/dist/workflows/builders.d.ts.map +1 -1
- package/dist/workflows/index.js +41 -38
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/request.d.ts.map +1 -1
- package/dist/workflows/types.d.ts +6 -3
- package/dist/workflows/types.d.ts.map +1 -1
- package/dist/workflows/validation.d.ts +2 -1
- package/dist/workflows/validation.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/actions/read-facade.ts +2 -1
- package/src/actions/validation.ts +4 -1
- package/src/agents/adapters.ts +15 -0
- package/src/agents/authority.ts +15 -0
- package/src/agents/context/entries.ts +48 -4
- package/src/agents/context/index.ts +1 -0
- package/src/agents/context-compaction.ts +6 -0
- package/src/agents/errors.ts +3 -0
- package/src/agents/index.ts +13 -1
- package/src/agents/message.ts +9 -0
- package/src/agents/request.ts +178 -22
- package/src/agents/skills.ts +63 -0
- package/src/agents/types.ts +35 -5
- package/src/auth/runtime.ts +14 -0
- package/src/auth/types.ts +6 -0
- package/src/authorization/resolve.ts +6 -1
- package/src/authorization/types.ts +7 -0
- package/src/blob-storage/execution.ts +12 -0
- package/src/blob-storage/file-content.ts +106 -0
- package/src/blob-storage/index.ts +1 -0
- package/src/blob-storage/internal.ts +7 -0
- package/src/blob-storage/media-type.ts +29 -0
- package/src/blob-storage/types.ts +13 -1
- package/src/blob-storage/validation.ts +13 -0
- package/src/bootstrap/agent-context.ts +356 -0
- package/src/bootstrap/discovery.ts +100 -33
- package/src/bootstrap/index.ts +1 -1
- package/src/bootstrap/ontology-type-manifest.ts +3 -38
- package/src/datasets/builders.ts +17 -1
- package/src/datasets/execution.ts +110 -2
- package/src/datasets/index.ts +7 -1
- package/src/datasets/types.ts +2 -0
- package/src/datasets/write.ts +21 -2
- package/src/edits/properties.ts +3 -0
- package/src/events/execution.ts +15 -16
- package/src/events/types/objects.ts +5 -0
- package/src/execution/agent.ts +27 -0
- package/src/execution/authorization.ts +1 -0
- package/src/execution/authorized-object-reader.ts +96 -34
- package/src/execution/scopes.ts +2 -6
- package/src/http/api-routes.ts +4 -3
- package/src/index.ts +27 -2
- package/src/models/catalog.ts +26 -2
- package/src/models/execution/README.md +4 -3
- package/src/models/execution/binding.ts +6 -0
- package/src/models/execution/model-call-recorder.ts +10 -0
- package/src/models/execution/session.ts +2 -2
- package/src/models/execution.ts +6 -2
- package/src/models/language-model.ts +6 -0
- package/src/objects/context/index.ts +1 -0
- package/src/objects/context/types.ts +7 -0
- package/src/objects/execution.ts +4 -1
- package/src/objects/materializer-adapter.ts +3 -0
- package/src/objects/object/upsert-batch.ts +4 -1
- package/src/objects/object/upsert.ts +3 -1
- package/src/objects/property-clearance.ts +209 -0
- package/src/objects/query/executor.ts +43 -36
- package/src/objects/query/validate.ts +133 -14
- package/src/objects/sdk/file-handle.ts +77 -0
- package/src/objects/sdk/object-handle.ts +8 -4
- package/src/objects/sdk/object-set.ts +5 -2
- package/src/ontology/builders.ts +18 -2
- package/src/ontology/docs-markdown.ts +394 -0
- package/src/ontology/docs.ts +196 -0
- package/src/ontology/inference/index.ts +25 -0
- package/src/ontology/internal.ts +7 -0
- package/src/ontology/tokens.ts +13 -2
- package/src/ontology/types.ts +5 -0
- package/src/ontology/validation/index.ts +1 -0
- package/src/ontology/validation/schema.ts +26 -1
- package/src/runtime/create.ts +34 -4
- package/src/runtime/definitions.ts +3 -1
- package/src/runtime/host.ts +45 -1
- package/src/runtime/index.ts +3 -0
- package/src/runtime/locale.ts +26 -0
- package/src/runtime/resolve-definitions.ts +28 -1
- package/src/runtime/sixb.ts +1 -1
- package/src/runtime/types.ts +39 -3
- package/src/scheduler/runtime.ts +11 -2
- package/src/security/builders.ts +49 -5
- package/src/security/index.ts +6 -1
- package/src/security/markings.ts +313 -0
- package/src/security/redactions.ts +6 -0
- package/src/security/registry.ts +21 -1
- package/src/security/types.ts +26 -0
- package/src/security/validation.ts +59 -2
- package/src/storage/agents/provider.ts +11 -0
- package/src/storage/agents/types.ts +15 -7
- package/src/storage/index.ts +1 -0
- package/src/storage/objects/types.ts +7 -0
- package/src/workflows/builders.ts +24 -1
- package/src/workflows/request.ts +3 -0
- package/src/workflows/types.ts +6 -3
- package/src/workflows/validation.ts +32 -4
- package/dist/chunk-10styjgk.js.map +0 -20
- package/dist/chunk-52c5zb0z.js.map +0 -10
- package/dist/chunk-69266efg.js.map +0 -12
- package/dist/chunk-6wbm6ymz.js.map +0 -48
- package/dist/chunk-91kcnbf0.js.map +0 -10
- package/dist/chunk-98cw09sw.js.map +0 -10
- package/dist/chunk-9vx5e9g1.js.map +0 -11
- package/dist/chunk-cd234ba4.js.map +0 -14
- package/dist/chunk-cnb5kv05.js.map +0 -19
- package/dist/chunk-dmn70ztd.js.map +0 -11
- package/dist/chunk-gf7yht60.js.map +0 -12
- package/dist/chunk-h3v76ams.js.map +0 -11
- package/dist/chunk-pja9jfz6.js.map +0 -19
- package/dist/chunk-t9shqx3w.js.map +0 -12
- package/dist/chunk-xcy5ddha.js.map +0 -15
- package/dist/chunk-xyvy73tj.js.map +0 -12
- package/dist/chunk-z5rnrmz1.js.map +0 -11
- /package/dist/{chunk-4gmng3vf.js.map → chunk-22v5bpz3.js.map} +0 -0
- /package/dist/{chunk-2am3db31.js.map → chunk-48e3cn2d.js.map} +0 -0
- /package/dist/{chunk-f1xh7a32.js.map → chunk-7hpdd6r9.js.map} +0 -0
- /package/dist/{chunk-rb143ggb.js.map → chunk-bwjcehza.js.map} +0 -0
- /package/dist/{chunk-vp3z1ckh.js.map → chunk-de4z2bj6.js.map} +0 -0
- /package/dist/{chunk-3rrezgyc.js.map → chunk-dnmadg9k.js.map} +0 -0
- /package/dist/{chunk-a7er86jd.js.map → chunk-ex496vct.js.map} +0 -0
- /package/dist/{chunk-jnfxmr3f.js.map → chunk-f1zxad2t.js.map} +0 -0
- /package/dist/{chunk-c2rga5cx.js.map → chunk-mfs23znk.js.map} +0 -0
- /package/dist/{chunk-fggq3d9k.js.map → chunk-p0dqwj3n.js.map} +0 -0
- /package/dist/{chunk-sk0hcjsz.js.map → chunk-qkvz64nd.js.map} +0 -0
- /package/dist/{chunk-rx7h5fdx.js.map → chunk-rt9p8m9t.js.map} +0 -0
- /package/dist/{chunk-e67ynxcr.js.map → chunk-v6xpd60t.js.map} +0 -0
- /package/dist/{chunk-jjrn5v0p.js.map → chunk-vgk3hknm.js.map} +0 -0
- /package/dist/{chunk-5thzcb8g.js.map → chunk-vx2yp45y.js.map} +0 -0
- /package/dist/{chunk-k4g51s47.js.map → chunk-yv9czyfr.js.map} +0 -0
- /package/dist/{chunk-vre348sb.js.map → chunk-za5yd58j.js.map} +0 -0
- /package/dist/{chunk-23xs4qp9.js.map → chunk-zb77kjth.js.map} +0 -0
- /package/dist/{chunk-33saed7g.js.map → chunk-zxawp1n2.js.map} +0 -0
|
@@ -39,10 +39,13 @@ import { rerankObjectCandidates } from "./reranking-executor"
|
|
|
39
39
|
import { findQueryReranking } from "./reranking-query"
|
|
40
40
|
import { compareQueryScalarValues, queryScalarValuesEqual } from "./scalar-values"
|
|
41
41
|
import {
|
|
42
|
+
type AdmittedObjectQuery,
|
|
43
|
+
type ObjectQuerySemanticAdmission,
|
|
42
44
|
type ObjectQueryValidationIssue,
|
|
43
45
|
resolveObjectQueryResultShape,
|
|
44
46
|
type ValidatedObjectQuery,
|
|
45
47
|
validateObjectQuery,
|
|
48
|
+
validateObjectQueryWithAdmission,
|
|
46
49
|
} from "./validate"
|
|
47
50
|
|
|
48
51
|
export interface QueryExecutorOptions
|
|
@@ -73,6 +76,8 @@ export interface QueryExecutorOptions
|
|
|
73
76
|
authorization?: AuthorizationContext
|
|
74
77
|
/** Registered execution capability for queries reached through a bound Sixb SDK. */
|
|
75
78
|
runtimeAuthorization?: RuntimeAuthorization
|
|
79
|
+
/** Reader-specific admission applied after grants, such as marking clearances. */
|
|
80
|
+
admission?: ObjectQuerySemanticAdmission
|
|
76
81
|
}
|
|
77
82
|
|
|
78
83
|
export interface ExecuteObjectQueryInput {
|
|
@@ -138,15 +143,7 @@ export async function executeObjectQuery(
|
|
|
138
143
|
input: ExecuteObjectQueryInput,
|
|
139
144
|
options: QueryExecutorOptions
|
|
140
145
|
): Promise<ExecuteObjectQueryResult> {
|
|
141
|
-
const
|
|
142
|
-
const validated = validateObjectQuery(normalized, {
|
|
143
|
-
ontology: options.ontology,
|
|
144
|
-
maxLimit: options.maxLimit,
|
|
145
|
-
maxPageSize: options.maxPageSize,
|
|
146
|
-
maxRefs: options.maxRefs,
|
|
147
|
-
normalize: false,
|
|
148
|
-
})
|
|
149
|
-
assertQueryViewable(input.projectId, validated, options)
|
|
146
|
+
const validated = validateExecutableQuery(input, options)
|
|
150
147
|
const capabilities = options.storage.queryCapabilities()
|
|
151
148
|
const hasQueryObjects = typeof options.storage.queryObjects === "function"
|
|
152
149
|
const hasCountObjects = typeof options.storage.countObjects === "function"
|
|
@@ -242,15 +239,7 @@ export async function countObjects(
|
|
|
242
239
|
input: ExecuteObjectCountInput,
|
|
243
240
|
options: QueryExecutorOptions
|
|
244
241
|
): Promise<ExecuteObjectCountResult> {
|
|
245
|
-
const
|
|
246
|
-
const validated = validateObjectQuery(normalized, {
|
|
247
|
-
ontology: options.ontology,
|
|
248
|
-
maxLimit: options.maxLimit,
|
|
249
|
-
maxPageSize: options.maxPageSize,
|
|
250
|
-
maxRefs: options.maxRefs,
|
|
251
|
-
normalize: false,
|
|
252
|
-
})
|
|
253
|
-
assertQueryViewable(input.projectId, validated, options)
|
|
242
|
+
const validated = validateExecutableQuery(input, options)
|
|
254
243
|
const capabilities = options.storage.queryCapabilities()
|
|
255
244
|
const hasQueryObjects = typeof options.storage.queryObjects === "function"
|
|
256
245
|
const hasCountObjects = typeof options.storage.countObjects === "function"
|
|
@@ -303,15 +292,7 @@ export async function existsObjects(
|
|
|
303
292
|
input: ExecuteObjectExistsInput,
|
|
304
293
|
options: QueryExecutorOptions
|
|
305
294
|
): Promise<ExecuteObjectExistsResult> {
|
|
306
|
-
const
|
|
307
|
-
const validated = validateObjectQuery(normalized, {
|
|
308
|
-
ontology: options.ontology,
|
|
309
|
-
maxLimit: options.maxLimit,
|
|
310
|
-
maxPageSize: options.maxPageSize,
|
|
311
|
-
maxRefs: options.maxRefs,
|
|
312
|
-
normalize: false,
|
|
313
|
-
})
|
|
314
|
-
assertQueryViewable(input.projectId, validated, options)
|
|
295
|
+
const validated = validateExecutableQuery(input, options)
|
|
315
296
|
const capabilities = options.storage.queryCapabilities()
|
|
316
297
|
const hasQueryObjects = typeof options.storage.queryObjects === "function"
|
|
317
298
|
const hasCountObjects = typeof options.storage.countObjects === "function"
|
|
@@ -364,16 +345,17 @@ export async function facetObjects(
|
|
|
364
345
|
input: ExecuteObjectFacetsInput,
|
|
365
346
|
options: QueryExecutorOptions
|
|
366
347
|
): Promise<ExecuteObjectFacetsResult> {
|
|
367
|
-
const
|
|
368
|
-
const validated = validateObjectQuery(normalized, {
|
|
369
|
-
ontology: options.ontology,
|
|
370
|
-
maxLimit: options.maxLimit,
|
|
371
|
-
maxPageSize: options.maxPageSize,
|
|
372
|
-
maxRefs: options.maxRefs,
|
|
373
|
-
normalize: false,
|
|
374
|
-
})
|
|
375
|
-
assertQueryViewable(input.projectId, validated, options)
|
|
348
|
+
const validated = validateExecutableQuery(input, options)
|
|
376
349
|
const facets = validateObjectFacetRequests(input.facets, validated.result.objectTypeIds, options)
|
|
350
|
+
facets.forEach((facet, index) => {
|
|
351
|
+
const denial = options.admission?.property({
|
|
352
|
+
state: validated.admissionState,
|
|
353
|
+
propertyId: facet.propertyId,
|
|
354
|
+
use: "facet",
|
|
355
|
+
path: `$.facets[${index}].propertyId`,
|
|
356
|
+
})
|
|
357
|
+
if (denial) throw denial
|
|
358
|
+
})
|
|
377
359
|
const aggregateQuery = stripOuterRowShape(validated.query)
|
|
378
360
|
const capabilities = options.storage.queryCapabilities()
|
|
379
361
|
const hasQueryObjects = typeof options.storage.queryObjects === "function"
|
|
@@ -430,6 +412,31 @@ export async function facetObjects(
|
|
|
430
412
|
}
|
|
431
413
|
}
|
|
432
414
|
|
|
415
|
+
/**
|
|
416
|
+
* Validate, authorize the touched types, then admit the query for the reader.
|
|
417
|
+
*
|
|
418
|
+
* Grants are checked first so a denial never describes properties of a type the caller cannot
|
|
419
|
+
* view. The admitted query is the one executed: an admission may narrow it, as markings narrow
|
|
420
|
+
* default text fields.
|
|
421
|
+
*/
|
|
422
|
+
function validateExecutableQuery(
|
|
423
|
+
input: { readonly projectId: string; readonly query: ObjectQuery },
|
|
424
|
+
options: QueryExecutorOptions
|
|
425
|
+
): AdmittedObjectQuery {
|
|
426
|
+
const validationOptions = {
|
|
427
|
+
ontology: options.ontology,
|
|
428
|
+
maxLimit: options.maxLimit,
|
|
429
|
+
maxPageSize: options.maxPageSize,
|
|
430
|
+
maxRefs: options.maxRefs,
|
|
431
|
+
normalize: false,
|
|
432
|
+
}
|
|
433
|
+
const normalized = normalizeObjectQuery(input.query)
|
|
434
|
+
const validated = validateObjectQuery(normalized, validationOptions)
|
|
435
|
+
assertQueryViewable(input.projectId, validated, options)
|
|
436
|
+
if (!options.admission) return { ...validated, admissionState: {} }
|
|
437
|
+
return validateObjectQueryWithAdmission(normalized, validationOptions, options.admission)
|
|
438
|
+
}
|
|
439
|
+
|
|
433
440
|
// Authorization happens at planning time: a scoped query must hold a view
|
|
434
441
|
// grant for every object type it touches, before any storage call runs.
|
|
435
442
|
function assertQueryViewable(
|
|
@@ -42,7 +42,10 @@ export interface ObjectQueryValidationIssue {
|
|
|
42
42
|
export interface ValidatedObjectQuery {
|
|
43
43
|
query: ObjectQuery
|
|
44
44
|
result: ObjectQueryResultShape
|
|
45
|
-
/**
|
|
45
|
+
/**
|
|
46
|
+
* Every object type the query touches, including intermediate traversal types and the subtypes
|
|
47
|
+
* an outgoing link can reach.
|
|
48
|
+
*/
|
|
46
49
|
touchedObjectTypeIds: readonly string[]
|
|
47
50
|
}
|
|
48
51
|
|
|
@@ -159,6 +162,67 @@ const NOOP_QUERY_ADMISSION: ObjectQuerySemanticAdmission = Object.freeze({
|
|
|
159
162
|
input.states[0] ?? NOOP_ADMISSION_STATE,
|
|
160
163
|
})
|
|
161
164
|
|
|
165
|
+
/**
|
|
166
|
+
* Admit a query only when both admissions admit it, each reducing its own state.
|
|
167
|
+
*
|
|
168
|
+
* The first denial wins, in order, so composing keeps each admission's messages unchanged.
|
|
169
|
+
*/
|
|
170
|
+
export function composeObjectQueryAdmissions(
|
|
171
|
+
first: ObjectQuerySemanticAdmission,
|
|
172
|
+
second: ObjectQuerySemanticAdmission
|
|
173
|
+
): ObjectQuerySemanticAdmission {
|
|
174
|
+
const parts = new WeakMap<
|
|
175
|
+
ObjectQueryAdmissionState,
|
|
176
|
+
readonly [ObjectQueryAdmissionState, ObjectQueryAdmissionState]
|
|
177
|
+
>()
|
|
178
|
+
const join = (
|
|
179
|
+
left: ObjectQueryAdmissionState,
|
|
180
|
+
right: ObjectQueryAdmissionState
|
|
181
|
+
): ObjectQueryAdmissionState => {
|
|
182
|
+
const state = Object.freeze({})
|
|
183
|
+
parts.set(state, [left, right])
|
|
184
|
+
return state
|
|
185
|
+
}
|
|
186
|
+
const split = (state: ObjectQueryAdmissionState) => {
|
|
187
|
+
const pair = parts.get(state)
|
|
188
|
+
if (!pair) throw new Error("[Sixb] Composed query admission received a foreign state.")
|
|
189
|
+
return pair
|
|
190
|
+
}
|
|
191
|
+
const transition = (
|
|
192
|
+
left: ObjectQueryAdmissionTransition,
|
|
193
|
+
right: ObjectQueryAdmissionTransition
|
|
194
|
+
): ObjectQueryAdmissionTransition => {
|
|
195
|
+
const denial = left.denial ?? right.denial
|
|
196
|
+
return { state: join(left.state, right.state), ...(denial ? { denial } : {}) }
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
const admission: ObjectQuerySemanticAdmission = {
|
|
200
|
+
empty: () => join(first.empty(), second.empty()),
|
|
201
|
+
source: (input) => transition(first.source(input), second.source(input)),
|
|
202
|
+
edge: (input) => {
|
|
203
|
+
const [left, right] = split(input.state)
|
|
204
|
+
return transition(
|
|
205
|
+
first.edge({ ...input, state: left }),
|
|
206
|
+
second.edge({ ...input, state: right })
|
|
207
|
+
)
|
|
208
|
+
},
|
|
209
|
+
property: (input) => {
|
|
210
|
+
const [left, right] = split(input.state)
|
|
211
|
+
return (
|
|
212
|
+
first.property({ ...input, state: left }) ?? second.property({ ...input, state: right })
|
|
213
|
+
)
|
|
214
|
+
},
|
|
215
|
+
set: (input) => {
|
|
216
|
+
const pairs = input.states.map(split)
|
|
217
|
+
return join(
|
|
218
|
+
first.set({ ...input, states: pairs.map(([left]) => left) }),
|
|
219
|
+
second.set({ ...input, states: pairs.map(([, right]) => right) })
|
|
220
|
+
)
|
|
221
|
+
},
|
|
222
|
+
}
|
|
223
|
+
return Object.freeze(admission)
|
|
224
|
+
}
|
|
225
|
+
|
|
162
226
|
export function validateObjectQuery(
|
|
163
227
|
query: ObjectQuery,
|
|
164
228
|
options: ObjectQueryValidationOptions
|
|
@@ -530,9 +594,7 @@ function validateStart(
|
|
|
530
594
|
return { result: { objectTypeIds: [] }, query: { kind: "start", objectTypeId } }
|
|
531
595
|
}
|
|
532
596
|
|
|
533
|
-
const objectTypeIds = includeSubtypes
|
|
534
|
-
? uniqueStrings([objectTypeId, ...ctx.ontology.listSubTypes(objectTypeId)])
|
|
535
|
-
: [objectTypeId]
|
|
597
|
+
const objectTypeIds = includeSubtypes ? withSubtypes([objectTypeId], ctx) : [objectTypeId]
|
|
536
598
|
|
|
537
599
|
return { result: { objectTypeIds }, query: { kind: "start", objectTypeId, includeSubtypes } }
|
|
538
600
|
}
|
|
@@ -895,16 +957,15 @@ function validateTextQuery(
|
|
|
895
957
|
continue
|
|
896
958
|
}
|
|
897
959
|
|
|
898
|
-
|
|
960
|
+
const admitted = admitTextFields(fieldIds, fields === undefined, {
|
|
961
|
+
state: admissionState,
|
|
962
|
+
objectTypeId: objectType.id,
|
|
963
|
+
path: `${path}.fields`,
|
|
964
|
+
ctx,
|
|
965
|
+
})
|
|
966
|
+
if (fieldsByObjectType) fieldsByObjectType[objectType.id] = uniqueStrings(admitted)
|
|
899
967
|
|
|
900
968
|
for (const fieldId of fieldIds) {
|
|
901
|
-
admitProperty(ctx, {
|
|
902
|
-
state: admissionState,
|
|
903
|
-
propertyId: fieldId,
|
|
904
|
-
objectTypeId: objectType.id,
|
|
905
|
-
use: "text",
|
|
906
|
-
path: `${path}.fields`,
|
|
907
|
-
})
|
|
908
969
|
const property = getProperty(objectType, fieldId)
|
|
909
970
|
if (!property) {
|
|
910
971
|
addIssue(
|
|
@@ -933,6 +994,43 @@ function validateTextQuery(
|
|
|
933
994
|
return fieldsByObjectType ? { fieldsByObjectType } : {}
|
|
934
995
|
}
|
|
935
996
|
|
|
997
|
+
/**
|
|
998
|
+
* Admit the fields a text query searches. Every explicit field must be admitted. Default fields
|
|
999
|
+
* come from the type's search profile, so a reader that cannot use one searches the others
|
|
1000
|
+
* instead; only a type left with no usable default field is denied.
|
|
1001
|
+
*/
|
|
1002
|
+
function admitTextFields(
|
|
1003
|
+
fieldIds: readonly string[],
|
|
1004
|
+
defaults: boolean,
|
|
1005
|
+
input: {
|
|
1006
|
+
readonly state: ObjectQueryAdmissionState
|
|
1007
|
+
readonly objectTypeId: string
|
|
1008
|
+
readonly path: string
|
|
1009
|
+
readonly ctx: QueryValidationContext
|
|
1010
|
+
}
|
|
1011
|
+
): readonly string[] {
|
|
1012
|
+
const admitted: string[] = []
|
|
1013
|
+
let firstDenial: Error | undefined
|
|
1014
|
+
for (const fieldId of fieldIds) {
|
|
1015
|
+
const denial = input.ctx.admission.property({
|
|
1016
|
+
state: input.state,
|
|
1017
|
+
propertyId: fieldId,
|
|
1018
|
+
objectTypeId: input.objectTypeId,
|
|
1019
|
+
use: "text",
|
|
1020
|
+
path: input.path,
|
|
1021
|
+
})
|
|
1022
|
+
if (!denial) {
|
|
1023
|
+
admitted.push(fieldId)
|
|
1024
|
+
} else if (!defaults) {
|
|
1025
|
+
recordAdmissionDenial(input.ctx, denial)
|
|
1026
|
+
} else {
|
|
1027
|
+
firstDenial ??= denial
|
|
1028
|
+
}
|
|
1029
|
+
}
|
|
1030
|
+
if (admitted.length === 0 && firstDenial) recordAdmissionDenial(input.ctx, firstDenial)
|
|
1031
|
+
return admitted
|
|
1032
|
+
}
|
|
1033
|
+
|
|
936
1034
|
function validateVectorProfileQuery(
|
|
937
1035
|
query: ObjectQueryVector,
|
|
938
1036
|
shape: ObjectQueryResultShape,
|
|
@@ -1060,7 +1158,9 @@ function validateOutgoingTraverse(
|
|
|
1060
1158
|
}
|
|
1061
1159
|
}
|
|
1062
1160
|
|
|
1063
|
-
|
|
1161
|
+
const objectTypeIds = uniqueStrings(targetTypeIds)
|
|
1162
|
+
touchLinkTargets(objectTypeIds, ctx)
|
|
1163
|
+
return { objectTypeIds }
|
|
1064
1164
|
}
|
|
1065
1165
|
|
|
1066
1166
|
function validateIncomingTraverse(
|
|
@@ -1261,7 +1361,22 @@ function resolveOutgoingExpansionTargets(
|
|
|
1261
1361
|
)
|
|
1262
1362
|
}
|
|
1263
1363
|
|
|
1264
|
-
|
|
1364
|
+
const objectTypeIds = uniqueStrings(targetTypeIds)
|
|
1365
|
+
touchLinkTargets(objectTypeIds, ctx)
|
|
1366
|
+
return { objectTypeIds }
|
|
1367
|
+
}
|
|
1368
|
+
|
|
1369
|
+
/**
|
|
1370
|
+
* Following a link outgoing reads every subtype of its declared targets: links accept subtype
|
|
1371
|
+
* targets and storage follows them by link id alone. Authorize those reads like a `start` that
|
|
1372
|
+
* includes subtypes; the result shape keeps the declared targets that later nodes validate against.
|
|
1373
|
+
* Incoming edges already name every source type they can return: storage matches a pinned
|
|
1374
|
+
* `sourceObjectTypeId` exactly, and otherwise subtypes inherit the link.
|
|
1375
|
+
*/
|
|
1376
|
+
function touchLinkTargets(objectTypeIds: readonly string[], ctx: QueryValidationContext): void {
|
|
1377
|
+
for (const objectTypeId of withSubtypes(objectTypeIds, ctx)) {
|
|
1378
|
+
ctx.touchedObjectTypeIds.add(objectTypeId)
|
|
1379
|
+
}
|
|
1265
1380
|
}
|
|
1266
1381
|
|
|
1267
1382
|
function resolveIncomingExpansionTargets(
|
|
@@ -1657,6 +1772,10 @@ function uniqueStrings(values: readonly string[]): string[] {
|
|
|
1657
1772
|
return [...new Set(values)]
|
|
1658
1773
|
}
|
|
1659
1774
|
|
|
1775
|
+
function withSubtypes(objectTypeIds: readonly string[], ctx: QueryValidationContext): string[] {
|
|
1776
|
+
return uniqueStrings(objectTypeIds.flatMap((id) => [id, ...ctx.ontology.listSubTypes(id)]))
|
|
1777
|
+
}
|
|
1778
|
+
|
|
1660
1779
|
function admitTransition(
|
|
1661
1780
|
ctx: QueryValidationContext,
|
|
1662
1781
|
transition: ObjectQueryAdmissionTransition
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File handle factory for ObjectReadByIdHandle.
|
|
3
|
+
*
|
|
4
|
+
* Opens a `fileRef` property through the object that holds it, the way the object file content
|
|
5
|
+
* route does: the object is read again with the caller's permissions, the FileRef is resolved in
|
|
6
|
+
* that authorized row, then checked against the stored blob before it is opened.
|
|
7
|
+
*/
|
|
8
|
+
import { AuthorizationError } from "../../authorization/errors"
|
|
9
|
+
import { jsonPointerSegment, openFileRef, resolveFileRefAtPath } from "../../blob-storage/internal"
|
|
10
|
+
import type { Property } from "../../ontology"
|
|
11
|
+
import { OntologyValidationError } from "../../ontology/errors"
|
|
12
|
+
import type { PropertyToken } from "../../ontology/tokens"
|
|
13
|
+
import { assertPropertyTokenBelongsToObjectType } from "../../ontology/validation"
|
|
14
|
+
import type { ObjectFileHandle } from "../../runtime/types"
|
|
15
|
+
import type { ObjectSetContext } from "../context"
|
|
16
|
+
|
|
17
|
+
export function createObjectFileHandle(
|
|
18
|
+
ctx: ObjectSetContext,
|
|
19
|
+
primaryId: string,
|
|
20
|
+
property: PropertyToken<string, string, Property>,
|
|
21
|
+
index?: number
|
|
22
|
+
): ObjectFileHandle {
|
|
23
|
+
const { objectType } = ctx
|
|
24
|
+
assertPropertyTokenBelongsToObjectType(objectType, property)
|
|
25
|
+
const registered = ctx.ontology
|
|
26
|
+
.resolveObjectType(objectType.id)
|
|
27
|
+
.properties.find((candidate) => candidate.id === property.id)
|
|
28
|
+
if (!registered) {
|
|
29
|
+
throw new OntologyValidationError(
|
|
30
|
+
`[Sixb] Unknown property '${property.id}' for object type '${objectType.id}'`
|
|
31
|
+
)
|
|
32
|
+
}
|
|
33
|
+
const path = filePropertyPath(objectType.id, registered, index)
|
|
34
|
+
|
|
35
|
+
return {
|
|
36
|
+
async open() {
|
|
37
|
+
const row = await ctx.objectReader.getByPrimaryId({ objectTypeId: objectType.id, primaryId })
|
|
38
|
+
if (!row) return null
|
|
39
|
+
if (row.redactions?.[property.id]) {
|
|
40
|
+
// Redacted, so the registered property has a marking the caller is not cleared for.
|
|
41
|
+
const markings = registered.markings ?? []
|
|
42
|
+
const marking =
|
|
43
|
+
markings.find((markingId) => !ctx.authorization?.clearances?.has(markingId)) ??
|
|
44
|
+
markings[0]
|
|
45
|
+
throw new AuthorizationError(
|
|
46
|
+
`clearance:marking:${marking}`,
|
|
47
|
+
`[Sixb] Cannot open file '${objectType.id}.${property.id}': it requires clearance for marking '${marking}'.`
|
|
48
|
+
)
|
|
49
|
+
}
|
|
50
|
+
const fileRef = resolveFileRefAtPath(row, path)
|
|
51
|
+
return fileRef ? openFileRef(ctx.blobStorage, fileRef) : null
|
|
52
|
+
},
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** JSON Pointer to the file in an object row, validated against the property's schema. */
|
|
57
|
+
function filePropertyPath(objectTypeId: string, property: Property, index: number | undefined) {
|
|
58
|
+
const { schema } = property
|
|
59
|
+
const name = `${objectTypeId}.${property.id}`
|
|
60
|
+
if (schema === "fileRef") {
|
|
61
|
+
if (index !== undefined) {
|
|
62
|
+
throw new OntologyValidationError(`[Sixb] Property ${name} holds one file; omit the index.`)
|
|
63
|
+
}
|
|
64
|
+
return `/properties/${jsonPointerSegment(property.id)}`
|
|
65
|
+
}
|
|
66
|
+
if (typeof schema === "object" && schema.type === "array" && schema.items === "fileRef") {
|
|
67
|
+
if (index === undefined || !Number.isSafeInteger(index) || index < 0) {
|
|
68
|
+
throw new OntologyValidationError(
|
|
69
|
+
`[Sixb] Property ${name} holds a list of files; pass the index of the file to open.`
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
return `/properties/${jsonPointerSegment(property.id)}/${index}`
|
|
73
|
+
}
|
|
74
|
+
throw new OntologyValidationError(
|
|
75
|
+
`[Sixb] Property ${name} is not a file: file() takes a "fileRef" property or a list of them.`
|
|
76
|
+
)
|
|
77
|
+
}
|
|
@@ -5,26 +5,27 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import type { ActionDefinition } from "../../actions"
|
|
8
|
-
import type { ObjectLink, ObjectRef } from "../../ontology"
|
|
8
|
+
import type { ObjectLink, ObjectRef, Property } from "../../ontology"
|
|
9
9
|
import { OntologyValidationError } from "../../ontology/errors"
|
|
10
|
-
import type { LinkToken, ObjectTypeWithPropertyTokens } from "../../ontology/tokens"
|
|
10
|
+
import type { LinkToken, ObjectTypeWithPropertyTokens, PropertyToken } from "../../ontology/tokens"
|
|
11
11
|
import { assertLinkTokenBelongsToObjectType } from "../../ontology/validation"
|
|
12
12
|
import type { ObjectByIdHandle, TwinObject } from "../../runtime/types"
|
|
13
13
|
import {
|
|
14
14
|
requestActionAndWait as requestActionAndWaitLeaf,
|
|
15
15
|
requestAction as requestActionLeaf,
|
|
16
16
|
} from "../action"
|
|
17
|
-
import type {
|
|
17
|
+
import type { ObjectSetContext, ResolvedLinkContext } from "../context"
|
|
18
18
|
import { removeLink as removeLinkLeaf, upsertLink as upsertLinkLeaf } from "../link"
|
|
19
19
|
import { deleteObject, restoreObject } from "../object"
|
|
20
20
|
import { createObjectVectorHandle } from "../vectors/handle"
|
|
21
|
+
import { createObjectFileHandle } from "./file-handle"
|
|
21
22
|
import { createTelemetryChannel } from "./telemetry-channel"
|
|
22
23
|
|
|
23
24
|
type ObjectRefInput = ObjectRef
|
|
24
25
|
type AnyLinkToken = LinkToken<string, string, string | readonly string[], ObjectLink>
|
|
25
26
|
|
|
26
27
|
export function createObjectByIdHandle<TObjectType extends ObjectTypeWithPropertyTokens>(
|
|
27
|
-
ctx:
|
|
28
|
+
ctx: ObjectSetContext,
|
|
28
29
|
primaryId: string
|
|
29
30
|
): ObjectByIdHandle<TObjectType> {
|
|
30
31
|
const objectHandle = {
|
|
@@ -130,6 +131,9 @@ export function createObjectByIdHandle<TObjectType extends ObjectTypeWithPropert
|
|
|
130
131
|
},
|
|
131
132
|
|
|
132
133
|
telemetry: createTelemetryChannel<TObjectType>(ctx, primaryId),
|
|
134
|
+
|
|
135
|
+
file: (property: PropertyToken<string, string, Property>, index?: number) =>
|
|
136
|
+
createObjectFileHandle(ctx, primaryId, property, index),
|
|
133
137
|
}
|
|
134
138
|
|
|
135
139
|
return objectHandle as unknown as ObjectByIdHandle<TObjectType>
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
import type { ActionDefinition } from "../../actions"
|
|
8
8
|
import type { AuthorizationContext } from "../../authorization"
|
|
9
|
+
import type { BlobStorage } from "../../blob-storage"
|
|
9
10
|
import { shareSixbErrorReporter } from "../../error-reporting/capability"
|
|
10
11
|
import type { ExecutionContext } from "../../execution"
|
|
11
12
|
import { assertAuthorizedObjectReaderBinding } from "../../execution/authorized-object-reader"
|
|
@@ -22,7 +23,7 @@ import {
|
|
|
22
23
|
requestActionAndWait as requestActionAndWaitLeaf,
|
|
23
24
|
requestAction as requestActionLeaf,
|
|
24
25
|
} from "../action"
|
|
25
|
-
import type {
|
|
26
|
+
import type { ObjectSetContext, ResolvedLinkContext } from "../context"
|
|
26
27
|
import { requireLinkDefinition } from "../context"
|
|
27
28
|
import { removeLink as removeLinkLeaf, upsertLink as upsertLinkLeaf } from "../link"
|
|
28
29
|
import { upsertObject as upsertObjectLeaf } from "../object"
|
|
@@ -36,6 +37,7 @@ export function createObjectSet<TObjectType extends ObjectTypeWithPropertyTokens
|
|
|
36
37
|
readonly execution: ExecutionContext
|
|
37
38
|
readonly objectType: TObjectType
|
|
38
39
|
readonly authorization?: AuthorizationContext
|
|
40
|
+
readonly blobStorage: Pick<BlobStorage, "stat" | "open">
|
|
39
41
|
}
|
|
40
42
|
): ObjectSet<TObjectType> {
|
|
41
43
|
assertAuthorizedObjectReaderBinding({
|
|
@@ -67,7 +69,7 @@ export function createObjectSet<TObjectType extends ObjectTypeWithPropertyTokens
|
|
|
67
69
|
objectReader,
|
|
68
70
|
})
|
|
69
71
|
|
|
70
|
-
const resolvedCtx:
|
|
72
|
+
const resolvedCtx: ObjectSetContext = {
|
|
71
73
|
embeddingModels: params.embeddingModels,
|
|
72
74
|
projectId,
|
|
73
75
|
broker,
|
|
@@ -80,6 +82,7 @@ export function createObjectSet<TObjectType extends ObjectTypeWithPropertyTokens
|
|
|
80
82
|
runtimeAuthorization,
|
|
81
83
|
authorization,
|
|
82
84
|
execution,
|
|
85
|
+
blobStorage: params.blobStorage,
|
|
83
86
|
objectType,
|
|
84
87
|
primaryPropertyId,
|
|
85
88
|
}
|
package/src/ontology/builders.ts
CHANGED
|
@@ -26,6 +26,8 @@
|
|
|
26
26
|
* ```
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
|
+
import { markingIdsFrom } from "../security/builders"
|
|
30
|
+
import type { MarkingDefinition } from "../security/types"
|
|
29
31
|
import type { ObjectTypeWithPropertyTokens, ObjectTypeWithTokens } from "./tokens"
|
|
30
32
|
import { createLinkTokenMap, createPropertyTokenMap } from "./tokens"
|
|
31
33
|
import type {
|
|
@@ -353,8 +355,17 @@ type PropertyOptions = {
|
|
|
353
355
|
mode?: PropertyMode
|
|
354
356
|
semanticType?: QuantitativeTypeId
|
|
355
357
|
query?: PropertyQueryMetadata
|
|
358
|
+
/** Readers need a clearance for every marking to receive this property's value. */
|
|
359
|
+
markings?: readonly MarkingDefinition[]
|
|
356
360
|
}
|
|
357
361
|
|
|
362
|
+
/** The property records marking ids; only a declared, non-empty list marks it. */
|
|
363
|
+
type MarkingsFromOptions<TOptions> = TOptions extends {
|
|
364
|
+
markings: readonly [MarkingDefinition, ...MarkingDefinition[]]
|
|
365
|
+
}
|
|
366
|
+
? { markings: readonly string[] }
|
|
367
|
+
: { markings?: readonly string[] }
|
|
368
|
+
|
|
358
369
|
type PropertyResult<
|
|
359
370
|
TId extends string,
|
|
360
371
|
TSchema extends Schema,
|
|
@@ -369,7 +380,8 @@ type PropertyResult<
|
|
|
369
380
|
FieldFromOptions<TOptions, "primary", true> &
|
|
370
381
|
FieldFromOptions<TOptions, "mode", PropertyMode> &
|
|
371
382
|
FieldFromOptions<TOptions, "semanticType", QuantitativeTypeId> &
|
|
372
|
-
FieldFromOptions<TOptions, "query", PropertyQueryMetadata>
|
|
383
|
+
FieldFromOptions<TOptions, "query", PropertyQueryMetadata> &
|
|
384
|
+
MarkingsFromOptions<TOptions>
|
|
373
385
|
|
|
374
386
|
/**
|
|
375
387
|
* Shorthand for creating a {@link Property}.
|
|
@@ -396,11 +408,15 @@ export function prop<
|
|
|
396
408
|
const TOptions extends PropertyOptions,
|
|
397
409
|
>(id: TId, schema: TSchema, options: TOptions): PropertyResult<TId, TSchema, TOptions>
|
|
398
410
|
export function prop(id: string, schema: Schema, options?: PropertyOptions): Property {
|
|
411
|
+
const { markings, ...rest } = options ?? {}
|
|
399
412
|
return {
|
|
400
413
|
id,
|
|
401
414
|
name: options?.name ?? id,
|
|
402
415
|
schema,
|
|
403
|
-
...
|
|
416
|
+
...rest,
|
|
417
|
+
...(markings && markings.length > 0
|
|
418
|
+
? { markings: markingIdsFrom(markings, `Property '${id}' markings`) }
|
|
419
|
+
: {}),
|
|
404
420
|
}
|
|
405
421
|
}
|
|
406
422
|
|