@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,405 @@
|
|
|
1
|
+
import type { LakeStorage } from "../lake-storage/types"
|
|
2
|
+
import type { OntologyDefinitionCatalog } from "../ontology/registry"
|
|
3
|
+
import type { PipelineDefinition } from "../pipelines/types"
|
|
4
|
+
import type { ProjectionDefinitionCatalog } from "../projections/registry"
|
|
5
|
+
import type { OntologySourceStorage } from "../storage/ontology"
|
|
6
|
+
import {
|
|
7
|
+
type AppliedVersionRead,
|
|
8
|
+
appliedContribution,
|
|
9
|
+
type EventOriginRef,
|
|
10
|
+
errorMessage,
|
|
11
|
+
eventOriginMarkings,
|
|
12
|
+
producingPipelines,
|
|
13
|
+
type SourceProjection,
|
|
14
|
+
sentence,
|
|
15
|
+
} from "./applied-markings-contribution"
|
|
16
|
+
import {
|
|
17
|
+
type AppliedContribution,
|
|
18
|
+
type AppliedMarkingsSnapshot,
|
|
19
|
+
assembleAppliedMarkings,
|
|
20
|
+
NO_APPLIED_MARKINGS,
|
|
21
|
+
NO_CONTRIBUTION,
|
|
22
|
+
withPropertyMarkings,
|
|
23
|
+
} from "./applied-markings-snapshot"
|
|
24
|
+
import type { DatasetVersionMarkings } from "./dataset-version-markings"
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Objects keep the markings of the dataset version they were projected from.
|
|
28
|
+
*
|
|
29
|
+
* Startup checks the code: each projected property declares the markings its column carries. The
|
|
30
|
+
* objects a projection applied may predate that code. When a property stops declaring a marking
|
|
31
|
+
* its applied version still carries on the column, the objects still hold those values. Until the
|
|
32
|
+
* projection applies a version the code allows, each such property keeps the marking (its
|
|
33
|
+
* surplus), and an object type or link whose key column carries markings is unreadable to readers
|
|
34
|
+
* lacking them, like a type they have no view grant for.
|
|
35
|
+
*
|
|
36
|
+
* Lifecycle: the snapshot is read when a read needs it, with no background work.
|
|
37
|
+
* - A read reads it with one storage query for the projections' active sources; only projections
|
|
38
|
+
* whose applied version or definition changed are classified again. A project whose columns
|
|
39
|
+
* carry no marking reads nothing.
|
|
40
|
+
* - A read uses a snapshot younger than {@link APPLIED_MARKINGS_FRESH_MS}. An older one, up to
|
|
41
|
+
* {@link APPLIED_MARKINGS_MAX_AGE_MS}, is used while one refresh runs behind the read. Past that
|
|
42
|
+
* age, or before any snapshot, the read waits for a refresh and fails if it fails or hangs past
|
|
43
|
+
* the same bound. Other servers so see a newly applied version within seconds.
|
|
44
|
+
* - A host that applies a projection invalidates the snapshot, so its next read refreshes first:
|
|
45
|
+
* `sixb dev` sees a version at once.
|
|
46
|
+
*/
|
|
47
|
+
export interface AppliedMarkings {
|
|
48
|
+
/** Whether readers with these clearances can be denied anything the code alone allows. */
|
|
49
|
+
affects(clearances: ReadonlySet<string>): boolean
|
|
50
|
+
/** The current snapshot, refreshed on demand. */
|
|
51
|
+
current(): Promise<AppliedMarkingsSnapshot>
|
|
52
|
+
/** A projection applied a version in this process: the next read refreshes first. */
|
|
53
|
+
invalidate(): void
|
|
54
|
+
/**
|
|
55
|
+
* The snapshot with the markings an object event's origin version carries on the properties
|
|
56
|
+
* its projection maps: the event holds that version's values, whatever version the projection
|
|
57
|
+
* applied since. Reads each version once, keeping the last few.
|
|
58
|
+
*/
|
|
59
|
+
forEventOrigin(
|
|
60
|
+
snapshot: AppliedMarkingsSnapshot,
|
|
61
|
+
origin: EventOriginRef
|
|
62
|
+
): Promise<AppliedMarkingsSnapshot>
|
|
63
|
+
/**
|
|
64
|
+
* The snapshot with every marking a column declares on each property a projection maps to this
|
|
65
|
+
* type: what an object event's earlier values read under. They are the values an update or a
|
|
66
|
+
* deletion replaced, and the projected values an action or a direct write recorded. They came
|
|
67
|
+
* from versions projections applied before, which no event records, so they read like a version
|
|
68
|
+
* that cannot be read. Like the objects they wrote, a projection the code no longer declares
|
|
69
|
+
* marks nothing.
|
|
70
|
+
*/
|
|
71
|
+
forEarlierValues(snapshot: AppliedMarkingsSnapshot, objectTypeId: string): AppliedMarkingsSnapshot
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export interface AppliedMarkingsOptions {
|
|
75
|
+
readonly projectId: string
|
|
76
|
+
readonly ontology: Pick<OntologyDefinitionCatalog, "getObjectTypeById">
|
|
77
|
+
readonly projections: Pick<ProjectionDefinitionCatalog, "listObjects" | "listLinks">
|
|
78
|
+
/** The revision of a projection's current definition. */
|
|
79
|
+
readonly revisionOf: (projectionId: string) => string
|
|
80
|
+
readonly pipelines: readonly PipelineDefinition[]
|
|
81
|
+
readonly versionMarkings: DatasetVersionMarkings
|
|
82
|
+
readonly lakeStorage: Pick<LakeStorage, "getVersion">
|
|
83
|
+
readonly sources: Pick<OntologySourceStorage, "listActive">
|
|
84
|
+
/** A monotonic clock in milliseconds. */
|
|
85
|
+
readonly now?: () => number
|
|
86
|
+
/** For this repo's tests: the bound past which a read waits, and a refresh fails. */
|
|
87
|
+
readonly maxAgeMs?: number
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Origin versions, and snapshots combined with them, kept for the events read next. */
|
|
91
|
+
const EVENT_ORIGINS_KEPT = 64
|
|
92
|
+
|
|
93
|
+
/** A read uses a snapshot younger than this as it is. */
|
|
94
|
+
export const APPLIED_MARKINGS_FRESH_MS = 5_000
|
|
95
|
+
/** A read waits for a snapshot older than this, and a refresh that takes longer fails. */
|
|
96
|
+
export const APPLIED_MARKINGS_MAX_AGE_MS = 10_000
|
|
97
|
+
|
|
98
|
+
interface ProjectionState {
|
|
99
|
+
/** The applied version and revision the contribution was computed for. */
|
|
100
|
+
readonly key: string
|
|
101
|
+
/** The version could not be read: seal now, read it again on the next refresh. */
|
|
102
|
+
readonly retry: boolean
|
|
103
|
+
readonly contribution: AppliedContribution
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export function createAppliedMarkings(options: AppliedMarkingsOptions): AppliedMarkings {
|
|
107
|
+
const maxAgeMs = options.maxAgeMs ?? APPLIED_MARKINGS_MAX_AGE_MS
|
|
108
|
+
const freshMs = Math.min(APPLIED_MARKINGS_FRESH_MS, maxAgeMs / 2)
|
|
109
|
+
const now = options.now ?? (() => performance.now())
|
|
110
|
+
const versionMarkings = options.versionMarkings
|
|
111
|
+
let pipelineOf: ((datasetId: string) => string | undefined) | undefined
|
|
112
|
+
|
|
113
|
+
let snapshot: AppliedMarkingsSnapshot | undefined
|
|
114
|
+
let fingerprint: string | undefined
|
|
115
|
+
let refreshedAt = 0
|
|
116
|
+
let states = new Map<string, ProjectionState>()
|
|
117
|
+
let generation = 0
|
|
118
|
+
let refreshedGeneration = -1
|
|
119
|
+
let inflight: Promise<void> | undefined
|
|
120
|
+
|
|
121
|
+
// Only the latest refresh may publish: one past its deadline is abandoned.
|
|
122
|
+
let latestRun = 0
|
|
123
|
+
let failing = false
|
|
124
|
+
const warned = new Set<string>()
|
|
125
|
+
|
|
126
|
+
const refresh = (): Promise<void> => {
|
|
127
|
+
if (inflight) return inflight
|
|
128
|
+
|
|
129
|
+
latestRun += 1
|
|
130
|
+
const run = latestRun
|
|
131
|
+
|
|
132
|
+
let timer: ReturnType<typeof setTimeout> | undefined
|
|
133
|
+
const deadline = new Promise<never>((_resolve, reject) => {
|
|
134
|
+
timer = setTimeout(() => {
|
|
135
|
+
latestRun += 1
|
|
136
|
+
reject(
|
|
137
|
+
new Error(
|
|
138
|
+
`[Sixb] Reading the dataset versions projections applied took longer than ${maxAgeMs / 1000}s.`
|
|
139
|
+
)
|
|
140
|
+
)
|
|
141
|
+
}, maxAgeMs)
|
|
142
|
+
timer.unref?.()
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
const work = read(run)
|
|
146
|
+
// The deadline may settle first; the abandoned read must not report an unhandled rejection.
|
|
147
|
+
work.catch(() => {})
|
|
148
|
+
|
|
149
|
+
inflight = Promise.race([work, deadline]).finally(() => {
|
|
150
|
+
clearTimeout(timer)
|
|
151
|
+
inflight = undefined
|
|
152
|
+
})
|
|
153
|
+
|
|
154
|
+
return inflight
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const read = async (run: number) => {
|
|
158
|
+
const startedAt = now()
|
|
159
|
+
const startedGeneration = generation
|
|
160
|
+
|
|
161
|
+
const active = await options.sources.listActive({ projectId: options.projectId })
|
|
162
|
+
const applied = new Map(active.map((source) => [source.source.projectionId, source]))
|
|
163
|
+
const projections: readonly SourceProjection[] = [
|
|
164
|
+
...options.projections.listObjects(),
|
|
165
|
+
...options.projections.listLinks(),
|
|
166
|
+
]
|
|
167
|
+
|
|
168
|
+
const next = new Map<string, ProjectionState>()
|
|
169
|
+
await Promise.all(
|
|
170
|
+
projections.map(async (projection) => {
|
|
171
|
+
const projectionId = projection.id
|
|
172
|
+
|
|
173
|
+
// A source the code no longer declares is read under the code's markings.
|
|
174
|
+
const source = applied.get(projectionId)
|
|
175
|
+
if (!source) return
|
|
176
|
+
|
|
177
|
+
const key = JSON.stringify([
|
|
178
|
+
source.datasetVersion.datasetId,
|
|
179
|
+
source.datasetVersion.versionId,
|
|
180
|
+
source.projectionRevision,
|
|
181
|
+
])
|
|
182
|
+
|
|
183
|
+
const previous = states.get(projectionId)
|
|
184
|
+
if (previous && previous.key === key && !previous.retry) {
|
|
185
|
+
next.set(projectionId, previous)
|
|
186
|
+
return
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const version = await readVersion(source.datasetVersion)
|
|
190
|
+
pipelineOf ??= producingPipelines(options.pipelines)
|
|
191
|
+
const contribution = appliedContribution(projection, source, version, {
|
|
192
|
+
ontology: options.ontology,
|
|
193
|
+
revisionOf: options.revisionOf,
|
|
194
|
+
everyMarking: versionMarkings.everyMarking(),
|
|
195
|
+
pipelineOf,
|
|
196
|
+
})
|
|
197
|
+
|
|
198
|
+
next.set(projectionId, { key, retry: version.kind !== "read", contribution })
|
|
199
|
+
})
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
if (run !== latestRun) return
|
|
203
|
+
|
|
204
|
+
states = next
|
|
205
|
+
failing = false
|
|
206
|
+
publish(next)
|
|
207
|
+
refreshedAt = startedAt
|
|
208
|
+
refreshedGeneration = startedGeneration
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/** Read and classify a version; a version that cannot be read is sealed, then read again. */
|
|
212
|
+
const readVersion = async (ref: {
|
|
213
|
+
readonly datasetId: string
|
|
214
|
+
readonly versionId: string
|
|
215
|
+
}): Promise<AppliedVersionRead> => {
|
|
216
|
+
try {
|
|
217
|
+
const version = await options.lakeStorage.getVersion(ref.datasetId, ref.versionId)
|
|
218
|
+
if (!version) return { kind: "missing" }
|
|
219
|
+
return { kind: "read", version, classification: versionMarkings.classify(version) }
|
|
220
|
+
} catch (error) {
|
|
221
|
+
return { kind: "failed", error }
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const publish = (next: ReadonlyMap<string, ProjectionState>) => {
|
|
226
|
+
const contributions = [...next]
|
|
227
|
+
.sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
|
|
228
|
+
.flatMap(([, state]) => (state.contribution === NO_CONTRIBUTION ? [] : [state.contribution]))
|
|
229
|
+
const nextFingerprint = JSON.stringify(contributions)
|
|
230
|
+
|
|
231
|
+
// Equal content keeps the same object, so clearances resolved for it stay cached.
|
|
232
|
+
if (snapshot && nextFingerprint === fingerprint) return
|
|
233
|
+
|
|
234
|
+
snapshot = assembleAppliedMarkings(contributions)
|
|
235
|
+
fingerprint = nextFingerprint
|
|
236
|
+
|
|
237
|
+
const sealed = new Set(
|
|
238
|
+
snapshot.notices.filter((notice) => notice.sealed).map((notice) => notice.projectionId)
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
// A projection sealed again after it was cleared warns again.
|
|
242
|
+
for (const projectionId of warned) if (!sealed.has(projectionId)) warned.delete(projectionId)
|
|
243
|
+
|
|
244
|
+
for (const notice of snapshot.notices) {
|
|
245
|
+
if (!notice.sealed || warned.has(notice.projectionId)) continue
|
|
246
|
+
warned.add(notice.projectionId)
|
|
247
|
+
console.warn(notice.message)
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/** One refresh behind reads that keep using the snapshot; a failure is reported once a streak. */
|
|
252
|
+
const refreshBehind = () => {
|
|
253
|
+
if (inflight) return
|
|
254
|
+
refresh().catch((error: unknown) => {
|
|
255
|
+
if (failing) return
|
|
256
|
+
failing = true
|
|
257
|
+
console.warn(
|
|
258
|
+
`[Sixb] Could not read the dataset versions projections applied: ${sentence(errorMessage(error))} Reads keep the markings read before for up to ${maxAgeMs / 1000}s, then fail until it succeeds.`
|
|
259
|
+
)
|
|
260
|
+
})
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
const current = async (): Promise<AppliedMarkingsSnapshot> => {
|
|
264
|
+
if (versionMarkings.everyMarking().size === 0) return NO_APPLIED_MARKINGS
|
|
265
|
+
|
|
266
|
+
// An invalidation during a refresh is only covered by a refresh that starts after it.
|
|
267
|
+
for (let attempt = 0; attempt < 3; attempt += 1) {
|
|
268
|
+
if (snapshot && refreshedGeneration === generation) {
|
|
269
|
+
const age = now() - refreshedAt
|
|
270
|
+
if (age < freshMs) return snapshot
|
|
271
|
+
if (age <= maxAgeMs) {
|
|
272
|
+
refreshBehind()
|
|
273
|
+
return snapshot
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
try {
|
|
278
|
+
await refresh()
|
|
279
|
+
} catch (error) {
|
|
280
|
+
if (snapshot && now() - refreshedAt <= maxAgeMs) return snapshot
|
|
281
|
+
throw new Error(
|
|
282
|
+
`[Sixb] Cannot read the dataset versions projections applied, so markings cannot be enforced: ${errorMessage(error)}`,
|
|
283
|
+
{ cause: error }
|
|
284
|
+
)
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
if (!snapshot) throw new Error("[Sixb] Applied markings were not read.")
|
|
289
|
+
return snapshot
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// A version's classification never changes. One that could not be read is read again.
|
|
293
|
+
const originVersions = new Map<string, Promise<AppliedVersionRead>>()
|
|
294
|
+
const readOriginVersion = (origin: EventOriginRef): Promise<AppliedVersionRead> => {
|
|
295
|
+
const key = JSON.stringify([origin.datasetId, origin.datasetVersionId])
|
|
296
|
+
let version = originVersions.get(key)
|
|
297
|
+
|
|
298
|
+
if (version) {
|
|
299
|
+
originVersions.delete(key)
|
|
300
|
+
} else {
|
|
301
|
+
const read = readVersion({ datasetId: origin.datasetId, versionId: origin.datasetVersionId })
|
|
302
|
+
void read.then((result) => {
|
|
303
|
+
if (result.kind === "failed" && originVersions.get(key) === read) originVersions.delete(key)
|
|
304
|
+
})
|
|
305
|
+
version = read
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
keep(originVersions, key, version)
|
|
309
|
+
return version
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
const combined = new WeakMap<AppliedMarkingsSnapshot, Map<string, AppliedMarkingsSnapshot>>()
|
|
313
|
+
const forEventOrigin = async (snapshot: AppliedMarkingsSnapshot, origin: EventOriginRef) => {
|
|
314
|
+
const projection = options.projections
|
|
315
|
+
.listObjects()
|
|
316
|
+
.find((candidate) => candidate.id === origin.projectionId)
|
|
317
|
+
|
|
318
|
+
// Like the objects it wrote, an event of a projection the code no longer declares is read
|
|
319
|
+
// under the markings the code declares.
|
|
320
|
+
if (!projection) return snapshot
|
|
321
|
+
|
|
322
|
+
const read = await readOriginVersion(origin)
|
|
323
|
+
const key = JSON.stringify([
|
|
324
|
+
origin.projectionId,
|
|
325
|
+
origin.datasetId,
|
|
326
|
+
origin.datasetVersionId,
|
|
327
|
+
origin.objectTypeId,
|
|
328
|
+
read.kind,
|
|
329
|
+
])
|
|
330
|
+
|
|
331
|
+
let bySnapshot = combined.get(snapshot)
|
|
332
|
+
const cached = bySnapshot?.get(key)
|
|
333
|
+
if (cached) return cached
|
|
334
|
+
|
|
335
|
+
const result = withPropertyMarkings(
|
|
336
|
+
snapshot,
|
|
337
|
+
eventOriginMarkings(projection, origin, read, {
|
|
338
|
+
ontology: options.ontology,
|
|
339
|
+
everyMarking: versionMarkings.everyMarking(),
|
|
340
|
+
})
|
|
341
|
+
)
|
|
342
|
+
|
|
343
|
+
// Equal snapshots share resolved clearances; a failed read is not kept.
|
|
344
|
+
if (read.kind !== "failed") {
|
|
345
|
+
bySnapshot ??= new Map()
|
|
346
|
+
combined.set(snapshot, bySnapshot)
|
|
347
|
+
keep(bySnapshot, key, result)
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
return result
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
const earlier = new WeakMap<AppliedMarkingsSnapshot, Map<string, AppliedMarkingsSnapshot>>()
|
|
354
|
+
const forEarlierValues = (snapshot: AppliedMarkingsSnapshot, objectTypeId: string) => {
|
|
355
|
+
let byType = earlier.get(snapshot)
|
|
356
|
+
const cached = byType?.get(objectTypeId)
|
|
357
|
+
if (cached) return cached
|
|
358
|
+
|
|
359
|
+
const primary = options.ontology
|
|
360
|
+
.getObjectTypeById(objectTypeId)
|
|
361
|
+
?.properties.find((property) => property.primary)?.id
|
|
362
|
+
const projected = options.projections
|
|
363
|
+
.listObjects()
|
|
364
|
+
.filter((projection) => projection.objectTypeId === objectTypeId)
|
|
365
|
+
.flatMap((projection) => Object.keys(projection.properties))
|
|
366
|
+
|
|
367
|
+
const markings = [...versionMarkings.everyMarking()].sort()
|
|
368
|
+
const result = withPropertyMarkings(
|
|
369
|
+
snapshot,
|
|
370
|
+
[...new Set(projected)]
|
|
371
|
+
.filter((propertyId) => propertyId !== primary)
|
|
372
|
+
.map((propertyId) => ({ objectTypeId, propertyId, markings }))
|
|
373
|
+
)
|
|
374
|
+
|
|
375
|
+
byType ??= new Map()
|
|
376
|
+
earlier.set(snapshot, byType)
|
|
377
|
+
keep(byType, objectTypeId, result)
|
|
378
|
+
return result
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
return {
|
|
382
|
+
forEventOrigin,
|
|
383
|
+
forEarlierValues,
|
|
384
|
+
affects: (clearances) => {
|
|
385
|
+
for (const markingId of versionMarkings.everyMarking()) {
|
|
386
|
+
if (!clearances.has(markingId)) return true
|
|
387
|
+
}
|
|
388
|
+
return false
|
|
389
|
+
},
|
|
390
|
+
current,
|
|
391
|
+
// Also before the first snapshot: a read in flight may have listed the sources before it.
|
|
392
|
+
invalidate: () => {
|
|
393
|
+
generation += 1
|
|
394
|
+
},
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/** Insert as the newest entry, dropping the oldest past the bound. */
|
|
399
|
+
function keep<TValue>(map: Map<string, TValue>, key: string, value: TValue): void {
|
|
400
|
+
map.set(key, value)
|
|
401
|
+
if (map.size <= EVENT_ORIGINS_KEPT) return
|
|
402
|
+
|
|
403
|
+
const oldest = map.keys().next().value
|
|
404
|
+
if (oldest !== undefined) map.delete(oldest)
|
|
405
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import type { DatasetDefinition } from "../datasets/types"
|
|
2
|
+
import { isUnknownLineage, lineageColumn, versionLineage } from "../lake-storage/lineage"
|
|
3
|
+
import type { DatasetColumnRef, DatasetVersion, LakeStorage } from "../lake-storage/types"
|
|
4
|
+
import { MarkingSets } from "./marking-sets"
|
|
5
|
+
|
|
6
|
+
/** Markings of each column of one dataset version. A column without markings has an empty set. */
|
|
7
|
+
export type VersionColumnMarkings = ReadonlyMap<string, ReadonlySet<string>>
|
|
8
|
+
|
|
9
|
+
export interface VersionClassification {
|
|
10
|
+
readonly columns: VersionColumnMarkings
|
|
11
|
+
/**
|
|
12
|
+
* Why part of the version was classified conservatively, with every marking it could hold.
|
|
13
|
+
* Absent when every column was classified from its lineage.
|
|
14
|
+
*/
|
|
15
|
+
readonly conservative?: string
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Markings each version of a dataset carries.
|
|
20
|
+
*
|
|
21
|
+
* Markings are never stored. A column carries the markings its registered dataset declares, and
|
|
22
|
+
* those every column its lineage lists declares. The version records that lineage resolved across
|
|
23
|
+
* every upstream step and every row it keeps (`DatasetVersion.lineage`), so a version keeps the
|
|
24
|
+
* classification of the code that produced it, and classifying it reads no other version.
|
|
25
|
+
*
|
|
26
|
+
* Wherever the record does not say what a column holds (no lineage on a pipeline version, or on
|
|
27
|
+
* any version of a provider that does not declare `recordsLineage`, an unknown history, a column
|
|
28
|
+
* it does not list, a dataset no longer registered) the column is classified with every marking
|
|
29
|
+
* the project declares.
|
|
30
|
+
*/
|
|
31
|
+
export interface DatasetVersionMarkings {
|
|
32
|
+
classify(version: DatasetVersion): VersionClassification
|
|
33
|
+
/**
|
|
34
|
+
* Every marking declared on a registered column. Every classification, conservative ones
|
|
35
|
+
* included, is drawn from it, so a reader cleared for all of it needs no classification. Empty
|
|
36
|
+
* when the project declares no column markings.
|
|
37
|
+
*/
|
|
38
|
+
everyMarking(): ReadonlySet<string>
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface DatasetVersionMarkingsOptions {
|
|
42
|
+
readonly datasets: { list(): readonly DatasetDefinition[] }
|
|
43
|
+
/** The lake the versions are read from: whether it records lineage on every version. */
|
|
44
|
+
readonly lakeStorage: Pick<LakeStorage, "recordsLineage">
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function createDatasetVersionMarkings(
|
|
48
|
+
options: DatasetVersionMarkingsOptions
|
|
49
|
+
): DatasetVersionMarkings {
|
|
50
|
+
const sets = new MarkingSets()
|
|
51
|
+
|
|
52
|
+
// Built on first use: a host that never classifies a version pays nothing for it.
|
|
53
|
+
let declared: ReadonlyMap<string, ReadonlyMap<string, ReadonlySet<string>>> | undefined
|
|
54
|
+
const declaredByDataset = () =>
|
|
55
|
+
(declared ??= new Map(
|
|
56
|
+
options.datasets
|
|
57
|
+
.list()
|
|
58
|
+
.map((dataset) => [
|
|
59
|
+
dataset.id,
|
|
60
|
+
new Map(dataset.schema.columns.map((column) => [column.name, sets.of(column.markings)])),
|
|
61
|
+
])
|
|
62
|
+
))
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Every marking a registered column declares: what a column may hold where its record does not
|
|
66
|
+
* say. The pipelines that wrote it may have read datasets the current code no longer reads, so
|
|
67
|
+
* nothing narrower is safe.
|
|
68
|
+
*/
|
|
69
|
+
let every: ReadonlySet<string> | undefined
|
|
70
|
+
const everyMarking = () =>
|
|
71
|
+
(every ??= sets.union(
|
|
72
|
+
[...declaredByDataset().values()].flatMap((columns) => [...columns.values()])
|
|
73
|
+
))
|
|
74
|
+
|
|
75
|
+
const classify = (version: DatasetVersion): VersionClassification => {
|
|
76
|
+
const subject = `version '${version.versionId}' of '${version.datasetId}'`
|
|
77
|
+
const own = declaredByDataset().get(version.datasetId)
|
|
78
|
+
|
|
79
|
+
// No definition says what its columns declare: they may hold anything a column declares.
|
|
80
|
+
if (!own) return conservatively(version, `dataset '${version.datasetId}' is not registered`)
|
|
81
|
+
|
|
82
|
+
const lineage = versionLineage(version, options.lakeStorage)
|
|
83
|
+
if (isUnknownLineage(lineage)) {
|
|
84
|
+
// A reason core derived names this version. A recorded one names where the lineage was
|
|
85
|
+
// lost: upstream, or, for a provider that could not decode it, this version's own record.
|
|
86
|
+
return conservatively(
|
|
87
|
+
version,
|
|
88
|
+
lineage === version.lineage
|
|
89
|
+
? `the lineage of ${subject} is unknown: ${lineage.unknown}`
|
|
90
|
+
: lineage.unknown
|
|
91
|
+
)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
let conservative: string | undefined
|
|
95
|
+
const markingsOf = (ref: DatasetColumnRef): ReadonlySet<string> | undefined => {
|
|
96
|
+
const columns = declaredByDataset().get(ref.datasetId)
|
|
97
|
+
if (columns) return columns.get(ref.column)
|
|
98
|
+
conservative ??= `dataset '${ref.datasetId}' is not registered`
|
|
99
|
+
return everyMarking()
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const rows = sets.union(lineage.rows.map(markingsOf))
|
|
103
|
+
const columns = new Map(
|
|
104
|
+
version.schema.columns.map(({ name }) => {
|
|
105
|
+
const values = lineageColumn(lineage, name)
|
|
106
|
+
if (!values) {
|
|
107
|
+
conservative ??= `${subject} recorded no lineage for column '${name}'`
|
|
108
|
+
return [name, everyMarking()]
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return [name, sets.union([own.get(name), rows, ...values.map(markingsOf)])]
|
|
112
|
+
})
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
return { columns, ...(conservative === undefined ? {} : { conservative }) }
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const conservatively = (version: DatasetVersion, reason: string): VersionClassification => {
|
|
119
|
+
const markings = everyMarking()
|
|
120
|
+
return {
|
|
121
|
+
columns: new Map(version.schema.columns.map(({ name }) => [name, markings])),
|
|
122
|
+
conservative: reason,
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return { classify, everyMarking }
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// ── Host capability ─────────────────────────────────────────
|
|
130
|
+
|
|
131
|
+
const datasetVersionMarkingsKey: unique symbol = Symbol("sixb.datasetVersionMarkings")
|
|
132
|
+
|
|
133
|
+
interface DatasetVersionMarkingsOwner {
|
|
134
|
+
readonly [datasetVersionMarkingsKey]?: DatasetVersionMarkings
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/** One classifier per host, so every reader shares the markings it reads from the definitions. */
|
|
138
|
+
export function registerDatasetVersionMarkings(
|
|
139
|
+
owner: object,
|
|
140
|
+
markings: DatasetVersionMarkings
|
|
141
|
+
): void {
|
|
142
|
+
const registered = (owner as DatasetVersionMarkingsOwner)[datasetVersionMarkingsKey]
|
|
143
|
+
if (registered && registered !== markings) {
|
|
144
|
+
throw new Error("[Sixb] Dataset version markings are already registered for this owner.")
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
Object.defineProperty(owner, datasetVersionMarkingsKey, {
|
|
148
|
+
configurable: false,
|
|
149
|
+
enumerable: false,
|
|
150
|
+
value: markings,
|
|
151
|
+
writable: false,
|
|
152
|
+
})
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export function getDatasetVersionMarkings(owner: object): DatasetVersionMarkings {
|
|
156
|
+
const markings = (owner as DatasetVersionMarkingsOwner)[datasetVersionMarkingsKey]
|
|
157
|
+
if (markings) return markings
|
|
158
|
+
throw new Error("[Sixb] Dataset version markings are not registered for this runtime.")
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export function shareDatasetVersionMarkings(source: object, target: object): void {
|
|
162
|
+
registerDatasetVersionMarkings(target, getDatasetVersionMarkings(source))
|
|
163
|
+
}
|
package/src/security/grants.ts
CHANGED
|
@@ -37,6 +37,7 @@ import type {
|
|
|
37
37
|
EditGrant,
|
|
38
38
|
ManageGrant,
|
|
39
39
|
ObserveGrant,
|
|
40
|
+
ProjectSurfaceReference,
|
|
40
41
|
RunGrant,
|
|
41
42
|
Selection,
|
|
42
43
|
ShareGrant,
|
|
@@ -258,11 +259,45 @@ function isAgentUsageReference(input: unknown): input is AgentUsageReference {
|
|
|
258
259
|
)
|
|
259
260
|
}
|
|
260
261
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
262
|
+
type ObservableReference = ProjectSurfaceReference | AgentUsageReference
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Every reference `can.observe` accepts, keyed by its `kind`, which is also its grant target. The
|
|
266
|
+
* full `Record` is what stops a new `project` member from compiling until it is listed here.
|
|
267
|
+
*/
|
|
268
|
+
const OBSERVABLE_REFERENCES: Readonly<Record<ObservableReference["kind"], string>> = {
|
|
269
|
+
logs: "project.logs",
|
|
270
|
+
activity: "project.activity",
|
|
271
|
+
aiUsage: "agent.usage",
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
function isObservableReference(input: unknown): input is ObservableReference {
|
|
275
|
+
return (
|
|
276
|
+
typeof input === "object" &&
|
|
277
|
+
input !== null &&
|
|
278
|
+
"kind" in input &&
|
|
279
|
+
typeof input.kind === "string" &&
|
|
280
|
+
Object.hasOwn(OBSERVABLE_REFERENCES, input.kind)
|
|
281
|
+
)
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
function observe(input: ObservableReference): ObserveGrant {
|
|
285
|
+
const value: unknown = input
|
|
286
|
+
|
|
287
|
+
// Older role files pass the string form. Point them at the reference instead of only rejecting
|
|
288
|
+
// the input.
|
|
289
|
+
if (value === "logs") {
|
|
290
|
+
throw new SecurityValidationError(
|
|
291
|
+
'[Sixb] can.observe("logs") is now can.observe(project.logs), imported from "@sixb/core".'
|
|
292
|
+
)
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
if (!isObservableReference(value)) {
|
|
296
|
+
const accepted = Object.values(OBSERVABLE_REFERENCES).join(" or ")
|
|
297
|
+
throw new SecurityValidationError(`[Sixb] can.observe accepts ${accepted}.`)
|
|
264
298
|
}
|
|
265
|
-
|
|
299
|
+
|
|
300
|
+
return { kind: "grant", capability: "observe", target: value.kind }
|
|
266
301
|
}
|
|
267
302
|
|
|
268
303
|
function manage(input: GrantInput<ConnectorDefinition, "connector">): ManageGrant<"connector">
|
package/src/security/index.ts
CHANGED
|
@@ -16,6 +16,7 @@ export {
|
|
|
16
16
|
missingMembershipGroupIds,
|
|
17
17
|
resolveMembershipPolicyScope,
|
|
18
18
|
} from "./membership-policies"
|
|
19
|
+
export { project } from "./project"
|
|
19
20
|
export type { SecurityDefinitionCatalog, SecurityRegistryOptions } from "./registry"
|
|
20
21
|
export { SecurityRegistry } from "./registry"
|
|
21
22
|
export type {
|
|
@@ -34,6 +35,8 @@ export type {
|
|
|
34
35
|
MembershipPolicyDefinition,
|
|
35
36
|
ObserveGrant,
|
|
36
37
|
ObserveGrantTarget,
|
|
38
|
+
ProjectReference,
|
|
39
|
+
ProjectSurfaceReference,
|
|
37
40
|
RedactionReason,
|
|
38
41
|
Redactions,
|
|
39
42
|
RegisteredSecurityDefinitions,
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Marking plumbing for this repo's hosts and workers, not for app authors.
|
|
3
|
+
*
|
|
4
|
+
* `checkPipelineMarkings` is the SQL preflight the API server and CLI run before serving. The
|
|
5
|
+
* projection worker shares the host's version classifier with `shareDatasetVersionMarkings`, then
|
|
6
|
+
* classifies each pinned version and refuses one with `assertProjectionVersionMarkings`. The API
|
|
7
|
+
* server reads the versions projections applied ahead of its first request with
|
|
8
|
+
* `warmAppliedMarkings`, and the CLI reports what they add with `getAppliedMarkings`.
|
|
9
|
+
*/
|
|
10
|
+
export { getAppliedMarkings, warmAppliedMarkings } from "./applied-markings-host"
|
|
11
|
+
export type {
|
|
12
|
+
DatasetVersionMarkings,
|
|
13
|
+
VersionClassification,
|
|
14
|
+
VersionColumnMarkings,
|
|
15
|
+
} from "./dataset-version-markings"
|
|
16
|
+
export { getDatasetVersionMarkings, shareDatasetVersionMarkings } from "./dataset-version-markings"
|
|
17
|
+
export { checkPipelineMarkings } from "./pipeline-markings"
|
|
18
|
+
export { assertProjectionVersionMarkings } from "./projection-markings"
|