@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
|
@@ -1,17 +1,27 @@
|
|
|
1
1
|
// @bun
|
|
2
|
+
import {
|
|
3
|
+
isFileRef2,
|
|
4
|
+
isValidFileRef
|
|
5
|
+
} from "./chunk-jhm3zsa7.js";
|
|
2
6
|
import {
|
|
3
7
|
getDatasetRowValidationFailure
|
|
4
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-rz53yb4v.js";
|
|
5
9
|
import {
|
|
6
10
|
getDatasetMergeChangeValidationError2
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import {
|
|
9
|
-
isFileRef2
|
|
10
|
-
} from "./chunk-h3v76ams.js";
|
|
11
|
+
} from "./chunk-bwjcehza.js";
|
|
11
12
|
|
|
12
13
|
// src/datasets/write.ts
|
|
14
|
+
function lakeDatasetDefinition2(dataset) {
|
|
15
|
+
if (!dataset.schema.columns.some((column) => column.markings))
|
|
16
|
+
return dataset;
|
|
17
|
+
return {
|
|
18
|
+
...dataset,
|
|
19
|
+
schema: { columns: dataset.schema.columns.map(({ markings: _markings, ...column }) => column) }
|
|
20
|
+
};
|
|
21
|
+
}
|
|
13
22
|
async function writeDataset2(input) {
|
|
14
|
-
const { lakeStorage,
|
|
23
|
+
const { lakeStorage, signal } = input;
|
|
24
|
+
const dataset = lakeDatasetDefinition2(input.dataset);
|
|
15
25
|
let abortWrite;
|
|
16
26
|
let rowsRead = 0;
|
|
17
27
|
const onRead = () => {
|
|
@@ -115,8 +125,11 @@ async function verifyRowFileRefs(row, input, itemIndex) {
|
|
|
115
125
|
}
|
|
116
126
|
}
|
|
117
127
|
async function verifyFileRef(fileRef, input, columnName, itemIndex) {
|
|
118
|
-
const blobInfo = await input.blobStorage.stat(fileRef.blobId);
|
|
119
128
|
const context = `${sourceLabel(input)} returned row ${itemIndex} with dataset '${input.dataset.id}' column '${columnName}'`;
|
|
129
|
+
if (!isValidFileRef(fileRef)) {
|
|
130
|
+
throw new Error(`${context} with an invalid mediaType; use one media type, such as "application/pdf".`);
|
|
131
|
+
}
|
|
132
|
+
const blobInfo = await input.blobStorage.stat(fileRef.blobId);
|
|
120
133
|
if (!blobInfo) {
|
|
121
134
|
throw new Error(`${context} referencing unknown blob '${fileRef.blobId}'.`);
|
|
122
135
|
}
|
|
@@ -137,6 +150,6 @@ function throwIfAborted(signal) {
|
|
|
137
150
|
throw error;
|
|
138
151
|
}
|
|
139
152
|
|
|
140
|
-
export { writeDataset2 };
|
|
153
|
+
export { lakeDatasetDefinition2, writeDataset2 };
|
|
141
154
|
|
|
142
|
-
//# debugId=
|
|
155
|
+
//# debugId=CDE5D84B182CBD5A64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/datasets/write.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { BlobStorage, FileRef } from \"../blob-storage\"\nimport { isFileRef } from \"../blob-storage\"\nimport { isValidFileRef } from \"../blob-storage/validation\"\nimport type { DatasetMergeCommitResult } from \"../lake-storage/merge\"\nimport { getDatasetMergeChangeValidationError } from \"../lake-storage/merge-validation\"\nimport type {\n DatasetProducer,\n DatasetRow,\n DatasetWriteMode,\n LakeStorage,\n} from \"../lake-storage/types\"\nimport type { MergeChange } from \"./changes\"\nimport type { DatasetDefinition } from \"./types\"\nimport { getDatasetRowValidationFailure } from \"./validation\"\n\nexport interface DatasetWriteValue {\n readonly value: unknown\n}\n\nexport interface WriteDatasetInput<TValue extends DatasetWriteValue = DatasetWriteValue> {\n readonly lakeStorage: LakeStorage\n readonly blobStorage: Pick<BlobStorage, \"stat\">\n readonly dataset: DatasetDefinition\n readonly mode: DatasetWriteMode | \"merge\"\n readonly signal: AbortSignal\n /** Lazy so a merge's latest-version guard is checked before fetching source data. */\n readValues(): Promise<Iterable<TValue> | AsyncIterable<TValue>>\n readonly producer?: DatasetProducer\n readonly expectedLatestVersionId?: string\n readonly commitMessage?: string\n /** Diagnostic label for the caller, including its component prefix. */\n readonly sourceLabel?: string\n /** Progress includes validated values even if the operation subsequently fails. */\n onRead?(rowsRead: number): void\n /** Attach caller-owned source provenance to a validation failure. */\n mapValidationError?(error: unknown, value: TValue, itemIndex: number): unknown\n}\n\nexport type WriteDatasetResult = DatasetMergeCommitResult & { readonly rowsRead: number }\n\n/**\n * The definition the lake receives. Markings are enforced from the registered definition and never\n * stored, so a stored schema cannot keep a classification the code has since changed.\n */\nexport function lakeDatasetDefinition(dataset: DatasetDefinition): DatasetDefinition {\n if (!dataset.schema.columns.some((column) => column.markings)) return dataset\n return {\n ...dataset,\n schema: { columns: dataset.schema.columns.map(({ markings: _markings, ...column }) => column) },\n }\n}\n\n/**\n * Validate, stage, and commit one dataset write using existing lake sessions.\n *\n * The caller owns fetching/cancelling its source, execution bookkeeping, and publishing the\n * dataset-update notification for a `created` result. This operation returns immediately after\n * the lake commit; it does not wait for downstream pipelines or projections.\n */\nexport async function writeDataset<TValue extends DatasetWriteValue>(\n input: WriteDatasetInput<TValue>\n): Promise<WriteDatasetResult> {\n const { lakeStorage, signal } = input\n const dataset = lakeDatasetDefinition(input.dataset)\n let abortWrite: (() => Promise<void>) | undefined\n let rowsRead = 0\n const onRead = () => {\n rowsRead += 1\n input.onRead?.(rowsRead)\n }\n\n throwIfAborted(signal)\n await lakeStorage.createDataset(dataset)\n try {\n throwIfAborted(signal)\n const reconcileSnapshot = dataset.sequenceBy !== undefined && input.mode === \"snapshot\"\n if (input.mode === \"merge\" || reconcileSnapshot) {\n const session = await lakeStorage.beginMerge({\n dataset,\n expectedLatestVersionId: input.expectedLatestVersionId,\n producer: input.producer,\n })\n abortWrite = () => session.abort()\n throwIfAborted(signal)\n const values = await input.readValues()\n throwIfAborted(signal)\n await session.writeChanges(\n validatedValues(\n input,\n values,\n async (value, itemIndex) =>\n reconcileSnapshot\n ? { kind: \"upsert\" as const, row: await validateRow(value, input, itemIndex) }\n : validateMergeChange(value, input, itemIndex),\n onRead\n )\n )\n throwIfAborted(signal)\n const result = await session.commit({\n commitMessage: input.commitMessage,\n createInitialVersion: reconcileSnapshot,\n retryOnConflict: dataset.sequenceBy !== undefined,\n signal,\n })\n return { ...result, rowsRead }\n }\n\n const values = await input.readValues()\n throwIfAborted(signal)\n const session = await lakeStorage.beginWrite({\n dataset,\n mode: input.mode,\n producer: input.producer,\n })\n abortWrite = () => session.abort()\n await session.writeRows(\n validatedValues(\n input,\n values,\n (value, itemIndex) => validateRow(value, input, itemIndex),\n onRead\n )\n )\n throwIfAborted(signal)\n\n // Preserve sync semantics: an empty append must not invent an initial dataset version.\n if (rowsRead === 0 && input.mode === \"append\") {\n const version = await lakeStorage.getLatestVersion(dataset.id)\n await session.abort()\n return { outcome: \"unchanged\", version, rowsRead }\n }\n\n const { outcome, ...version } = await session.commit({\n expectedLatestVersionId: input.expectedLatestVersionId,\n commitMessage: input.commitMessage,\n })\n return { outcome, version, rowsRead }\n } catch (error) {\n // Cleanup must not replace the source, validation, cancellation, or commit failure.\n await abortWrite?.().catch(() => {})\n throw error\n }\n}\n\nasync function* validatedValues<TValue extends DatasetWriteValue, TResult>(\n input: WriteDatasetInput<TValue>,\n values: Iterable<TValue> | AsyncIterable<TValue>,\n validate: (value: unknown, itemIndex: number) => Promise<TResult>,\n onRead: () => void\n): AsyncIterable<TResult> {\n let itemIndex = 0\n for await (const sourceValue of values) {\n throwIfAborted(input.signal)\n itemIndex += 1\n let value: TResult\n try {\n value = await validate(sourceValue.value, itemIndex)\n } catch (error) {\n throw input.mapValidationError\n ? input.mapValidationError(error, sourceValue, itemIndex)\n : error\n }\n onRead()\n yield value\n }\n}\n\nfunction sourceLabel(input: Pick<WriteDatasetInput, \"dataset\" | \"sourceLabel\">): string {\n return input.sourceLabel ?? `[Sixb] Dataset '${input.dataset.id}' writer`\n}\n\nasync function validateRow(\n value: unknown,\n input: WriteDatasetInput,\n itemIndex: number\n): Promise<DatasetRow> {\n const validationError = getDatasetRowValidationFailure(value, input.dataset)\n if (validationError) {\n throw new Error(\n `${sourceLabel(input)} returned an invalid row at item ${itemIndex}. ${validationError.message}`,\n { cause: validationError }\n )\n }\n // The validator above establishes the row shape.\n const row = value as DatasetRow\n await verifyRowFileRefs(row, input, itemIndex)\n return row\n}\n\nasync function validateMergeChange(\n value: unknown,\n input: WriteDatasetInput,\n itemIndex: number\n): Promise<MergeChange<DatasetRow, DatasetRow>> {\n const validationError = getDatasetMergeChangeValidationError(value, input.dataset)\n if (validationError) {\n throw new Error(\n `${sourceLabel(input)} returned an invalid merge change at item ${itemIndex}. ${validationError}`\n )\n }\n const change = value as MergeChange<DatasetRow, DatasetRow>\n if (change.kind === \"upsert\") await verifyRowFileRefs(change.row, input, itemIndex)\n return change\n}\n\nasync function verifyRowFileRefs(\n row: DatasetRow,\n input: WriteDatasetInput,\n itemIndex: number\n): Promise<void> {\n for (const column of input.dataset.schema.columns) {\n if (column.type !== \"fileRef\") continue\n const value = row[column.name]\n if (isFileRef(value)) await verifyFileRef(value, input, column.name, itemIndex)\n }\n}\n\nasync function verifyFileRef(\n fileRef: FileRef,\n input: WriteDatasetInput,\n columnName: string,\n itemIndex: number\n): Promise<void> {\n const context = `${sourceLabel(input)} returned row ${itemIndex} with dataset '${input.dataset.id}' column '${columnName}'`\n if (!isValidFileRef(fileRef)) {\n throw new Error(\n `${context} with an invalid mediaType; use one media type, such as \"application/pdf\".`\n )\n }\n const blobInfo = await input.blobStorage.stat(fileRef.blobId)\n if (!blobInfo) {\n throw new Error(`${context} referencing unknown blob '${fileRef.blobId}'.`)\n }\n if (blobInfo.digest !== fileRef.digest) {\n throw new Error(\n `${context} referencing blob '${fileRef.blobId}' with digest '${fileRef.digest}', but blob storage has '${blobInfo.digest}'.`\n )\n }\n if (blobInfo.sizeBytes !== fileRef.sizeBytes) {\n throw new Error(\n `${context} referencing blob '${fileRef.blobId}' with size ${fileRef.sizeBytes}, but blob storage has ${blobInfo.sizeBytes}.`\n )\n }\n}\n\nfunction throwIfAborted(signal: AbortSignal): void {\n if (!signal.aborted) return\n if (signal.reason instanceof Error) throw signal.reason\n const error = new Error(\n typeof signal.reason === \"string\" && signal.reason.length > 0\n ? signal.reason\n : \"[Sixb] Dataset write was cancelled.\"\n )\n error.name = \"AbortError\"\n throw error\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "CDE5D84B182CBD5A64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import {
|
|
3
|
-
GRANT_KINDS,
|
|
4
|
-
grantKindOf,
|
|
5
3
|
canAccessApplication2,
|
|
6
4
|
resolveRoleGrants2,
|
|
7
5
|
resolveAuthorizationContext2
|
|
8
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-qkbx3tf6.js";
|
|
7
|
+
import {
|
|
8
|
+
assertValidFileRefs2
|
|
9
|
+
} from "./chunk-y05543x6.js";
|
|
10
|
+
import {
|
|
11
|
+
SecurityValidationError2,
|
|
12
|
+
resolveMembershipPolicyScope,
|
|
13
|
+
canPerformMembershipOperation,
|
|
14
|
+
missingMembershipGroupIds,
|
|
15
|
+
validateSecurityDefinitionsAtStartup
|
|
16
|
+
} from "./chunk-xt1zt7gv.js";
|
|
9
17
|
import {
|
|
10
18
|
AuthRuntimeError2,
|
|
11
19
|
DEFAULT_AUTH_SESSION_AUDIENCE2,
|
|
@@ -21,7 +29,7 @@ import {
|
|
|
21
29
|
import {
|
|
22
30
|
normalizeParams,
|
|
23
31
|
coerceParamsToTyped
|
|
24
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-vx2yp45y.js";
|
|
25
33
|
import {
|
|
26
34
|
snapshotLinkPathSelection
|
|
27
35
|
} from "./chunk-t6f3tdnr.js";
|
|
@@ -160,405 +168,6 @@ var applications2 = {
|
|
|
160
168
|
app: { kind: "application", id: "app", label: "Custom app" }
|
|
161
169
|
};
|
|
162
170
|
var APPLICATION_IDS = new Set(Object.values(applications2).map((application) => application.id));
|
|
163
|
-
// src/security/errors.ts
|
|
164
|
-
class SecurityValidationError2 extends Error {
|
|
165
|
-
name = "SecurityValidationError";
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// src/security/membership-policies.ts
|
|
169
|
-
var MEMBERSHIP_OPERATIONS = ["invite", "assignGroups", "suspend"];
|
|
170
|
-
function resolveMembershipPolicyScope(input) {
|
|
171
|
-
const callerGroups = new Set(input.callerGroupIds);
|
|
172
|
-
const policyIds = [];
|
|
173
|
-
const operations = createEmptyOperationScopes();
|
|
174
|
-
for (const policy of input.membershipPolicies) {
|
|
175
|
-
if (!policy.grantedToGroupIds.some((groupId) => callerGroups.has(groupId))) {
|
|
176
|
-
continue;
|
|
177
|
-
}
|
|
178
|
-
policyIds.push(policy.id);
|
|
179
|
-
for (const operation of policy.can) {
|
|
180
|
-
operations[operation].policyIds.push(policy.id);
|
|
181
|
-
for (const groupId of policy.scopeGroupIds) {
|
|
182
|
-
operations[operation].groupIds.add(groupId);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
return {
|
|
187
|
-
policyIds,
|
|
188
|
-
operations: {
|
|
189
|
-
invite: freezeOperationScope(operations.invite),
|
|
190
|
-
assignGroups: freezeOperationScope(operations.assignGroups),
|
|
191
|
-
suspend: freezeOperationScope(operations.suspend)
|
|
192
|
-
}
|
|
193
|
-
};
|
|
194
|
-
}
|
|
195
|
-
function canPerformMembershipOperation(scope, operation, groupIds) {
|
|
196
|
-
const operationScope = scope.operations[operation];
|
|
197
|
-
if (operationScope.policyIds.length === 0) {
|
|
198
|
-
return false;
|
|
199
|
-
}
|
|
200
|
-
if (groupIds.length === 0) {
|
|
201
|
-
return true;
|
|
202
|
-
}
|
|
203
|
-
return groupIds.every((groupId) => operationScope.groupIds.has(groupId));
|
|
204
|
-
}
|
|
205
|
-
function missingMembershipGroupIds(scope, operation, groupIds) {
|
|
206
|
-
if (groupIds.length === 0) {
|
|
207
|
-
return [];
|
|
208
|
-
}
|
|
209
|
-
const operationScope = scope.operations[operation];
|
|
210
|
-
return groupIds.filter((groupId) => !operationScope.groupIds.has(groupId));
|
|
211
|
-
}
|
|
212
|
-
function createEmptyOperationScopes() {
|
|
213
|
-
return {
|
|
214
|
-
invite: { policyIds: [], groupIds: new Set },
|
|
215
|
-
assignGroups: { policyIds: [], groupIds: new Set },
|
|
216
|
-
suspend: { policyIds: [], groupIds: new Set }
|
|
217
|
-
};
|
|
218
|
-
}
|
|
219
|
-
function freezeOperationScope(input) {
|
|
220
|
-
return {
|
|
221
|
-
policyIds: [...input.policyIds],
|
|
222
|
-
groupIds: new Set(input.groupIds)
|
|
223
|
-
};
|
|
224
|
-
}
|
|
225
|
-
function isMembershipOperation(value) {
|
|
226
|
-
return MEMBERSHIP_OPERATIONS.includes(value);
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
// src/security/validation.ts
|
|
230
|
-
var GRANT_CAPABILITIES = Object.keys({
|
|
231
|
-
access: true,
|
|
232
|
-
view: true,
|
|
233
|
-
edit: true,
|
|
234
|
-
append: true,
|
|
235
|
-
apply: true,
|
|
236
|
-
share: true,
|
|
237
|
-
run: true,
|
|
238
|
-
observe: true,
|
|
239
|
-
manage: true
|
|
240
|
-
});
|
|
241
|
-
function formatAlternatives(values) {
|
|
242
|
-
const quoted = values.map((value) => `'${value}'`);
|
|
243
|
-
const last = quoted.at(-1);
|
|
244
|
-
return quoted.length < 2 ? last ?? "" : `${quoted.slice(0, -1).join(", ")}, or ${last}`;
|
|
245
|
-
}
|
|
246
|
-
function isRecord(value) {
|
|
247
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
248
|
-
}
|
|
249
|
-
function assertNonEmptyString(value, field, createError = (message) => new SecurityValidationError2(message)) {
|
|
250
|
-
if (typeof value !== "string" || value.trim().length === 0) {
|
|
251
|
-
throw createError(`[Sixb] ${field} must not be empty.`);
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
function assertOptionalString(value, field, createError = (message) => new SecurityValidationError2(message)) {
|
|
255
|
-
if (value === undefined) {
|
|
256
|
-
return;
|
|
257
|
-
}
|
|
258
|
-
if (typeof value !== "string") {
|
|
259
|
-
throw createError(`[Sixb] ${field} must be a string.`);
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
function assertStringArray(value, field, createError) {
|
|
263
|
-
if (!Array.isArray(value)) {
|
|
264
|
-
throw createError(`[Sixb] ${field} must be an array of group ids.`);
|
|
265
|
-
}
|
|
266
|
-
for (const item of value) {
|
|
267
|
-
assertNonEmptyString(item, `${field} item`, createError);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
function assertMembershipOperationArray(value, field, createError) {
|
|
271
|
-
if (!Array.isArray(value)) {
|
|
272
|
-
throw createError(`[Sixb] ${field} must be an array of membership operations.`);
|
|
273
|
-
}
|
|
274
|
-
for (const item of value) {
|
|
275
|
-
if (!isMembershipOperation(item)) {
|
|
276
|
-
throw createError(`[Sixb] ${field} must contain only membership operations: invite, assignGroups, suspend.`);
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
function assertNoDuplicateIds(ids, field) {
|
|
281
|
-
const seen = new Set;
|
|
282
|
-
for (const id of ids) {
|
|
283
|
-
if (seen.has(id)) {
|
|
284
|
-
throw new SecurityValidationError2(`[Sixb] ${field} contains duplicate group id '${id}'.`);
|
|
285
|
-
}
|
|
286
|
-
seen.add(id);
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
function assertNoDuplicateOperations(operations, field) {
|
|
290
|
-
const seen = new Set;
|
|
291
|
-
for (const operation of operations) {
|
|
292
|
-
if (seen.has(operation)) {
|
|
293
|
-
throw new SecurityValidationError2(`[Sixb] ${field} contains duplicate operation '${operation}'.`);
|
|
294
|
-
}
|
|
295
|
-
seen.add(operation);
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
function assertGroupDefinition(value, createError = (message) => new SecurityValidationError2(message)) {
|
|
299
|
-
if (!isRecord(value)) {
|
|
300
|
-
throw createError("[Sixb] Group definition must be an object.");
|
|
301
|
-
}
|
|
302
|
-
if (value.kind !== "group") {
|
|
303
|
-
throw createError("[Sixb] Group definition kind must be 'group'.");
|
|
304
|
-
}
|
|
305
|
-
assertNonEmptyString(value.id, "Group id", createError);
|
|
306
|
-
assertOptionalString(value.label, `Group '${value.id}' label`, createError);
|
|
307
|
-
assertOptionalString(value.description, `Group '${value.id}' description`, createError);
|
|
308
|
-
}
|
|
309
|
-
function isGroupDefinition(value) {
|
|
310
|
-
try {
|
|
311
|
-
assertGroupDefinition(value, (message) => new Error(message));
|
|
312
|
-
return true;
|
|
313
|
-
} catch {
|
|
314
|
-
return false;
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
function assertMembershipPolicyDefinition(value, createError = (message) => new SecurityValidationError2(message)) {
|
|
318
|
-
if (!isRecord(value)) {
|
|
319
|
-
throw createError("[Sixb] Membership policy definition must be an object.");
|
|
320
|
-
}
|
|
321
|
-
if (value.kind !== "membershipPolicy") {
|
|
322
|
-
throw createError("[Sixb] Membership policy definition kind must be 'membershipPolicy'.");
|
|
323
|
-
}
|
|
324
|
-
assertNonEmptyString(value.id, "Membership policy id", createError);
|
|
325
|
-
assertStringArray(value.grantedToGroupIds, `Membership policy '${value.id}' grantedTo`, createError);
|
|
326
|
-
assertStringArray(value.scopeGroupIds, `Membership policy '${value.id}' scope`, createError);
|
|
327
|
-
assertMembershipOperationArray(value.can, `Membership policy '${value.id}' can`, createError);
|
|
328
|
-
}
|
|
329
|
-
function isMembershipPolicyDefinition(value) {
|
|
330
|
-
try {
|
|
331
|
-
assertMembershipPolicyDefinition(value, (message) => new Error(message));
|
|
332
|
-
return true;
|
|
333
|
-
} catch {
|
|
334
|
-
return false;
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
function assertGrantDefinition(value, field, createError = (message) => new SecurityValidationError2(message)) {
|
|
338
|
-
if (!isRecord(value) || value.kind !== "grant") {
|
|
339
|
-
throw createError(`[Sixb] ${field} must contain only grant definitions from 'can'.`);
|
|
340
|
-
}
|
|
341
|
-
if (!GRANT_CAPABILITIES.includes(value.capability)) {
|
|
342
|
-
throw createError(`[Sixb] ${field} grant capability must be ${formatAlternatives(GRANT_CAPABILITIES)}.`);
|
|
343
|
-
}
|
|
344
|
-
if (value.capability === "access" && value.target !== "application") {
|
|
345
|
-
throw createError(`[Sixb] ${field} access grant target must be 'application'.`);
|
|
346
|
-
}
|
|
347
|
-
if (value.capability === "view" && value.target !== "object" && value.target !== "dataset") {
|
|
348
|
-
throw createError(`[Sixb] ${field} view grant target must be 'object' or 'dataset'.`);
|
|
349
|
-
}
|
|
350
|
-
if (value.capability === "run" && value.target !== "workflow" && value.target !== "sync" && value.target !== "pipeline" && value.target !== "agent") {
|
|
351
|
-
throw createError(`[Sixb] ${field} run grant target must be 'workflow', 'sync', 'pipeline', or 'agent'.`);
|
|
352
|
-
}
|
|
353
|
-
if (value.capability === "observe" && value.target !== "logs" && value.target !== "aiUsage") {
|
|
354
|
-
throw createError(`[Sixb] ${field} observe grant target must be 'logs' or 'aiUsage'.`);
|
|
355
|
-
}
|
|
356
|
-
if (value.capability === "manage" && value.target !== "connector" && value.target !== "aiUsage") {
|
|
357
|
-
throw createError(`[Sixb] ${field} manage grant target must be 'connector' or 'aiUsage'.`);
|
|
358
|
-
}
|
|
359
|
-
if (value.capability === "run" && value.target === "agent") {
|
|
360
|
-
if (value.selection !== undefined) {
|
|
361
|
-
throw createError(`[Sixb] ${field} agent run grant must not declare a selection.`);
|
|
362
|
-
}
|
|
363
|
-
return;
|
|
364
|
-
}
|
|
365
|
-
assertSelection(value.selection, field, createError);
|
|
366
|
-
}
|
|
367
|
-
function assertSelection(value, field, createError) {
|
|
368
|
-
if (!isRecord(value) || typeof value.all !== "boolean") {
|
|
369
|
-
throw createError(`[Sixb] ${field} grant must carry a selection from 'can' or a scope.`);
|
|
370
|
-
}
|
|
371
|
-
const ids = value.all ? value.except : value.ids;
|
|
372
|
-
if (!Array.isArray(ids)) {
|
|
373
|
-
throw createError(`[Sixb] ${field} grant selection must list ids.`);
|
|
374
|
-
}
|
|
375
|
-
for (const id of ids) {
|
|
376
|
-
assertNonEmptyString(id, `${field} grant selection id`, createError);
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
function assertRoleDefinition(value, createError = (message) => new SecurityValidationError2(message)) {
|
|
380
|
-
if (!isRecord(value)) {
|
|
381
|
-
throw createError("[Sixb] Role definition must be an object.");
|
|
382
|
-
}
|
|
383
|
-
if (value.kind !== "role") {
|
|
384
|
-
throw createError("[Sixb] Role definition kind must be 'role'.");
|
|
385
|
-
}
|
|
386
|
-
assertNonEmptyString(value.id, "Role id", createError);
|
|
387
|
-
assertOptionalString(value.label, `Role '${value.id}' label`, createError);
|
|
388
|
-
assertOptionalString(value.description, `Role '${value.id}' description`, createError);
|
|
389
|
-
assertStringArray(value.grantedToGroupIds, `Role '${value.id}' grantedTo`, createError);
|
|
390
|
-
if (!Array.isArray(value.grants)) {
|
|
391
|
-
throw createError(`[Sixb] Role '${value.id}' grants must be an array.`);
|
|
392
|
-
}
|
|
393
|
-
for (const grant of value.grants) {
|
|
394
|
-
assertGrantDefinition(grant, `Role '${value.id}' grants`, createError);
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
function isRoleDefinition(value) {
|
|
398
|
-
try {
|
|
399
|
-
assertRoleDefinition(value, (message) => new Error(message));
|
|
400
|
-
return true;
|
|
401
|
-
} catch {
|
|
402
|
-
return false;
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
function validateSecurityDefinitionsAtStartup(input) {
|
|
406
|
-
const groupsById = new Map;
|
|
407
|
-
const rolesById = new Map;
|
|
408
|
-
const membershipPoliciesById = new Map;
|
|
409
|
-
for (const group of input.groups) {
|
|
410
|
-
assertGroupDefinition(group);
|
|
411
|
-
if (groupsById.has(group.id)) {
|
|
412
|
-
throw new SecurityValidationError2(`[Sixb] Duplicate group id: ${group.id}`);
|
|
413
|
-
}
|
|
414
|
-
groupsById.set(group.id, group);
|
|
415
|
-
}
|
|
416
|
-
for (const role of input.roles ?? []) {
|
|
417
|
-
assertRoleDefinition(role);
|
|
418
|
-
if (rolesById.has(role.id)) {
|
|
419
|
-
throw new SecurityValidationError2(`[Sixb] Duplicate role id: ${role.id}`);
|
|
420
|
-
}
|
|
421
|
-
if (role.grantedToGroupIds.length === 0) {
|
|
422
|
-
throw new SecurityValidationError2(`[Sixb] Role '${role.id}' must be granted to at least one group.`);
|
|
423
|
-
}
|
|
424
|
-
if (role.grants.length === 0) {
|
|
425
|
-
throw new SecurityValidationError2(`[Sixb] Role '${role.id}' must declare at least one grant.`);
|
|
426
|
-
}
|
|
427
|
-
assertNoDuplicateIds(role.grantedToGroupIds, `Role '${role.id}' grantedTo`);
|
|
428
|
-
for (const groupId of role.grantedToGroupIds) {
|
|
429
|
-
if (!groupsById.has(groupId)) {
|
|
430
|
-
throw new SecurityValidationError2(`[Sixb] Role '${role.id}' grantedTo references unknown group '${groupId}'. Add it to 'security/groups/' or pass it to createSixb({ groups }).`);
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
for (const grant of role.grants) {
|
|
434
|
-
assertGrantReferences(role.id, grant, input);
|
|
435
|
-
}
|
|
436
|
-
rolesById.set(role.id, role);
|
|
437
|
-
}
|
|
438
|
-
for (const policy of input.membershipPolicies) {
|
|
439
|
-
assertMembershipPolicyDefinition(policy);
|
|
440
|
-
if (membershipPoliciesById.has(policy.id)) {
|
|
441
|
-
throw new SecurityValidationError2(`[Sixb] Duplicate membership policy id: ${policy.id}`);
|
|
442
|
-
}
|
|
443
|
-
if (policy.grantedToGroupIds.length === 0) {
|
|
444
|
-
throw new SecurityValidationError2(`[Sixb] Membership policy '${policy.id}' must grant membership authority to at least one group.`);
|
|
445
|
-
}
|
|
446
|
-
if (policy.can.length === 0) {
|
|
447
|
-
throw new SecurityValidationError2(`[Sixb] Membership policy '${policy.id}' must declare at least one operation.`);
|
|
448
|
-
}
|
|
449
|
-
assertNoDuplicateIds(policy.grantedToGroupIds, `Membership policy '${policy.id}' grantedTo`);
|
|
450
|
-
assertNoDuplicateIds(policy.scopeGroupIds, `Membership policy '${policy.id}' scope`);
|
|
451
|
-
assertNoDuplicateOperations(policy.can, `Membership policy '${policy.id}' can`);
|
|
452
|
-
for (const groupId of policy.grantedToGroupIds) {
|
|
453
|
-
if (!groupsById.has(groupId)) {
|
|
454
|
-
throw new SecurityValidationError2(`[Sixb] Membership policy '${policy.id}' grantedTo references unknown group '${groupId}'. Add it to 'security/groups/' or pass it to createSixb({ groups }).`);
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
for (const groupId of policy.scopeGroupIds) {
|
|
458
|
-
if (!groupsById.has(groupId)) {
|
|
459
|
-
throw new SecurityValidationError2(`[Sixb] Membership policy '${policy.id}' scope references unknown group '${groupId}'. Add it to 'security/groups/' or pass it to createSixb({ groups }).`);
|
|
460
|
-
}
|
|
461
|
-
}
|
|
462
|
-
membershipPoliciesById.set(policy.id, policy);
|
|
463
|
-
}
|
|
464
|
-
return {
|
|
465
|
-
groups: [...groupsById.values()],
|
|
466
|
-
groupsById,
|
|
467
|
-
roles: [...rolesById.values()],
|
|
468
|
-
rolesById,
|
|
469
|
-
membershipPolicies: [...membershipPoliciesById.values()],
|
|
470
|
-
membershipPoliciesById
|
|
471
|
-
};
|
|
472
|
-
}
|
|
473
|
-
function assertGrantReferences(roleId, grant, registered) {
|
|
474
|
-
if (grant.capability === "run" && grant.target === "agent") {
|
|
475
|
-
const spec = GRANT_KINDS[grantKindOf(grant)];
|
|
476
|
-
if (!registered.agentAvailable) {
|
|
477
|
-
throw new SecurityValidationError2(`[Sixb] Role '${roleId}' grants ${grant.capability} on the project Agent, but it is unavailable. ${spec.fix}`);
|
|
478
|
-
}
|
|
479
|
-
return;
|
|
480
|
-
}
|
|
481
|
-
const spec = GRANT_KINDS[grantKindOf(grant)];
|
|
482
|
-
const universe = registered[spec.universeKey];
|
|
483
|
-
if (!universe) {
|
|
484
|
-
return;
|
|
485
|
-
}
|
|
486
|
-
const ids = grant.selection.all ? grant.selection.except : grant.selection.ids;
|
|
487
|
-
for (const id of ids) {
|
|
488
|
-
if (!universe.has(id)) {
|
|
489
|
-
throw new SecurityValidationError2(`[Sixb] Role '${roleId}' grants ${grant.capability} on unknown ${spec.subject} '${id}'. ${spec.fix}`);
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
// src/security/builders.ts
|
|
495
|
-
var MEMBERSHIP_OPERATIONS2 = new Set(["invite", "assignGroups", "suspend"]);
|
|
496
|
-
function assertNonEmptyArray(value, field) {
|
|
497
|
-
if (value.length === 0) {
|
|
498
|
-
throw new SecurityValidationError2(`[Sixb] ${field} must not be empty.`);
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
function groupIdsFrom(groups, field) {
|
|
502
|
-
return groups.map((group) => {
|
|
503
|
-
if (!isRecord(group) || group.kind !== "group") {
|
|
504
|
-
throw new SecurityValidationError2(`[Sixb] ${field} must contain only group definitions.`);
|
|
505
|
-
}
|
|
506
|
-
assertNonEmptyString(group.id, `${field} group id`);
|
|
507
|
-
return group.id;
|
|
508
|
-
});
|
|
509
|
-
}
|
|
510
|
-
function membershipOperationsFrom(operations, field) {
|
|
511
|
-
return operations.map((operation) => {
|
|
512
|
-
if (!MEMBERSHIP_OPERATIONS2.has(operation)) {
|
|
513
|
-
throw new SecurityValidationError2(`[Sixb] ${field} must contain only membership operations: invite, assignGroups, suspend.`);
|
|
514
|
-
}
|
|
515
|
-
return operation;
|
|
516
|
-
});
|
|
517
|
-
}
|
|
518
|
-
function defineGroup2(id, options = {}) {
|
|
519
|
-
assertNonEmptyString(id, "Group id");
|
|
520
|
-
assertOptionalString(options.label, `Group '${id}' label`);
|
|
521
|
-
assertOptionalString(options.description, `Group '${id}' description`);
|
|
522
|
-
return {
|
|
523
|
-
kind: "group",
|
|
524
|
-
id,
|
|
525
|
-
...options.label !== undefined ? { label: options.label } : {},
|
|
526
|
-
...options.description !== undefined ? { description: options.description } : {}
|
|
527
|
-
};
|
|
528
|
-
}
|
|
529
|
-
function defineRole2(id, options) {
|
|
530
|
-
assertNonEmptyString(id, "Role id");
|
|
531
|
-
assertOptionalString(options.label, `Role '${id}' label`);
|
|
532
|
-
assertOptionalString(options.description, `Role '${id}' description`);
|
|
533
|
-
assertNonEmptyArray(options.grantedTo, `Role '${id}' grantedTo`);
|
|
534
|
-
const grantedToGroupIds = groupIdsFrom(options.grantedTo, `Role '${id}' grantedTo`);
|
|
535
|
-
for (const grant of options.grants) {
|
|
536
|
-
assertGrantDefinition(grant, `Role '${id}' grants`);
|
|
537
|
-
}
|
|
538
|
-
if (options.grants.length === 0) {
|
|
539
|
-
throw new SecurityValidationError2(`[Sixb] Role '${id}' grants must not be empty.`);
|
|
540
|
-
}
|
|
541
|
-
return {
|
|
542
|
-
kind: "role",
|
|
543
|
-
id,
|
|
544
|
-
...options.label !== undefined ? { label: options.label } : {},
|
|
545
|
-
...options.description !== undefined ? { description: options.description } : {},
|
|
546
|
-
grantedToGroupIds,
|
|
547
|
-
grants: options.grants
|
|
548
|
-
};
|
|
549
|
-
}
|
|
550
|
-
function defineMembershipPolicy2(id, options) {
|
|
551
|
-
assertNonEmptyString(id, "Membership policy id");
|
|
552
|
-
assertNonEmptyArray(options.grantedTo, `Membership policy '${id}' grantedTo`);
|
|
553
|
-
assertNonEmptyArray(options.can, `Membership policy '${id}' can`);
|
|
554
|
-
return {
|
|
555
|
-
kind: "membershipPolicy",
|
|
556
|
-
id,
|
|
557
|
-
grantedToGroupIds: groupIdsFrom(options.grantedTo, `Membership policy '${id}' grantedTo`),
|
|
558
|
-
scopeGroupIds: groupIdsFrom(options.scope, `Membership policy '${id}' scope`),
|
|
559
|
-
can: membershipOperationsFrom(options.can, `Membership policy '${id}' can`)
|
|
560
|
-
};
|
|
561
|
-
}
|
|
562
171
|
// src/security/every.ts
|
|
563
172
|
var BREADTH_TARGETS = [
|
|
564
173
|
"object",
|
|
@@ -638,10 +247,12 @@ function isObjectActionDefinition2(value) {
|
|
|
638
247
|
return value.binding.kind === "object";
|
|
639
248
|
}
|
|
640
249
|
function normalizeActionParams(runtime, paramsConfig, params, pathPrefix) {
|
|
641
|
-
|
|
250
|
+
const normalized = normalizeParams(runtime.ontology.getValueTypesById(), paramsConfig, params, {
|
|
642
251
|
kind: "action",
|
|
643
252
|
id: pathPrefix
|
|
644
253
|
});
|
|
254
|
+
assertValidFileRefs2(normalized, pathPrefix);
|
|
255
|
+
return normalized;
|
|
645
256
|
}
|
|
646
257
|
function coerceActionParamsToTyped2(paramsConfig, params, valueTypesById) {
|
|
647
258
|
return coerceParamsToTyped(paramsConfig, params, valueTypesById);
|
|
@@ -707,16 +318,16 @@ function defineShare2(id, options) {
|
|
|
707
318
|
});
|
|
708
319
|
}
|
|
709
320
|
function isShareDefinition(value) {
|
|
710
|
-
if (!
|
|
321
|
+
if (!isRecord(value) || value.kind !== "share" || !isNonEmpty(value.id))
|
|
711
322
|
return false;
|
|
712
|
-
if (!
|
|
323
|
+
if (!isRecord(value.target) || value.target.kind !== "object" || !isNonEmpty(value.target.objectTypeId)) {
|
|
713
324
|
return false;
|
|
714
325
|
}
|
|
715
326
|
return Array.isArray(value.grants);
|
|
716
327
|
}
|
|
717
328
|
function snapshotShareDefinition(value) {
|
|
718
329
|
try {
|
|
719
|
-
if (!
|
|
330
|
+
if (!isRecord(value)) {
|
|
720
331
|
throw invalid("Share definition kind must be 'share'.");
|
|
721
332
|
}
|
|
722
333
|
const kind = value.kind;
|
|
@@ -728,7 +339,7 @@ function snapshotShareDefinition(value) {
|
|
|
728
339
|
throw invalid("Share definition kind must be 'share'.");
|
|
729
340
|
}
|
|
730
341
|
const id = nonEmpty(authoredId, "Share id");
|
|
731
|
-
if (!
|
|
342
|
+
if (!isRecord(target)) {
|
|
732
343
|
throw invalid(`Share '${id}' target must be an object type.`);
|
|
733
344
|
}
|
|
734
345
|
const targetKind = target.kind;
|
|
@@ -816,7 +427,7 @@ function snapshotShareGrants(shareId, targetObjectTypeId, authored) {
|
|
|
816
427
|
let viewCount = 0;
|
|
817
428
|
for (let index = 0;index < authored.length; index += 1) {
|
|
818
429
|
const grant = authored[index];
|
|
819
|
-
if (!
|
|
430
|
+
if (!isRecord(grant)) {
|
|
820
431
|
throw invalid(`Share '${shareId}' grant ${index} must come from 'can'.`);
|
|
821
432
|
}
|
|
822
433
|
const kind = grant.kind;
|
|
@@ -862,7 +473,7 @@ function snapshotShareGrants(shareId, targetObjectTypeId, authored) {
|
|
|
862
473
|
return Object.freeze(grants);
|
|
863
474
|
}
|
|
864
475
|
function snapshotLinkMode(value) {
|
|
865
|
-
if (!
|
|
476
|
+
if (!isRecord(value))
|
|
866
477
|
throw invalid("Share link selection must be an object.");
|
|
867
478
|
const kind = value.kind;
|
|
868
479
|
const links = value.links;
|
|
@@ -939,9 +550,9 @@ function assertShareTarget(value) {
|
|
|
939
550
|
}
|
|
940
551
|
}
|
|
941
552
|
function isObjectType(value) {
|
|
942
|
-
return
|
|
553
|
+
return isRecord(value) && isNonEmpty(value.id) && Array.isArray(value.properties) && Array.isArray(value.links);
|
|
943
554
|
}
|
|
944
|
-
function
|
|
555
|
+
function isRecord(value) {
|
|
945
556
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
946
557
|
}
|
|
947
558
|
function isNonEmpty(value) {
|
|
@@ -1117,12 +728,14 @@ var can2 = {
|
|
|
1117
728
|
};
|
|
1118
729
|
// src/security/registry.ts
|
|
1119
730
|
class SecurityRegistry {
|
|
731
|
+
markingsById;
|
|
1120
732
|
groupsById;
|
|
1121
733
|
rolesById;
|
|
1122
734
|
membershipPoliciesById;
|
|
1123
735
|
resolvedRoles;
|
|
1124
736
|
constructor(input) {
|
|
1125
737
|
const definitions = validateSecurityDefinitionsAtStartup({
|
|
738
|
+
markings: input.markings ?? [],
|
|
1126
739
|
groups: input.groups ?? [],
|
|
1127
740
|
roles: input.roles ?? [],
|
|
1128
741
|
membershipPolicies: input.membershipPolicies ?? [],
|
|
@@ -1153,15 +766,23 @@ class SecurityRegistry {
|
|
|
1153
766
|
shareIds: input.shareIds ?? new Set,
|
|
1154
767
|
getSubTypes: input.getSubTypes ?? (() => [])
|
|
1155
768
|
};
|
|
769
|
+
this.markingsById = definitions.markingsById;
|
|
1156
770
|
this.groupsById = definitions.groupsById;
|
|
1157
771
|
this.rolesById = definitions.rolesById;
|
|
1158
772
|
this.membershipPoliciesById = definitions.membershipPoliciesById;
|
|
1159
773
|
this.resolvedRoles = definitions.roles.map((role) => ({
|
|
1160
774
|
id: role.id,
|
|
1161
775
|
grantedToGroupIds: role.grantedToGroupIds,
|
|
1162
|
-
grants: resolveRoleGrants2(role, universe)
|
|
776
|
+
grants: resolveRoleGrants2(role, universe),
|
|
777
|
+
clearances: new Set(role.clearances ?? [])
|
|
1163
778
|
}));
|
|
1164
779
|
}
|
|
780
|
+
listMarkings() {
|
|
781
|
+
return [...this.markingsById.values()];
|
|
782
|
+
}
|
|
783
|
+
getMarkingById(markingId) {
|
|
784
|
+
return this.markingsById.get(markingId) ?? null;
|
|
785
|
+
}
|
|
1165
786
|
listGroups() {
|
|
1166
787
|
return [...this.groupsById.values()];
|
|
1167
788
|
}
|
|
@@ -3093,6 +2714,7 @@ class AuthRuntime2 {
|
|
|
3093
2714
|
return { accessTokens: result.accessTokens };
|
|
3094
2715
|
}
|
|
3095
2716
|
async createPersonalAccessToken(caller, input) {
|
|
2717
|
+
assertSessionCaller(caller);
|
|
3096
2718
|
const storage = this.requireAuthStorage();
|
|
3097
2719
|
const groupIds = constrainRequestedGroupIds(input.groupIds, caller.groupIds, {
|
|
3098
2720
|
subject: "personal access token"
|
|
@@ -3197,6 +2819,7 @@ class AuthRuntime2 {
|
|
|
3197
2819
|
return { serviceAccount, accessTokens: result.accessTokens };
|
|
3198
2820
|
}
|
|
3199
2821
|
async createServiceAccountAccessToken(caller, input) {
|
|
2822
|
+
assertSessionCaller(caller);
|
|
3200
2823
|
const storage = this.requireAuthStorage();
|
|
3201
2824
|
const { serviceAccount, groupIds: serviceAccountGroupIds } = await this.requireManageableServiceAccount(storage, caller.groupIds, input.serviceAccountId);
|
|
3202
2825
|
if (serviceAccount.status === "suspended") {
|
|
@@ -3625,6 +3248,11 @@ function memberGroups(memberships) {
|
|
|
3625
3248
|
function callerSessionId(caller) {
|
|
3626
3249
|
return caller.credentialSource === "session" ? caller.session.id : undefined;
|
|
3627
3250
|
}
|
|
3251
|
+
function assertSessionCaller(caller) {
|
|
3252
|
+
if (caller.credentialSource !== "session") {
|
|
3253
|
+
throw new AuthRuntimeError2("authorization_denied", "[Sixb] Access tokens can only be created from a signed-in session, not with another access token.");
|
|
3254
|
+
}
|
|
3255
|
+
}
|
|
3628
3256
|
function constrainTokenGroupIds(principalGroupIds, accessToken) {
|
|
3629
3257
|
if (accessToken.groupIds === undefined) {
|
|
3630
3258
|
return principalGroupIds;
|
|
@@ -3699,6 +3327,6 @@ var SYSTEM_PRINCIPAL2 = { type: "system", id: "system" };
|
|
|
3699
3327
|
function principalsEqual2(left, right) {
|
|
3700
3328
|
return left.type === right.type && left.id === right.id;
|
|
3701
3329
|
}
|
|
3702
|
-
export { ActionDefinitionError2, ActionEditCommitError2, missingActionMutationMessage, effectsWithoutEditsMessage, assertNonEmpty2, isActionDefinition2, isGlobalActionDefinition2, isObjectActionDefinition2, normalizeActionParams, coerceActionParamsToTyped2, validateActionSubject, resolveObjectActionSubject, PERSONAL_ACCESS_TOKEN_PREFIX2, SERVICE_ACCOUNT_ACCESS_TOKEN_PREFIX2, generateAccessTokenSecret2, hashAccessTokenSecret2, formatAccessTokenValue2, parseAccessTokenValue2, getBearerAccessTokenValue2, createAccessTokenCredential2, setRequestClientAddress2, getRequestClientAddress2, CSRF_HEADER_NAME2, generateCsrfToken2, isCsrfExemptMethod2, verifyDoubleSubmitCsrf2, verifyCsrfToken2, applications2,
|
|
3330
|
+
export { ActionDefinitionError2, ActionEditCommitError2, missingActionMutationMessage, effectsWithoutEditsMessage, assertNonEmpty2, isActionDefinition2, isGlobalActionDefinition2, isObjectActionDefinition2, normalizeActionParams, coerceActionParamsToTyped2, validateActionSubject, resolveObjectActionSubject, PERSONAL_ACCESS_TOKEN_PREFIX2, SERVICE_ACCOUNT_ACCESS_TOKEN_PREFIX2, generateAccessTokenSecret2, hashAccessTokenSecret2, formatAccessTokenValue2, parseAccessTokenValue2, getBearerAccessTokenValue2, createAccessTokenCredential2, setRequestClientAddress2, getRequestClientAddress2, CSRF_HEADER_NAME2, generateCsrfToken2, isCsrfExemptMethod2, verifyDoubleSubmitCsrf2, verifyCsrfToken2, applications2, every2, ShareDefinitionError2, defineShare2, isShareDefinition, snapshotShareDefinition, can2, SecurityRegistry, AuthStorageError2, MAX_PENDING_DEVICE_AUTHORIZATIONS2, paginate, InMemoryAuthStorage2, generateSessionSecret2, hashSessionSecret2, formatSessionCookieValue2, parseSessionCookieValue2, createSessionCredential2, AuthRuntime2, SYSTEM_PRINCIPAL2, principalsEqual2 };
|
|
3703
3331
|
|
|
3704
|
-
//# debugId=
|
|
3332
|
+
//# debugId=E73F1E47F0D1834864756E2164756E21
|