@sixb/core 0.1.17 → 0.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -6
- package/dist/actions/commit-edits.d.ts +7 -19
- package/dist/actions/commit-edits.d.ts.map +1 -1
- package/dist/actions/errors.d.ts +0 -3
- package/dist/actions/errors.d.ts.map +1 -1
- package/dist/actions/execution.d.ts +10 -3
- package/dist/actions/execution.d.ts.map +1 -1
- package/dist/actions/index.d.ts +6 -9
- package/dist/actions/index.d.ts.map +1 -1
- package/dist/actions/index.js +56 -52
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/read-facade.d.ts +1 -1
- package/dist/actions/request.d.ts +14 -25
- package/dist/actions/request.d.ts.map +1 -1
- package/dist/actions/run/context.d.ts +40 -0
- package/dist/actions/run/context.d.ts.map +1 -0
- package/dist/actions/run/edits-commit.d.ts +31 -0
- package/dist/actions/run/edits-commit.d.ts.map +1 -0
- package/dist/actions/run/effects.d.ts +23 -0
- package/dist/actions/run/effects.d.ts.map +1 -0
- package/dist/actions/run/execute.d.ts +30 -0
- package/dist/actions/run/execute.d.ts.map +1 -0
- package/dist/actions/run/executor.d.ts +95 -0
- package/dist/actions/run/executor.d.ts.map +1 -0
- package/dist/actions/run/normalize.d.ts +36 -0
- package/dist/actions/run/normalize.d.ts.map +1 -0
- package/dist/actions/run/phase-types.d.ts +18 -0
- package/dist/actions/run/phase-types.d.ts.map +1 -0
- package/dist/actions/run/phases.d.ts +20 -0
- package/dist/actions/run/phases.d.ts.map +1 -0
- package/dist/actions/run/run-action.d.ts +25 -0
- package/dist/actions/run/run-action.d.ts.map +1 -0
- package/dist/actions/run/signals.d.ts +67 -0
- package/dist/actions/run/signals.d.ts.map +1 -0
- package/dist/actions/run/state.d.ts +47 -0
- package/dist/actions/run/state.d.ts.map +1 -0
- package/dist/actions/run/types.d.ts +54 -0
- package/dist/actions/run/types.d.ts.map +1 -0
- package/dist/actions/run/writeback.d.ts +17 -0
- package/dist/actions/run/writeback.d.ts.map +1 -0
- package/dist/actions/run-authorization.d.ts +1 -1
- package/dist/actions/run-authorization.d.ts.map +1 -1
- package/dist/actions/run-persistence.d.ts +53 -0
- package/dist/actions/run-persistence.d.ts.map +1 -0
- package/dist/actions/types/context.d.ts +10 -0
- package/dist/actions/types/context.d.ts.map +1 -1
- package/dist/actions/validation.d.ts.map +1 -1
- 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 +63 -59
- 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 +2 -2
- package/dist/agents/streams/internal.js +2 -2
- package/dist/agents/types.d.ts +33 -4
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/auth/index.js +12 -9
- 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/event-visibility.d.ts.map +1 -1
- package/dist/authorization/index.js +6 -4
- 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 +285 -77
- package/dist/bootstrap/index.js.map +4 -3
- package/dist/bootstrap/ontology-type-manifest.d.ts.map +1 -1
- package/dist/{chunk-t9shqx3w.js → chunk-1f7wpmyp.js} +143 -7
- package/dist/chunk-1f7wpmyp.js.map +14 -0
- package/dist/{chunk-jjrn5v0p.js → chunk-1k89ecfr.js} +1 -1
- package/dist/{chunk-9vx5e9g1.js → chunk-1sr8ryzk.js} +3 -3
- package/dist/chunk-1sr8ryzk.js.map +11 -0
- 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-svabwqdq.js → chunk-3gnrh4ve.js} +44 -420
- package/dist/{chunk-svabwqdq.js.map → chunk-3gnrh4ve.js.map} +9 -13
- 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-pja9jfz6.js → chunk-4tcx876c.js} +126 -64
- package/dist/chunk-4tcx876c.js.map +19 -0
- package/dist/{chunk-vre348sb.js → chunk-52bk93x8.js} +2 -2
- package/dist/{chunk-4gmng3vf.js → chunk-5e43w60z.js} +2 -2
- package/dist/{chunk-91kcnbf0.js → chunk-6gmfggss.js} +22 -9
- package/dist/chunk-6gmfggss.js.map +10 -0
- package/dist/{chunk-33saed7g.js → chunk-7kg3k1m9.js} +1 -1
- package/dist/{chunk-7ecp4v7a.js → chunk-7mbzgd9m.js} +10 -4
- package/dist/{chunk-7ecp4v7a.js.map → chunk-7mbzgd9m.js.map} +3 -3
- package/dist/{chunk-b9affek3.js → chunk-7n440zgt.js} +30 -30
- package/dist/{chunk-b9affek3.js.map → chunk-7n440zgt.js.map} +4 -4
- package/dist/{chunk-kkqwzy6h.js → chunk-7t429e3f.js} +1 -1
- package/dist/{chunk-xcy5ddha.js → chunk-80mc0971.js} +356 -301
- package/dist/chunk-80mc0971.js.map +15 -0
- package/dist/{chunk-gf7yht60.js → chunk-85yvv5n0.js} +27 -10
- package/dist/chunk-85yvv5n0.js.map +12 -0
- package/dist/{chunk-6fsr7y93.js → chunk-8mx7qw3y.js} +14 -13
- package/dist/{chunk-6fsr7y93.js.map → chunk-8mx7qw3y.js.map} +4 -4
- package/dist/{chunk-kpx7jrmn.js → chunk-91mg3nj9.js} +59 -59
- package/dist/{chunk-kpx7jrmn.js.map → chunk-91mg3nj9.js.map} +5 -5
- package/dist/{chunk-2am3db31.js → chunk-9gyp8hg1.js} +2 -2
- package/dist/{chunk-ewqa58h9.js → chunk-9k93ah50.js} +4 -4
- package/dist/{chunk-ewqa58h9.js.map → chunk-9k93ah50.js.map} +1 -1
- package/dist/{chunk-4wn7bxxa.js → chunk-9ybhtmg4.js} +1 -1
- package/dist/{chunk-fc5zfxy1.js → chunk-a40ad1ft.js} +5 -13
- package/dist/chunk-a40ad1ft.js.map +10 -0
- package/dist/{chunk-dam456ve.js → chunk-aff7cyea.js} +431 -70
- package/dist/{chunk-dam456ve.js.map → chunk-aff7cyea.js.map} +10 -7
- package/dist/{chunk-y2aq6ag9.js → chunk-b38szspf.js} +5 -14
- package/dist/chunk-b38szspf.js.map +11 -0
- package/dist/{chunk-r2y23egw.js → chunk-bkpke1sg.js} +1 -10
- package/dist/chunk-bkpke1sg.js.map +10 -0
- package/dist/{chunk-xyvy73tj.js → chunk-bpgy64fw.js} +8 -3
- package/dist/chunk-bpgy64fw.js.map +12 -0
- package/dist/{chunk-rb143ggb.js → chunk-bwjcehza.js} +1 -1
- package/dist/{chunk-5thzcb8g.js → chunk-c85m1hyj.js} +2 -2
- package/dist/{chunk-e67ynxcr.js → chunk-d2ync1v3.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-ey3pyej1.js +8807 -0
- package/dist/chunk-ey3pyej1.js.map +106 -0
- package/dist/{chunk-vjcd8d27.js → chunk-fa02jy15.js} +1 -1
- 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-rpxz486p.js → chunk-hvsb78a1.js} +24 -8
- package/dist/{chunk-rpxz486p.js.map → chunk-hvsb78a1.js.map} +3 -3
- package/dist/{chunk-5yd8cchh.js → chunk-j2bp5ryw.js} +55 -246
- package/dist/{chunk-5yd8cchh.js.map → chunk-j2bp5ryw.js.map} +4 -4
- package/dist/{chunk-h3v76ams.js → chunk-jhm3zsa7.js} +25 -2
- package/dist/chunk-jhm3zsa7.js.map +12 -0
- package/dist/{chunk-w9yycd3t.js → chunk-kg5j6fct.js} +4 -8
- package/dist/{chunk-w9yycd3t.js.map → chunk-kg5j6fct.js.map} +3 -3
- package/dist/{chunk-vp3z1ckh.js → chunk-kyzq4wy9.js} +7 -7
- package/dist/{chunk-wr8qp979.js → chunk-m427qgq0.js} +9 -5
- package/dist/{chunk-wr8qp979.js.map → chunk-m427qgq0.js.map} +4 -3
- package/dist/{chunk-c2rga5cx.js → chunk-mfs23znk.js} +1 -1
- package/dist/{chunk-e1c18xjx.js → chunk-nq6gpjt7.js} +4 -45
- package/dist/{chunk-e1c18xjx.js.map → chunk-nq6gpjt7.js.map} +5 -5
- package/dist/{chunk-a7er86jd.js → chunk-nre82s12.js} +1 -1
- package/dist/{chunk-1hqwggsn.js → chunk-nzapm6p0.js} +1 -2
- package/dist/chunk-nzapm6p0.js.map +12 -0
- package/dist/{chunk-wt4szfec.js → chunk-pbcbn83d.js} +4 -4
- package/dist/{chunk-wt4szfec.js.map → chunk-pbcbn83d.js.map} +1 -1
- 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-f1xh7a32.js → chunk-q1vkr2ys.js} +4 -4
- package/dist/chunk-rdghfsss.js.map +2 -2
- package/dist/{chunk-23xs4qp9.js → chunk-rhg02hxq.js} +4 -4
- package/dist/{chunk-cd234ba4.js → chunk-rz53yb4v.js} +10 -5
- package/dist/chunk-rz53yb4v.js.map +14 -0
- package/dist/{chunk-aq39q04r.js → chunk-s16apyk9.js} +104 -18
- package/dist/chunk-s16apyk9.js.map +16 -0
- package/dist/{chunk-69266efg.js → chunk-s54c868q.js} +12 -4
- package/dist/chunk-s54c868q.js.map +12 -0
- package/dist/{chunk-k4g51s47.js → chunk-t6vq7bff.js} +5 -5
- package/dist/{chunk-sk0hcjsz.js → chunk-tjb1mk5t.js} +3 -3
- package/dist/{chunk-cnb5kv05.js → chunk-tpn40322.js} +23 -8
- package/dist/chunk-tpn40322.js.map +19 -0
- package/dist/{chunk-rx7h5fdx.js → chunk-v9xd5wzd.js} +1 -1
- package/dist/{chunk-2vhg6ysa.js → chunk-vyf9kfqf.js} +1 -1
- package/dist/chunk-wwdfe68s.js +128 -0
- package/dist/chunk-wwdfe68s.js.map +11 -0
- package/dist/{chunk-jnfxmr3f.js → chunk-wz0xs816.js} +6 -6
- package/dist/{chunk-jnfxmr3f.js.map → chunk-wz0xs816.js.map} +1 -1
- package/dist/chunk-xt1zt7gv.js +471 -0
- package/dist/chunk-xt1zt7gv.js.map +13 -0
- package/dist/chunk-y0c4e6ex.js +16 -0
- package/dist/chunk-y0c4e6ex.js.map +10 -0
- package/dist/{chunk-5be2ath4.js → chunk-y7rqfrgg.js} +20 -138
- package/dist/{chunk-5be2ath4.js.map → chunk-y7rqfrgg.js.map} +8 -9
- package/dist/{chunk-z5rnrmz1.js → chunk-yw9pyg66.js} +5 -3
- package/dist/chunk-yw9pyg66.js.map +11 -0
- package/dist/{chunk-dfm066qg.js → chunk-yxd3nnqt.js} +2 -29
- package/dist/chunk-yxd3nnqt.js.map +11 -0
- package/dist/{chunk-70jmg2zx.js → chunk-yzwja0mj.js} +4 -19
- package/dist/{chunk-70jmg2zx.js.map → chunk-yzwja0mj.js.map} +3 -3
- package/dist/{chunk-fggq3d9k.js → chunk-zrmy8zvw.js} +66 -47
- package/dist/{chunk-fggq3d9k.js.map → chunk-zrmy8zvw.js.map} +4 -4
- 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/deploy/index.d.ts +1 -1
- package/dist/deploy/index.d.ts.map +1 -1
- package/dist/deploy/internal.js +10 -8
- package/dist/deploy/internal.js.map +4 -4
- package/dist/deploy/services.d.ts +1 -2
- package/dist/deploy/services.d.ts.map +1 -1
- package/dist/deploy/types.d.ts +6 -5
- package/dist/deploy/types.d.ts.map +1 -1
- package/dist/deploy/validation.d.ts.map +1 -1
- package/dist/edits/index.js +3 -5
- package/dist/edits/index.js.map +1 -1
- package/dist/edits/properties.d.ts.map +1 -1
- package/dist/error-reporting/internal.js +3 -3
- package/dist/error-reporting/types.d.ts +2 -9
- package/dist/error-reporting/types.d.ts.map +1 -1
- package/dist/errors/catalog.d.ts +12 -0
- package/dist/errors/catalog.d.ts.map +1 -1
- package/dist/errors/internal.js +1 -1
- package/dist/events/definitions.d.ts +0 -5
- package/dist/events/definitions.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/index.d.ts +3 -3
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +6 -8
- package/dist/events/index.js.map +1 -1
- package/dist/events/scope.d.ts +0 -1
- package/dist/events/scope.d.ts.map +1 -1
- package/dist/events/scope.js +1 -1
- package/dist/events/selectors/builder.d.ts +1 -8
- package/dist/events/selectors/builder.d.ts.map +1 -1
- package/dist/events/selectors/index.d.ts +2 -2
- package/dist/events/selectors/index.d.ts.map +1 -1
- package/dist/events/selectors/index.js +2 -2
- package/dist/events/selectors/predicate.d.ts.map +1 -1
- package/dist/events/selectors/types.d.ts +2 -33
- package/dist/events/selectors/types.d.ts.map +1 -1
- package/dist/events/types/index.d.ts +1 -12
- package/dist/events/types/index.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 +50 -48
- 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 +60 -88
- package/dist/execution/primitive.js.map +3 -4
- package/dist/execution/request.js +46 -46
- package/dist/execution/request.js.map +1 -1
- package/dist/http/api-routes.d.ts.map +1 -1
- package/dist/http/index.js +1 -1
- package/dist/index.d.ts +12 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +120 -124
- 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/materialization/index.js +3 -3
- package/dist/materialization/index.js.map +1 -1
- package/dist/materialization/model.d.ts +19 -6
- package/dist/materialization/model.d.ts.map +1 -1
- package/dist/materializer/index.js +35 -32
- package/dist/materializer/index.js.map +1 -1
- package/dist/materializer/shared/normalize.d.ts.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 +26 -23
- 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/action/errors.d.ts +0 -9
- package/dist/objects/action/errors.d.ts.map +1 -1
- package/dist/objects/action/index.d.ts +3 -3
- package/dist/objects/action/index.d.ts.map +1 -1
- package/dist/objects/action/request.d.ts +2 -8
- package/dist/objects/action/request.d.ts.map +1 -1
- package/dist/objects/context/index.d.ts +1 -1
- package/dist/objects/context/index.d.ts.map +1 -1
- package/dist/objects/context/types.d.ts +6 -0
- package/dist/objects/context/types.d.ts.map +1 -1
- package/dist/objects/execution.d.ts +2 -3
- package/dist/objects/execution.d.ts.map +1 -1
- package/dist/objects/index.js +49 -30
- 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 +34 -31
- 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/objects/service/index.d.ts +0 -1
- package/dist/objects/service/index.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 +34 -31
- package/dist/pipelines/index.js.map +1 -1
- package/dist/projections/internal.js +27 -24
- package/dist/projections/internal.js.map +1 -1
- package/dist/query.js +2 -2
- package/dist/queues/in-memory.d.ts +1 -2
- package/dist/queues/in-memory.d.ts.map +1 -1
- package/dist/queues/index.d.ts +1 -1
- package/dist/queues/index.d.ts.map +1 -1
- package/dist/queues/index.js +1 -1
- package/dist/queues/types.d.ts +0 -7
- package/dist/queues/types.d.ts.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 +30 -28
- 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 +46 -39
- 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/schedules/builders.d.ts.map +1 -1
- package/dist/schedules/index.js +3 -3
- package/dist/schedules/runtime.d.ts.map +1 -1
- package/dist/schedules/validation.d.ts +0 -1
- package/dist/schedules/validation.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/every.d.ts +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 +24 -21
- package/dist/shares/internal.js.map +2 -2
- package/dist/storage/action-runs/failure.js +2 -2
- package/dist/storage/action-runs/idempotency.d.ts +3 -4
- package/dist/storage/action-runs/idempotency.d.ts.map +1 -1
- package/dist/storage/action-runs/in-memory.d.ts +2 -9
- package/dist/storage/action-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/action-runs/index.d.ts +1 -3
- package/dist/storage/action-runs/index.d.ts.map +1 -1
- package/dist/storage/action-runs/provider.js +1 -1
- package/dist/storage/action-runs/record.d.ts +20 -0
- package/dist/storage/action-runs/record.d.ts.map +1 -0
- package/dist/storage/action-runs/types.d.ts +39 -68
- package/dist/storage/action-runs/types.d.ts.map +1 -1
- 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/ai-limits/enforcement.js +2 -2
- package/dist/storage/connector-connections/provider.js +1 -1
- package/dist/storage/file-upload-sessions/provider.js +12 -9
- package/dist/storage/file-upload-sessions/provider.js.map +1 -1
- package/dist/storage/index.d.ts +3 -2
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +36 -34
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/internal.d.ts +1 -1
- package/dist/storage/internal.d.ts.map +1 -1
- package/dist/storage/internal.js +11 -13
- package/dist/storage/internal.js.map +1 -1
- package/dist/storage/objects/execution-limits.d.ts +1 -1
- package/dist/storage/objects/execution-limits.d.ts.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/ontology/provider.js +2 -2
- package/dist/storage/projection-runs/provider.js +2 -2
- package/dist/storage/types.d.ts +1 -1
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/workflow-runs/provider.js +12 -9
- package/dist/storage/workflow-runs/provider.js.map +1 -1
- package/dist/syncs/index.js +35 -32
- package/dist/syncs/index.js.map +1 -1
- package/dist/testing/action-execution.d.ts +34 -4
- package/dist/testing/action-execution.d.ts.map +1 -1
- package/dist/testing/action-run-storage-contract.d.ts +11 -0
- package/dist/testing/action-run-storage-contract.d.ts.map +1 -0
- package/dist/testing/index.d.ts +2 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +3213 -2869
- package/dist/testing/index.js.map +7 -6
- package/dist/testing/materializer-storage-contract.d.ts.map +1 -1
- package/dist/testing/queues-contract.d.ts.map +1 -1
- package/dist/webhooks/internal.js +29 -26
- package/dist/webhooks/internal.js.map +2 -2
- package/dist/workers/index.js +1 -1
- package/dist/workflows/builders.d.ts.map +1 -1
- package/dist/workflows/index.js +55 -55
- 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 -7
- package/src/actions/commit-edits.ts +9 -37
- package/src/actions/errors.ts +0 -4
- package/src/actions/execution.ts +10 -10
- package/src/actions/index.ts +5 -24
- package/src/actions/read-facade.ts +2 -1
- package/src/actions/request.ts +157 -295
- package/src/actions/run/context.ts +193 -0
- package/src/actions/run/edits-commit.ts +102 -0
- package/src/actions/run/effects.ts +105 -0
- package/src/actions/run/execute.ts +113 -0
- package/src/actions/run/executor.ts +314 -0
- package/src/actions/run/normalize.ts +142 -0
- package/src/actions/run/phase-types.ts +20 -0
- package/src/actions/run/phases.ts +150 -0
- package/src/actions/run/run-action.ts +170 -0
- package/src/actions/run/signals.ts +118 -0
- package/src/actions/run/state.ts +95 -0
- package/src/actions/run/types.ts +61 -0
- package/src/actions/run/writeback.ts +79 -0
- package/src/actions/run-authorization.ts +1 -1
- package/src/actions/run-persistence.ts +105 -0
- package/src/actions/types/context.ts +10 -0
- 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/event-visibility.ts +0 -12
- 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/deploy/index.ts +0 -1
- package/src/deploy/services.ts +2 -11
- package/src/deploy/types.ts +6 -6
- package/src/deploy/validation.ts +12 -6
- package/src/edits/properties.ts +3 -0
- package/src/error-reporting/types.ts +2 -10
- package/src/errors/catalog.ts +13 -0
- package/src/events/definitions.ts +0 -17
- package/src/events/execution.ts +15 -16
- package/src/events/index.ts +0 -14
- package/src/events/scope.ts +0 -12
- package/src/events/selectors/builder.ts +0 -51
- package/src/events/selectors/index.ts +0 -6
- package/src/events/selectors/predicate.ts +0 -2
- package/src/events/selectors/types.ts +7 -65
- package/src/events/types/index.ts +0 -11
- 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 +28 -21
- package/src/materialization/model.ts +26 -9
- package/src/materializer/README.md +6 -1
- package/src/materializer/edits/commit.ts +42 -32
- package/src/materializer/shared/normalize.ts +25 -14
- 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/action/errors.ts +0 -12
- package/src/objects/action/index.ts +3 -3
- package/src/objects/action/request.ts +2 -29
- package/src/objects/context/index.ts +1 -0
- package/src/objects/context/types.ts +7 -0
- package/src/objects/execution.ts +6 -3
- 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 +11 -33
- package/src/objects/sdk/object-set.ts +10 -32
- package/src/objects/service/index.ts +0 -1
- 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/queues/in-memory.ts +0 -6
- package/src/queues/index.ts +0 -2
- package/src/queues/types.ts +0 -11
- package/src/runtime/create.ts +34 -4
- package/src/runtime/definitions.ts +3 -1
- package/src/runtime/host.ts +50 -1
- package/src/runtime/index.ts +3 -0
- package/src/runtime/locale.ts +26 -0
- package/src/runtime/resolve-definitions.ts +28 -2
- package/src/runtime/sixb.ts +1 -1
- package/src/runtime/types.ts +55 -48
- package/src/scheduler/runtime.ts +11 -2
- package/src/schedules/builders.ts +1 -4
- package/src/schedules/runtime.ts +0 -41
- package/src/schedules/validation.ts +2 -16
- package/src/security/builders.ts +49 -5
- package/src/security/every.ts +1 -1
- 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/action-runs/idempotency.ts +13 -41
- package/src/storage/action-runs/in-memory.ts +20 -311
- package/src/storage/action-runs/index.ts +1 -16
- package/src/storage/action-runs/record.ts +130 -0
- package/src/storage/action-runs/types.ts +37 -92
- package/src/storage/agents/provider.ts +11 -0
- package/src/storage/agents/types.ts +15 -7
- package/src/storage/index.ts +2 -9
- package/src/storage/internal.ts +1 -7
- package/src/storage/objects/execution-limits.ts +3 -2
- package/src/storage/objects/types.ts +7 -0
- package/src/storage/types.ts +2 -4
- package/src/testing/action-execution.ts +73 -13
- package/src/testing/action-run-storage-contract.ts +335 -0
- package/src/testing/index.ts +8 -1
- package/src/testing/materializer-storage-contract.ts +174 -18
- package/src/testing/queues-contract.ts +0 -18
- 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/actions/run-dispatch.d.ts +0 -25
- package/dist/actions/run-dispatch.d.ts.map +0 -1
- package/dist/actions/worker.d.ts +0 -3
- package/dist/actions/worker.d.ts.map +0 -1
- package/dist/actions/worker.js +0 -321
- package/dist/actions/worker.js.map +0 -11
- package/dist/chunk-10styjgk.js +0 -1572
- package/dist/chunk-10styjgk.js.map +0 -20
- package/dist/chunk-1hqwggsn.js.map +0 -12
- package/dist/chunk-52c5zb0z.js +0 -81
- package/dist/chunk-52c5zb0z.js.map +0 -10
- package/dist/chunk-69266efg.js.map +0 -12
- package/dist/chunk-6wbm6ymz.js +0 -4399
- package/dist/chunk-6wbm6ymz.js.map +0 -48
- package/dist/chunk-85cd7e8c.js +0 -51
- package/dist/chunk-85cd7e8c.js.map +0 -10
- package/dist/chunk-91kcnbf0.js.map +0 -10
- package/dist/chunk-98cw09sw.js.map +0 -10
- package/dist/chunk-9g6jz9kk.js +0 -592
- package/dist/chunk-9g6jz9kk.js.map +0 -15
- package/dist/chunk-9vx5e9g1.js.map +0 -11
- package/dist/chunk-aq39q04r.js.map +0 -15
- package/dist/chunk-cd234ba4.js.map +0 -14
- package/dist/chunk-cnb5kv05.js.map +0 -19
- package/dist/chunk-dfm066qg.js.map +0 -11
- package/dist/chunk-dmn70ztd.js.map +0 -11
- package/dist/chunk-fc5zfxy1.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-r2y23egw.js.map +0 -10
- package/dist/chunk-t9shqx3w.js.map +0 -12
- package/dist/chunk-tjjgy3z4.js +0 -1277
- package/dist/chunk-tjjgy3z4.js.map +0 -35
- package/dist/chunk-xcy5ddha.js.map +0 -15
- package/dist/chunk-xyvy73tj.js.map +0 -12
- package/dist/chunk-y2aq6ag9.js.map +0 -11
- package/dist/chunk-z5rnrmz1.js.map +0 -11
- package/dist/chunk-zvx7h87b.js +0 -12
- package/dist/chunk-zvx7h87b.js.map +0 -10
- package/dist/events/types/actions.d.ts +0 -39
- package/dist/events/types/actions.d.ts.map +0 -1
- package/dist/objects/service/action-service.d.ts +0 -13
- package/dist/objects/service/action-service.d.ts.map +0 -1
- package/src/actions/run-dispatch.ts +0 -282
- package/src/actions/worker.ts +0 -2
- package/src/events/types/actions.ts +0 -42
- package/src/objects/service/action-service.ts +0 -43
- /package/dist/{chunk-jjrn5v0p.js.map → chunk-1k89ecfr.js.map} +0 -0
- /package/dist/{chunk-vre348sb.js.map → chunk-52bk93x8.js.map} +0 -0
- /package/dist/{chunk-4gmng3vf.js.map → chunk-5e43w60z.js.map} +0 -0
- /package/dist/{chunk-33saed7g.js.map → chunk-7kg3k1m9.js.map} +0 -0
- /package/dist/{chunk-kkqwzy6h.js.map → chunk-7t429e3f.js.map} +0 -0
- /package/dist/{chunk-2am3db31.js.map → chunk-9gyp8hg1.js.map} +0 -0
- /package/dist/{chunk-4wn7bxxa.js.map → chunk-9ybhtmg4.js.map} +0 -0
- /package/dist/{chunk-rb143ggb.js.map → chunk-bwjcehza.js.map} +0 -0
- /package/dist/{chunk-5thzcb8g.js.map → chunk-c85m1hyj.js.map} +0 -0
- /package/dist/{chunk-e67ynxcr.js.map → chunk-d2ync1v3.js.map} +0 -0
- /package/dist/{chunk-3rrezgyc.js.map → chunk-dnmadg9k.js.map} +0 -0
- /package/dist/{chunk-vjcd8d27.js.map → chunk-fa02jy15.js.map} +0 -0
- /package/dist/{chunk-vp3z1ckh.js.map → chunk-kyzq4wy9.js.map} +0 -0
- /package/dist/{chunk-c2rga5cx.js.map → chunk-mfs23znk.js.map} +0 -0
- /package/dist/{chunk-a7er86jd.js.map → chunk-nre82s12.js.map} +0 -0
- /package/dist/{chunk-f1xh7a32.js.map → chunk-q1vkr2ys.js.map} +0 -0
- /package/dist/{chunk-23xs4qp9.js.map → chunk-rhg02hxq.js.map} +0 -0
- /package/dist/{chunk-k4g51s47.js.map → chunk-t6vq7bff.js.map} +0 -0
- /package/dist/{chunk-sk0hcjsz.js.map → chunk-tjb1mk5t.js.map} +0 -0
- /package/dist/{chunk-rx7h5fdx.js.map → chunk-v9xd5wzd.js.map} +0 -0
- /package/dist/{chunk-2vhg6ysa.js.map → chunk-vyf9kfqf.js.map} +0 -0
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import type { DatasetDefinition } from "../datasets/types"
|
|
2
|
+
import type { OntologyDefinitionCatalog } from "../ontology/registry"
|
|
3
|
+
import type { ObjectType, Property } from "../ontology/types"
|
|
4
|
+
import type { PipelineDefinition } from "../pipelines/types"
|
|
5
|
+
import type { ProjectionDefinitionCatalog } from "../projections/registry"
|
|
6
|
+
import type { ObjectProjectionDefinition } from "../projections/types"
|
|
7
|
+
import { SecurityValidationError } from "./errors"
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Check every marking once at startup.
|
|
11
|
+
*
|
|
12
|
+
* A marking is enforced at read time from the property or column definition alone, so each rule
|
|
13
|
+
* here closes a path that would otherwise return the value unredacted or make enforcement
|
|
14
|
+
* ambiguous.
|
|
15
|
+
*/
|
|
16
|
+
export function validateMarkingsAtStartup(input: {
|
|
17
|
+
readonly markingIds: ReadonlySet<string>
|
|
18
|
+
readonly ontology: OntologyDefinitionCatalog
|
|
19
|
+
readonly datasetsById: ReadonlyMap<string, DatasetDefinition>
|
|
20
|
+
readonly pipelines: readonly PipelineDefinition[]
|
|
21
|
+
readonly projections: ProjectionDefinitionCatalog
|
|
22
|
+
}): void {
|
|
23
|
+
validatePropertyMarkings(input.ontology, input.markingIds)
|
|
24
|
+
validateColumnMarkings(input.datasetsById, input.markingIds)
|
|
25
|
+
rejectPipelineStepsOverMarkedColumns(input.pipelines, input.datasetsById)
|
|
26
|
+
validateProjectionMarkings(input.projections, input.ontology, input.datasetsById)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// ── Declarations ────────────────────────────────────────────
|
|
30
|
+
|
|
31
|
+
function validatePropertyMarkings(
|
|
32
|
+
ontology: OntologyDefinitionCatalog,
|
|
33
|
+
markingIds: ReadonlySet<string>
|
|
34
|
+
): void {
|
|
35
|
+
for (const objectType of ontology.listObjectTypes()) {
|
|
36
|
+
for (const property of objectType.properties) {
|
|
37
|
+
validateProperty(objectType, property, markingIds)
|
|
38
|
+
}
|
|
39
|
+
for (const link of objectType.links) {
|
|
40
|
+
for (const property of link.properties ?? []) {
|
|
41
|
+
if (property.markings !== undefined) {
|
|
42
|
+
throw new SecurityValidationError(
|
|
43
|
+
`[Sixb] Link property '${objectType.id}.${link.id}.${property.id}' cannot carry markings. Mark object properties instead.`
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
assertSubtypeKeepsParentMarkings(objectType, ontology)
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function validateProperty(
|
|
53
|
+
objectType: ObjectType,
|
|
54
|
+
property: Property,
|
|
55
|
+
markingIds: ReadonlySet<string>
|
|
56
|
+
): void {
|
|
57
|
+
if (property.markings === undefined) return
|
|
58
|
+
const path = `${objectType.id}.${property.id}`
|
|
59
|
+
assertMarkingList(property.markings, `Property '${path}'`, markingIds)
|
|
60
|
+
|
|
61
|
+
// The primary id identifies the object in every response, link, and event.
|
|
62
|
+
if (property.primary) {
|
|
63
|
+
throw new SecurityValidationError(
|
|
64
|
+
`[Sixb] Primary property '${path}' cannot carry markings: it identifies the object.`
|
|
65
|
+
)
|
|
66
|
+
}
|
|
67
|
+
// Telemetry values also flow through history reads and telemetry events, which do not
|
|
68
|
+
// enforce markings yet.
|
|
69
|
+
if (property.mode === "telemetry") {
|
|
70
|
+
throw new SecurityValidationError(
|
|
71
|
+
`[Sixb] Telemetry property '${path}' cannot carry markings yet.`
|
|
72
|
+
)
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* A subtype inherits its parent's properties and may redefine them. Subtype rows are returned by
|
|
78
|
+
* parent-type reads, so a redefinition that dropped a marking would declassify the parent's data.
|
|
79
|
+
*/
|
|
80
|
+
function assertSubtypeKeepsParentMarkings(
|
|
81
|
+
objectType: ObjectType,
|
|
82
|
+
ontology: OntologyDefinitionCatalog
|
|
83
|
+
): void {
|
|
84
|
+
if (!objectType.extends) return
|
|
85
|
+
const parent = ontology.getObjectTypeById(objectType.extends)
|
|
86
|
+
if (!parent) return
|
|
87
|
+
|
|
88
|
+
for (const parentProperty of parent.properties) {
|
|
89
|
+
const property = objectType.properties.find((candidate) => candidate.id === parentProperty.id)
|
|
90
|
+
const missing = missingMarkings(parentProperty.markings, property?.markings)
|
|
91
|
+
if (missing.length > 0) {
|
|
92
|
+
throw new SecurityValidationError(
|
|
93
|
+
`[Sixb] Property '${objectType.id}.${parentProperty.id}' must keep the markings of '${parent.id}.${parentProperty.id}': add ${missing.map((markingId) => `'${markingId}'`).join(", ")}.`
|
|
94
|
+
)
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function validateColumnMarkings(
|
|
100
|
+
datasetsById: ReadonlyMap<string, DatasetDefinition>,
|
|
101
|
+
markingIds: ReadonlySet<string>
|
|
102
|
+
): void {
|
|
103
|
+
for (const dataset of datasetsById.values()) {
|
|
104
|
+
for (const column of dataset.schema.columns) {
|
|
105
|
+
if (column.markings === undefined) continue
|
|
106
|
+
assertMarkingList(
|
|
107
|
+
column.markings,
|
|
108
|
+
`Dataset column '${dataset.id}.${column.name}'`,
|
|
109
|
+
markingIds
|
|
110
|
+
)
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function assertMarkingList(
|
|
116
|
+
markings: unknown,
|
|
117
|
+
subject: string,
|
|
118
|
+
markingIds: ReadonlySet<string>
|
|
119
|
+
): void {
|
|
120
|
+
if (!Array.isArray(markings) || markings.length === 0) {
|
|
121
|
+
throw new SecurityValidationError(
|
|
122
|
+
`[Sixb] ${subject} markings must be a non-empty list of marking ids.`
|
|
123
|
+
)
|
|
124
|
+
}
|
|
125
|
+
if (new Set(markings).size !== markings.length) {
|
|
126
|
+
throw new SecurityValidationError(`[Sixb] ${subject} lists the same marking twice.`)
|
|
127
|
+
}
|
|
128
|
+
for (const markingId of markings) {
|
|
129
|
+
if (typeof markingId !== "string" || !markingIds.has(markingId)) {
|
|
130
|
+
throw new SecurityValidationError(
|
|
131
|
+
`[Sixb] ${subject} references unknown marking '${String(markingId)}'. Add it to 'security/markings/' or pass it to createSixb({ markings }).`
|
|
132
|
+
)
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// ── Propagation ─────────────────────────────────────────────
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* A step's output inherits nothing from its inputs until Sixb can derive each output column's
|
|
141
|
+
* markings from the transform. Until then, reading a marked column would declassify it.
|
|
142
|
+
*/
|
|
143
|
+
function rejectPipelineStepsOverMarkedColumns(
|
|
144
|
+
pipelines: readonly PipelineDefinition[],
|
|
145
|
+
datasetsById: ReadonlyMap<string, DatasetDefinition>
|
|
146
|
+
): void {
|
|
147
|
+
for (const pipeline of pipelines) {
|
|
148
|
+
for (const { step } of pipeline.graph.nodes) {
|
|
149
|
+
for (const input of Object.values(step.inputs)) {
|
|
150
|
+
const dataset = datasetsById.get(input.id)
|
|
151
|
+
const column = dataset?.schema.columns.find((candidate) => candidate.markings)
|
|
152
|
+
if (!dataset || !column) continue
|
|
153
|
+
throw new SecurityValidationError(
|
|
154
|
+
`[Sixb] Pipeline '${pipeline.id}' step '${step.id}' reads column '${dataset.id}.${column.name}', which carries ${markingList(column.markings)}. Pipeline steps cannot read marked columns yet.`
|
|
155
|
+
)
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Objects are read through the ontology, so each projected property declares the markings of its
|
|
163
|
+
* column: the ontology stays the reviewed contract of what each reader receives. Values that
|
|
164
|
+
* identify objects or key links are returned wherever the object or link is, and telemetry does
|
|
165
|
+
* not enforce markings yet, so those columns cannot carry markings.
|
|
166
|
+
*/
|
|
167
|
+
function validateProjectionMarkings(
|
|
168
|
+
projections: ProjectionDefinitionCatalog,
|
|
169
|
+
ontology: OntologyDefinitionCatalog,
|
|
170
|
+
datasetsById: ReadonlyMap<string, DatasetDefinition>
|
|
171
|
+
): void {
|
|
172
|
+
for (const projection of projections.listObjects()) {
|
|
173
|
+
const objectType = ontology.getObjectTypeById(projection.objectTypeId)
|
|
174
|
+
if (objectType) validateObjectProjection(projection, objectType, datasetsById)
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
for (const projection of projections.listLinks()) {
|
|
178
|
+
const role = `keys link '${projection.sourceObjectTypeId}.${projection.linkId}'`
|
|
179
|
+
for (const columnName of [projection.sourceField, projection.targetField]) {
|
|
180
|
+
assertUnmarkedColumn(projection, sourceColumn(projection, columnName, datasetsById), role)
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
for (const projection of projections.listTelemetry()) {
|
|
185
|
+
const columnNames = [
|
|
186
|
+
projection.objectIdField,
|
|
187
|
+
projection.atField,
|
|
188
|
+
...Object.values(projection.properties).flatMap((mapping) =>
|
|
189
|
+
mapping.unitField === undefined
|
|
190
|
+
? [mapping.valueField]
|
|
191
|
+
: [mapping.valueField, mapping.unitField]
|
|
192
|
+
),
|
|
193
|
+
]
|
|
194
|
+
for (const columnName of columnNames) {
|
|
195
|
+
const column = sourceColumn(projection, columnName, datasetsById)
|
|
196
|
+
if (!column.markings) continue
|
|
197
|
+
throw new SecurityValidationError(
|
|
198
|
+
`[Sixb] Projection '${projection.id}' reads column '${column.path}', which carries ${markingList(column.markings)}. Telemetry projections cannot read marked columns yet.`
|
|
199
|
+
)
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function validateObjectProjection(
|
|
205
|
+
projection: ObjectProjectionDefinition,
|
|
206
|
+
objectType: ObjectType,
|
|
207
|
+
datasetsById: ReadonlyMap<string, DatasetDefinition>
|
|
208
|
+
): void {
|
|
209
|
+
const keyRoles = objectProjectionKeyRoles(projection, objectType)
|
|
210
|
+
|
|
211
|
+
for (const [propertyId, columnName] of Object.entries(projection.properties)) {
|
|
212
|
+
const column = sourceColumn(projection, columnName, datasetsById)
|
|
213
|
+
const property = objectType.properties.find((candidate) => candidate.id === propertyId)
|
|
214
|
+
const path = `${objectType.id}.${propertyId}`
|
|
215
|
+
const keyRole = keyRoles.get(propertyId)
|
|
216
|
+
if (keyRole) {
|
|
217
|
+
assertUnmarkedColumn(projection, column, keyRole)
|
|
218
|
+
if (property?.markings) {
|
|
219
|
+
throw new SecurityValidationError(
|
|
220
|
+
`[Sixb] Projection '${projection.id}': property '${path}' ${keyRole} and cannot carry markings.`
|
|
221
|
+
)
|
|
222
|
+
}
|
|
223
|
+
continue
|
|
224
|
+
}
|
|
225
|
+
const missing = missingMarkings(column.markings, property?.markings)
|
|
226
|
+
if (missing.length > 0) {
|
|
227
|
+
throw new SecurityValidationError(
|
|
228
|
+
`[Sixb] Projection '${projection.id}': property '${path}' is projected from column '${column.path}', which carries ${markingList(column.markings)}. Add markings: ${markingList(missing)} to the property.`
|
|
229
|
+
)
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
for (const [linkId, link] of Object.entries(projection.links)) {
|
|
234
|
+
if (link.sourceField === undefined) continue
|
|
235
|
+
assertUnmarkedColumn(
|
|
236
|
+
projection,
|
|
237
|
+
sourceColumn(projection, link.sourceField, datasetsById),
|
|
238
|
+
`keys link '${objectType.id}.${linkId}'`
|
|
239
|
+
)
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// The timestamp decides whether the source value or an app edit wins, which reveals how they
|
|
243
|
+
// compare.
|
|
244
|
+
const conflictResolution = projection.conflictResolution
|
|
245
|
+
if (conflictResolution?.strategy === "mostRecent") {
|
|
246
|
+
assertUnmarkedColumn(
|
|
247
|
+
projection,
|
|
248
|
+
sourceColumn(projection, conflictResolution.sourceTimestamp, datasetsById),
|
|
249
|
+
"decides which value wins under 'mostRecent'"
|
|
250
|
+
)
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/** Properties whose value becomes an object id or a link key, with the role they play. */
|
|
255
|
+
function objectProjectionKeyRoles(
|
|
256
|
+
projection: ObjectProjectionDefinition,
|
|
257
|
+
objectType: ObjectType
|
|
258
|
+
): ReadonlyMap<string, string> {
|
|
259
|
+
const roles = new Map<string, string>()
|
|
260
|
+
for (const property of objectType.properties) {
|
|
261
|
+
if (property.primary) roles.set(property.id, `becomes the id of '${objectType.id}'`)
|
|
262
|
+
}
|
|
263
|
+
for (const [linkId, link] of Object.entries(projection.links)) {
|
|
264
|
+
if (link.sourcePropertyId === undefined) continue
|
|
265
|
+
roles.set(link.sourcePropertyId, `keys link '${objectType.id}.${linkId}'`)
|
|
266
|
+
}
|
|
267
|
+
return roles
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
interface SourceColumn {
|
|
271
|
+
readonly path: string
|
|
272
|
+
readonly markings?: readonly string[]
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
function sourceColumn(
|
|
276
|
+
projection: { readonly id: string; readonly datasetId: string },
|
|
277
|
+
columnName: string,
|
|
278
|
+
datasetsById: ReadonlyMap<string, DatasetDefinition>
|
|
279
|
+
): SourceColumn {
|
|
280
|
+
const column = datasetsById
|
|
281
|
+
.get(projection.datasetId)
|
|
282
|
+
?.schema.columns.find((candidate) => candidate.name === columnName)
|
|
283
|
+
// Projection validation runs first and resolves every mapped column.
|
|
284
|
+
if (!column) {
|
|
285
|
+
throw new Error(`[Sixb] Projection '${projection.id}' maps unknown column '${columnName}'.`)
|
|
286
|
+
}
|
|
287
|
+
return { path: `${projection.datasetId}.${columnName}`, markings: column.markings }
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
function assertUnmarkedColumn(
|
|
291
|
+
projection: { readonly id: string },
|
|
292
|
+
column: SourceColumn,
|
|
293
|
+
role: string
|
|
294
|
+
): void {
|
|
295
|
+
if (!column.markings) return
|
|
296
|
+
throw new SecurityValidationError(
|
|
297
|
+
`[Sixb] Projection '${projection.id}': column '${column.path}' ${role} and cannot carry markings.`
|
|
298
|
+
)
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// ── Helpers ─────────────────────────────────────────────────
|
|
302
|
+
|
|
303
|
+
function missingMarkings(
|
|
304
|
+
required: readonly string[] | undefined,
|
|
305
|
+
declared: readonly string[] | undefined
|
|
306
|
+
): readonly string[] {
|
|
307
|
+
const present = new Set(declared ?? [])
|
|
308
|
+
return (required ?? []).filter((markingId) => !present.has(markingId))
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
function markingList(markings: readonly string[] | undefined): string {
|
|
312
|
+
return `[${(markings ?? []).join(", ")}]`
|
|
313
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Redactions } from "./types"
|
|
2
|
+
|
|
3
|
+
/** List the values hidden from a reader that lacks a clearance for their markings. */
|
|
4
|
+
export function missingClearanceRedactions(ids: Iterable<string>): Redactions {
|
|
5
|
+
return Object.fromEntries([...ids].map((id) => [id, { reason: "missing_clearance" }] as const))
|
|
6
|
+
}
|
package/src/security/registry.ts
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
import { type ResolvedRole, resolveRoleGrants } from "../authorization"
|
|
2
2
|
import { APPLICATION_IDS } from "./applications"
|
|
3
|
-
import type {
|
|
3
|
+
import type {
|
|
4
|
+
GroupDefinition,
|
|
5
|
+
MarkingDefinition,
|
|
6
|
+
MembershipPolicyDefinition,
|
|
7
|
+
RoleDefinition,
|
|
8
|
+
} from "./types"
|
|
4
9
|
import { validateSecurityDefinitionsAtStartup } from "./validation"
|
|
5
10
|
|
|
6
11
|
/** Read-only access to validated security definitions and resolved role grants. */
|
|
7
12
|
export interface SecurityDefinitionCatalog {
|
|
13
|
+
listMarkings(): readonly MarkingDefinition[]
|
|
14
|
+
getMarkingById(markingId: string): MarkingDefinition | null
|
|
8
15
|
listGroups(): readonly GroupDefinition[]
|
|
9
16
|
getGroupById(groupId: string): GroupDefinition | null
|
|
10
17
|
listRoles(): readonly RoleDefinition[]
|
|
@@ -15,6 +22,7 @@ export interface SecurityDefinitionCatalog {
|
|
|
15
22
|
}
|
|
16
23
|
|
|
17
24
|
export interface SecurityRegistryOptions {
|
|
25
|
+
readonly markings?: readonly MarkingDefinition[]
|
|
18
26
|
readonly groups?: readonly GroupDefinition[]
|
|
19
27
|
readonly roles?: readonly RoleDefinition[]
|
|
20
28
|
readonly membershipPolicies?: readonly MembershipPolicyDefinition[]
|
|
@@ -32,6 +40,7 @@ export interface SecurityRegistryOptions {
|
|
|
32
40
|
}
|
|
33
41
|
|
|
34
42
|
export class SecurityRegistry implements SecurityDefinitionCatalog {
|
|
43
|
+
private readonly markingsById: ReadonlyMap<string, MarkingDefinition>
|
|
35
44
|
private readonly groupsById: ReadonlyMap<string, GroupDefinition>
|
|
36
45
|
private readonly rolesById: ReadonlyMap<string, RoleDefinition>
|
|
37
46
|
private readonly membershipPoliciesById: ReadonlyMap<string, MembershipPolicyDefinition>
|
|
@@ -39,6 +48,7 @@ export class SecurityRegistry implements SecurityDefinitionCatalog {
|
|
|
39
48
|
|
|
40
49
|
constructor(input: SecurityRegistryOptions) {
|
|
41
50
|
const definitions = validateSecurityDefinitionsAtStartup({
|
|
51
|
+
markings: input.markings ?? [],
|
|
42
52
|
groups: input.groups ?? [],
|
|
43
53
|
roles: input.roles ?? [],
|
|
44
54
|
membershipPolicies: input.membershipPolicies ?? [],
|
|
@@ -71,6 +81,7 @@ export class SecurityRegistry implements SecurityDefinitionCatalog {
|
|
|
71
81
|
getSubTypes: input.getSubTypes ?? (() => []),
|
|
72
82
|
}
|
|
73
83
|
|
|
84
|
+
this.markingsById = definitions.markingsById
|
|
74
85
|
this.groupsById = definitions.groupsById
|
|
75
86
|
this.rolesById = definitions.rolesById
|
|
76
87
|
this.membershipPoliciesById = definitions.membershipPoliciesById
|
|
@@ -78,9 +89,18 @@ export class SecurityRegistry implements SecurityDefinitionCatalog {
|
|
|
78
89
|
id: role.id,
|
|
79
90
|
grantedToGroupIds: role.grantedToGroupIds,
|
|
80
91
|
grants: resolveRoleGrants(role, universe),
|
|
92
|
+
clearances: new Set(role.clearances ?? []),
|
|
81
93
|
}))
|
|
82
94
|
}
|
|
83
95
|
|
|
96
|
+
listMarkings(): readonly MarkingDefinition[] {
|
|
97
|
+
return [...this.markingsById.values()]
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
getMarkingById(markingId: string): MarkingDefinition | null {
|
|
101
|
+
return this.markingsById.get(markingId) ?? null
|
|
102
|
+
}
|
|
103
|
+
|
|
84
104
|
listGroups(): readonly GroupDefinition[] {
|
|
85
105
|
return [...this.groupsById.values()]
|
|
86
106
|
}
|
package/src/security/types.ts
CHANGED
|
@@ -7,6 +7,28 @@ export interface GroupDefinition<TId extends string = string> {
|
|
|
7
7
|
readonly description?: string
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
+
/**
|
|
11
|
+
* A classification carried by sensitive properties and dataset columns.
|
|
12
|
+
*
|
|
13
|
+
* A principal reads a marked value only when one of its roles lists the marking in `clearances`.
|
|
14
|
+
* No grant bypasses a marking.
|
|
15
|
+
*/
|
|
16
|
+
export interface MarkingDefinition<TId extends string = string> {
|
|
17
|
+
readonly kind: "marking"
|
|
18
|
+
readonly id: TId
|
|
19
|
+
readonly label?: string
|
|
20
|
+
readonly description?: string
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Why a value was omitted from a read. */
|
|
24
|
+
export type RedactionReason = "missing_clearance"
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Values omitted from a read, keyed by property id or column name. A redacted value is absent,
|
|
28
|
+
* never `null`.
|
|
29
|
+
*/
|
|
30
|
+
export type Redactions = Readonly<Record<string, { readonly reason: RedactionReason }>>
|
|
31
|
+
|
|
10
32
|
/**
|
|
11
33
|
* A group named either by its definition or by its id.
|
|
12
34
|
*
|
|
@@ -149,6 +171,8 @@ export interface RoleDefinition<TId extends string = string> {
|
|
|
149
171
|
readonly description?: string
|
|
150
172
|
readonly grantedToGroupIds: readonly string[]
|
|
151
173
|
readonly grants: readonly GrantDefinition[]
|
|
174
|
+
/** Ids of the markings this role's members may read. Absent means none. */
|
|
175
|
+
readonly clearances?: readonly string[]
|
|
152
176
|
}
|
|
153
177
|
|
|
154
178
|
export type MembershipOperation = "invite" | "assignGroups" | "suspend"
|
|
@@ -162,6 +186,8 @@ export interface MembershipPolicyDefinition<TId extends string = string> {
|
|
|
162
186
|
}
|
|
163
187
|
|
|
164
188
|
export interface RegisteredSecurityDefinitions {
|
|
189
|
+
readonly markings: readonly MarkingDefinition[]
|
|
190
|
+
readonly markingsById: ReadonlyMap<string, MarkingDefinition>
|
|
165
191
|
readonly groups: readonly GroupDefinition[]
|
|
166
192
|
readonly groupsById: ReadonlyMap<string, GroupDefinition>
|
|
167
193
|
readonly roles: readonly RoleDefinition[]
|
|
@@ -5,6 +5,7 @@ import type {
|
|
|
5
5
|
GrantCapability,
|
|
6
6
|
GrantDefinition,
|
|
7
7
|
GroupDefinition,
|
|
8
|
+
MarkingDefinition,
|
|
8
9
|
MembershipPolicyDefinition,
|
|
9
10
|
RegisteredSecurityDefinitions,
|
|
10
11
|
RoleDefinition,
|
|
@@ -132,6 +133,32 @@ function assertNoDuplicateOperations(
|
|
|
132
133
|
}
|
|
133
134
|
}
|
|
134
135
|
|
|
136
|
+
export function assertMarkingDefinition(
|
|
137
|
+
value: unknown,
|
|
138
|
+
createError: CreateSecurityError = (message) => new SecurityValidationError(message)
|
|
139
|
+
): asserts value is MarkingDefinition {
|
|
140
|
+
if (!isRecord(value)) {
|
|
141
|
+
throw createError("[Sixb] Marking definition must be an object.")
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (value.kind !== "marking") {
|
|
145
|
+
throw createError("[Sixb] Marking definition kind must be 'marking'.")
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
assertNonEmptyString(value.id, "Marking id", createError)
|
|
149
|
+
assertOptionalString(value.label, `Marking '${value.id}' label`, createError)
|
|
150
|
+
assertOptionalString(value.description, `Marking '${value.id}' description`, createError)
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export function isMarkingDefinition(value: unknown): value is MarkingDefinition {
|
|
154
|
+
try {
|
|
155
|
+
assertMarkingDefinition(value, (message) => new Error(message))
|
|
156
|
+
return true
|
|
157
|
+
} catch {
|
|
158
|
+
return false
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
135
162
|
export function assertGroupDefinition(
|
|
136
163
|
value: unknown,
|
|
137
164
|
createError: CreateSecurityError = (message) => new SecurityValidationError(message)
|
|
@@ -285,6 +312,10 @@ export function assertRoleDefinition(
|
|
|
285
312
|
for (const grant of value.grants) {
|
|
286
313
|
assertGrantDefinition(grant, `Role '${value.id}' grants`, createError)
|
|
287
314
|
}
|
|
315
|
+
|
|
316
|
+
if (value.clearances !== undefined) {
|
|
317
|
+
assertStringArray(value.clearances, `Role '${value.id}' clearances`, createError)
|
|
318
|
+
}
|
|
288
319
|
}
|
|
289
320
|
|
|
290
321
|
export function isRoleDefinition(value: unknown): value is RoleDefinition {
|
|
@@ -297,6 +328,7 @@ export function isRoleDefinition(value: unknown): value is RoleDefinition {
|
|
|
297
328
|
}
|
|
298
329
|
|
|
299
330
|
export function validateSecurityDefinitionsAtStartup(input: {
|
|
331
|
+
readonly markings?: readonly MarkingDefinition[]
|
|
300
332
|
readonly groups: readonly GroupDefinition[]
|
|
301
333
|
readonly membershipPolicies: readonly MembershipPolicyDefinition[]
|
|
302
334
|
readonly roles?: readonly RoleDefinition[]
|
|
@@ -325,10 +357,21 @@ export function validateSecurityDefinitionsAtStartup(input: {
|
|
|
325
357
|
/** Registered Share ids — when provided, share grants must reference them. */
|
|
326
358
|
readonly shareIds?: ReadonlySet<string>
|
|
327
359
|
}): RegisteredSecurityDefinitions {
|
|
360
|
+
const markingsById = new Map<string, MarkingDefinition>()
|
|
328
361
|
const groupsById = new Map<string, GroupDefinition>()
|
|
329
362
|
const rolesById = new Map<string, RoleDefinition>()
|
|
330
363
|
const membershipPoliciesById = new Map<string, MembershipPolicyDefinition>()
|
|
331
364
|
|
|
365
|
+
for (const marking of input.markings ?? []) {
|
|
366
|
+
assertMarkingDefinition(marking)
|
|
367
|
+
|
|
368
|
+
if (markingsById.has(marking.id)) {
|
|
369
|
+
throw new SecurityValidationError(`[Sixb] Duplicate marking id: ${marking.id}`)
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
markingsById.set(marking.id, marking)
|
|
373
|
+
}
|
|
374
|
+
|
|
332
375
|
for (const group of input.groups) {
|
|
333
376
|
assertGroupDefinition(group)
|
|
334
377
|
|
|
@@ -352,11 +395,23 @@ export function validateSecurityDefinitionsAtStartup(input: {
|
|
|
352
395
|
)
|
|
353
396
|
}
|
|
354
397
|
|
|
355
|
-
|
|
356
|
-
|
|
398
|
+
const clearances = role.clearances ?? []
|
|
399
|
+
if (role.grants.length === 0 && clearances.length === 0) {
|
|
400
|
+
throw new SecurityValidationError(
|
|
401
|
+
`[Sixb] Role '${role.id}' must declare at least one grant or clearance.`
|
|
402
|
+
)
|
|
357
403
|
}
|
|
358
404
|
|
|
359
405
|
assertNoDuplicateIds(role.grantedToGroupIds, `Role '${role.id}' grantedTo`)
|
|
406
|
+
assertNoDuplicateIds(clearances, `Role '${role.id}' clearances`)
|
|
407
|
+
|
|
408
|
+
for (const markingId of clearances) {
|
|
409
|
+
if (!markingsById.has(markingId)) {
|
|
410
|
+
throw new SecurityValidationError(
|
|
411
|
+
`[Sixb] Role '${role.id}' clearances reference unknown marking '${markingId}'. Add it to 'security/markings/' or pass it to createSixb({ markings }).`
|
|
412
|
+
)
|
|
413
|
+
}
|
|
414
|
+
}
|
|
360
415
|
|
|
361
416
|
for (const groupId of role.grantedToGroupIds) {
|
|
362
417
|
if (!groupsById.has(groupId)) {
|
|
@@ -416,6 +471,8 @@ export function validateSecurityDefinitionsAtStartup(input: {
|
|
|
416
471
|
}
|
|
417
472
|
|
|
418
473
|
return {
|
|
474
|
+
markings: [...markingsById.values()],
|
|
475
|
+
markingsById,
|
|
419
476
|
groups: [...groupsById.values()],
|
|
420
477
|
groupsById,
|
|
421
478
|
roles: [...rolesById.values()],
|
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
import type { ActionSubject } from "../../actions"
|
|
2
2
|
import { stableJsonStringify } from "../../json"
|
|
3
|
-
import type {
|
|
4
|
-
ActionRunEffectsRecord,
|
|
5
|
-
ActionRunPhase,
|
|
6
|
-
ActionRunRecord,
|
|
7
|
-
ActionRunWritebackRecord,
|
|
8
|
-
FinishActionRunInput,
|
|
9
|
-
QueueActionRunInput,
|
|
10
|
-
} from "./types"
|
|
3
|
+
import type { ActionRunEffectsRecord, ActionRunRecord, ActionRunWritebackRecord } from "./types"
|
|
11
4
|
|
|
12
5
|
export function actionSubjectsEqual(left: ActionSubject, right: ActionSubject): boolean {
|
|
13
6
|
if (left.kind !== right.kind) return false
|
|
@@ -20,6 +13,18 @@ export function actionRunParamsEqual(left: unknown, right: unknown): boolean {
|
|
|
20
13
|
return stableJsonStringify(left) === stableJsonStringify(right)
|
|
21
14
|
}
|
|
22
15
|
|
|
16
|
+
/** Whether two runs carry the same request: the same Action, subject, and params. */
|
|
17
|
+
export function actionRunRequestsEqual(
|
|
18
|
+
left: Pick<ActionRunRecord, "actionId" | "subject" | "params">,
|
|
19
|
+
right: Pick<ActionRunRecord, "actionId" | "subject" | "params">
|
|
20
|
+
): boolean {
|
|
21
|
+
return (
|
|
22
|
+
left.actionId === right.actionId &&
|
|
23
|
+
actionSubjectsEqual(left.subject, right.subject) &&
|
|
24
|
+
actionRunParamsEqual(left.params, right.params)
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
|
|
23
28
|
export type ActionRunPhaseRecord = ActionRunWritebackRecord | ActionRunEffectsRecord
|
|
24
29
|
|
|
25
30
|
export function actionRunPhaseRecordsEqual(
|
|
@@ -29,39 +34,6 @@ export function actionRunPhaseRecordsEqual(
|
|
|
29
34
|
return actionRunParamsEqual(stripPhaseRecordCompletedAt(left), stripPhaseRecordCompletedAt(right))
|
|
30
35
|
}
|
|
31
36
|
|
|
32
|
-
export function finishActionRunPhase(
|
|
33
|
-
input: FinishActionRunInput,
|
|
34
|
-
current: ActionRunPhase | null | undefined
|
|
35
|
-
): ActionRunPhase {
|
|
36
|
-
if (input.status === "succeeded") {
|
|
37
|
-
return input.phase ?? current ?? "validation"
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return input.error.details.phase
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export function canRequeueActionRunAfterEnqueueFailure(
|
|
44
|
-
existing: ActionRunRecord,
|
|
45
|
-
input: QueueActionRunInput
|
|
46
|
-
): boolean {
|
|
47
|
-
return (
|
|
48
|
-
existing.status === "failed" &&
|
|
49
|
-
existing.phase === "enqueue" &&
|
|
50
|
-
existing.executionId === input.executionId &&
|
|
51
|
-
existing.error?.retryable === true &&
|
|
52
|
-
existing.actionId === input.actionId &&
|
|
53
|
-
existing.idempotencyKey === input.idempotencyKey &&
|
|
54
|
-
actionSubjectsEqual(existing.subject, input.subject) &&
|
|
55
|
-
actionRunParamsEqual(existing.params, input.params)
|
|
56
|
-
)
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export function isTerminalActionRun(record: Pick<ActionRunRecord, "status">): boolean {
|
|
60
|
-
return (
|
|
61
|
-
record.status === "succeeded" || record.status === "failed" || record.status === "cancelled"
|
|
62
|
-
)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
37
|
function stripPhaseRecordCompletedAt(
|
|
66
38
|
record: ActionRunPhaseRecord
|
|
67
39
|
): Omit<ActionRunPhaseRecord, "completedAt"> {
|