@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
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import {
|
|
3
|
+
GRANT_KINDS,
|
|
4
|
+
grantKindOf
|
|
5
|
+
} from "./chunk-enpsx8k5.js";
|
|
6
|
+
|
|
7
|
+
// src/security/errors.ts
|
|
8
|
+
class SecurityValidationError2 extends Error {
|
|
9
|
+
name = "SecurityValidationError";
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// src/security/membership-policies.ts
|
|
13
|
+
var MEMBERSHIP_OPERATIONS = ["invite", "assignGroups", "suspend"];
|
|
14
|
+
function resolveMembershipPolicyScope(input) {
|
|
15
|
+
const callerGroups = new Set(input.callerGroupIds);
|
|
16
|
+
const policyIds = [];
|
|
17
|
+
const operations = createEmptyOperationScopes();
|
|
18
|
+
for (const policy of input.membershipPolicies) {
|
|
19
|
+
if (!policy.grantedToGroupIds.some((groupId) => callerGroups.has(groupId))) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
policyIds.push(policy.id);
|
|
23
|
+
for (const operation of policy.can) {
|
|
24
|
+
operations[operation].policyIds.push(policy.id);
|
|
25
|
+
for (const groupId of policy.scopeGroupIds) {
|
|
26
|
+
operations[operation].groupIds.add(groupId);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
policyIds,
|
|
32
|
+
operations: {
|
|
33
|
+
invite: freezeOperationScope(operations.invite),
|
|
34
|
+
assignGroups: freezeOperationScope(operations.assignGroups),
|
|
35
|
+
suspend: freezeOperationScope(operations.suspend)
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function canPerformMembershipOperation(scope, operation, groupIds) {
|
|
40
|
+
const operationScope = scope.operations[operation];
|
|
41
|
+
if (operationScope.policyIds.length === 0) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
if (groupIds.length === 0) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
return groupIds.every((groupId) => operationScope.groupIds.has(groupId));
|
|
48
|
+
}
|
|
49
|
+
function missingMembershipGroupIds(scope, operation, groupIds) {
|
|
50
|
+
if (groupIds.length === 0) {
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
const operationScope = scope.operations[operation];
|
|
54
|
+
return groupIds.filter((groupId) => !operationScope.groupIds.has(groupId));
|
|
55
|
+
}
|
|
56
|
+
function createEmptyOperationScopes() {
|
|
57
|
+
return {
|
|
58
|
+
invite: { policyIds: [], groupIds: new Set },
|
|
59
|
+
assignGroups: { policyIds: [], groupIds: new Set },
|
|
60
|
+
suspend: { policyIds: [], groupIds: new Set }
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function freezeOperationScope(input) {
|
|
64
|
+
return {
|
|
65
|
+
policyIds: [...input.policyIds],
|
|
66
|
+
groupIds: new Set(input.groupIds)
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function isMembershipOperation(value) {
|
|
70
|
+
return MEMBERSHIP_OPERATIONS.includes(value);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// src/security/validation.ts
|
|
74
|
+
var GRANT_CAPABILITIES = Object.keys({
|
|
75
|
+
access: true,
|
|
76
|
+
view: true,
|
|
77
|
+
edit: true,
|
|
78
|
+
append: true,
|
|
79
|
+
apply: true,
|
|
80
|
+
share: true,
|
|
81
|
+
run: true,
|
|
82
|
+
observe: true,
|
|
83
|
+
manage: true
|
|
84
|
+
});
|
|
85
|
+
function formatAlternatives(values) {
|
|
86
|
+
const quoted = values.map((value) => `'${value}'`);
|
|
87
|
+
const last = quoted.at(-1);
|
|
88
|
+
return quoted.length < 2 ? last ?? "" : `${quoted.slice(0, -1).join(", ")}, or ${last}`;
|
|
89
|
+
}
|
|
90
|
+
function isRecord(value) {
|
|
91
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
92
|
+
}
|
|
93
|
+
function assertNonEmptyString(value, field, createError = (message) => new SecurityValidationError2(message)) {
|
|
94
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
95
|
+
throw createError(`[Sixb] ${field} must not be empty.`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function assertOptionalString(value, field, createError = (message) => new SecurityValidationError2(message)) {
|
|
99
|
+
if (value === undefined) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (typeof value !== "string") {
|
|
103
|
+
throw createError(`[Sixb] ${field} must be a string.`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function assertStringArray(value, field, createError) {
|
|
107
|
+
if (!Array.isArray(value)) {
|
|
108
|
+
throw createError(`[Sixb] ${field} must be an array of group ids.`);
|
|
109
|
+
}
|
|
110
|
+
for (const item of value) {
|
|
111
|
+
assertNonEmptyString(item, `${field} item`, createError);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function assertMembershipOperationArray(value, field, createError) {
|
|
115
|
+
if (!Array.isArray(value)) {
|
|
116
|
+
throw createError(`[Sixb] ${field} must be an array of membership operations.`);
|
|
117
|
+
}
|
|
118
|
+
for (const item of value) {
|
|
119
|
+
if (!isMembershipOperation(item)) {
|
|
120
|
+
throw createError(`[Sixb] ${field} must contain only membership operations: invite, assignGroups, suspend.`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function assertNoDuplicateIds(ids, field) {
|
|
125
|
+
const seen = new Set;
|
|
126
|
+
for (const id of ids) {
|
|
127
|
+
if (seen.has(id)) {
|
|
128
|
+
throw new SecurityValidationError2(`[Sixb] ${field} contains duplicate group id '${id}'.`);
|
|
129
|
+
}
|
|
130
|
+
seen.add(id);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function assertNoDuplicateOperations(operations, field) {
|
|
134
|
+
const seen = new Set;
|
|
135
|
+
for (const operation of operations) {
|
|
136
|
+
if (seen.has(operation)) {
|
|
137
|
+
throw new SecurityValidationError2(`[Sixb] ${field} contains duplicate operation '${operation}'.`);
|
|
138
|
+
}
|
|
139
|
+
seen.add(operation);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function assertMarkingDefinition(value, createError = (message) => new SecurityValidationError2(message)) {
|
|
143
|
+
if (!isRecord(value)) {
|
|
144
|
+
throw createError("[Sixb] Marking definition must be an object.");
|
|
145
|
+
}
|
|
146
|
+
if (value.kind !== "marking") {
|
|
147
|
+
throw createError("[Sixb] Marking definition kind must be 'marking'.");
|
|
148
|
+
}
|
|
149
|
+
assertNonEmptyString(value.id, "Marking id", createError);
|
|
150
|
+
assertOptionalString(value.label, `Marking '${value.id}' label`, createError);
|
|
151
|
+
assertOptionalString(value.description, `Marking '${value.id}' description`, createError);
|
|
152
|
+
}
|
|
153
|
+
function isMarkingDefinition(value) {
|
|
154
|
+
try {
|
|
155
|
+
assertMarkingDefinition(value, (message) => new Error(message));
|
|
156
|
+
return true;
|
|
157
|
+
} catch {
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
function assertGroupDefinition(value, createError = (message) => new SecurityValidationError2(message)) {
|
|
162
|
+
if (!isRecord(value)) {
|
|
163
|
+
throw createError("[Sixb] Group definition must be an object.");
|
|
164
|
+
}
|
|
165
|
+
if (value.kind !== "group") {
|
|
166
|
+
throw createError("[Sixb] Group definition kind must be 'group'.");
|
|
167
|
+
}
|
|
168
|
+
assertNonEmptyString(value.id, "Group id", createError);
|
|
169
|
+
assertOptionalString(value.label, `Group '${value.id}' label`, createError);
|
|
170
|
+
assertOptionalString(value.description, `Group '${value.id}' description`, createError);
|
|
171
|
+
}
|
|
172
|
+
function isGroupDefinition(value) {
|
|
173
|
+
try {
|
|
174
|
+
assertGroupDefinition(value, (message) => new Error(message));
|
|
175
|
+
return true;
|
|
176
|
+
} catch {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function assertMembershipPolicyDefinition(value, createError = (message) => new SecurityValidationError2(message)) {
|
|
181
|
+
if (!isRecord(value)) {
|
|
182
|
+
throw createError("[Sixb] Membership policy definition must be an object.");
|
|
183
|
+
}
|
|
184
|
+
if (value.kind !== "membershipPolicy") {
|
|
185
|
+
throw createError("[Sixb] Membership policy definition kind must be 'membershipPolicy'.");
|
|
186
|
+
}
|
|
187
|
+
assertNonEmptyString(value.id, "Membership policy id", createError);
|
|
188
|
+
assertStringArray(value.grantedToGroupIds, `Membership policy '${value.id}' grantedTo`, createError);
|
|
189
|
+
assertStringArray(value.scopeGroupIds, `Membership policy '${value.id}' scope`, createError);
|
|
190
|
+
assertMembershipOperationArray(value.can, `Membership policy '${value.id}' can`, createError);
|
|
191
|
+
}
|
|
192
|
+
function isMembershipPolicyDefinition(value) {
|
|
193
|
+
try {
|
|
194
|
+
assertMembershipPolicyDefinition(value, (message) => new Error(message));
|
|
195
|
+
return true;
|
|
196
|
+
} catch {
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
function assertGrantDefinition(value, field, createError = (message) => new SecurityValidationError2(message)) {
|
|
201
|
+
if (!isRecord(value) || value.kind !== "grant") {
|
|
202
|
+
throw createError(`[Sixb] ${field} must contain only grant definitions from 'can'.`);
|
|
203
|
+
}
|
|
204
|
+
if (!GRANT_CAPABILITIES.includes(value.capability)) {
|
|
205
|
+
throw createError(`[Sixb] ${field} grant capability must be ${formatAlternatives(GRANT_CAPABILITIES)}.`);
|
|
206
|
+
}
|
|
207
|
+
if (value.capability === "access" && value.target !== "application") {
|
|
208
|
+
throw createError(`[Sixb] ${field} access grant target must be 'application'.`);
|
|
209
|
+
}
|
|
210
|
+
if (value.capability === "view" && value.target !== "object" && value.target !== "dataset") {
|
|
211
|
+
throw createError(`[Sixb] ${field} view grant target must be 'object' or 'dataset'.`);
|
|
212
|
+
}
|
|
213
|
+
if (value.capability === "run" && value.target !== "workflow" && value.target !== "sync" && value.target !== "pipeline" && value.target !== "agent") {
|
|
214
|
+
throw createError(`[Sixb] ${field} run grant target must be 'workflow', 'sync', 'pipeline', or 'agent'.`);
|
|
215
|
+
}
|
|
216
|
+
if (value.capability === "observe" && value.target !== "logs" && value.target !== "aiUsage") {
|
|
217
|
+
throw createError(`[Sixb] ${field} observe grant target must be 'logs' or 'aiUsage'.`);
|
|
218
|
+
}
|
|
219
|
+
if (value.capability === "manage" && value.target !== "connector" && value.target !== "aiUsage") {
|
|
220
|
+
throw createError(`[Sixb] ${field} manage grant target must be 'connector' or 'aiUsage'.`);
|
|
221
|
+
}
|
|
222
|
+
if (value.capability === "run" && value.target === "agent") {
|
|
223
|
+
if (value.selection !== undefined) {
|
|
224
|
+
throw createError(`[Sixb] ${field} agent run grant must not declare a selection.`);
|
|
225
|
+
}
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
assertSelection(value.selection, field, createError);
|
|
229
|
+
}
|
|
230
|
+
function assertSelection(value, field, createError) {
|
|
231
|
+
if (!isRecord(value) || typeof value.all !== "boolean") {
|
|
232
|
+
throw createError(`[Sixb] ${field} grant must carry a selection from 'can' or a scope.`);
|
|
233
|
+
}
|
|
234
|
+
const ids = value.all ? value.except : value.ids;
|
|
235
|
+
if (!Array.isArray(ids)) {
|
|
236
|
+
throw createError(`[Sixb] ${field} grant selection must list ids.`);
|
|
237
|
+
}
|
|
238
|
+
for (const id of ids) {
|
|
239
|
+
assertNonEmptyString(id, `${field} grant selection id`, createError);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
function assertRoleDefinition(value, createError = (message) => new SecurityValidationError2(message)) {
|
|
243
|
+
if (!isRecord(value)) {
|
|
244
|
+
throw createError("[Sixb] Role definition must be an object.");
|
|
245
|
+
}
|
|
246
|
+
if (value.kind !== "role") {
|
|
247
|
+
throw createError("[Sixb] Role definition kind must be 'role'.");
|
|
248
|
+
}
|
|
249
|
+
assertNonEmptyString(value.id, "Role id", createError);
|
|
250
|
+
assertOptionalString(value.label, `Role '${value.id}' label`, createError);
|
|
251
|
+
assertOptionalString(value.description, `Role '${value.id}' description`, createError);
|
|
252
|
+
assertStringArray(value.grantedToGroupIds, `Role '${value.id}' grantedTo`, createError);
|
|
253
|
+
if (!Array.isArray(value.grants)) {
|
|
254
|
+
throw createError(`[Sixb] Role '${value.id}' grants must be an array.`);
|
|
255
|
+
}
|
|
256
|
+
for (const grant of value.grants) {
|
|
257
|
+
assertGrantDefinition(grant, `Role '${value.id}' grants`, createError);
|
|
258
|
+
}
|
|
259
|
+
if (value.clearances !== undefined) {
|
|
260
|
+
assertStringArray(value.clearances, `Role '${value.id}' clearances`, createError);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
function isRoleDefinition(value) {
|
|
264
|
+
try {
|
|
265
|
+
assertRoleDefinition(value, (message) => new Error(message));
|
|
266
|
+
return true;
|
|
267
|
+
} catch {
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
function validateSecurityDefinitionsAtStartup(input) {
|
|
272
|
+
const markingsById = new Map;
|
|
273
|
+
const groupsById = new Map;
|
|
274
|
+
const rolesById = new Map;
|
|
275
|
+
const membershipPoliciesById = new Map;
|
|
276
|
+
for (const marking of input.markings ?? []) {
|
|
277
|
+
assertMarkingDefinition(marking);
|
|
278
|
+
if (markingsById.has(marking.id)) {
|
|
279
|
+
throw new SecurityValidationError2(`[Sixb] Duplicate marking id: ${marking.id}`);
|
|
280
|
+
}
|
|
281
|
+
markingsById.set(marking.id, marking);
|
|
282
|
+
}
|
|
283
|
+
for (const group of input.groups) {
|
|
284
|
+
assertGroupDefinition(group);
|
|
285
|
+
if (groupsById.has(group.id)) {
|
|
286
|
+
throw new SecurityValidationError2(`[Sixb] Duplicate group id: ${group.id}`);
|
|
287
|
+
}
|
|
288
|
+
groupsById.set(group.id, group);
|
|
289
|
+
}
|
|
290
|
+
for (const role of input.roles ?? []) {
|
|
291
|
+
assertRoleDefinition(role);
|
|
292
|
+
if (rolesById.has(role.id)) {
|
|
293
|
+
throw new SecurityValidationError2(`[Sixb] Duplicate role id: ${role.id}`);
|
|
294
|
+
}
|
|
295
|
+
if (role.grantedToGroupIds.length === 0) {
|
|
296
|
+
throw new SecurityValidationError2(`[Sixb] Role '${role.id}' must be granted to at least one group.`);
|
|
297
|
+
}
|
|
298
|
+
const clearances = role.clearances ?? [];
|
|
299
|
+
if (role.grants.length === 0 && clearances.length === 0) {
|
|
300
|
+
throw new SecurityValidationError2(`[Sixb] Role '${role.id}' must declare at least one grant or clearance.`);
|
|
301
|
+
}
|
|
302
|
+
assertNoDuplicateIds(role.grantedToGroupIds, `Role '${role.id}' grantedTo`);
|
|
303
|
+
assertNoDuplicateIds(clearances, `Role '${role.id}' clearances`);
|
|
304
|
+
for (const markingId of clearances) {
|
|
305
|
+
if (!markingsById.has(markingId)) {
|
|
306
|
+
throw new SecurityValidationError2(`[Sixb] Role '${role.id}' clearances reference unknown marking '${markingId}'. Add it to 'security/markings/' or pass it to createSixb({ markings }).`);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
for (const groupId of role.grantedToGroupIds) {
|
|
310
|
+
if (!groupsById.has(groupId)) {
|
|
311
|
+
throw new SecurityValidationError2(`[Sixb] Role '${role.id}' grantedTo references unknown group '${groupId}'. Add it to 'security/groups/' or pass it to createSixb({ groups }).`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
for (const grant of role.grants) {
|
|
315
|
+
assertGrantReferences(role.id, grant, input);
|
|
316
|
+
}
|
|
317
|
+
rolesById.set(role.id, role);
|
|
318
|
+
}
|
|
319
|
+
for (const policy of input.membershipPolicies) {
|
|
320
|
+
assertMembershipPolicyDefinition(policy);
|
|
321
|
+
if (membershipPoliciesById.has(policy.id)) {
|
|
322
|
+
throw new SecurityValidationError2(`[Sixb] Duplicate membership policy id: ${policy.id}`);
|
|
323
|
+
}
|
|
324
|
+
if (policy.grantedToGroupIds.length === 0) {
|
|
325
|
+
throw new SecurityValidationError2(`[Sixb] Membership policy '${policy.id}' must grant membership authority to at least one group.`);
|
|
326
|
+
}
|
|
327
|
+
if (policy.can.length === 0) {
|
|
328
|
+
throw new SecurityValidationError2(`[Sixb] Membership policy '${policy.id}' must declare at least one operation.`);
|
|
329
|
+
}
|
|
330
|
+
assertNoDuplicateIds(policy.grantedToGroupIds, `Membership policy '${policy.id}' grantedTo`);
|
|
331
|
+
assertNoDuplicateIds(policy.scopeGroupIds, `Membership policy '${policy.id}' scope`);
|
|
332
|
+
assertNoDuplicateOperations(policy.can, `Membership policy '${policy.id}' can`);
|
|
333
|
+
for (const groupId of policy.grantedToGroupIds) {
|
|
334
|
+
if (!groupsById.has(groupId)) {
|
|
335
|
+
throw new SecurityValidationError2(`[Sixb] Membership policy '${policy.id}' grantedTo references unknown group '${groupId}'. Add it to 'security/groups/' or pass it to createSixb({ groups }).`);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
for (const groupId of policy.scopeGroupIds) {
|
|
339
|
+
if (!groupsById.has(groupId)) {
|
|
340
|
+
throw new SecurityValidationError2(`[Sixb] Membership policy '${policy.id}' scope references unknown group '${groupId}'. Add it to 'security/groups/' or pass it to createSixb({ groups }).`);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
membershipPoliciesById.set(policy.id, policy);
|
|
344
|
+
}
|
|
345
|
+
return {
|
|
346
|
+
markings: [...markingsById.values()],
|
|
347
|
+
markingsById,
|
|
348
|
+
groups: [...groupsById.values()],
|
|
349
|
+
groupsById,
|
|
350
|
+
roles: [...rolesById.values()],
|
|
351
|
+
rolesById,
|
|
352
|
+
membershipPolicies: [...membershipPoliciesById.values()],
|
|
353
|
+
membershipPoliciesById
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
function assertGrantReferences(roleId, grant, registered) {
|
|
357
|
+
if (grant.capability === "run" && grant.target === "agent") {
|
|
358
|
+
const spec = GRANT_KINDS[grantKindOf(grant)];
|
|
359
|
+
if (!registered.agentAvailable) {
|
|
360
|
+
throw new SecurityValidationError2(`[Sixb] Role '${roleId}' grants ${grant.capability} on the project Agent, but it is unavailable. ${spec.fix}`);
|
|
361
|
+
}
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
const spec = GRANT_KINDS[grantKindOf(grant)];
|
|
365
|
+
const universe = registered[spec.universeKey];
|
|
366
|
+
if (!universe) {
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
const ids = grant.selection.all ? grant.selection.except : grant.selection.ids;
|
|
370
|
+
for (const id of ids) {
|
|
371
|
+
if (!universe.has(id)) {
|
|
372
|
+
throw new SecurityValidationError2(`[Sixb] Role '${roleId}' grants ${grant.capability} on unknown ${spec.subject} '${id}'. ${spec.fix}`);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// src/security/builders.ts
|
|
378
|
+
var MEMBERSHIP_OPERATIONS2 = new Set(["invite", "assignGroups", "suspend"]);
|
|
379
|
+
function assertNonEmptyArray(value, field) {
|
|
380
|
+
if (value.length === 0) {
|
|
381
|
+
throw new SecurityValidationError2(`[Sixb] ${field} must not be empty.`);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
function groupIdsFrom(groups, field) {
|
|
385
|
+
return groups.map((group) => {
|
|
386
|
+
if (!isRecord(group) || group.kind !== "group") {
|
|
387
|
+
throw new SecurityValidationError2(`[Sixb] ${field} must contain only group definitions.`);
|
|
388
|
+
}
|
|
389
|
+
assertNonEmptyString(group.id, `${field} group id`);
|
|
390
|
+
return group.id;
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
function membershipOperationsFrom(operations, field) {
|
|
394
|
+
return operations.map((operation) => {
|
|
395
|
+
if (!MEMBERSHIP_OPERATIONS2.has(operation)) {
|
|
396
|
+
throw new SecurityValidationError2(`[Sixb] ${field} must contain only membership operations: invite, assignGroups, suspend.`);
|
|
397
|
+
}
|
|
398
|
+
return operation;
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
function defineGroup2(id, options = {}) {
|
|
402
|
+
assertNonEmptyString(id, "Group id");
|
|
403
|
+
assertOptionalString(options.label, `Group '${id}' label`);
|
|
404
|
+
assertOptionalString(options.description, `Group '${id}' description`);
|
|
405
|
+
return {
|
|
406
|
+
kind: "group",
|
|
407
|
+
id,
|
|
408
|
+
...options.label !== undefined ? { label: options.label } : {},
|
|
409
|
+
...options.description !== undefined ? { description: options.description } : {}
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
function markingIdsFrom(markings, field) {
|
|
413
|
+
return markings.map((marking) => {
|
|
414
|
+
if (!isRecord(marking) || marking.kind !== "marking") {
|
|
415
|
+
throw new SecurityValidationError2(`[Sixb] ${field} must contain only marking definitions.`);
|
|
416
|
+
}
|
|
417
|
+
assertNonEmptyString(marking.id, `${field} marking id`);
|
|
418
|
+
return marking.id;
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
function defineMarking2(id, options = {}) {
|
|
422
|
+
assertNonEmptyString(id, "Marking id");
|
|
423
|
+
assertOptionalString(options.label, `Marking '${id}' label`);
|
|
424
|
+
assertOptionalString(options.description, `Marking '${id}' description`);
|
|
425
|
+
return {
|
|
426
|
+
kind: "marking",
|
|
427
|
+
id,
|
|
428
|
+
...options.label !== undefined ? { label: options.label } : {},
|
|
429
|
+
...options.description !== undefined ? { description: options.description } : {}
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
function defineRole2(id, options) {
|
|
433
|
+
assertNonEmptyString(id, "Role id");
|
|
434
|
+
assertOptionalString(options.label, `Role '${id}' label`);
|
|
435
|
+
assertOptionalString(options.description, `Role '${id}' description`);
|
|
436
|
+
assertNonEmptyArray(options.grantedTo, `Role '${id}' grantedTo`);
|
|
437
|
+
const grantedToGroupIds = groupIdsFrom(options.grantedTo, `Role '${id}' grantedTo`);
|
|
438
|
+
const grants = options.grants ?? [];
|
|
439
|
+
const clearances = markingIdsFrom(options.clearances ?? [], `Role '${id}' clearances`);
|
|
440
|
+
for (const grant of grants) {
|
|
441
|
+
assertGrantDefinition(grant, `Role '${id}' grants`);
|
|
442
|
+
}
|
|
443
|
+
if (grants.length === 0 && clearances.length === 0) {
|
|
444
|
+
throw new SecurityValidationError2(`[Sixb] Role '${id}' must declare at least one grant or clearance.`);
|
|
445
|
+
}
|
|
446
|
+
return {
|
|
447
|
+
kind: "role",
|
|
448
|
+
id,
|
|
449
|
+
...options.label !== undefined ? { label: options.label } : {},
|
|
450
|
+
...options.description !== undefined ? { description: options.description } : {},
|
|
451
|
+
grantedToGroupIds,
|
|
452
|
+
grants,
|
|
453
|
+
...clearances.length > 0 ? { clearances } : {}
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
function defineMembershipPolicy2(id, options) {
|
|
457
|
+
assertNonEmptyString(id, "Membership policy id");
|
|
458
|
+
assertNonEmptyArray(options.grantedTo, `Membership policy '${id}' grantedTo`);
|
|
459
|
+
assertNonEmptyArray(options.can, `Membership policy '${id}' can`);
|
|
460
|
+
return {
|
|
461
|
+
kind: "membershipPolicy",
|
|
462
|
+
id,
|
|
463
|
+
grantedToGroupIds: groupIdsFrom(options.grantedTo, `Membership policy '${id}' grantedTo`),
|
|
464
|
+
scopeGroupIds: groupIdsFrom(options.scope, `Membership policy '${id}' scope`),
|
|
465
|
+
can: membershipOperationsFrom(options.can, `Membership policy '${id}' can`)
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
export { SecurityValidationError2, resolveMembershipPolicyScope, canPerformMembershipOperation, missingMembershipGroupIds, isMarkingDefinition, isGroupDefinition, isMembershipPolicyDefinition, isRoleDefinition, validateSecurityDefinitionsAtStartup, defineGroup2, markingIdsFrom, defineMarking2, defineRole2, defineMembershipPolicy2 };
|
|
470
|
+
|
|
471
|
+
//# debugId=5DED6666AEF6ACF164756E2164756E21
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/security/errors.ts", "../src/security/membership-policies.ts", "../src/security/validation.ts", "../src/security/builders.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"export class SecurityValidationError extends Error {\n readonly name = \"SecurityValidationError\"\n}\n",
|
|
6
|
+
"import type { MembershipOperation, MembershipPolicyDefinition } from \"./types\"\n\nexport interface MembershipOperationScope {\n readonly policyIds: readonly string[]\n readonly groupIds: ReadonlySet<string>\n}\n\nexport interface MembershipPolicyScope {\n readonly policyIds: readonly string[]\n readonly operations: Readonly<Record<MembershipOperation, MembershipOperationScope>>\n}\n\nconst MEMBERSHIP_OPERATIONS = [\"invite\", \"assignGroups\", \"suspend\"] as const\n\nexport function resolveMembershipPolicyScope(input: {\n readonly membershipPolicies: readonly MembershipPolicyDefinition[]\n readonly callerGroupIds: readonly string[]\n}): MembershipPolicyScope {\n const callerGroups = new Set(input.callerGroupIds)\n const policyIds: string[] = []\n const operations = createEmptyOperationScopes()\n\n for (const policy of input.membershipPolicies) {\n if (!policy.grantedToGroupIds.some((groupId) => callerGroups.has(groupId))) {\n continue\n }\n\n policyIds.push(policy.id)\n for (const operation of policy.can) {\n operations[operation].policyIds.push(policy.id)\n for (const groupId of policy.scopeGroupIds) {\n operations[operation].groupIds.add(groupId)\n }\n }\n }\n\n return {\n policyIds,\n operations: {\n invite: freezeOperationScope(operations.invite),\n assignGroups: freezeOperationScope(operations.assignGroups),\n suspend: freezeOperationScope(operations.suspend),\n },\n }\n}\n\nexport function canPerformMembershipOperation(\n scope: MembershipPolicyScope,\n operation: MembershipOperation,\n groupIds: readonly string[]\n): boolean {\n const operationScope = scope.operations[operation]\n\n if (operationScope.policyIds.length === 0) {\n return false\n }\n\n if (groupIds.length === 0) {\n return true\n }\n\n return groupIds.every((groupId) => operationScope.groupIds.has(groupId))\n}\n\nexport function missingMembershipGroupIds(\n scope: MembershipPolicyScope,\n operation: MembershipOperation,\n groupIds: readonly string[]\n): readonly string[] {\n if (groupIds.length === 0) {\n return []\n }\n\n const operationScope = scope.operations[operation]\n return groupIds.filter((groupId) => !operationScope.groupIds.has(groupId))\n}\n\nfunction createEmptyOperationScopes(): Record<\n MembershipOperation,\n { policyIds: string[]; groupIds: Set<string> }\n> {\n return {\n invite: { policyIds: [], groupIds: new Set<string>() },\n assignGroups: { policyIds: [], groupIds: new Set<string>() },\n suspend: { policyIds: [], groupIds: new Set<string>() },\n }\n}\n\nfunction freezeOperationScope(input: {\n readonly policyIds: readonly string[]\n readonly groupIds: ReadonlySet<string>\n}): MembershipOperationScope {\n return {\n policyIds: [...input.policyIds],\n groupIds: new Set(input.groupIds),\n }\n}\n\nexport function isMembershipOperation(value: unknown): value is MembershipOperation {\n return MEMBERSHIP_OPERATIONS.includes(value as MembershipOperation)\n}\n",
|
|
7
|
+
"import { GRANT_KINDS, type GrantUniverseKey, grantKindOf } from \"../authorization/grant-kinds\"\nimport { SecurityValidationError } from \"./errors\"\nimport { isMembershipOperation } from \"./membership-policies\"\nimport type {\n GrantCapability,\n GrantDefinition,\n GroupDefinition,\n MarkingDefinition,\n MembershipPolicyDefinition,\n RegisteredSecurityDefinitions,\n RoleDefinition,\n Selection,\n} from \"./types\"\n\n/** Registered id universes and singleton capabilities available to role grants. */\ntype RegisteredUniverses = Partial<Record<GrantUniverseKey, ReadonlySet<string>>> & {\n readonly agentAvailable?: boolean\n}\n\n/**\n * Every grant capability, for validating grants that arrive from untyped code.\n *\n * Written as a total `Record<GrantCapability, true>` rather than a bare array so a capability added\n * to `GrantDefinition` is a compile error here — the same discipline `GRANT_KINDS` uses. The\n * hand-written `capability !== \"access\" && …` chain this replaces would have accepted the new\n * capability at startup and then died on `GRANT_KINDS[kind].universeKey`.\n */\nconst GRANT_CAPABILITIES = Object.keys({\n access: true,\n view: true,\n edit: true,\n append: true,\n apply: true,\n share: true,\n run: true,\n observe: true,\n manage: true,\n} satisfies Record<GrantCapability, true>) as readonly GrantCapability[]\n\n/** \"'a', 'b', or 'c'\" — the shape the security errors already use. */\nfunction formatAlternatives(values: readonly string[]): string {\n const quoted = values.map((value) => `'${value}'`)\n const last = quoted.at(-1)\n return quoted.length < 2 ? (last ?? \"\") : `${quoted.slice(0, -1).join(\", \")}, or ${last}`\n}\n\nexport type CreateSecurityError = (message: string) => Error\n\n// Shared, single-source validation primitives. The builders reuse these too, so\n// authoring-time and startup-time checks can never drift apart.\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nexport function assertNonEmptyString(\n value: unknown,\n field: string,\n createError: CreateSecurityError = (message) => new SecurityValidationError(message)\n): asserts value is string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw createError(`[Sixb] ${field} must not be empty.`)\n }\n}\n\nexport function assertOptionalString(\n value: unknown,\n field: string,\n createError: CreateSecurityError = (message) => new SecurityValidationError(message)\n): asserts value is string | undefined {\n if (value === undefined) {\n return\n }\n\n if (typeof value !== \"string\") {\n throw createError(`[Sixb] ${field} must be a string.`)\n }\n}\n\nfunction assertStringArray(\n value: unknown,\n field: string,\n createError: CreateSecurityError\n): asserts value is readonly string[] {\n if (!Array.isArray(value)) {\n throw createError(`[Sixb] ${field} must be an array of group ids.`)\n }\n\n for (const item of value) {\n assertNonEmptyString(item, `${field} item`, createError)\n }\n}\n\nfunction assertMembershipOperationArray(\n value: unknown,\n field: string,\n createError: CreateSecurityError\n): asserts value is MembershipPolicyDefinition[\"can\"] {\n if (!Array.isArray(value)) {\n throw createError(`[Sixb] ${field} must be an array of membership operations.`)\n }\n\n for (const item of value) {\n if (!isMembershipOperation(item)) {\n throw createError(\n `[Sixb] ${field} must contain only membership operations: invite, assignGroups, suspend.`\n )\n }\n }\n}\n\nfunction assertNoDuplicateIds(ids: readonly string[], field: string): void {\n const seen = new Set<string>()\n for (const id of ids) {\n if (seen.has(id)) {\n throw new SecurityValidationError(`[Sixb] ${field} contains duplicate group id '${id}'.`)\n }\n seen.add(id)\n }\n}\n\nfunction assertNoDuplicateOperations(\n operations: readonly MembershipPolicyDefinition[\"can\"][number][],\n field: string\n): void {\n const seen = new Set<string>()\n for (const operation of operations) {\n if (seen.has(operation)) {\n throw new SecurityValidationError(\n `[Sixb] ${field} contains duplicate operation '${operation}'.`\n )\n }\n seen.add(operation)\n }\n}\n\nexport function assertMarkingDefinition(\n value: unknown,\n createError: CreateSecurityError = (message) => new SecurityValidationError(message)\n): asserts value is MarkingDefinition {\n if (!isRecord(value)) {\n throw createError(\"[Sixb] Marking definition must be an object.\")\n }\n\n if (value.kind !== \"marking\") {\n throw createError(\"[Sixb] Marking definition kind must be 'marking'.\")\n }\n\n assertNonEmptyString(value.id, \"Marking id\", createError)\n assertOptionalString(value.label, `Marking '${value.id}' label`, createError)\n assertOptionalString(value.description, `Marking '${value.id}' description`, createError)\n}\n\nexport function isMarkingDefinition(value: unknown): value is MarkingDefinition {\n try {\n assertMarkingDefinition(value, (message) => new Error(message))\n return true\n } catch {\n return false\n }\n}\n\nexport function assertGroupDefinition(\n value: unknown,\n createError: CreateSecurityError = (message) => new SecurityValidationError(message)\n): asserts value is GroupDefinition {\n if (!isRecord(value)) {\n throw createError(\"[Sixb] Group definition must be an object.\")\n }\n\n if (value.kind !== \"group\") {\n throw createError(\"[Sixb] Group definition kind must be 'group'.\")\n }\n\n assertNonEmptyString(value.id, \"Group id\", createError)\n assertOptionalString(value.label, `Group '${value.id}' label`, createError)\n assertOptionalString(value.description, `Group '${value.id}' description`, createError)\n}\n\nexport function isGroupDefinition(value: unknown): value is GroupDefinition {\n try {\n assertGroupDefinition(value, (message) => new Error(message))\n return true\n } catch {\n return false\n }\n}\n\nexport function assertMembershipPolicyDefinition(\n value: unknown,\n createError: CreateSecurityError = (message) => new SecurityValidationError(message)\n): asserts value is MembershipPolicyDefinition {\n if (!isRecord(value)) {\n throw createError(\"[Sixb] Membership policy definition must be an object.\")\n }\n\n if (value.kind !== \"membershipPolicy\") {\n throw createError(\"[Sixb] Membership policy definition kind must be 'membershipPolicy'.\")\n }\n\n assertNonEmptyString(value.id, \"Membership policy id\", createError)\n assertStringArray(\n value.grantedToGroupIds,\n `Membership policy '${value.id}' grantedTo`,\n createError\n )\n assertStringArray(value.scopeGroupIds, `Membership policy '${value.id}' scope`, createError)\n assertMembershipOperationArray(value.can, `Membership policy '${value.id}' can`, createError)\n}\n\nexport function isMembershipPolicyDefinition(value: unknown): value is MembershipPolicyDefinition {\n try {\n assertMembershipPolicyDefinition(value, (message) => new Error(message))\n return true\n } catch {\n return false\n }\n}\n\nexport function assertGrantDefinition(\n value: unknown,\n field: string,\n createError: CreateSecurityError = (message) => new SecurityValidationError(message)\n): asserts value is GrantDefinition {\n if (!isRecord(value) || value.kind !== \"grant\") {\n throw createError(`[Sixb] ${field} must contain only grant definitions from 'can'.`)\n }\n\n if (!GRANT_CAPABILITIES.includes(value.capability as GrantCapability)) {\n throw createError(\n `[Sixb] ${field} grant capability must be ${formatAlternatives(GRANT_CAPABILITIES)}.`\n )\n }\n\n if (value.capability === \"access\" && value.target !== \"application\") {\n throw createError(`[Sixb] ${field} access grant target must be 'application'.`)\n }\n\n if (value.capability === \"view\" && value.target !== \"object\" && value.target !== \"dataset\") {\n throw createError(`[Sixb] ${field} view grant target must be 'object' or 'dataset'.`)\n }\n\n if (\n value.capability === \"run\" &&\n value.target !== \"workflow\" &&\n value.target !== \"sync\" &&\n value.target !== \"pipeline\" &&\n value.target !== \"agent\"\n ) {\n throw createError(\n `[Sixb] ${field} run grant target must be 'workflow', 'sync', 'pipeline', or 'agent'.`\n )\n }\n\n if (value.capability === \"observe\" && value.target !== \"logs\" && value.target !== \"aiUsage\") {\n throw createError(`[Sixb] ${field} observe grant target must be 'logs' or 'aiUsage'.`)\n }\n\n if (value.capability === \"manage\" && value.target !== \"connector\" && value.target !== \"aiUsage\") {\n throw createError(`[Sixb] ${field} manage grant target must be 'connector' or 'aiUsage'.`)\n }\n\n if (value.capability === \"run\" && value.target === \"agent\") {\n if (value.selection !== undefined) {\n throw createError(`[Sixb] ${field} agent run grant must not declare a selection.`)\n }\n return\n }\n\n assertSelection(value.selection, field, createError)\n}\n\nfunction assertSelection(\n value: unknown,\n field: string,\n createError: CreateSecurityError\n): asserts value is Selection {\n if (!isRecord(value) || typeof value.all !== \"boolean\") {\n throw createError(`[Sixb] ${field} grant must carry a selection from 'can' or a scope.`)\n }\n\n const ids = value.all ? value.except : value.ids\n if (!Array.isArray(ids)) {\n throw createError(`[Sixb] ${field} grant selection must list ids.`)\n }\n\n for (const id of ids) {\n assertNonEmptyString(id, `${field} grant selection id`, createError)\n }\n}\n\nexport function assertRoleDefinition(\n value: unknown,\n createError: CreateSecurityError = (message) => new SecurityValidationError(message)\n): asserts value is RoleDefinition {\n if (!isRecord(value)) {\n throw createError(\"[Sixb] Role definition must be an object.\")\n }\n\n if (value.kind !== \"role\") {\n throw createError(\"[Sixb] Role definition kind must be 'role'.\")\n }\n\n assertNonEmptyString(value.id, \"Role id\", createError)\n assertOptionalString(value.label, `Role '${value.id}' label`, createError)\n assertOptionalString(value.description, `Role '${value.id}' description`, createError)\n assertStringArray(value.grantedToGroupIds, `Role '${value.id}' grantedTo`, createError)\n\n if (!Array.isArray(value.grants)) {\n throw createError(`[Sixb] Role '${value.id}' grants must be an array.`)\n }\n\n for (const grant of value.grants) {\n assertGrantDefinition(grant, `Role '${value.id}' grants`, createError)\n }\n\n if (value.clearances !== undefined) {\n assertStringArray(value.clearances, `Role '${value.id}' clearances`, createError)\n }\n}\n\nexport function isRoleDefinition(value: unknown): value is RoleDefinition {\n try {\n assertRoleDefinition(value, (message) => new Error(message))\n return true\n } catch {\n return false\n }\n}\n\nexport function validateSecurityDefinitionsAtStartup(input: {\n readonly markings?: readonly MarkingDefinition[]\n readonly groups: readonly GroupDefinition[]\n readonly membershipPolicies: readonly MembershipPolicyDefinition[]\n readonly roles?: readonly RoleDefinition[]\n /** Registered browser application ids — when provided, access grants must reference them. */\n readonly applicationIds?: ReadonlySet<string>\n /** Registered object type ids — when provided, view grants must reference them. */\n readonly objectTypeIds?: ReadonlySet<string>\n /** Registered dataset ids — when provided, dataset view grants must reference them. */\n readonly datasetIds?: ReadonlySet<string>\n /** Registered action ids — when provided, apply grants must reference them. */\n readonly actionIds?: ReadonlySet<string>\n /** Registered workflow ids — when provided, run grants must reference them. */\n readonly workflowIds?: ReadonlySet<string>\n /** Registered sync ids — when provided, sync run grants must reference them. */\n readonly syncIds?: ReadonlySet<string>\n /** Registered pipeline ids — when provided, pipeline run grants must reference them. */\n readonly pipelineIds?: ReadonlySet<string>\n /** Whether the project's single conversational Agent is configured. */\n readonly agentAvailable?: boolean\n /** Registered observability surfaces. */\n readonly observableIds?: ReadonlySet<string>\n /** Registered singleton management surfaces. */\n readonly manageableIds?: ReadonlySet<string>\n /** Registered connector ids — when provided, manage grants must reference them. */\n readonly connectorIds?: ReadonlySet<string>\n /** Registered Share ids — when provided, share grants must reference them. */\n readonly shareIds?: ReadonlySet<string>\n}): RegisteredSecurityDefinitions {\n const markingsById = new Map<string, MarkingDefinition>()\n const groupsById = new Map<string, GroupDefinition>()\n const rolesById = new Map<string, RoleDefinition>()\n const membershipPoliciesById = new Map<string, MembershipPolicyDefinition>()\n\n for (const marking of input.markings ?? []) {\n assertMarkingDefinition(marking)\n\n if (markingsById.has(marking.id)) {\n throw new SecurityValidationError(`[Sixb] Duplicate marking id: ${marking.id}`)\n }\n\n markingsById.set(marking.id, marking)\n }\n\n for (const group of input.groups) {\n assertGroupDefinition(group)\n\n if (groupsById.has(group.id)) {\n throw new SecurityValidationError(`[Sixb] Duplicate group id: ${group.id}`)\n }\n\n groupsById.set(group.id, group)\n }\n\n for (const role of input.roles ?? []) {\n assertRoleDefinition(role)\n\n if (rolesById.has(role.id)) {\n throw new SecurityValidationError(`[Sixb] Duplicate role id: ${role.id}`)\n }\n\n if (role.grantedToGroupIds.length === 0) {\n throw new SecurityValidationError(\n `[Sixb] Role '${role.id}' must be granted to at least one group.`\n )\n }\n\n const clearances = role.clearances ?? []\n if (role.grants.length === 0 && clearances.length === 0) {\n throw new SecurityValidationError(\n `[Sixb] Role '${role.id}' must declare at least one grant or clearance.`\n )\n }\n\n assertNoDuplicateIds(role.grantedToGroupIds, `Role '${role.id}' grantedTo`)\n assertNoDuplicateIds(clearances, `Role '${role.id}' clearances`)\n\n for (const markingId of clearances) {\n if (!markingsById.has(markingId)) {\n throw new SecurityValidationError(\n `[Sixb] Role '${role.id}' clearances reference unknown marking '${markingId}'. Add it to 'security/markings/' or pass it to createSixb({ markings }).`\n )\n }\n }\n\n for (const groupId of role.grantedToGroupIds) {\n if (!groupsById.has(groupId)) {\n throw new SecurityValidationError(\n `[Sixb] Role '${role.id}' grantedTo references unknown group '${groupId}'. Add it to 'security/groups/' or pass it to createSixb({ groups }).`\n )\n }\n }\n\n for (const grant of role.grants) {\n assertGrantReferences(role.id, grant, input)\n }\n\n rolesById.set(role.id, role)\n }\n\n for (const policy of input.membershipPolicies) {\n assertMembershipPolicyDefinition(policy)\n\n if (membershipPoliciesById.has(policy.id)) {\n throw new SecurityValidationError(`[Sixb] Duplicate membership policy id: ${policy.id}`)\n }\n\n if (policy.grantedToGroupIds.length === 0) {\n throw new SecurityValidationError(\n `[Sixb] Membership policy '${policy.id}' must grant membership authority to at least one group.`\n )\n }\n\n if (policy.can.length === 0) {\n throw new SecurityValidationError(\n `[Sixb] Membership policy '${policy.id}' must declare at least one operation.`\n )\n }\n\n assertNoDuplicateIds(policy.grantedToGroupIds, `Membership policy '${policy.id}' grantedTo`)\n assertNoDuplicateIds(policy.scopeGroupIds, `Membership policy '${policy.id}' scope`)\n assertNoDuplicateOperations(policy.can, `Membership policy '${policy.id}' can`)\n\n for (const groupId of policy.grantedToGroupIds) {\n if (!groupsById.has(groupId)) {\n throw new SecurityValidationError(\n `[Sixb] Membership policy '${policy.id}' grantedTo references unknown group '${groupId}'. Add it to 'security/groups/' or pass it to createSixb({ groups }).`\n )\n }\n }\n\n for (const groupId of policy.scopeGroupIds) {\n if (!groupsById.has(groupId)) {\n throw new SecurityValidationError(\n `[Sixb] Membership policy '${policy.id}' scope references unknown group '${groupId}'. Add it to 'security/groups/' or pass it to createSixb({ groups }).`\n )\n }\n }\n\n membershipPoliciesById.set(policy.id, policy)\n }\n\n return {\n markings: [...markingsById.values()],\n markingsById,\n groups: [...groupsById.values()],\n groupsById,\n roles: [...rolesById.values()],\n rolesById,\n membershipPolicies: [...membershipPoliciesById.values()],\n membershipPoliciesById,\n }\n}\n\nfunction assertGrantReferences(\n roleId: string,\n grant: GrantDefinition,\n registered: RegisteredUniverses\n): void {\n if (grant.capability === \"run\" && grant.target === \"agent\") {\n const spec = GRANT_KINDS[grantKindOf(grant)]\n if (!registered.agentAvailable) {\n throw new SecurityValidationError(\n `[Sixb] Role '${roleId}' grants ${grant.capability} on the project Agent, but it is unavailable. ${spec.fix}`\n )\n }\n return\n }\n const spec = GRANT_KINDS[grantKindOf(grant)]\n const universe = registered[spec.universeKey]\n\n if (!universe) {\n return\n }\n\n // Explicit selections list ids to include; \"all except\" selections list ids\n // to exclude. Either way every named id must be registered — an unknown id is\n // a typo that would silently widen or no-op the grant.\n const ids = grant.selection.all ? grant.selection.except : grant.selection.ids\n\n for (const id of ids) {\n if (!universe.has(id)) {\n throw new SecurityValidationError(\n `[Sixb] Role '${roleId}' grants ${grant.capability} on unknown ${spec.subject} '${id}'. ${spec.fix}`\n )\n }\n }\n}\n",
|
|
8
|
+
"import { SecurityValidationError } from \"./errors\"\nimport type {\n GrantDefinition,\n GroupDefinition,\n MarkingDefinition,\n MembershipOperation,\n MembershipPolicyDefinition,\n RoleDefinition,\n} from \"./types\"\nimport {\n assertGrantDefinition,\n assertNonEmptyString,\n assertOptionalString,\n isRecord,\n} from \"./validation\"\n\nexport interface DefineGroupOptions {\n readonly label?: string\n readonly description?: string\n}\n\nexport interface DefineMarkingOptions {\n readonly label?: string\n readonly description?: string\n}\n\nexport interface DefineRoleOptions {\n readonly label?: string\n readonly description?: string\n readonly grantedTo: readonly GroupDefinition[]\n readonly grants?: readonly GrantDefinition[]\n /** Markings this role's members may read. */\n readonly clearances?: readonly MarkingDefinition[]\n}\n\nexport interface DefineMembershipPolicyOptions {\n readonly grantedTo: readonly GroupDefinition[]\n readonly scope: readonly GroupDefinition[]\n readonly can: readonly MembershipOperation[]\n}\n\nconst MEMBERSHIP_OPERATIONS = new Set<MembershipOperation>([\"invite\", \"assignGroups\", \"suspend\"])\n\nfunction assertNonEmptyArray<T>(value: readonly T[], field: string): void {\n if (value.length === 0) {\n throw new SecurityValidationError(`[Sixb] ${field} must not be empty.`)\n }\n}\n\nfunction groupIdsFrom(groups: readonly GroupDefinition[], field: string): readonly string[] {\n return groups.map((group) => {\n if (!isRecord(group) || group.kind !== \"group\") {\n throw new SecurityValidationError(`[Sixb] ${field} must contain only group definitions.`)\n }\n\n assertNonEmptyString(group.id, `${field} group id`)\n return group.id\n })\n}\n\nfunction membershipOperationsFrom(\n operations: readonly MembershipOperation[],\n field: string\n): readonly MembershipOperation[] {\n return operations.map((operation) => {\n if (!MEMBERSHIP_OPERATIONS.has(operation)) {\n throw new SecurityValidationError(\n `[Sixb] ${field} must contain only membership operations: invite, assignGroups, suspend.`\n )\n }\n\n return operation\n })\n}\n\nexport function defineGroup<const TId extends string>(\n id: TId,\n options: DefineGroupOptions = {}\n): GroupDefinition<TId> {\n assertNonEmptyString(id, \"Group id\")\n assertOptionalString(options.label, `Group '${id}' label`)\n assertOptionalString(options.description, `Group '${id}' description`)\n\n return {\n kind: \"group\",\n id,\n ...(options.label !== undefined ? { label: options.label } : {}),\n ...(options.description !== undefined ? { description: options.description } : {}),\n }\n}\n\n/** Read the ids of marking definitions, rejecting anything else such as a bare id. */\nexport function markingIdsFrom(\n markings: readonly MarkingDefinition[],\n field: string\n): readonly string[] {\n return markings.map((marking) => {\n if (!isRecord(marking) || marking.kind !== \"marking\") {\n throw new SecurityValidationError(`[Sixb] ${field} must contain only marking definitions.`)\n }\n\n assertNonEmptyString(marking.id, `${field} marking id`)\n return marking.id\n })\n}\n\nexport function defineMarking<const TId extends string>(\n id: TId,\n options: DefineMarkingOptions = {}\n): MarkingDefinition<TId> {\n assertNonEmptyString(id, \"Marking id\")\n assertOptionalString(options.label, `Marking '${id}' label`)\n assertOptionalString(options.description, `Marking '${id}' description`)\n\n return {\n kind: \"marking\",\n id,\n ...(options.label !== undefined ? { label: options.label } : {}),\n ...(options.description !== undefined ? { description: options.description } : {}),\n }\n}\n\nexport function defineRole<const TId extends string>(\n id: TId,\n options: DefineRoleOptions\n): RoleDefinition<TId> {\n assertNonEmptyString(id, \"Role id\")\n assertOptionalString(options.label, `Role '${id}' label`)\n assertOptionalString(options.description, `Role '${id}' description`)\n assertNonEmptyArray(options.grantedTo, `Role '${id}' grantedTo`)\n\n const grantedToGroupIds = groupIdsFrom(options.grantedTo, `Role '${id}' grantedTo`)\n const grants = options.grants ?? []\n const clearances = markingIdsFrom(options.clearances ?? [], `Role '${id}' clearances`)\n\n for (const grant of grants) {\n assertGrantDefinition(grant, `Role '${id}' grants`)\n }\n\n if (grants.length === 0 && clearances.length === 0) {\n throw new SecurityValidationError(\n `[Sixb] Role '${id}' must declare at least one grant or clearance.`\n )\n }\n\n return {\n kind: \"role\",\n id,\n ...(options.label !== undefined ? { label: options.label } : {}),\n ...(options.description !== undefined ? { description: options.description } : {}),\n grantedToGroupIds,\n grants,\n ...(clearances.length > 0 ? { clearances } : {}),\n }\n}\n\nexport function defineMembershipPolicy<const TId extends string>(\n id: TId,\n options: DefineMembershipPolicyOptions\n): MembershipPolicyDefinition<TId> {\n assertNonEmptyString(id, \"Membership policy id\")\n assertNonEmptyArray(options.grantedTo, `Membership policy '${id}' grantedTo`)\n assertNonEmptyArray(options.can, `Membership policy '${id}' can`)\n\n return {\n kind: \"membershipPolicy\",\n id,\n grantedToGroupIds: groupIdsFrom(options.grantedTo, `Membership policy '${id}' grantedTo`),\n scopeGroupIds: groupIdsFrom(options.scope, `Membership policy '${id}' scope`),\n can: membershipOperationsFrom(options.can, `Membership policy '${id}' can`),\n }\n}\n"
|
|
9
|
+
],
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "5DED6666AEF6ACF164756E2164756E21",
|
|
12
|
+
"names": []
|
|
13
|
+
}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
// @bun
|
|
2
|
+
import {
|
|
3
|
+
isFileRef2,
|
|
4
|
+
isValidFileRef
|
|
5
|
+
} from "./chunk-jhm3zsa7.js";
|
|
2
6
|
import {
|
|
3
7
|
withFailureMessage
|
|
4
8
|
} from "./chunk-z3y5kg1x.js";
|
|
@@ -12,9 +16,6 @@ import {
|
|
|
12
16
|
normalizeDecimalValue2,
|
|
13
17
|
isDecimalString2
|
|
14
18
|
} from "./chunk-3bh94gbw.js";
|
|
15
|
-
import {
|
|
16
|
-
isFileRef2
|
|
17
|
-
} from "./chunk-h3v76ams.js";
|
|
18
19
|
import {
|
|
19
20
|
assertJsonValue2,
|
|
20
21
|
cloneJsonValue2
|
|
@@ -199,6 +200,21 @@ function validateSchemaValue2(schema, value, path, valueTypesById, diagnosticPat
|
|
|
199
200
|
validateSchemaValue2(resolveValueTypeSchema2(schema, valueTypesById, path), value, path, valueTypesById, diagnosticPath);
|
|
200
201
|
}
|
|
201
202
|
}
|
|
203
|
+
function assertValidFileRefs2(value, path) {
|
|
204
|
+
if (isFileRef2(value)) {
|
|
205
|
+
if (!isValidFileRef(value)) {
|
|
206
|
+
throw withFailureMessage(new OntologyValidationError2(`[Sixb] Property ${path}.mediaType must be one media type, such as "application/pdf"`), `Property ${path}.mediaType must be one media type, such as "application/pdf".`);
|
|
207
|
+
}
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
if (Array.isArray(value)) {
|
|
211
|
+
for (const [index, item] of value.entries())
|
|
212
|
+
assertValidFileRefs2(item, `${path}[${index}]`);
|
|
213
|
+
} else if (isRecord2(value)) {
|
|
214
|
+
for (const [key, item] of Object.entries(value))
|
|
215
|
+
assertValidFileRefs2(item, `${path}.${key}`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
202
218
|
function validateFieldValue(field, value, path, valueTypesById, diagnosticPath = path) {
|
|
203
219
|
if (value === null) {
|
|
204
220
|
if (field.nullable) {
|
|
@@ -1531,6 +1547,6 @@ function validateTelemetryUnit2(property, propertyPath, unit, valueTypesById) {
|
|
|
1531
1547
|
throw new OntologyValidationError2(`[Sixb] Property ${propertyPath} does not define semanticType and cannot accept a unit`);
|
|
1532
1548
|
}
|
|
1533
1549
|
}
|
|
1534
|
-
export { userRef2, collectUserRefIds, userReferenceProblem, validateSchemaValue2, resolveValueTypeRef2, resolveValueTypeSchema2, isRecord2, normalizeObjectProperties2, normalizeSchemaValue2, coerceSchemaValueToTyped2, isPrimitiveSchema, primitiveTraits, assertObjectTypeRegistered2, assertPropertyTokenBelongsToObjectType2, assertLinkTokenBelongsToObjectType2, assertKnownProperties2, assertRequiredProperties2, validateObjectProperties2, validatePrimaryProperties2, validatePropertyDefinitions2, validatePropertyValue2, findPrimitiveSchema, assertLinkTargetType2, assertTargetTypeCompatible2, normalizeLinkProperties2, validateLinkProperties2, isExactSchema, isSortableSchema, isTextSchema, isContainsSchema, queryScalarKindForSchema, resolvePropertyQueryCapabilities2, resolveQuerySchema, validateQueryMetadata2, quantitativeTypes2, getUnit2, getUnitsFor2, isValidUnit2, getUnitSymbol2, isQuantitativeTypeId2, isUnitId2, assertTelemetryProperty2, resolveSemanticType2, validateTelemetryUnit2 };
|
|
1550
|
+
export { userRef2, collectUserRefIds, userReferenceProblem, validateSchemaValue2, assertValidFileRefs2, resolveValueTypeRef2, resolveValueTypeSchema2, isRecord2, normalizeObjectProperties2, normalizeSchemaValue2, coerceSchemaValueToTyped2, isPrimitiveSchema, primitiveTraits, assertObjectTypeRegistered2, assertPropertyTokenBelongsToObjectType2, assertLinkTokenBelongsToObjectType2, assertKnownProperties2, assertRequiredProperties2, validateObjectProperties2, validatePrimaryProperties2, validatePropertyDefinitions2, validatePropertyValue2, findPrimitiveSchema, assertLinkTargetType2, assertTargetTypeCompatible2, normalizeLinkProperties2, validateLinkProperties2, isExactSchema, isSortableSchema, isTextSchema, isContainsSchema, queryScalarKindForSchema, resolvePropertyQueryCapabilities2, resolveQuerySchema, validateQueryMetadata2, quantitativeTypes2, getUnit2, getUnitsFor2, isValidUnit2, getUnitSymbol2, isQuantitativeTypeId2, isUnitId2, assertTelemetryProperty2, resolveSemanticType2, validateTelemetryUnit2 };
|
|
1535
1551
|
|
|
1536
|
-
//# debugId=
|
|
1552
|
+
//# debugId=25E5D0DEAD07D8DD64756E2164756E21
|