@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
package/src/datasets/builders.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { markingIdsFrom } from "../security/builders"
|
|
2
|
+
import type { MarkingDefinition } from "../security/types"
|
|
1
3
|
import { DatasetValidationError } from "./errors"
|
|
2
4
|
import type {
|
|
3
5
|
DatasetColumnDefinition,
|
|
@@ -10,6 +12,8 @@ import { assertDatasetColumnDefinition, assertDatasetDefinition } from "./valida
|
|
|
10
12
|
|
|
11
13
|
type DatasetColumnOptions = {
|
|
12
14
|
readonly nullable?: boolean
|
|
15
|
+
/** Principals need a clearance for every marking to read this column. */
|
|
16
|
+
readonly markings?: readonly MarkingDefinition[]
|
|
13
17
|
}
|
|
14
18
|
|
|
15
19
|
type DefineDatasetOptions = {
|
|
@@ -112,6 +116,13 @@ type DerivedColumns<
|
|
|
112
116
|
: DerivedBaseColumns<TParent, TOptions>
|
|
113
117
|
: DerivedBaseColumns<TParent, TOptions>
|
|
114
118
|
|
|
119
|
+
/** The column records marking ids; only a declared, non-empty list marks it. */
|
|
120
|
+
type MarkingsFromOptions<TOptions> = TOptions extends {
|
|
121
|
+
readonly markings: readonly [MarkingDefinition, ...MarkingDefinition[]]
|
|
122
|
+
}
|
|
123
|
+
? { readonly markings: readonly string[] }
|
|
124
|
+
: { readonly markings?: readonly string[] }
|
|
125
|
+
|
|
115
126
|
type DatasetColumnResult<
|
|
116
127
|
TName extends string,
|
|
117
128
|
TType extends DatasetColumnType,
|
|
@@ -119,7 +130,8 @@ type DatasetColumnResult<
|
|
|
119
130
|
> = {
|
|
120
131
|
readonly name: TName
|
|
121
132
|
readonly type: TType
|
|
122
|
-
} & FieldFromOptions<TOptions, "nullable", boolean>
|
|
133
|
+
} & FieldFromOptions<TOptions, "nullable", boolean> &
|
|
134
|
+
MarkingsFromOptions<TOptions>
|
|
123
135
|
|
|
124
136
|
type DatasetDefinitionResult<TId extends string, TOptions extends DefineDatasetOptions> = Omit<
|
|
125
137
|
DatasetDefinition<TId, TOptions["schema"]>,
|
|
@@ -165,10 +177,14 @@ export function col(
|
|
|
165
177
|
type: DatasetColumnType,
|
|
166
178
|
options?: DatasetColumnOptions
|
|
167
179
|
): DatasetColumnDefinition {
|
|
180
|
+
const markings = options?.markings
|
|
168
181
|
const column: DatasetColumnDefinition = {
|
|
169
182
|
name,
|
|
170
183
|
type,
|
|
171
184
|
...(options?.nullable !== undefined ? { nullable: options.nullable } : {}),
|
|
185
|
+
...(markings && markings.length > 0
|
|
186
|
+
? { markings: markingIdsFrom(markings, `Dataset column '${name}' markings`) }
|
|
187
|
+
: {}),
|
|
172
188
|
}
|
|
173
189
|
|
|
174
190
|
assertDatasetColumnDefinition(column, (message) => new DatasetValidationError(message))
|
|
@@ -1,11 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
assertAuthorized,
|
|
3
|
+
assertPrivileged,
|
|
4
|
+
assertRuntimeAuthorizationBound,
|
|
5
|
+
isRuntimeAllowed,
|
|
6
|
+
} from "../authorization"
|
|
2
7
|
import type { BlobStorage } from "../blob-storage"
|
|
3
8
|
import type { ExecutionContext } from "../execution"
|
|
4
9
|
import { resolveRuntimeAuthorizationForProject } from "../execution/authorization"
|
|
5
10
|
import type { DatasetMergeCommitResult } from "../lake-storage/merge"
|
|
6
11
|
import { getDatasetPrimaryKeyColumns } from "../lake-storage/merge-validation"
|
|
7
|
-
import type { DatasetRow, LakeStorage } from "../lake-storage/types"
|
|
12
|
+
import type { DatasetRow, DatasetVersion, LakeStorage } from "../lake-storage/types"
|
|
8
13
|
import type { SixbRuntimeContext } from "../runtime/types"
|
|
14
|
+
import { missingClearanceRedactions } from "../security/redactions"
|
|
15
|
+
import type { Redactions } from "../security/types"
|
|
9
16
|
import type { MergeChange } from "./changes"
|
|
10
17
|
import type { DatasetDefinition } from "./types"
|
|
11
18
|
import { writeDataset } from "./write"
|
|
@@ -20,9 +27,36 @@ export interface DatasetIngestInput {
|
|
|
20
27
|
/** Source commit result; downstream pipelines and projections run asynchronously. */
|
|
21
28
|
export type DatasetIngestResult = DatasetMergeCommitResult & { readonly rowsRead: number }
|
|
22
29
|
|
|
30
|
+
export interface DatasetReadRowsInput {
|
|
31
|
+
/** Defaults to the latest version. */
|
|
32
|
+
readonly versionId?: string
|
|
33
|
+
/** Defaults to every column of the version, in schema order. */
|
|
34
|
+
readonly columns?: readonly string[]
|
|
35
|
+
readonly limit?: number
|
|
36
|
+
readonly offset?: number
|
|
37
|
+
readonly signal?: AbortSignal
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface DatasetRows {
|
|
41
|
+
readonly version: DatasetVersion
|
|
42
|
+
/** Columns each row holds. Redacted columns are left out. */
|
|
43
|
+
readonly columns: readonly string[]
|
|
44
|
+
/**
|
|
45
|
+
* Every column of the dataset the reader cannot read, whether or not it was requested. Absent
|
|
46
|
+
* when the reader can read every column.
|
|
47
|
+
*/
|
|
48
|
+
readonly redactions?: Redactions
|
|
49
|
+
readonly rows: AsyncIterable<DatasetRow>
|
|
50
|
+
}
|
|
51
|
+
|
|
23
52
|
export interface DatasetsRuntime {
|
|
24
53
|
list(): readonly DatasetDefinition[]
|
|
25
54
|
getById(datasetId: string): DatasetDefinition | null
|
|
55
|
+
/**
|
|
56
|
+
* Read rows of one version. Returns null when the dataset has no version yet or the requested
|
|
57
|
+
* version does not exist.
|
|
58
|
+
*/
|
|
59
|
+
readRows(dataset: DatasetDefinition, input?: DatasetReadRowsInput): Promise<DatasetRows | null>
|
|
26
60
|
ingest(dataset: DatasetDefinition, input: DatasetIngestInput): Promise<DatasetIngestResult>
|
|
27
61
|
}
|
|
28
62
|
|
|
@@ -47,6 +81,44 @@ export function createDatasetsRuntime(
|
|
|
47
81
|
const dataset = source.getById(datasetId)
|
|
48
82
|
return dataset && allowed(datasetId) ? dataset : null
|
|
49
83
|
},
|
|
84
|
+
async readRows(dataset, input = {}) {
|
|
85
|
+
assertAuthorized(runtime, { kind: "dataset.view", datasetId: dataset.id })
|
|
86
|
+
const registered = source.getById(dataset.id)
|
|
87
|
+
if (!registered) throw new Error(`[Sixb] Dataset '${dataset.id}' is not registered.`)
|
|
88
|
+
const version =
|
|
89
|
+
input.versionId === undefined
|
|
90
|
+
? await lakeStorage.getLatestVersion(registered.id)
|
|
91
|
+
: await lakeStorage.getVersion(registered.id, input.versionId)
|
|
92
|
+
if (!version) return null
|
|
93
|
+
|
|
94
|
+
const redacted = redactedColumns(registered, assertRuntimeAuthorizationBound(runtime))
|
|
95
|
+
const selected = selectColumns(version, input.columns)
|
|
96
|
+
const columns = selected.filter((column) => !redacted.has(column))
|
|
97
|
+
const read = (readColumns: readonly string[] | undefined) =>
|
|
98
|
+
lakeStorage.readRows({
|
|
99
|
+
datasetId: registered.id,
|
|
100
|
+
versionId: version.versionId,
|
|
101
|
+
columns: readColumns,
|
|
102
|
+
limit: input.limit,
|
|
103
|
+
offset: input.offset,
|
|
104
|
+
signal: input.signal,
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
// Redacted columns are not read. A provider reads every column when given none, so a page
|
|
108
|
+
// made only of redacted columns reads one of them to count its rows and returns them empty.
|
|
109
|
+
const rows =
|
|
110
|
+
columns.length === selected.length
|
|
111
|
+
? read(input.columns)
|
|
112
|
+
: columns.length > 0
|
|
113
|
+
? read(columns)
|
|
114
|
+
: emptyRows(read(selected.slice(0, 1)))
|
|
115
|
+
return {
|
|
116
|
+
version,
|
|
117
|
+
columns,
|
|
118
|
+
...(redacted.size > 0 ? { redactions: missingClearanceRedactions(redacted) } : {}),
|
|
119
|
+
rows,
|
|
120
|
+
}
|
|
121
|
+
},
|
|
50
122
|
async ingest(dataset, input) {
|
|
51
123
|
assertPrivileged(runtime, "datasets.ingest")
|
|
52
124
|
const registered = source.getById(dataset.id)
|
|
@@ -93,3 +165,39 @@ export function createDatasetsRuntime(
|
|
|
93
165
|
},
|
|
94
166
|
}
|
|
95
167
|
}
|
|
168
|
+
|
|
169
|
+
/** Requested columns, or every column of the version. Like the lake, an empty list means all. */
|
|
170
|
+
function selectColumns(version: DatasetVersion, requested: readonly string[] | undefined) {
|
|
171
|
+
const available = version.schema.columns.map((column) => column.name)
|
|
172
|
+
if (requested === undefined || requested.length === 0) return available
|
|
173
|
+
for (const column of requested) {
|
|
174
|
+
if (!available.includes(column)) {
|
|
175
|
+
throw new Error(
|
|
176
|
+
`[Sixb] Dataset '${version.datasetId}' does not have column '${column}' at version '${version.versionId}'.`
|
|
177
|
+
)
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return [...requested]
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Columns the reader cannot read. Trusted code reads every column, a principal reads what its roles
|
|
185
|
+
* clear, and any other authority is cleared for nothing.
|
|
186
|
+
*/
|
|
187
|
+
function redactedColumns(
|
|
188
|
+
dataset: DatasetDefinition,
|
|
189
|
+
authority: ReturnType<typeof assertRuntimeAuthorizationBound>
|
|
190
|
+
): ReadonlySet<string> {
|
|
191
|
+
if (authority.type === "unrestricted") return new Set()
|
|
192
|
+
const clearances =
|
|
193
|
+
authority.type === "principal" ? (authority.context.clearances ?? new Set()) : new Set()
|
|
194
|
+
return new Set(
|
|
195
|
+
dataset.schema.columns
|
|
196
|
+
.filter((column) => column.markings?.some((markingId) => !clearances.has(markingId)))
|
|
197
|
+
.map((column) => column.name)
|
|
198
|
+
)
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
async function* emptyRows(rows: AsyncIterable<DatasetRow>): AsyncIterable<DatasetRow> {
|
|
202
|
+
for await (const _row of rows) yield {}
|
|
203
|
+
}
|
package/src/datasets/index.ts
CHANGED
|
@@ -2,7 +2,13 @@ export { col, defineDataset } from "./builders"
|
|
|
2
2
|
export type { MergeChange } from "./changes"
|
|
3
3
|
export { change } from "./changes"
|
|
4
4
|
export { DatasetValidationError } from "./errors"
|
|
5
|
-
export type {
|
|
5
|
+
export type {
|
|
6
|
+
DatasetIngestInput,
|
|
7
|
+
DatasetIngestResult,
|
|
8
|
+
DatasetReadRowsInput,
|
|
9
|
+
DatasetRows,
|
|
10
|
+
DatasetsRuntime,
|
|
11
|
+
} from "./execution"
|
|
6
12
|
export type {
|
|
7
13
|
DatasetColumnDefinition,
|
|
8
14
|
DatasetColumnDefinitionOf,
|
package/src/datasets/types.ts
CHANGED
|
@@ -16,6 +16,8 @@ export interface DatasetColumnDefinition<
|
|
|
16
16
|
readonly name: TName
|
|
17
17
|
readonly type: TType
|
|
18
18
|
readonly nullable?: boolean
|
|
19
|
+
/** Marking ids. Principals need a clearance for each one to read this column. */
|
|
20
|
+
readonly markings?: readonly string[]
|
|
19
21
|
}
|
|
20
22
|
|
|
21
23
|
export interface DatasetSchema<
|
package/src/datasets/write.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { BlobStorage, FileRef } from "../blob-storage"
|
|
2
2
|
import { isFileRef } from "../blob-storage"
|
|
3
|
+
import { isValidFileRef } from "../blob-storage/validation"
|
|
3
4
|
import type { DatasetMergeCommitResult } from "../lake-storage/merge"
|
|
4
5
|
import { getDatasetMergeChangeValidationError } from "../lake-storage/merge-validation"
|
|
5
6
|
import type {
|
|
@@ -37,6 +38,18 @@ export interface WriteDatasetInput<TValue extends DatasetWriteValue = DatasetWri
|
|
|
37
38
|
|
|
38
39
|
export type WriteDatasetResult = DatasetMergeCommitResult & { readonly rowsRead: number }
|
|
39
40
|
|
|
41
|
+
/**
|
|
42
|
+
* The definition the lake receives. Markings are enforced from the registered definition and never
|
|
43
|
+
* stored, so a stored schema cannot keep a classification the code has since changed.
|
|
44
|
+
*/
|
|
45
|
+
export function lakeDatasetDefinition(dataset: DatasetDefinition): DatasetDefinition {
|
|
46
|
+
if (!dataset.schema.columns.some((column) => column.markings)) return dataset
|
|
47
|
+
return {
|
|
48
|
+
...dataset,
|
|
49
|
+
schema: { columns: dataset.schema.columns.map(({ markings: _markings, ...column }) => column) },
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
40
53
|
/**
|
|
41
54
|
* Validate, stage, and commit one dataset write using existing lake sessions.
|
|
42
55
|
*
|
|
@@ -47,7 +60,8 @@ export type WriteDatasetResult = DatasetMergeCommitResult & { readonly rowsRead:
|
|
|
47
60
|
export async function writeDataset<TValue extends DatasetWriteValue>(
|
|
48
61
|
input: WriteDatasetInput<TValue>
|
|
49
62
|
): Promise<WriteDatasetResult> {
|
|
50
|
-
const { lakeStorage,
|
|
63
|
+
const { lakeStorage, signal } = input
|
|
64
|
+
const dataset = lakeDatasetDefinition(input.dataset)
|
|
51
65
|
let abortWrite: (() => Promise<void>) | undefined
|
|
52
66
|
let rowsRead = 0
|
|
53
67
|
const onRead = () => {
|
|
@@ -207,8 +221,13 @@ async function verifyFileRef(
|
|
|
207
221
|
columnName: string,
|
|
208
222
|
itemIndex: number
|
|
209
223
|
): Promise<void> {
|
|
210
|
-
const blobInfo = await input.blobStorage.stat(fileRef.blobId)
|
|
211
224
|
const context = `${sourceLabel(input)} returned row ${itemIndex} with dataset '${input.dataset.id}' column '${columnName}'`
|
|
225
|
+
if (!isValidFileRef(fileRef)) {
|
|
226
|
+
throw new Error(
|
|
227
|
+
`${context} with an invalid mediaType; use one media type, such as "application/pdf".`
|
|
228
|
+
)
|
|
229
|
+
}
|
|
230
|
+
const blobInfo = await input.blobStorage.stat(fileRef.blobId)
|
|
212
231
|
if (!blobInfo) {
|
|
213
232
|
throw new Error(`${context} referencing unknown blob '${fileRef.blobId}'.`)
|
|
214
233
|
}
|
package/src/edits/properties.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { OntologyValidationError } from "../ontology/errors"
|
|
|
3
3
|
import type { ObjectTypeWithPropertyTokens } from "../ontology/tokens"
|
|
4
4
|
import {
|
|
5
5
|
assertKnownProperties,
|
|
6
|
+
assertValidFileRefs,
|
|
6
7
|
normalizeObjectProperties,
|
|
7
8
|
validateObjectProperties,
|
|
8
9
|
validatePropertyValue,
|
|
@@ -20,6 +21,7 @@ export function normalizeObjectEditProperties(params: {
|
|
|
20
21
|
assertKnownProperties(objectType, properties)
|
|
21
22
|
assertNoTelemetryProperties(objectType.properties, properties, path)
|
|
22
23
|
validateObjectProperties(objectType, properties, valueTypesById)
|
|
24
|
+
assertValidFileRefs(properties, objectType.id)
|
|
23
25
|
return normalizeObjectProperties(objectType.properties, properties, valueTypesById, path)
|
|
24
26
|
}
|
|
25
27
|
|
|
@@ -60,6 +62,7 @@ export function normalizeLinkEditProperties(params: {
|
|
|
60
62
|
valueTypesById
|
|
61
63
|
)
|
|
62
64
|
}
|
|
65
|
+
assertValidFileRefs(properties, `${sourceObjectTypeId}.${linkId}`)
|
|
63
66
|
|
|
64
67
|
return normalizeObjectProperties(
|
|
65
68
|
linkProperties,
|
package/src/events/execution.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { assertPrivileged, canViewEvent } from "../authorization"
|
|
2
2
|
import { resolveRuntimeAuthorizationForProject } from "../execution/authorization"
|
|
3
|
+
import { redactDomainEvent, resolvePropertyClearance } from "../objects/property-clearance"
|
|
3
4
|
import type { SixbRuntimeContext } from "../runtime/types"
|
|
4
5
|
import type {
|
|
5
6
|
EventsAppendInput,
|
|
@@ -10,7 +11,8 @@ import type {
|
|
|
10
11
|
import type { StoredDomainEvent } from "./types"
|
|
11
12
|
|
|
12
13
|
export interface EventsRuntime {
|
|
13
|
-
|
|
14
|
+
/** The event as this execution may read it: hidden events are `undefined`, others redacted. */
|
|
15
|
+
readable(event: StoredDomainEvent): StoredDomainEvent | undefined
|
|
14
16
|
append(input: EventsAppendInput): Promise<readonly StoredDomainEvent[]>
|
|
15
17
|
emit(input: EventsAppendInput, options: EventsEmitOptions): Promise<void>
|
|
16
18
|
read(input?: EventsReadInput): Promise<readonly StoredDomainEvent[]>
|
|
@@ -23,30 +25,27 @@ export interface EventsRuntime {
|
|
|
23
25
|
|
|
24
26
|
export function createEventsRuntime(runtime: SixbRuntimeContext): EventsRuntime {
|
|
25
27
|
const authority = resolveRuntimeAuthorizationForProject(runtime)
|
|
26
|
-
const
|
|
28
|
+
const clearance =
|
|
29
|
+
authority.type === "principal"
|
|
30
|
+
? resolvePropertyClearance(runtime.ontology, authority.context.clearances ?? new Set())
|
|
31
|
+
: undefined
|
|
32
|
+
const readable = (event: StoredDomainEvent): StoredDomainEvent | undefined => {
|
|
27
33
|
switch (authority.type) {
|
|
28
34
|
case "denied":
|
|
29
35
|
case "delegated":
|
|
30
|
-
return
|
|
36
|
+
return undefined
|
|
31
37
|
case "principal":
|
|
32
|
-
|
|
38
|
+
if (!canViewEvent(authority.context, event)) return undefined
|
|
39
|
+
return clearance ? redactDomainEvent(event, clearance) : event
|
|
33
40
|
case "unrestricted":
|
|
34
|
-
return
|
|
41
|
+
return event
|
|
35
42
|
}
|
|
36
43
|
}
|
|
44
|
+
const visibleEvents = (events: readonly StoredDomainEvent[]): readonly StoredDomainEvent[] =>
|
|
45
|
+
events.flatMap((event) => readable(event) ?? [])
|
|
37
46
|
|
|
38
47
|
return {
|
|
39
|
-
|
|
40
|
-
switch (authority.type) {
|
|
41
|
-
case "denied":
|
|
42
|
-
case "delegated":
|
|
43
|
-
return false
|
|
44
|
-
case "principal":
|
|
45
|
-
return canViewEvent(authority.context, event)
|
|
46
|
-
case "unrestricted":
|
|
47
|
-
return true
|
|
48
|
-
}
|
|
49
|
-
},
|
|
48
|
+
readable,
|
|
50
49
|
append: (input) => {
|
|
51
50
|
assertPrivileged(runtime, "events.append")
|
|
52
51
|
return runtime.events.append(input)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Redactions } from "../../security/types"
|
|
1
2
|
import type { EventEnvelope } from "../envelope"
|
|
2
3
|
import type { PropertyChangeMap } from "../property-changes"
|
|
3
4
|
|
|
@@ -6,12 +7,16 @@ export interface ObjectMutationEventPayload<TValue = unknown> {
|
|
|
6
7
|
primaryId: string
|
|
7
8
|
properties: Record<string, TValue>
|
|
8
9
|
propertyChanges: PropertyChangeMap<TValue>
|
|
10
|
+
/** Properties omitted for this reader, which lacks their clearance. Never stored. */
|
|
11
|
+
redactions?: Redactions
|
|
9
12
|
}
|
|
10
13
|
|
|
11
14
|
export interface ObjectDeletedEventPayload<TValue = unknown> {
|
|
12
15
|
objectTypeId: string
|
|
13
16
|
primaryId: string
|
|
14
17
|
propertyChanges: PropertyChangeMap<TValue>
|
|
18
|
+
/** Properties omitted for this reader, which lacks their clearance. Never stored. */
|
|
19
|
+
redactions?: Redactions
|
|
15
20
|
}
|
|
16
21
|
|
|
17
22
|
export interface ObjectCreatedEvent extends EventEnvelope {
|
package/src/execution/agent.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { type AgentExecutionAuthorization, agentServiceAccountId } from "../agents/authority"
|
|
2
|
+
import { bindModelExecutionAttempt } from "../models/execution/binding"
|
|
3
|
+
import type { AiModelCallRecorder } from "../models/execution/model-call-recorder"
|
|
2
4
|
import { isBoundSixb, type Sixb } from "../runtime/sixb"
|
|
3
5
|
import type { ExecutionRecord } from "../storage/executions"
|
|
4
6
|
import { ExecutionStorageError } from "../storage/executions"
|
|
@@ -107,6 +109,31 @@ export function bindDurableAgentExecution(
|
|
|
107
109
|
return sixb
|
|
108
110
|
}
|
|
109
111
|
|
|
112
|
+
/**
|
|
113
|
+
* Account model calls made through a run's bound SDK — by its tools, or embeddings behind their
|
|
114
|
+
* searches — like the run's own: same execution attempt, limits, failure state and cancellation.
|
|
115
|
+
* The attempt is the recorder's, so the two cannot diverge.
|
|
116
|
+
*/
|
|
117
|
+
export function bindAgentModelExecution(
|
|
118
|
+
sixb: Sixb,
|
|
119
|
+
input: {
|
|
120
|
+
readonly signal: AbortSignal
|
|
121
|
+
readonly accounting: AiModelCallRecorder
|
|
122
|
+
}
|
|
123
|
+
): void {
|
|
124
|
+
const { accounting } = input
|
|
125
|
+
if (accounting.executionId !== sixb.execution.id) {
|
|
126
|
+
throw new Error(
|
|
127
|
+
`[Sixb] Agent execution '${sixb.execution.id}' cannot account its model calls to execution '${accounting.executionId}'.`
|
|
128
|
+
)
|
|
129
|
+
}
|
|
130
|
+
bindModelExecutionAttempt(sixb.models, {
|
|
131
|
+
attempt: accounting.attempt,
|
|
132
|
+
signal: input.signal,
|
|
133
|
+
accounting,
|
|
134
|
+
})
|
|
135
|
+
}
|
|
136
|
+
|
|
110
137
|
/** Restore one provider-validated Agent execution with its currently resolved grants. */
|
|
111
138
|
export function restoreAgentExecutionScope(input: {
|
|
112
139
|
readonly execution: ExecutionRecord
|
|
@@ -8,6 +8,12 @@ import {
|
|
|
8
8
|
type AuthorizedOntologyView,
|
|
9
9
|
createAuthorizedOntologyView,
|
|
10
10
|
} from "../objects/authorized-ontology-view"
|
|
11
|
+
import {
|
|
12
|
+
createClearanceQueryAdmission,
|
|
13
|
+
type PropertyClearance,
|
|
14
|
+
redactObjectRow,
|
|
15
|
+
resolvePropertyClearance,
|
|
16
|
+
} from "../objects/property-clearance"
|
|
11
17
|
import {
|
|
12
18
|
countObjects,
|
|
13
19
|
type ExecuteObjectCountInput,
|
|
@@ -35,6 +41,8 @@ import {
|
|
|
35
41
|
} from "../objects/query/selected-read-admission"
|
|
36
42
|
import {
|
|
37
43
|
type AdmittedObjectQuery,
|
|
44
|
+
composeObjectQueryAdmissions,
|
|
45
|
+
type ObjectQuerySemanticAdmission,
|
|
38
46
|
validateObjectQuery,
|
|
39
47
|
validateObjectQueryWithAdmission,
|
|
40
48
|
} from "../objects/query/validate"
|
|
@@ -50,6 +58,7 @@ import type {
|
|
|
50
58
|
ObjectFacetRequest,
|
|
51
59
|
ObjectLinkRow,
|
|
52
60
|
ObjectReadStorage,
|
|
61
|
+
ObjectRow,
|
|
53
62
|
ObjectStorage,
|
|
54
63
|
} from "../storage"
|
|
55
64
|
import { assertObjectReadOutputWithinLimit, MAX_OBJECT_READ_FACETS } from "../storage"
|
|
@@ -93,6 +102,8 @@ class AuthorizedObjectReaderImpl {
|
|
|
93
102
|
readonly #delegatedObjectTypeIds?: ReadonlySet<string>
|
|
94
103
|
readonly #delegatedLinkDefinitions?: ReadonlySet<string>
|
|
95
104
|
readonly #delegatedQueryAdmission?: SelectedObjectQueryAdmission
|
|
105
|
+
/** Marked properties this authority cannot read; absent when it reads every property. */
|
|
106
|
+
readonly #clearance?: PropertyClearance
|
|
96
107
|
|
|
97
108
|
constructor(
|
|
98
109
|
key: typeof readerConstructionKey,
|
|
@@ -127,6 +138,7 @@ class AuthorizedObjectReaderImpl {
|
|
|
127
138
|
input.authority.type === "delegated"
|
|
128
139
|
? createSelectedObjectQueryAdmission(input.authority.objectRead.scope)
|
|
129
140
|
: undefined
|
|
141
|
+
this.#clearance = clearanceForAuthority(input.authority, input.ontology)
|
|
130
142
|
this.#runtime = Object.freeze({
|
|
131
143
|
projectId: input.scope.execution.projectId,
|
|
132
144
|
runtimeAuthorization: input.scope.authorization,
|
|
@@ -170,12 +182,11 @@ class AuthorizedObjectReaderImpl {
|
|
|
170
182
|
primaryId: input.primaryId,
|
|
171
183
|
})
|
|
172
184
|
this.#assertObjectTypesViewable([request.objectTypeId])
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
)
|
|
185
|
+
const row = await this.#storage.getByPrimaryId({
|
|
186
|
+
...request,
|
|
187
|
+
projectId: this.#runtime.projectId,
|
|
188
|
+
})
|
|
189
|
+
return detachReadResult(row && this.#redact(row))
|
|
179
190
|
}
|
|
180
191
|
|
|
181
192
|
async getByPrimaryIdBatch(
|
|
@@ -188,11 +199,12 @@ class AuthorizedObjectReaderImpl {
|
|
|
188
199
|
})),
|
|
189
200
|
})
|
|
190
201
|
this.#assertObjectTypesViewable(request.items.map((item) => item.objectTypeId))
|
|
202
|
+
const rows = await this.#storage.getByPrimaryIdBatch({
|
|
203
|
+
...request,
|
|
204
|
+
projectId: this.#runtime.projectId,
|
|
205
|
+
})
|
|
191
206
|
return detachReadResult(
|
|
192
|
-
|
|
193
|
-
...request,
|
|
194
|
-
projectId: this.#runtime.projectId,
|
|
195
|
-
})
|
|
207
|
+
new Map([...rows].map(([key, row]) => [key, this.#redact(row)] as const))
|
|
196
208
|
)
|
|
197
209
|
}
|
|
198
210
|
|
|
@@ -203,6 +215,7 @@ class AuthorizedObjectReaderImpl {
|
|
|
203
215
|
propertyId: input.propertyId,
|
|
204
216
|
})
|
|
205
217
|
this.#assertObjectTypesViewable([request.objectTypeId])
|
|
218
|
+
if (this.#hidesProperty(request)) return false
|
|
206
219
|
if (this.#authority.type !== "delegated") return true
|
|
207
220
|
const [readable] = await this.#storage.selectsObjectProperties({
|
|
208
221
|
projectId: this.#runtime.projectId,
|
|
@@ -222,12 +235,15 @@ class AuthorizedObjectReaderImpl {
|
|
|
222
235
|
})),
|
|
223
236
|
})
|
|
224
237
|
this.#assertObjectTypesViewable(request.items.map((item) => item.objectTypeId))
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
238
|
+
const selected =
|
|
239
|
+
this.#authority.type === "delegated"
|
|
240
|
+
? await this.#storage.selectsObjectProperties({
|
|
241
|
+
...request,
|
|
242
|
+
projectId: this.#runtime.projectId,
|
|
243
|
+
})
|
|
244
|
+
: request.items.map(() => true)
|
|
245
|
+
return request.items.map(
|
|
246
|
+
(item, index) => !this.#hidesProperty(item) && selected[index] === true
|
|
231
247
|
)
|
|
232
248
|
}
|
|
233
249
|
|
|
@@ -258,13 +274,12 @@ class AuthorizedObjectReaderImpl {
|
|
|
258
274
|
return { objects: [], hasMore: false, total: 0 }
|
|
259
275
|
}
|
|
260
276
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
)
|
|
277
|
+
const page = await this.#storage.list({
|
|
278
|
+
...request,
|
|
279
|
+
...(objectTypeId === undefined ? {} : { objectTypeId }),
|
|
280
|
+
projectId: this.#runtime.projectId,
|
|
281
|
+
})
|
|
282
|
+
return detachReadResult({ ...page, objects: page.objects.map((row) => this.#redact(row)) })
|
|
268
283
|
}
|
|
269
284
|
|
|
270
285
|
async listLinks(input: ListLinksInput): ReturnType<ObjectReadStorage["listLinks"]> {
|
|
@@ -318,17 +333,16 @@ class AuthorizedObjectReaderImpl {
|
|
|
318
333
|
const query = snapshotAuthoredQuery(input.query)
|
|
319
334
|
const includeTotal = snapshotReadValue(input.includeTotal)
|
|
320
335
|
const executionQuery = this.#admitDelegatedQuery(query)?.query ?? query
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
this.#queryExecutorOptions()
|
|
330
|
-
)
|
|
336
|
+
const result = await executeObjectQuery(
|
|
337
|
+
{
|
|
338
|
+
query: executionQuery,
|
|
339
|
+
...(includeTotal === undefined ? {} : { includeTotal }),
|
|
340
|
+
projectId: this.#runtime.projectId,
|
|
341
|
+
signal: input.signal,
|
|
342
|
+
},
|
|
343
|
+
this.#queryExecutorOptions()
|
|
331
344
|
)
|
|
345
|
+
return detachReadResult({ ...result, objects: result.objects.map((row) => this.#redact(row)) })
|
|
332
346
|
}
|
|
333
347
|
|
|
334
348
|
async queryLinks(
|
|
@@ -378,7 +392,7 @@ class AuthorizedObjectReaderImpl {
|
|
|
378
392
|
) {
|
|
379
393
|
throw new Error("[Sixb] Object storage returned a link page outside its authorized scope.")
|
|
380
394
|
}
|
|
381
|
-
return result
|
|
395
|
+
return { ...result, objects: result.objects.map((row) => this.#redact(row)) }
|
|
382
396
|
}
|
|
383
397
|
|
|
384
398
|
async count(
|
|
@@ -450,6 +464,14 @@ class AuthorizedObjectReaderImpl {
|
|
|
450
464
|
)
|
|
451
465
|
}
|
|
452
466
|
|
|
467
|
+
/**
|
|
468
|
+
* Redact a row returned by a write. An upsert returns the merged effective row, which may hold
|
|
469
|
+
* marked values the writer never sent and cannot read.
|
|
470
|
+
*/
|
|
471
|
+
redactWrittenRow<TRow extends ObjectRow>(row: TRow): TRow {
|
|
472
|
+
return this.#redact(row)
|
|
473
|
+
}
|
|
474
|
+
|
|
453
475
|
/** Enforce the delegated response budget without exposing or recombining its limits. */
|
|
454
476
|
assertVisibleOutputWithinLimit(value: unknown): void {
|
|
455
477
|
if (this.#authority.type !== "delegated") return
|
|
@@ -464,6 +486,7 @@ class AuthorizedObjectReaderImpl {
|
|
|
464
486
|
}
|
|
465
487
|
|
|
466
488
|
#queryExecutorOptions() {
|
|
489
|
+
const admission = this.#executorAdmission()
|
|
467
490
|
if (this.#authority.type === "delegated") {
|
|
468
491
|
// The selected storage instance is the private execution capability. Passing the delegated
|
|
469
492
|
// runtime token into the generic executor would either reject this admitted query or tempt a
|
|
@@ -473,6 +496,7 @@ class AuthorizedObjectReaderImpl {
|
|
|
473
496
|
storage: this.#storage,
|
|
474
497
|
embeddingModels: this.#embeddingModels,
|
|
475
498
|
rerankingModels: this.#rerankingModels,
|
|
499
|
+
...(admission === undefined ? {} : { admission }),
|
|
476
500
|
}
|
|
477
501
|
}
|
|
478
502
|
return {
|
|
@@ -484,9 +508,29 @@ class AuthorizedObjectReaderImpl {
|
|
|
484
508
|
...(this.#runtime.authorization === undefined
|
|
485
509
|
? {}
|
|
486
510
|
: { authorization: this.#runtime.authorization }),
|
|
511
|
+
...(admission === undefined ? {} : { admission }),
|
|
487
512
|
}
|
|
488
513
|
}
|
|
489
514
|
|
|
515
|
+
/**
|
|
516
|
+
* The executor validates the query it runs, and that validation resolves default text fields.
|
|
517
|
+
* Every admission that narrows those fields must therefore apply there, not only beforehand.
|
|
518
|
+
*/
|
|
519
|
+
#executorAdmission(): ObjectQuerySemanticAdmission | undefined {
|
|
520
|
+
const clearance = this.#clearance && createClearanceQueryAdmission(this.#clearance)
|
|
521
|
+
const selected = this.#delegatedQueryAdmission
|
|
522
|
+
if (selected && clearance) return composeObjectQueryAdmissions(selected, clearance)
|
|
523
|
+
return selected ?? clearance
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
#redact<TRow extends ObjectRow>(row: TRow): TRow {
|
|
527
|
+
return this.#clearance ? redactObjectRow(row, this.#clearance) : row
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
#hidesProperty(item: { readonly objectTypeId: string; readonly propertyId: string }): boolean {
|
|
531
|
+
return this.#clearance?.hiddenPropertyIds(item.objectTypeId).has(item.propertyId) ?? false
|
|
532
|
+
}
|
|
533
|
+
|
|
490
534
|
#admitDelegatedQuery(query: ObjectQuery): AdmittedObjectQuery | undefined {
|
|
491
535
|
if (!this.#delegatedQueryAdmission) return undefined
|
|
492
536
|
return validateObjectQueryWithAdmission(
|
|
@@ -595,6 +639,24 @@ export function getAuthorizedOntologyView(reader: AuthorizedObjectReader): Autho
|
|
|
595
639
|
return AuthorizedObjectReaderImpl.ontologyView(reader)
|
|
596
640
|
}
|
|
597
641
|
|
|
642
|
+
/**
|
|
643
|
+
* Unrestricted authority reads every property. A principal reads what its roles clear; delegated
|
|
644
|
+
* shared access carries no clearance, so no share can expose a marked property.
|
|
645
|
+
*/
|
|
646
|
+
function clearanceForAuthority(
|
|
647
|
+
authority: ResolvedExecutionAuthority,
|
|
648
|
+
ontology: OntologyRegistry
|
|
649
|
+
): PropertyClearance | undefined {
|
|
650
|
+
switch (authority.type) {
|
|
651
|
+
case "unrestricted":
|
|
652
|
+
return undefined
|
|
653
|
+
case "principal":
|
|
654
|
+
return resolvePropertyClearance(ontology, authority.context.clearances ?? new Set())
|
|
655
|
+
case "delegated":
|
|
656
|
+
return resolvePropertyClearance(ontology, new Set())
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
|
|
598
660
|
function objectStorageForAuthority(
|
|
599
661
|
authority: ResolvedExecutionAuthority,
|
|
600
662
|
objectStorage: ObjectStorage
|