@sixb/core 0.1.20 → 0.1.21
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/execution.d.ts.map +1 -1
- package/dist/actions/index.js +54 -47
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/request.d.ts.map +1 -1
- package/dist/actions/run-authorization.d.ts +9 -0
- package/dist/actions/run-authorization.d.ts.map +1 -1
- package/dist/activity/connection.d.ts +62 -0
- package/dist/activity/connection.d.ts.map +1 -0
- package/dist/activity/device.d.ts +8 -0
- package/dist/activity/device.d.ts.map +1 -0
- package/dist/activity/execution.d.ts +48 -0
- package/dist/activity/execution.d.ts.map +1 -0
- package/dist/activity/service.d.ts +79 -0
- package/dist/activity/service.d.ts.map +1 -0
- package/dist/activity/shares.d.ts +24 -0
- package/dist/activity/shares.d.ts.map +1 -0
- package/dist/activity/timeline.d.ts +96 -0
- package/dist/activity/timeline.d.ts.map +1 -0
- package/dist/agents/index.d.ts +2 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +63 -50
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/request.d.ts.map +1 -1
- package/dist/agents/skills.d.ts.map +1 -1
- package/dist/agents/streams/index.js +3 -3
- package/dist/agents/streams/internal.js +3 -3
- package/dist/agents/types.d.ts +8 -8
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/agents/validation.d.ts +1 -1
- package/dist/agents/validation.d.ts.map +1 -1
- package/dist/artifacts/address.d.ts +48 -0
- package/dist/artifacts/address.d.ts.map +1 -0
- package/dist/artifacts/csv.d.ts +22 -0
- package/dist/artifacts/csv.d.ts.map +1 -0
- package/dist/artifacts/errors.d.ts +11 -0
- package/dist/artifacts/errors.d.ts.map +1 -0
- package/dist/artifacts/execution.d.ts +43 -0
- package/dist/artifacts/execution.d.ts.map +1 -0
- package/dist/artifacts/frames/assets.d.ts +28 -0
- package/dist/artifacts/frames/assets.d.ts.map +1 -0
- package/dist/artifacts/frames/grants.d.ts +37 -0
- package/dist/artifacts/frames/grants.d.ts.map +1 -0
- package/dist/artifacts/frames/index.d.ts +10 -0
- package/dist/artifacts/frames/index.d.ts.map +1 -0
- package/dist/artifacts/frames/index.js +892 -0
- package/dist/artifacts/frames/index.js.map +14 -0
- package/dist/artifacts/frames/kit.d.ts +66 -0
- package/dist/artifacts/frames/kit.d.ts.map +1 -0
- package/dist/artifacts/frames/probe.d.ts +41 -0
- package/dist/artifacts/frames/probe.d.ts.map +1 -0
- package/dist/artifacts/frames/protocol.d.ts +98 -0
- package/dist/artifacts/frames/protocol.d.ts.map +1 -0
- package/dist/artifacts/frames/runtime.d.ts +13 -0
- package/dist/artifacts/frames/runtime.d.ts.map +1 -0
- package/dist/artifacts/html.d.ts +6 -0
- package/dist/artifacts/html.d.ts.map +1 -0
- package/dist/artifacts/ids.d.ts +5 -0
- package/dist/artifacts/ids.d.ts.map +1 -0
- package/dist/artifacts/index.d.ts +16 -0
- package/dist/artifacts/index.d.ts.map +1 -0
- package/dist/artifacts/index.js +125 -0
- package/dist/artifacts/index.js.map +10 -0
- package/dist/artifacts/kinds.d.ts +5 -0
- package/dist/artifacts/kinds.d.ts.map +1 -0
- package/dist/artifacts/limits.d.ts +28 -0
- package/dist/artifacts/limits.d.ts.map +1 -0
- package/dist/artifacts/outline.d.ts +44 -0
- package/dist/artifacts/outline.d.ts.map +1 -0
- package/dist/artifacts/publish/files.d.ts +15 -0
- package/dist/artifacts/publish/files.d.ts.map +1 -0
- package/dist/artifacts/publish/index.d.ts +5 -0
- package/dist/artifacts/publish/index.d.ts.map +1 -0
- package/dist/artifacts/publish/index.js +36 -0
- package/dist/artifacts/publish/index.js.map +9 -0
- package/dist/artifacts/publish/publish.d.ts +52 -0
- package/dist/artifacts/publish/publish.d.ts.map +1 -0
- package/dist/artifacts/publish/references.d.ts +27 -0
- package/dist/artifacts/publish/references.d.ts.map +1 -0
- package/dist/artifacts/publish/validate/document.d.ts +17 -0
- package/dist/artifacts/publish/validate/document.d.ts.map +1 -0
- package/dist/artifacts/publish/validate/file.d.ts +8 -0
- package/dist/artifacts/publish/validate/file.d.ts.map +1 -0
- package/dist/artifacts/publish/validate/sheet.d.ts +15 -0
- package/dist/artifacts/publish/validate/sheet.d.ts.map +1 -0
- package/dist/artifacts/publish/validate/slides.d.ts +21 -0
- package/dist/artifacts/publish/validate/slides.d.ts.map +1 -0
- package/dist/artifacts/references.d.ts +12 -0
- package/dist/artifacts/references.d.ts.map +1 -0
- package/dist/artifacts/resolve.d.ts +41 -0
- package/dist/artifacts/resolve.d.ts.map +1 -0
- package/dist/artifacts/theme.d.ts +19 -0
- package/dist/artifacts/theme.d.ts.map +1 -0
- package/dist/artifacts/warnings.d.ts +11 -0
- package/dist/artifacts/warnings.d.ts.map +1 -0
- package/dist/artifacts/workbook.d.ts +64 -0
- package/dist/artifacts/workbook.d.ts.map +1 -0
- package/dist/auth/index.js +10 -10
- package/dist/authorization/decision.d.ts +2 -0
- package/dist/authorization/decision.d.ts.map +1 -1
- package/dist/authorization/grant-kinds.d.ts +2 -2
- package/dist/authorization/grant-kinds.d.ts.map +1 -1
- package/dist/authorization/index.js +6 -6
- package/dist/blob-storage/browser.js +1 -1
- package/dist/blob-storage/index.js +2 -2
- package/dist/blob-storage/internal.d.ts +1 -1
- package/dist/blob-storage/internal.d.ts.map +1 -1
- package/dist/blob-storage/internal.js +11 -5
- package/dist/blob-storage/internal.js.map +1 -1
- package/dist/blob-storage/media-type.d.ts +12 -0
- package/dist/blob-storage/media-type.d.ts.map +1 -1
- package/dist/bootstrap/index.js +53 -47
- package/dist/bootstrap/index.js.map +2 -2
- package/dist/{chunk-xfs8x8m9.js → chunk-0bphap9y.js} +5 -5
- package/dist/{chunk-1zq2p6g0.js → chunk-1cc1xaf3.js} +3 -3
- package/dist/chunk-3jms7je7.js +14 -0
- package/dist/chunk-3jms7je7.js.map +10 -0
- package/dist/{chunk-s54c868q.js → chunk-3qct2mdc.js} +3 -13
- package/dist/chunk-3qct2mdc.js.map +12 -0
- package/dist/{chunk-t7x8dmn0.js → chunk-431pyp2c.js} +3 -3
- package/dist/{chunk-c85m1hyj.js → chunk-447a5c0p.js} +2 -2
- package/dist/chunk-48qjhh6v.js +185 -0
- package/dist/chunk-48qjhh6v.js.map +13 -0
- package/dist/{chunk-ren4kg2j.js → chunk-561r0yc9.js} +8 -8
- package/dist/{chunk-5e43w60z.js → chunk-5948n82c.js} +2 -2
- package/dist/{chunk-yzwja0mj.js → chunk-5hx48dnn.js} +2 -2
- package/dist/{chunk-x6m907x7.js → chunk-5vems3nx.js} +5 -6
- package/dist/{chunk-x6m907x7.js.map → chunk-5vems3nx.js.map} +3 -3
- package/dist/{chunk-0rbyz4qy.js → chunk-61y5xs4p.js} +560 -164
- package/dist/{chunk-0rbyz4qy.js.map → chunk-61y5xs4p.js.map} +12 -9
- package/dist/chunk-65abf64x.js +13 -0
- package/dist/chunk-65abf64x.js.map +10 -0
- package/dist/{chunk-z3y5kg1x.js → chunk-6eqsgvxk.js} +3 -3
- package/dist/{chunk-z3y5kg1x.js.map → chunk-6eqsgvxk.js.map} +2 -2
- package/dist/chunk-6rqgmkde.js +2028 -0
- package/dist/chunk-6rqgmkde.js.map +29 -0
- package/dist/{chunk-d0bqz29d.js → chunk-6vb4st8k.js} +8 -4
- package/dist/{chunk-d0bqz29d.js.map → chunk-6vb4st8k.js.map} +3 -3
- package/dist/chunk-7q8t23v4.js +467 -0
- package/dist/chunk-7q8t23v4.js.map +14 -0
- package/dist/{chunk-5j58wjct.js → chunk-858emn8m.js} +6 -6
- package/dist/{chunk-hvsb78a1.js → chunk-8frc8a4j.js} +26 -26
- package/dist/{chunk-hvsb78a1.js.map → chunk-8frc8a4j.js.map} +2 -2
- package/dist/{chunk-3zxk45er.js → chunk-8ncg20rd.js} +3 -68
- package/dist/{chunk-3zxk45er.js.map → chunk-8ncg20rd.js.map} +4 -5
- package/dist/{chunk-n33z5bjw.js → chunk-918wwnaa.js} +490 -24
- package/dist/{chunk-n33z5bjw.js.map → chunk-918wwnaa.js.map} +13 -11
- package/dist/{chunk-rrzt8jdy.js → chunk-9j4jw7as.js} +103 -110
- package/dist/chunk-9j4jw7as.js.map +14 -0
- package/dist/chunk-9kgkfg6v.js +502 -0
- package/dist/chunk-9kgkfg6v.js.map +14 -0
- package/dist/chunk-a3faa34j.js +74 -0
- package/dist/chunk-a3faa34j.js.map +10 -0
- package/dist/{chunk-6c6sn0bh.js → chunk-akzryx9h.js} +335 -1167
- package/dist/{chunk-6c6sn0bh.js.map → chunk-akzryx9h.js.map} +18 -24
- package/dist/chunk-arns890k.js +10 -0
- package/dist/chunk-arns890k.js.map +10 -0
- package/dist/{chunk-hjzdd750.js → chunk-bk9svbcq.js} +11 -11
- package/dist/{chunk-hjzdd750.js.map → chunk-bk9svbcq.js.map} +2 -2
- package/dist/{chunk-hkc3jct7.js → chunk-c06hmxyy.js} +2 -10
- package/dist/chunk-c06hmxyy.js.map +10 -0
- package/dist/{chunk-6p49a5cq.js → chunk-c1rxbz5y.js} +3 -3
- package/dist/chunk-cfj9dfbb.js +288 -0
- package/dist/chunk-cfj9dfbb.js.map +12 -0
- package/dist/{chunk-bx9q3cwv.js → chunk-cn0fwwhy.js} +7 -7
- package/dist/{chunk-bx9q3cwv.js.map → chunk-cn0fwwhy.js.map} +1 -1
- package/dist/{chunk-gc4ntf7d.js → chunk-cwdzcv37.js} +1 -1
- package/dist/{chunk-fa02jy15.js → chunk-cy4mbddw.js} +1 -1
- package/dist/{chunk-9w055r5b.js → chunk-d09e3rax.js} +1 -1
- package/dist/chunk-d5rjr8c0.js +176 -0
- package/dist/chunk-d5rjr8c0.js.map +12 -0
- package/dist/{chunk-dk8tkk5f.js → chunk-d7dnxdep.js} +3 -3
- package/dist/{chunk-b38szspf.js → chunk-dhcv7yxc.js} +1 -1
- package/dist/{chunk-b38szspf.js.map → chunk-dhcv7yxc.js.map} +1 -1
- package/dist/{chunk-gsjm1wms.js → chunk-dhdha526.js} +8 -2
- package/dist/chunk-dhdha526.js.map +10 -0
- package/dist/{chunk-8mx7qw3y.js → chunk-dvd2fp9q.js} +2 -2
- package/dist/{chunk-8mx7qw3y.js.map → chunk-dvd2fp9q.js.map} +3 -3
- package/dist/{chunk-way52z4h.js → chunk-e17zdm62.js} +6 -12
- package/dist/{chunk-way52z4h.js.map → chunk-e17zdm62.js.map} +3 -4
- package/dist/{chunk-tpn40322.js → chunk-e6k4thh5.js} +11 -10
- package/dist/{chunk-tpn40322.js.map → chunk-e6k4thh5.js.map} +3 -3
- package/dist/{chunk-tw03bsmb.js → chunk-eptrvnby.js} +224 -3
- package/dist/chunk-eptrvnby.js.map +12 -0
- package/dist/{chunk-es1gxsbf.js → chunk-f4pamkt9.js} +8 -10
- package/dist/chunk-f4pamkt9.js.map +12 -0
- package/dist/chunk-ff5xkv0p.js +211 -0
- package/dist/chunk-ff5xkv0p.js.map +10 -0
- package/dist/{chunk-d09tj99x.js → chunk-g257jwnc.js} +10 -4
- package/dist/{chunk-d09tj99x.js.map → chunk-g257jwnc.js.map} +3 -3
- package/dist/chunk-g5bvzyyr.js +32 -0
- package/dist/chunk-g5bvzyyr.js.map +10 -0
- package/dist/chunk-hke9aeen.js +9 -0
- package/dist/chunk-hke9aeen.js.map +10 -0
- package/dist/{chunk-1sr8ryzk.js → chunk-hwksyjks.js} +122 -1
- package/dist/{chunk-1sr8ryzk.js.map → chunk-hwksyjks.js.map} +3 -3
- package/dist/chunk-jcfw4h7m.js +9 -0
- package/dist/chunk-jcfw4h7m.js.map +10 -0
- package/dist/{chunk-k6q3n2sc.js → chunk-k43ct2ke.js} +20 -11
- package/dist/chunk-k43ct2ke.js.map +12 -0
- package/dist/{chunk-3t2hgbgd.js → chunk-kge7k6ey.js} +40 -8
- package/dist/chunk-kge7k6ey.js.map +15 -0
- package/dist/{chunk-tg2cw67r.js → chunk-ky3j490c.js} +2 -2
- package/dist/chunk-mjddfa7k.js +129 -0
- package/dist/chunk-mjddfa7k.js.map +12 -0
- package/dist/{chunk-vpq4shxz.js → chunk-nn5xnx3s.js} +45 -10
- package/dist/{chunk-vpq4shxz.js.map → chunk-nn5xnx3s.js.map} +7 -6
- package/dist/{chunk-0yh890a4.js → chunk-q5e5tv4b.js} +35 -7
- package/dist/{chunk-0yh890a4.js.map → chunk-q5e5tv4b.js.map} +3 -3
- package/dist/{chunk-vyf9kfqf.js → chunk-q7gn29y3.js} +1 -1
- package/dist/{chunk-yevzdx4y.js → chunk-rmakanzx.js} +10 -12
- package/dist/{chunk-yevzdx4y.js.map → chunk-rmakanzx.js.map} +3 -4
- package/dist/{chunk-v9xd5wzd.js → chunk-s7jg7pmn.js} +1 -1
- package/dist/chunk-tbc1ngpd.js +642 -0
- package/dist/chunk-tbc1ngpd.js.map +18 -0
- package/dist/chunk-twe4dx8p.js +676 -0
- package/dist/chunk-twe4dx8p.js.map +15 -0
- package/dist/{chunk-9dmt152s.js → chunk-vf57cr4t.js} +2 -2
- package/dist/{chunk-9ybhtmg4.js → chunk-vvxtn22d.js} +1 -1
- package/dist/{chunk-jhm3zsa7.js → chunk-wkv3h3q7.js} +64 -2
- package/dist/{chunk-jhm3zsa7.js.map → chunk-wkv3h3q7.js.map} +3 -3
- package/dist/chunk-x0v3jd47.js +124 -0
- package/dist/chunk-x0v3jd47.js.map +10 -0
- package/dist/{chunk-7t429e3f.js → chunk-xvsc5m8n.js} +1 -1
- package/dist/{chunk-z4m0yz8c.js → chunk-y5tah2kf.js} +1 -1
- package/dist/{chunk-fkgc1wt8.js → chunk-z58tm0hm.js} +2 -2
- package/dist/datasets/builders.d.ts +15 -2
- package/dist/datasets/builders.d.ts.map +1 -1
- package/dist/datasets/column-index.d.ts +7 -0
- package/dist/datasets/column-index.d.ts.map +1 -0
- package/dist/datasets/execution.d.ts +3 -2
- package/dist/datasets/execution.d.ts.map +1 -1
- package/dist/datasets/write.js +8 -8
- package/dist/error-reporting/internal.js +4 -4
- package/dist/errors/internal.d.ts +1 -0
- package/dist/errors/internal.d.ts.map +1 -1
- package/dist/errors/internal.js +7 -4
- package/dist/errors/internal.js.map +1 -1
- package/dist/events/execution.d.ts +12 -2
- package/dist/events/execution.d.ts.map +1 -1
- package/dist/events/index.js +4 -4
- package/dist/execution/agent.js +56 -49
- package/dist/execution/agent.js.map +1 -1
- package/dist/execution/authorized-object-reader.d.ts +52 -11
- package/dist/execution/authorized-object-reader.d.ts.map +1 -1
- package/dist/execution/object-reader-clearance.d.ts +41 -0
- package/dist/execution/object-reader-clearance.d.ts.map +1 -0
- package/dist/execution/object-reader-ontology.d.ts +12 -0
- package/dist/execution/object-reader-ontology.d.ts.map +1 -0
- package/dist/execution/object-reader-security.d.ts +45 -0
- package/dist/execution/object-reader-security.d.ts.map +1 -0
- package/dist/execution/primitive.js +54 -47
- package/dist/execution/primitive.js.map +1 -1
- package/dist/execution/request.js +48 -41
- 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 +20 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +112 -97
- package/dist/index.js.map +1 -1
- package/dist/lake-storage/in-memory.d.ts +1 -0
- package/dist/lake-storage/in-memory.d.ts.map +1 -1
- package/dist/lake-storage/index.d.ts +6 -3
- package/dist/lake-storage/index.d.ts.map +1 -1
- package/dist/lake-storage/index.js +21 -13
- package/dist/lake-storage/index.js.map +1 -1
- package/dist/lake-storage/lineage.d.ts +94 -0
- package/dist/lake-storage/lineage.d.ts.map +1 -0
- package/dist/lake-storage/sql-transforms.d.ts +45 -0
- package/dist/lake-storage/sql-transforms.d.ts.map +1 -1
- package/dist/lake-storage/types.d.ts +55 -1
- package/dist/lake-storage/types.d.ts.map +1 -1
- package/dist/lake-storage/version-inputs.d.ts +14 -3
- package/dist/lake-storage/version-inputs.d.ts.map +1 -1
- package/dist/maintenance/ontology-maintenance.d.ts.map +1 -1
- package/dist/materializer/index.js +31 -30
- package/dist/materializer/index.js.map +1 -1
- package/dist/models/execution/index.js +25 -24
- package/dist/models/execution/index.js.map +1 -1
- package/dist/objects/clearance-redaction.d.ts +27 -0
- package/dist/objects/clearance-redaction.d.ts.map +1 -0
- package/dist/objects/index.js +54 -47
- package/dist/objects/index.js.map +1 -1
- package/dist/objects/link/authorization.d.ts +8 -5
- package/dist/objects/link/authorization.d.ts.map +1 -1
- package/dist/objects/link/upsert-batch.d.ts.map +1 -1
- package/dist/objects/object/delete.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 +47 -24
- package/dist/objects/property-clearance.d.ts.map +1 -1
- package/dist/objects/query/clearance-admission.d.ts +10 -0
- package/dist/objects/query/clearance-admission.d.ts.map +1 -0
- package/dist/objects/query/index.js +29 -28
- package/dist/objects/query/index.js.map +1 -1
- package/dist/objects/query/link-query-clearance.d.ts +21 -0
- package/dist/objects/query/link-query-clearance.d.ts.map +1 -0
- package/dist/ontology/builders.d.ts.map +1 -1
- package/dist/ontology/docs-markdown.d.ts +1 -1
- package/dist/ontology/docs-markdown.d.ts.map +1 -1
- package/dist/ontology/index.js +7 -7
- package/dist/ontology/internal.js +4 -4
- package/dist/ontology/internal.js.map +1 -1
- package/dist/pipelines/index.d.ts +2 -0
- package/dist/pipelines/index.d.ts.map +1 -1
- package/dist/pipelines/index.js +47 -35
- package/dist/pipelines/index.js.map +1 -1
- package/dist/pipelines/lineage.d.ts +17 -0
- package/dist/pipelines/lineage.d.ts.map +1 -0
- package/dist/projections/internal.d.ts +2 -2
- package/dist/projections/internal.js +30 -29
- package/dist/projections/internal.js.map +1 -1
- package/dist/runtime/create.d.ts +3 -0
- package/dist/runtime/create.d.ts.map +1 -1
- package/dist/runtime/host.d.ts +6 -0
- package/dist/runtime/host.d.ts.map +1 -1
- package/dist/runtime/internal.d.ts +2 -0
- package/dist/runtime/internal.d.ts.map +1 -1
- package/dist/runtime/internal.js +46 -42
- package/dist/runtime/internal.js.map +1 -1
- package/dist/runtime/ontology-mutations.d.ts +2 -0
- package/dist/runtime/ontology-mutations.d.ts.map +1 -1
- package/dist/runtime/resolve-definitions.d.ts.map +1 -1
- package/dist/runtime/sixb.d.ts +8 -0
- package/dist/runtime/sixb.d.ts.map +1 -1
- package/dist/sandboxes/auth.d.ts +16 -0
- package/dist/sandboxes/auth.d.ts.map +1 -1
- package/dist/sandboxes/config.d.ts.map +1 -1
- package/dist/sandboxes/configuration.d.ts +26 -0
- package/dist/sandboxes/configuration.d.ts.map +1 -1
- package/dist/sandboxes/index.d.ts +1 -1
- package/dist/sandboxes/index.d.ts.map +1 -1
- package/dist/sandboxes/index.js +14 -13
- package/dist/sandboxes/index.js.map +1 -1
- package/dist/sandboxes/sandbox.d.ts +28 -5
- package/dist/sandboxes/sandbox.d.ts.map +1 -1
- package/dist/security/applied-markings-contribution.d.ts +58 -0
- package/dist/security/applied-markings-contribution.d.ts.map +1 -0
- package/dist/security/applied-markings-host.d.ts +10 -0
- package/dist/security/applied-markings-host.d.ts.map +1 -0
- package/dist/security/applied-markings-snapshot.d.ts +67 -0
- package/dist/security/applied-markings-snapshot.d.ts.map +1 -0
- package/dist/security/applied-markings.d.ts +73 -0
- package/dist/security/applied-markings.d.ts.map +1 -0
- package/dist/security/dataset-version-markings.d.ts +47 -0
- package/dist/security/dataset-version-markings.d.ts.map +1 -0
- package/dist/security/grants.d.ts +3 -2
- package/dist/security/grants.d.ts.map +1 -1
- package/dist/security/index.d.ts +2 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/internal.d.ts +15 -0
- package/dist/security/internal.d.ts.map +1 -0
- package/dist/security/internal.js +135 -0
- package/dist/security/internal.js.map +10 -0
- package/dist/security/marking-propagation.d.ts +62 -0
- package/dist/security/marking-propagation.d.ts.map +1 -0
- package/dist/security/marking-sets.d.ts +14 -0
- package/dist/security/marking-sets.d.ts.map +1 -0
- package/dist/security/markings.d.ts +6 -3
- package/dist/security/markings.d.ts.map +1 -1
- package/dist/security/pipeline-markings.d.ts +20 -0
- package/dist/security/pipeline-markings.d.ts.map +1 -0
- package/dist/security/project.d.ts +4 -0
- package/dist/security/project.d.ts.map +1 -0
- package/dist/security/projection-markings.d.ts +71 -0
- package/dist/security/projection-markings.d.ts.map +1 -0
- package/dist/security/public.js +2 -2
- package/dist/security/redactions.d.ts +4 -1
- package/dist/security/redactions.d.ts.map +1 -1
- package/dist/security/types.d.ts +22 -2
- package/dist/security/types.d.ts.map +1 -1
- package/dist/security/validation.d.ts.map +1 -1
- package/dist/shares/internal.js +24 -23
- package/dist/shares/internal.js.map +2 -2
- package/dist/storage/action-runs/failure.js +3 -3
- package/dist/storage/action-runs/in-memory.d.ts +4 -0
- package/dist/storage/action-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/action-runs/types.d.ts +8 -0
- package/dist/storage/action-runs/types.d.ts.map +1 -1
- package/dist/storage/activity/in-memory.d.ts +55 -0
- package/dist/storage/activity/in-memory.d.ts.map +1 -0
- package/dist/storage/activity/index.d.ts +3 -0
- package/dist/storage/activity/index.d.ts.map +1 -0
- package/dist/storage/activity/policy.d.ts +96 -0
- package/dist/storage/activity/policy.d.ts.map +1 -0
- package/dist/storage/activity/types.d.ts +191 -0
- package/dist/storage/activity/types.d.ts.map +1 -0
- package/dist/storage/agents/in-memory.d.ts +4 -0
- package/dist/storage/agents/in-memory.d.ts.map +1 -1
- package/dist/storage/agents/provider.d.ts.map +1 -1
- package/dist/storage/agents/provider.js +2 -5
- package/dist/storage/agents/provider.js.map +1 -1
- package/dist/storage/agents/types.d.ts +9 -8
- package/dist/storage/agents/types.d.ts.map +1 -1
- package/dist/storage/ai-limits/enforcement.js +3 -3
- package/dist/storage/artifacts/errors.d.ts +8 -0
- package/dist/storage/artifacts/errors.d.ts.map +1 -0
- package/dist/storage/artifacts/in-memory.d.ts +34 -0
- package/dist/storage/artifacts/in-memory.d.ts.map +1 -0
- package/dist/storage/artifacts/index.d.ts +5 -0
- package/dist/storage/artifacts/index.d.ts.map +1 -0
- package/dist/storage/artifacts/record.d.ts +17 -0
- package/dist/storage/artifacts/record.d.ts.map +1 -0
- package/dist/storage/artifacts/types.d.ts +184 -0
- package/dist/storage/artifacts/types.d.ts.map +1 -0
- package/dist/storage/auth/in-memory/sessions.d.ts +2 -1
- package/dist/storage/auth/in-memory/sessions.d.ts.map +1 -1
- package/dist/storage/auth/index.d.ts +1 -1
- package/dist/storage/auth/index.d.ts.map +1 -1
- package/dist/storage/auth/types.d.ts +19 -0
- package/dist/storage/auth/types.d.ts.map +1 -1
- package/dist/storage/connector-connections/provider.js +2 -2
- package/dist/storage/executions/in-memory.d.ts +2 -1
- package/dist/storage/executions/in-memory.d.ts.map +1 -1
- package/dist/storage/executions/index.d.ts +1 -1
- package/dist/storage/executions/index.d.ts.map +1 -1
- package/dist/storage/executions/provider.d.ts +2 -0
- package/dist/storage/executions/provider.d.ts.map +1 -1
- package/dist/storage/executions/provider.js +9 -223
- package/dist/storage/executions/provider.js.map +3 -4
- package/dist/storage/executions/types.d.ts +31 -0
- package/dist/storage/executions/types.d.ts.map +1 -1
- package/dist/storage/file-upload-sessions/provider.js +11 -11
- package/dist/storage/in-memory/index.d.ts +8 -0
- package/dist/storage/in-memory/index.d.ts.map +1 -1
- package/dist/storage/index.d.ts +6 -4
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +54 -53
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/internal.d.ts +3 -0
- package/dist/storage/internal.d.ts.map +1 -1
- package/dist/storage/internal.js +66 -16
- package/dist/storage/internal.js.map +1 -1
- package/dist/storage/ontology/in-memory/sources.d.ts +2 -1
- package/dist/storage/ontology/in-memory/sources.d.ts.map +1 -1
- package/dist/storage/ontology/index.d.ts +1 -1
- package/dist/storage/ontology/index.d.ts.map +1 -1
- package/dist/storage/ontology/sources.d.ts +15 -0
- package/dist/storage/ontology/sources.d.ts.map +1 -1
- package/dist/storage/projection-runs/provider.js +3 -3
- package/dist/storage/share-grants/in-memory.d.ts +2 -1
- package/dist/storage/share-grants/in-memory.d.ts.map +1 -1
- package/dist/storage/share-grants/index.d.ts +1 -1
- package/dist/storage/share-grants/index.d.ts.map +1 -1
- package/dist/storage/share-grants/types.d.ts +6 -0
- package/dist/storage/share-grants/types.d.ts.map +1 -1
- package/dist/storage/types.d.ts +4 -0
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/workflow-runs/in-memory.d.ts +4 -0
- package/dist/storage/workflow-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/workflow-runs/provider.js +13 -12
- package/dist/storage/workflow-runs/provider.js.map +1 -1
- package/dist/storage/workflow-runs/types.d.ts +5 -0
- package/dist/storage/workflow-runs/types.d.ts.map +1 -1
- package/dist/syncs/index.js +35 -34
- package/dist/syncs/index.js.map +1 -1
- package/dist/testing/action-run-storage-contract.d.ts.map +1 -1
- package/dist/testing/activity-storage-contract.d.ts +14 -0
- package/dist/testing/activity-storage-contract.d.ts.map +1 -0
- package/dist/testing/agent-storage-contract.d.ts.map +1 -1
- package/dist/testing/artifact-storage-contract.d.ts +13 -0
- package/dist/testing/artifact-storage-contract.d.ts.map +1 -0
- package/dist/testing/auth-storage-contract.d.ts.map +1 -1
- package/dist/testing/execution-storage-contract.d.ts.map +1 -1
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +4488 -3137
- package/dist/testing/index.js.map +14 -12
- package/dist/testing/lake-merge-storage-contract.d.ts.map +1 -1
- package/dist/testing/lake-storage-contract.d.ts +2 -0
- package/dist/testing/lake-storage-contract.d.ts.map +1 -1
- package/dist/testing/ontology-storage-contract.d.ts.map +1 -1
- package/dist/testing/share-grant-storage-contract.d.ts.map +1 -1
- package/dist/webhooks/internal.js +27 -26
- package/dist/webhooks/internal.js.map +2 -2
- package/dist/workers/index.js +2 -2
- package/dist/workflows/builders.d.ts.map +1 -1
- package/dist/workflows/index.js +57 -51
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/types.d.ts +9 -0
- package/dist/workflows/types.d.ts.map +1 -1
- package/dist/workflows/validation.d.ts +7 -0
- package/dist/workflows/validation.d.ts.map +1 -1
- package/package.json +25 -1
- package/src/actions/execution.ts +18 -13
- package/src/actions/request.ts +18 -3
- package/src/actions/run-authorization.ts +23 -0
- package/src/activity/README.md +155 -0
- package/src/activity/connection.ts +217 -0
- package/src/activity/device.ts +41 -0
- package/src/activity/execution.ts +210 -0
- package/src/activity/service.ts +274 -0
- package/src/activity/shares.ts +62 -0
- package/src/activity/timeline.ts +424 -0
- package/src/agents/index.ts +8 -3
- package/src/agents/request.ts +5 -0
- package/src/agents/skills.ts +6 -0
- package/src/agents/types.ts +8 -8
- package/src/agents/validation.ts +2 -0
- package/src/artifacts/address.ts +132 -0
- package/src/artifacts/csv.ts +108 -0
- package/src/artifacts/errors.ts +21 -0
- package/src/artifacts/execution.ts +153 -0
- package/src/artifacts/frames/assets.ts +88 -0
- package/src/artifacts/frames/grants.ts +124 -0
- package/src/artifacts/frames/index.ts +15 -0
- package/src/artifacts/frames/kit.ts +392 -0
- package/src/artifacts/frames/probe.ts +309 -0
- package/src/artifacts/frames/protocol.ts +174 -0
- package/src/artifacts/frames/runtime.ts +213 -0
- package/src/artifacts/html.ts +25 -0
- package/src/artifacts/ids.ts +18 -0
- package/src/artifacts/index.ts +61 -0
- package/src/artifacts/kinds.ts +8 -0
- package/src/artifacts/limits.ts +27 -0
- package/src/artifacts/outline.ts +62 -0
- package/src/artifacts/publish/files.ts +87 -0
- package/src/artifacts/publish/index.ts +12 -0
- package/src/artifacts/publish/publish.ts +250 -0
- package/src/artifacts/publish/references.ts +130 -0
- package/src/artifacts/publish/validate/document.ts +114 -0
- package/src/artifacts/publish/validate/file.ts +19 -0
- package/src/artifacts/publish/validate/sheet.ts +251 -0
- package/src/artifacts/publish/validate/slides.ts +134 -0
- package/src/artifacts/references.ts +11 -0
- package/src/artifacts/resolve.ts +97 -0
- package/src/artifacts/theme.ts +116 -0
- package/src/artifacts/warnings.ts +10 -0
- package/src/artifacts/workbook.ts +315 -0
- package/src/authorization/decision.ts +5 -0
- package/src/authorization/grant-kinds.ts +14 -2
- package/src/blob-storage/internal.ts +1 -1
- package/src/blob-storage/media-type.ts +69 -0
- package/src/datasets/builders.ts +66 -2
- package/src/datasets/column-index.ts +19 -0
- package/src/datasets/execution.ts +23 -9
- package/src/errors/internal.ts +1 -0
- package/src/events/execution.ts +134 -21
- package/src/execution/authorized-object-reader.ts +270 -256
- package/src/execution/object-reader-clearance.ts +91 -0
- package/src/execution/object-reader-ontology.ts +63 -0
- package/src/execution/object-reader-security.ts +146 -0
- package/src/http/api-routes.ts +125 -0
- package/src/index.ts +71 -3
- package/src/lake-storage/in-memory.ts +26 -3
- package/src/lake-storage/index.ts +13 -1
- package/src/lake-storage/lineage.ts +385 -0
- package/src/lake-storage/sql-transforms.ts +45 -0
- package/src/lake-storage/types.ts +59 -1
- package/src/lake-storage/version-inputs.ts +35 -6
- package/src/maintenance/ontology-maintenance.ts +15 -0
- package/src/objects/clearance-redaction.ts +138 -0
- package/src/objects/link/authorization.ts +27 -7
- package/src/objects/link/remove.ts +2 -2
- package/src/objects/link/upsert-batch.ts +7 -5
- package/src/objects/link/upsert.ts +2 -2
- package/src/objects/object/delete.ts +2 -0
- package/src/objects/object/upsert-batch.ts +2 -4
- package/src/objects/object/upsert.ts +2 -3
- package/src/objects/property-clearance.ts +171 -152
- package/src/objects/query/clearance-admission.ts +112 -0
- package/src/objects/query/link-query-clearance.ts +73 -0
- package/src/ontology/builders.ts +12 -1
- package/src/ontology/docs-markdown.ts +1 -1
- package/src/pipelines/index.ts +2 -0
- package/src/pipelines/lineage.ts +45 -0
- package/src/projections/internal.ts +2 -2
- package/src/runtime/create.ts +4 -0
- package/src/runtime/host.ts +55 -0
- package/src/runtime/internal.ts +2 -0
- package/src/runtime/ontology-mutations.ts +19 -4
- package/src/runtime/resolve-definitions.ts +66 -3
- package/src/runtime/sixb.ts +18 -1
- package/src/sandboxes/README.md +29 -7
- package/src/sandboxes/auth.ts +16 -0
- package/src/sandboxes/config.ts +2 -7
- package/src/sandboxes/configuration.ts +61 -7
- package/src/sandboxes/index.ts +1 -0
- package/src/sandboxes/sandbox.ts +27 -5
- package/src/security/applied-markings-contribution.ts +277 -0
- package/src/security/applied-markings-host.ts +41 -0
- package/src/security/applied-markings-snapshot.ts +235 -0
- package/src/security/applied-markings.ts +405 -0
- package/src/security/dataset-version-markings.ts +163 -0
- package/src/security/grants.ts +39 -4
- package/src/security/index.ts +3 -0
- package/src/security/internal.ts +18 -0
- package/src/security/marking-propagation.ts +255 -0
- package/src/security/marking-sets.ts +42 -0
- package/src/security/markings.ts +29 -178
- package/src/security/pipeline-markings.ts +175 -0
- package/src/security/project.ts +8 -0
- package/src/security/projection-markings.ts +421 -0
- package/src/security/redactions.ts +7 -2
- package/src/security/types.ts +20 -2
- package/src/security/validation.ts +11 -4
- package/src/storage/action-runs/in-memory.ts +18 -0
- package/src/storage/action-runs/types.ts +8 -0
- package/src/storage/activity/in-memory.ts +374 -0
- package/src/storage/activity/index.ts +27 -0
- package/src/storage/activity/policy.ts +430 -0
- package/src/storage/activity/types.ts +211 -0
- package/src/storage/agents/in-memory.ts +10 -0
- package/src/storage/agents/provider.ts +2 -13
- package/src/storage/agents/types.ts +9 -16
- package/src/storage/artifacts/errors.ts +16 -0
- package/src/storage/artifacts/in-memory.ts +240 -0
- package/src/storage/artifacts/index.ts +30 -0
- package/src/storage/artifacts/record.ts +200 -0
- package/src/storage/artifacts/types.ts +209 -0
- package/src/storage/auth/in-memory/sessions.ts +21 -0
- package/src/storage/auth/index.ts +2 -0
- package/src/storage/auth/types.ts +18 -0
- package/src/storage/executions/in-memory.ts +61 -1
- package/src/storage/executions/index.ts +3 -0
- package/src/storage/executions/provider.ts +12 -0
- package/src/storage/executions/types.ts +30 -0
- package/src/storage/in-memory/index.ts +16 -0
- package/src/storage/index.ts +63 -0
- package/src/storage/internal.ts +30 -0
- package/src/storage/ontology/in-memory/sources.ts +23 -0
- package/src/storage/ontology/index.ts +2 -0
- package/src/storage/ontology/sources.ts +17 -0
- package/src/storage/share-grants/in-memory.ts +8 -0
- package/src/storage/share-grants/index.ts +1 -0
- package/src/storage/share-grants/types.ts +8 -0
- package/src/storage/types.ts +4 -0
- package/src/storage/workflow-runs/in-memory.ts +16 -0
- package/src/storage/workflow-runs/types.ts +5 -0
- package/src/testing/action-run-storage-contract.ts +25 -0
- package/src/testing/activity-storage-contract.ts +840 -0
- package/src/testing/agent-storage-contract.ts +22 -21
- package/src/testing/artifact-storage-contract.ts +517 -0
- package/src/testing/auth-storage-contract.ts +47 -0
- package/src/testing/execution-storage-contract.ts +147 -1
- package/src/testing/index.ts +9 -0
- package/src/testing/lake-merge-storage-contract.ts +38 -0
- package/src/testing/lake-storage-contract.ts +247 -2
- package/src/testing/materializer-storage-contract.ts +1 -0
- package/src/testing/ontology-storage-contract.ts +57 -2
- package/src/testing/share-grant-storage-contract.ts +15 -0
- package/src/workflows/builders.ts +14 -0
- package/src/workflows/types.ts +9 -0
- package/src/workflows/validation.ts +72 -0
- package/dist/chunk-1k89ecfr.js +0 -85
- package/dist/chunk-1k89ecfr.js.map +0 -10
- package/dist/chunk-3t2hgbgd.js.map +0 -15
- package/dist/chunk-4vyr1j8f.js +0 -128
- package/dist/chunk-4vyr1j8f.js.map +0 -11
- package/dist/chunk-9gyp8hg1.js +0 -363
- package/dist/chunk-9gyp8hg1.js.map +0 -14
- package/dist/chunk-es1gxsbf.js.map +0 -13
- package/dist/chunk-gsjm1wms.js.map +0 -10
- package/dist/chunk-hkc3jct7.js.map +0 -10
- package/dist/chunk-k6q3n2sc.js.map +0 -12
- package/dist/chunk-rrzt8jdy.js.map +0 -14
- package/dist/chunk-s16apyk9.js +0 -256
- package/dist/chunk-s16apyk9.js.map +0 -16
- package/dist/chunk-s54c868q.js.map +0 -12
- package/dist/chunk-tw03bsmb.js.map +0 -11
- /package/dist/{chunk-xfs8x8m9.js.map → chunk-0bphap9y.js.map} +0 -0
- /package/dist/{chunk-1zq2p6g0.js.map → chunk-1cc1xaf3.js.map} +0 -0
- /package/dist/{chunk-t7x8dmn0.js.map → chunk-431pyp2c.js.map} +0 -0
- /package/dist/{chunk-c85m1hyj.js.map → chunk-447a5c0p.js.map} +0 -0
- /package/dist/{chunk-ren4kg2j.js.map → chunk-561r0yc9.js.map} +0 -0
- /package/dist/{chunk-5e43w60z.js.map → chunk-5948n82c.js.map} +0 -0
- /package/dist/{chunk-yzwja0mj.js.map → chunk-5hx48dnn.js.map} +0 -0
- /package/dist/{chunk-5j58wjct.js.map → chunk-858emn8m.js.map} +0 -0
- /package/dist/{chunk-6p49a5cq.js.map → chunk-c1rxbz5y.js.map} +0 -0
- /package/dist/{chunk-gc4ntf7d.js.map → chunk-cwdzcv37.js.map} +0 -0
- /package/dist/{chunk-fa02jy15.js.map → chunk-cy4mbddw.js.map} +0 -0
- /package/dist/{chunk-9w055r5b.js.map → chunk-d09e3rax.js.map} +0 -0
- /package/dist/{chunk-dk8tkk5f.js.map → chunk-d7dnxdep.js.map} +0 -0
- /package/dist/{chunk-tg2cw67r.js.map → chunk-ky3j490c.js.map} +0 -0
- /package/dist/{chunk-vyf9kfqf.js.map → chunk-q7gn29y3.js.map} +0 -0
- /package/dist/{chunk-v9xd5wzd.js.map → chunk-s7jg7pmn.js.map} +0 -0
- /package/dist/{chunk-9dmt152s.js.map → chunk-vf57cr4t.js.map} +0 -0
- /package/dist/{chunk-9ybhtmg4.js.map → chunk-vvxtn22d.js.map} +0 -0
- /package/dist/{chunk-7t429e3f.js.map → chunk-xvsc5m8n.js.map} +0 -0
- /package/dist/{chunk-z4m0yz8c.js.map → chunk-y5tah2kf.js.map} +0 -0
- /package/dist/{chunk-fkgc1wt8.js.map → chunk-z58tm0hm.js.map} +0 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import type { DatasetDefinition } from "../datasets/types"
|
|
2
|
+
import { lineageColumn } from "../lake-storage/lineage"
|
|
3
|
+
import type { DatasetColumnLineage, DatasetColumnRef } from "../lake-storage/types"
|
|
4
|
+
import { runStepLineage, stepReadColumns } from "../pipelines/lineage"
|
|
5
|
+
import type { PipelineDefinition, PipelineStepDefinition } from "../pipelines/types"
|
|
6
|
+
|
|
7
|
+
/** A step of a registered pipeline. A step reused by two pipelines is two registered steps. */
|
|
8
|
+
export interface RegisteredStep {
|
|
9
|
+
readonly pipelineId: string
|
|
10
|
+
readonly step: PipelineStepDefinition
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** The column that declares a marking, and the steps it went through to reach a column. */
|
|
14
|
+
export interface MarkingOrigin {
|
|
15
|
+
readonly column: DatasetColumnRef
|
|
16
|
+
/** `pipeline/step`, upstream first. Empty when the column declares the marking itself. */
|
|
17
|
+
readonly steps: readonly string[]
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Each marking a column carries, with one path it arrived by. */
|
|
21
|
+
export type ColumnMarkingOrigins = ReadonlyMap<string, MarkingOrigin>
|
|
22
|
+
|
|
23
|
+
/** Markings of every column of every registered dataset, derived from the definitions. */
|
|
24
|
+
export interface DatasetMarkings {
|
|
25
|
+
/** Empty for a column without markings or that is not registered. */
|
|
26
|
+
of(column: DatasetColumnRef): ColumnMarkingOrigins
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function registeredSteps(
|
|
30
|
+
pipelines: readonly PipelineDefinition[]
|
|
31
|
+
): readonly RegisteredStep[] {
|
|
32
|
+
return pipelines.flatMap((pipeline) =>
|
|
33
|
+
pipeline.graph.nodes.map(({ step }) => ({ pipelineId: pipeline.id, step }))
|
|
34
|
+
)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Lineage of each `run` step, built once per step object; undefined for other steps. */
|
|
38
|
+
export function runStepLineages(
|
|
39
|
+
datasetsById: ReadonlyMap<string, DatasetDefinition>
|
|
40
|
+
): (entry: RegisteredStep) => DatasetColumnLineage | undefined {
|
|
41
|
+
const lineages = new Map<PipelineStepDefinition, DatasetColumnLineage>()
|
|
42
|
+
|
|
43
|
+
return ({ step }) => {
|
|
44
|
+
if (step.executor.kind !== "run") return undefined
|
|
45
|
+
|
|
46
|
+
let lineage = lineages.get(step)
|
|
47
|
+
if (!lineage) {
|
|
48
|
+
lineage = runStepLineage(step, datasetsById)
|
|
49
|
+
lineages.set(step, lineage)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return lineage
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function stepLabel(entry: RegisteredStep): string {
|
|
57
|
+
return `${entry.pipelineId}/${entry.step.id}`
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
type MutableOrigins = Map<string, MarkingOrigin>
|
|
61
|
+
|
|
62
|
+
const NO_MARKINGS: ColumnMarkingOrigins = new Map()
|
|
63
|
+
|
|
64
|
+
interface KnownLineage {
|
|
65
|
+
readonly lineage: DatasetColumnLineage
|
|
66
|
+
/** What a column the lineage does not list depends on. */
|
|
67
|
+
readonly reads: readonly DatasetColumnRef[]
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Markings each column carries according to the registered definitions: the ones it declares, and
|
|
72
|
+
* the ones each step derives from the columns it depends on, once that step's lineage is known.
|
|
73
|
+
*
|
|
74
|
+
* What decided the rows of a step's inputs decides the rows of its output, whether or not the step
|
|
75
|
+
* reads a column of that input: `SELECT count(*) FROM rich` reveals which rows `rich` holds. So
|
|
76
|
+
* each dataset also keeps the markings of its row dependencies, and every output column of a step
|
|
77
|
+
* carries those of every input it reads, as the lineage each version records does.
|
|
78
|
+
*
|
|
79
|
+
* A step may read its own output and a dataset may have several producers, so a step whose output
|
|
80
|
+
* gains a marking queues the steps that read that output, until nothing changes. Lineage can be
|
|
81
|
+
* added in rounds: each round only revisits what the new lineage reaches.
|
|
82
|
+
*/
|
|
83
|
+
export class MarkingPropagation implements DatasetMarkings {
|
|
84
|
+
private readonly datasetsById: ReadonlyMap<string, DatasetDefinition>
|
|
85
|
+
/** Marked columns only, by dataset, built when a dataset is first looked at. */
|
|
86
|
+
private readonly markings = new Map<string, Map<string, MutableOrigins>>()
|
|
87
|
+
/** Markings of what decides each dataset's rows, for datasets a step writes. */
|
|
88
|
+
private readonly rowMarkings = new Map<string, MutableOrigins>()
|
|
89
|
+
private readonly ordered: readonly RegisteredStep[]
|
|
90
|
+
private readonly readers = new Map<string, RegisteredStep[]>()
|
|
91
|
+
private readonly known = new Map<RegisteredStep, KnownLineage>()
|
|
92
|
+
private readonly queue = new Set<RegisteredStep>()
|
|
93
|
+
|
|
94
|
+
constructor(
|
|
95
|
+
datasetsById: ReadonlyMap<string, DatasetDefinition>,
|
|
96
|
+
steps: readonly RegisteredStep[]
|
|
97
|
+
) {
|
|
98
|
+
this.datasetsById = datasetsById
|
|
99
|
+
this.ordered = inDependencyOrder(steps)
|
|
100
|
+
|
|
101
|
+
for (const entry of steps) {
|
|
102
|
+
for (const input of new Set(Object.values(entry.step.inputs).map((dataset) => dataset.id))) {
|
|
103
|
+
appendTo(this.readers, input, entry)
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
of(ref: DatasetColumnRef): ColumnMarkingOrigins {
|
|
109
|
+
return this.markedColumns(ref.datasetId).get(ref.column) ?? NO_MARKINGS
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Derive markings through every step `lineageOf` knows the lineage of. A step it returns null
|
|
114
|
+
* for derives nothing until a later call knows it.
|
|
115
|
+
*/
|
|
116
|
+
derive(lineageOf: (entry: RegisteredStep) => DatasetColumnLineage | null): this {
|
|
117
|
+
for (const entry of this.ordered) {
|
|
118
|
+
if (this.known.has(entry)) continue
|
|
119
|
+
|
|
120
|
+
const lineage = lineageOf(entry)
|
|
121
|
+
if (!lineage) continue
|
|
122
|
+
|
|
123
|
+
this.known.set(entry, { lineage, reads: stepReadColumns(entry.step) })
|
|
124
|
+
this.queue.add(entry)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
for (const entry of this.queue) {
|
|
128
|
+
this.queue.delete(entry)
|
|
129
|
+
const known = this.known.get(entry)
|
|
130
|
+
if (!known || !this.apply(entry, known)) continue
|
|
131
|
+
|
|
132
|
+
// Entries added while iterating a Set are visited, so the queue drains in this loop.
|
|
133
|
+
for (const reader of this.readers.get(entry.step.output.id) ?? []) {
|
|
134
|
+
if (this.known.has(reader)) this.queue.add(reader)
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return this
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** Whether the output's rows or any output column gained a marking. */
|
|
142
|
+
private apply(entry: RegisteredStep, { lineage, reads }: KnownLineage): boolean {
|
|
143
|
+
const label = stepLabel(entry)
|
|
144
|
+
const rows = this.union(lineage.rows)
|
|
145
|
+
|
|
146
|
+
for (const input of new Set(Object.values(entry.step.inputs).map((dataset) => dataset.id))) {
|
|
147
|
+
for (const [markingId, origin] of this.rowMarkings.get(input) ?? []) {
|
|
148
|
+
if (!rows.has(markingId)) rows.set(markingId, origin)
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
let everyRead: ReadonlyMap<string, MarkingOrigin> | undefined
|
|
153
|
+
let changed = false
|
|
154
|
+
|
|
155
|
+
const outputId = entry.step.output.id
|
|
156
|
+
let outputRows = this.rowMarkings.get(outputId)
|
|
157
|
+
|
|
158
|
+
for (const [markingId, origin] of rows) {
|
|
159
|
+
if (outputRows?.has(markingId)) continue
|
|
160
|
+
if (!outputRows) {
|
|
161
|
+
outputRows = new Map()
|
|
162
|
+
this.rowMarkings.set(outputId, outputRows)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
outputRows.set(markingId, { column: origin.column, steps: [...origin.steps, label] })
|
|
166
|
+
changed = true
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const marked = this.markedColumns(outputId)
|
|
170
|
+
for (const { name: column } of this.datasetsById.get(outputId)?.schema.columns ?? []) {
|
|
171
|
+
const values = lineageColumn(lineage, column)
|
|
172
|
+
const valueSource = values ? this.union(values) : (everyRead ?? this.union(reads))
|
|
173
|
+
if (!values) everyRead = valueSource
|
|
174
|
+
|
|
175
|
+
for (const source of [rows, valueSource]) {
|
|
176
|
+
for (const [markingId, origin] of source) {
|
|
177
|
+
let origins = marked.get(column)
|
|
178
|
+
if (origins?.has(markingId)) continue
|
|
179
|
+
if (!origins) {
|
|
180
|
+
origins = new Map()
|
|
181
|
+
marked.set(column, origins)
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
origins.set(markingId, { column: origin.column, steps: [...origin.steps, label] })
|
|
185
|
+
changed = true
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
return changed
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
private markedColumns(datasetId: string): Map<string, MutableOrigins> {
|
|
194
|
+
let columns = this.markings.get(datasetId)
|
|
195
|
+
if (!columns) {
|
|
196
|
+
columns = new Map()
|
|
197
|
+
for (const column of this.datasetsById.get(datasetId)?.schema.columns ?? []) {
|
|
198
|
+
if (!column.markings?.length) continue
|
|
199
|
+
|
|
200
|
+
const origin = { column: { datasetId, column: column.name }, steps: [] }
|
|
201
|
+
columns.set(column.name, new Map(column.markings.map((id) => [id, origin])))
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
this.markings.set(datasetId, columns)
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return columns
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/** Every marking of these columns, each with the first origin found. */
|
|
211
|
+
private union(columns: readonly DatasetColumnRef[]): MutableOrigins {
|
|
212
|
+
const union: MutableOrigins = new Map()
|
|
213
|
+
for (const column of columns) {
|
|
214
|
+
for (const [markingId, origin] of this.of(column)) {
|
|
215
|
+
if (!union.has(markingId)) union.set(markingId, origin)
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return union
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/** Producers before consumers, so most markings arrive by their shortest path. */
|
|
223
|
+
function inDependencyOrder(steps: readonly RegisteredStep[]): readonly RegisteredStep[] {
|
|
224
|
+
const producers = producersByDataset(steps)
|
|
225
|
+
const ordered: RegisteredStep[] = []
|
|
226
|
+
const visited = new Set<RegisteredStep>()
|
|
227
|
+
|
|
228
|
+
const visit = (entry: RegisteredStep): void => {
|
|
229
|
+
if (visited.has(entry)) return
|
|
230
|
+
|
|
231
|
+
visited.add(entry)
|
|
232
|
+
for (const input of Object.values(entry.step.inputs)) {
|
|
233
|
+
for (const producer of producers.get(input.id) ?? []) visit(producer)
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
ordered.push(entry)
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
for (const entry of steps) visit(entry)
|
|
240
|
+
return ordered
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function producersByDataset(
|
|
244
|
+
steps: readonly RegisteredStep[]
|
|
245
|
+
): ReadonlyMap<string, readonly RegisteredStep[]> {
|
|
246
|
+
const producers = new Map<string, RegisteredStep[]>()
|
|
247
|
+
for (const entry of steps) appendTo(producers, entry.step.output.id, entry)
|
|
248
|
+
return producers
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
function appendTo<TValue>(map: Map<string, TValue[]>, key: string, value: TValue): void {
|
|
252
|
+
const values = map.get(key)
|
|
253
|
+
if (values) values.push(value)
|
|
254
|
+
else map.set(key, [value])
|
|
255
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared, immutable sets of marking ids.
|
|
3
|
+
*
|
|
4
|
+
* Every column of every resolved version holds one of a handful of distinct sets, so each distinct
|
|
5
|
+
* set is created once and compared by identity.
|
|
6
|
+
*/
|
|
7
|
+
export class MarkingSets {
|
|
8
|
+
readonly empty: ReadonlySet<string> = new Set()
|
|
9
|
+
private readonly sets = new Map<string, ReadonlySet<string>>([["", this.empty]])
|
|
10
|
+
|
|
11
|
+
of(markingIds: Iterable<string> | undefined): ReadonlySet<string> {
|
|
12
|
+
// Most columns carry no marking.
|
|
13
|
+
if (markingIds === undefined || (Array.isArray(markingIds) && markingIds.length === 0)) {
|
|
14
|
+
return this.empty
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const sorted = [...new Set(markingIds)].sort()
|
|
18
|
+
const key = sorted.join("\u0000")
|
|
19
|
+
|
|
20
|
+
let set = this.sets.get(key)
|
|
21
|
+
if (!set) {
|
|
22
|
+
set = new Set(sorted)
|
|
23
|
+
this.sets.set(key, set)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return set
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** The union of sets this instance created. */
|
|
30
|
+
union(sets: Iterable<ReadonlySet<string> | undefined>): ReadonlySet<string> {
|
|
31
|
+
let single: ReadonlySet<string> | undefined
|
|
32
|
+
const ids: string[] = []
|
|
33
|
+
|
|
34
|
+
for (const set of sets) {
|
|
35
|
+
if (!set || set.size === 0) continue
|
|
36
|
+
single = single === undefined && ids.length === 0 ? set : undefined
|
|
37
|
+
ids.push(...set)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return single ?? this.of(ids)
|
|
41
|
+
}
|
|
42
|
+
}
|
package/src/security/markings.ts
CHANGED
|
@@ -3,15 +3,19 @@ import type { OntologyDefinitionCatalog } from "../ontology/registry"
|
|
|
3
3
|
import type { ObjectType, Property } from "../ontology/types"
|
|
4
4
|
import type { PipelineDefinition } from "../pipelines/types"
|
|
5
5
|
import type { ProjectionDefinitionCatalog } from "../projections/registry"
|
|
6
|
-
import type { ObjectProjectionDefinition } from "../projections/types"
|
|
7
6
|
import { SecurityValidationError } from "./errors"
|
|
7
|
+
import { MarkingPropagation, registeredSteps, runStepLineages } from "./marking-propagation"
|
|
8
|
+
import { validateProjectionMarkings } from "./projection-markings"
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* Check every marking once at startup.
|
|
11
12
|
*
|
|
12
|
-
* A marking is enforced at read time from the property or column definition
|
|
13
|
-
* here closes a path that would otherwise return the value
|
|
14
|
-
* ambiguous.
|
|
13
|
+
* A marking is enforced at read time from the property or column definition and the lineage of
|
|
14
|
+
* the version read, so each rule here closes a path that would otherwise return the value
|
|
15
|
+
* unredacted or make enforcement ambiguous.
|
|
16
|
+
*
|
|
17
|
+
* Projections are checked against the markings columns declare or inherit through `run` steps.
|
|
18
|
+
* What SQL steps derive needs the lake provider's analysis, which `checkPipelineMarkings` adds.
|
|
15
19
|
*/
|
|
16
20
|
export function validateMarkingsAtStartup(input: {
|
|
17
21
|
readonly markingIds: ReadonlySet<string>
|
|
@@ -22,8 +26,14 @@ export function validateMarkingsAtStartup(input: {
|
|
|
22
26
|
}): void {
|
|
23
27
|
validatePropertyMarkings(input.ontology, input.markingIds)
|
|
24
28
|
validateColumnMarkings(input.datasetsById, input.markingIds)
|
|
25
|
-
|
|
26
|
-
|
|
29
|
+
|
|
30
|
+
const runLineageOf = runStepLineages(input.datasetsById)
|
|
31
|
+
const markings = new MarkingPropagation(
|
|
32
|
+
input.datasetsById,
|
|
33
|
+
registeredSteps(input.pipelines)
|
|
34
|
+
).derive((entry) => runLineageOf(entry) ?? null)
|
|
35
|
+
|
|
36
|
+
validateProjectionMarkings(input.projections, input.ontology, markings)
|
|
27
37
|
}
|
|
28
38
|
|
|
29
39
|
// ── Declarations ────────────────────────────────────────────
|
|
@@ -85,9 +95,20 @@ function assertSubtypeKeepsParentMarkings(
|
|
|
85
95
|
const parent = ontology.getObjectTypeById(objectType.extends)
|
|
86
96
|
if (!parent) return
|
|
87
97
|
|
|
98
|
+
// Indexed on the first marked parent property: most parents mark nothing.
|
|
99
|
+
let propertiesById: Map<string, Property> | undefined
|
|
88
100
|
for (const parentProperty of parent.properties) {
|
|
89
|
-
const
|
|
90
|
-
|
|
101
|
+
const parentMarkings = parentProperty.markings
|
|
102
|
+
if (!parentMarkings) continue
|
|
103
|
+
|
|
104
|
+
if (!propertiesById) {
|
|
105
|
+
propertiesById = new Map()
|
|
106
|
+
for (const property of objectType.properties) {
|
|
107
|
+
if (!propertiesById.has(property.id)) propertiesById.set(property.id, property)
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const missing = missingMarkings(parentMarkings, propertiesById.get(parentProperty.id)?.markings)
|
|
91
112
|
if (missing.length > 0) {
|
|
92
113
|
throw new SecurityValidationError(
|
|
93
114
|
`[Sixb] Property '${objectType.id}.${parentProperty.id}' must keep the markings of '${parent.id}.${parentProperty.id}': add ${missing.map((markingId) => `'${markingId}'`).join(", ")}.`
|
|
@@ -134,172 +155,6 @@ function assertMarkingList(
|
|
|
134
155
|
}
|
|
135
156
|
}
|
|
136
157
|
|
|
137
|
-
// ── Propagation ─────────────────────────────────────────────
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* A step's output inherits nothing from its inputs until Sixb can derive each output column's
|
|
141
|
-
* markings from the transform. Until then, reading a marked column would declassify it.
|
|
142
|
-
*/
|
|
143
|
-
function rejectPipelineStepsOverMarkedColumns(
|
|
144
|
-
pipelines: readonly PipelineDefinition[],
|
|
145
|
-
datasetsById: ReadonlyMap<string, DatasetDefinition>
|
|
146
|
-
): void {
|
|
147
|
-
for (const pipeline of pipelines) {
|
|
148
|
-
for (const { step } of pipeline.graph.nodes) {
|
|
149
|
-
for (const input of Object.values(step.inputs)) {
|
|
150
|
-
const dataset = datasetsById.get(input.id)
|
|
151
|
-
const column = dataset?.schema.columns.find((candidate) => candidate.markings)
|
|
152
|
-
if (!dataset || !column) continue
|
|
153
|
-
throw new SecurityValidationError(
|
|
154
|
-
`[Sixb] Pipeline '${pipeline.id}' step '${step.id}' reads column '${dataset.id}.${column.name}', which carries ${markingList(column.markings)}. Pipeline steps cannot read marked columns yet.`
|
|
155
|
-
)
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Objects are read through the ontology, so each projected property declares the markings of its
|
|
163
|
-
* column: the ontology stays the reviewed contract of what each reader receives. Values that
|
|
164
|
-
* identify objects or key links are returned wherever the object or link is, and telemetry does
|
|
165
|
-
* not enforce markings yet, so those columns cannot carry markings.
|
|
166
|
-
*/
|
|
167
|
-
function validateProjectionMarkings(
|
|
168
|
-
projections: ProjectionDefinitionCatalog,
|
|
169
|
-
ontology: OntologyDefinitionCatalog,
|
|
170
|
-
datasetsById: ReadonlyMap<string, DatasetDefinition>
|
|
171
|
-
): void {
|
|
172
|
-
for (const projection of projections.listObjects()) {
|
|
173
|
-
const objectType = ontology.getObjectTypeById(projection.objectTypeId)
|
|
174
|
-
if (objectType) validateObjectProjection(projection, objectType, datasetsById)
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
for (const projection of projections.listLinks()) {
|
|
178
|
-
const role = `keys link '${projection.sourceObjectTypeId}.${projection.linkId}'`
|
|
179
|
-
for (const columnName of [projection.sourceField, projection.targetField]) {
|
|
180
|
-
assertUnmarkedColumn(projection, sourceColumn(projection, columnName, datasetsById), role)
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
for (const projection of projections.listTelemetry()) {
|
|
185
|
-
const columnNames = [
|
|
186
|
-
projection.objectIdField,
|
|
187
|
-
projection.atField,
|
|
188
|
-
...Object.values(projection.properties).flatMap((mapping) =>
|
|
189
|
-
mapping.unitField === undefined
|
|
190
|
-
? [mapping.valueField]
|
|
191
|
-
: [mapping.valueField, mapping.unitField]
|
|
192
|
-
),
|
|
193
|
-
]
|
|
194
|
-
for (const columnName of columnNames) {
|
|
195
|
-
const column = sourceColumn(projection, columnName, datasetsById)
|
|
196
|
-
if (!column.markings) continue
|
|
197
|
-
throw new SecurityValidationError(
|
|
198
|
-
`[Sixb] Projection '${projection.id}' reads column '${column.path}', which carries ${markingList(column.markings)}. Telemetry projections cannot read marked columns yet.`
|
|
199
|
-
)
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
function validateObjectProjection(
|
|
205
|
-
projection: ObjectProjectionDefinition,
|
|
206
|
-
objectType: ObjectType,
|
|
207
|
-
datasetsById: ReadonlyMap<string, DatasetDefinition>
|
|
208
|
-
): void {
|
|
209
|
-
const keyRoles = objectProjectionKeyRoles(projection, objectType)
|
|
210
|
-
|
|
211
|
-
for (const [propertyId, columnName] of Object.entries(projection.properties)) {
|
|
212
|
-
const column = sourceColumn(projection, columnName, datasetsById)
|
|
213
|
-
const property = objectType.properties.find((candidate) => candidate.id === propertyId)
|
|
214
|
-
const path = `${objectType.id}.${propertyId}`
|
|
215
|
-
const keyRole = keyRoles.get(propertyId)
|
|
216
|
-
if (keyRole) {
|
|
217
|
-
assertUnmarkedColumn(projection, column, keyRole)
|
|
218
|
-
if (property?.markings) {
|
|
219
|
-
throw new SecurityValidationError(
|
|
220
|
-
`[Sixb] Projection '${projection.id}': property '${path}' ${keyRole} and cannot carry markings.`
|
|
221
|
-
)
|
|
222
|
-
}
|
|
223
|
-
continue
|
|
224
|
-
}
|
|
225
|
-
const missing = missingMarkings(column.markings, property?.markings)
|
|
226
|
-
if (missing.length > 0) {
|
|
227
|
-
throw new SecurityValidationError(
|
|
228
|
-
`[Sixb] Projection '${projection.id}': property '${path}' is projected from column '${column.path}', which carries ${markingList(column.markings)}. Add markings: ${markingList(missing)} to the property.`
|
|
229
|
-
)
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
for (const [linkId, link] of Object.entries(projection.links)) {
|
|
234
|
-
if (link.sourceField === undefined) continue
|
|
235
|
-
assertUnmarkedColumn(
|
|
236
|
-
projection,
|
|
237
|
-
sourceColumn(projection, link.sourceField, datasetsById),
|
|
238
|
-
`keys link '${objectType.id}.${linkId}'`
|
|
239
|
-
)
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
// The timestamp decides whether the source value or an app edit wins, which reveals how they
|
|
243
|
-
// compare.
|
|
244
|
-
const conflictResolution = projection.conflictResolution
|
|
245
|
-
if (conflictResolution?.strategy === "mostRecent") {
|
|
246
|
-
assertUnmarkedColumn(
|
|
247
|
-
projection,
|
|
248
|
-
sourceColumn(projection, conflictResolution.sourceTimestamp, datasetsById),
|
|
249
|
-
"decides which value wins under 'mostRecent'"
|
|
250
|
-
)
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
/** Properties whose value becomes an object id or a link key, with the role they play. */
|
|
255
|
-
function objectProjectionKeyRoles(
|
|
256
|
-
projection: ObjectProjectionDefinition,
|
|
257
|
-
objectType: ObjectType
|
|
258
|
-
): ReadonlyMap<string, string> {
|
|
259
|
-
const roles = new Map<string, string>()
|
|
260
|
-
for (const property of objectType.properties) {
|
|
261
|
-
if (property.primary) roles.set(property.id, `becomes the id of '${objectType.id}'`)
|
|
262
|
-
}
|
|
263
|
-
for (const [linkId, link] of Object.entries(projection.links)) {
|
|
264
|
-
if (link.sourcePropertyId === undefined) continue
|
|
265
|
-
roles.set(link.sourcePropertyId, `keys link '${objectType.id}.${linkId}'`)
|
|
266
|
-
}
|
|
267
|
-
return roles
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
interface SourceColumn {
|
|
271
|
-
readonly path: string
|
|
272
|
-
readonly markings?: readonly string[]
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
function sourceColumn(
|
|
276
|
-
projection: { readonly id: string; readonly datasetId: string },
|
|
277
|
-
columnName: string,
|
|
278
|
-
datasetsById: ReadonlyMap<string, DatasetDefinition>
|
|
279
|
-
): SourceColumn {
|
|
280
|
-
const column = datasetsById
|
|
281
|
-
.get(projection.datasetId)
|
|
282
|
-
?.schema.columns.find((candidate) => candidate.name === columnName)
|
|
283
|
-
// Projection validation runs first and resolves every mapped column.
|
|
284
|
-
if (!column) {
|
|
285
|
-
throw new Error(`[Sixb] Projection '${projection.id}' maps unknown column '${columnName}'.`)
|
|
286
|
-
}
|
|
287
|
-
return { path: `${projection.datasetId}.${columnName}`, markings: column.markings }
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
function assertUnmarkedColumn(
|
|
291
|
-
projection: { readonly id: string },
|
|
292
|
-
column: SourceColumn,
|
|
293
|
-
role: string
|
|
294
|
-
): void {
|
|
295
|
-
if (!column.markings) return
|
|
296
|
-
throw new SecurityValidationError(
|
|
297
|
-
`[Sixb] Projection '${projection.id}': column '${column.path}' ${role} and cannot carry markings.`
|
|
298
|
-
)
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
// ── Helpers ─────────────────────────────────────────────────
|
|
302
|
-
|
|
303
158
|
function missingMarkings(
|
|
304
159
|
required: readonly string[] | undefined,
|
|
305
160
|
declared: readonly string[] | undefined
|
|
@@ -307,7 +162,3 @@ function missingMarkings(
|
|
|
307
162
|
const present = new Set(declared ?? [])
|
|
308
163
|
return (required ?? []).filter((markingId) => !present.has(markingId))
|
|
309
164
|
}
|
|
310
|
-
|
|
311
|
-
function markingList(markings: readonly string[] | undefined): string {
|
|
312
|
-
return `[${(markings ?? []).join(", ")}]`
|
|
313
|
-
}
|