@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,315 @@
|
|
|
1
|
+
import { ARTIFACT_LIMITS } from "./limits"
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A sheet artifact is `workbook.json` and one CSV per sheet under `sheets/`. The CSV holds the
|
|
5
|
+
* values; the workbook holds what CSV can't: sheet order, column types and formats, frozen rows
|
|
6
|
+
* and columns, widths, and charts drawn from the sheets. Formulas belong in an `.xlsx` file.
|
|
7
|
+
*/
|
|
8
|
+
export const WORKBOOK_FILE = "workbook.json"
|
|
9
|
+
|
|
10
|
+
export const SHEET_COLUMN_TYPES = [
|
|
11
|
+
"text",
|
|
12
|
+
"number",
|
|
13
|
+
"currency",
|
|
14
|
+
"percent",
|
|
15
|
+
"date",
|
|
16
|
+
"link",
|
|
17
|
+
"image",
|
|
18
|
+
] as const
|
|
19
|
+
export type SheetColumnType = (typeof SHEET_COLUMN_TYPES)[number]
|
|
20
|
+
|
|
21
|
+
/** Column types whose cells are numbers, so a chart can plot them and a range can sum them. */
|
|
22
|
+
export const NUMERIC_COLUMN_TYPES: readonly SheetColumnType[] = ["number", "currency", "percent"]
|
|
23
|
+
|
|
24
|
+
export const SHEET_CHART_TYPES = ["bar", "line", "area", "pie"] as const
|
|
25
|
+
export type SheetChartType = (typeof SHEET_CHART_TYPES)[number]
|
|
26
|
+
|
|
27
|
+
export interface SheetColumnFormat {
|
|
28
|
+
readonly type: SheetColumnType
|
|
29
|
+
/** An ISO 4217 code, for a currency column. */
|
|
30
|
+
readonly currency?: string
|
|
31
|
+
/** Digits after the decimal point, for numbers, currencies, and percents. */
|
|
32
|
+
readonly decimals?: number
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface WorkbookSheet {
|
|
36
|
+
readonly name: string
|
|
37
|
+
/** Rows that stay in view as the sheet scrolls, the header row included. */
|
|
38
|
+
readonly frozenRows: number
|
|
39
|
+
/** Columns that stay in view as the sheet scrolls sideways. */
|
|
40
|
+
readonly frozenColumns: number
|
|
41
|
+
/** Formats by column name; a column not named here is text. */
|
|
42
|
+
readonly columns: Readonly<Record<string, SheetColumnFormat>>
|
|
43
|
+
/** Widths in pixels by column name. */
|
|
44
|
+
readonly widths: Readonly<Record<string, number>>
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface WorkbookChart {
|
|
48
|
+
/** What `#chart=<name>` names in an address; lowercase letters, digits, and hyphens. */
|
|
49
|
+
readonly name: string
|
|
50
|
+
readonly type: SheetChartType
|
|
51
|
+
readonly sheet: string
|
|
52
|
+
/** The column along the x axis, or a pie's slice labels. */
|
|
53
|
+
readonly x: string
|
|
54
|
+
/** The plotted columns: one series each, or a pie's one value column. */
|
|
55
|
+
readonly y: readonly string[]
|
|
56
|
+
readonly title?: string
|
|
57
|
+
/** Stack a bar or area chart's series. */
|
|
58
|
+
readonly stacked: boolean
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export interface Workbook {
|
|
62
|
+
readonly sheets: readonly WorkbookSheet[]
|
|
63
|
+
readonly charts: readonly WorkbookChart[]
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Where a sheet's values are, in the artifact. */
|
|
67
|
+
export function sheetFilePath(sheetName: string): string {
|
|
68
|
+
return `sheets/${sheetName}.csv`
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Reads `workbook.json` into its full form: `"Revenue": "currency"` becomes
|
|
73
|
+
* `{ type: "currency" }`, a single `y` becomes a list, and defaults are filled. Returns what is
|
|
74
|
+
* wrong in words the author can act on. Whether the columns exist is checked against the CSVs.
|
|
75
|
+
*/
|
|
76
|
+
export function parseWorkbook(
|
|
77
|
+
text: string
|
|
78
|
+
): { readonly workbook: Workbook } | { readonly error: string } {
|
|
79
|
+
let value: unknown
|
|
80
|
+
try {
|
|
81
|
+
value = JSON.parse(text)
|
|
82
|
+
} catch {
|
|
83
|
+
return { error: `${WORKBOOK_FILE} is not valid JSON.` }
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
return { workbook: readWorkbook(value) }
|
|
87
|
+
} catch (error) {
|
|
88
|
+
if (error instanceof WorkbookError) return { error: `${WORKBOOK_FILE}: ${error.message}` }
|
|
89
|
+
throw error
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** A number as a sheet stores it: plain digits, an optional sign, decimals, and exponent. */
|
|
94
|
+
export function parseSheetNumber(value: string): number | undefined {
|
|
95
|
+
const trimmed = value.trim()
|
|
96
|
+
if (!/^[-+]?(\d+\.?\d*|\.\d+)(e[-+]?\d+)?$/i.test(trimmed)) return undefined
|
|
97
|
+
const number = Number(trimmed)
|
|
98
|
+
return Number.isFinite(number) ? number : undefined
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** A date as a sheet stores it: `YYYY-MM-DD`, optionally with an ISO 8601 time. */
|
|
102
|
+
export function parseSheetDate(value: string): Date | undefined {
|
|
103
|
+
const trimmed = value.trim()
|
|
104
|
+
if (!/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}(:\d{2}(\.\d+)?)?(Z|[-+]\d{2}:\d{2})?)?$/.test(trimmed)) {
|
|
105
|
+
return undefined
|
|
106
|
+
}
|
|
107
|
+
const date = new Date(trimmed.length === 10 ? `${trimmed}T00:00:00Z` : trimmed)
|
|
108
|
+
return Number.isNaN(date.getTime()) ? undefined : date
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
class WorkbookError extends Error {}
|
|
112
|
+
|
|
113
|
+
const SHEET_NAME_MAX = 60
|
|
114
|
+
const CHART_NAME = /^[a-z0-9][a-z0-9-]{0,39}$/
|
|
115
|
+
const CONTROL = /[\u0000-\u001f\u007f]/
|
|
116
|
+
|
|
117
|
+
function readWorkbook(value: unknown): Workbook {
|
|
118
|
+
const input = record(value, "the workbook", ["sheets", "charts"])
|
|
119
|
+
if (!Array.isArray(input.sheets) || input.sheets.length === 0) {
|
|
120
|
+
throw new WorkbookError('"sheets" must list at least one sheet.')
|
|
121
|
+
}
|
|
122
|
+
if (input.sheets.length > ARTIFACT_LIMITS.maxSheets) {
|
|
123
|
+
throw new WorkbookError(
|
|
124
|
+
`a workbook holds at most ${ARTIFACT_LIMITS.maxSheets} sheets; this one has ${input.sheets.length}.`
|
|
125
|
+
)
|
|
126
|
+
}
|
|
127
|
+
const sheets = input.sheets.map((sheet, index) => readSheet(sheet, index))
|
|
128
|
+
const names = new Set<string>()
|
|
129
|
+
for (const sheet of sheets) {
|
|
130
|
+
const key = sheet.name.toLowerCase()
|
|
131
|
+
if (names.has(key)) throw new WorkbookError(`two sheets are named '${sheet.name}'.`)
|
|
132
|
+
names.add(key)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const chartsInput = input.charts ?? []
|
|
136
|
+
if (!Array.isArray(chartsInput)) throw new WorkbookError('"charts" must be a list.')
|
|
137
|
+
if (chartsInput.length > ARTIFACT_LIMITS.maxCharts) {
|
|
138
|
+
throw new WorkbookError(
|
|
139
|
+
`a workbook holds at most ${ARTIFACT_LIMITS.maxCharts} charts; this one has ${chartsInput.length}.`
|
|
140
|
+
)
|
|
141
|
+
}
|
|
142
|
+
const charts = chartsInput.map((chart, index) => readChart(chart, index, sheets))
|
|
143
|
+
const chartNames = new Set<string>()
|
|
144
|
+
for (const chart of charts) {
|
|
145
|
+
if (chartNames.has(chart.name)) throw new WorkbookError(`two charts are named '${chart.name}'.`)
|
|
146
|
+
chartNames.add(chart.name)
|
|
147
|
+
}
|
|
148
|
+
return { sheets, charts }
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function readSheet(value: unknown, index: number): WorkbookSheet {
|
|
152
|
+
const at = `sheet ${index + 1}`
|
|
153
|
+
const input = record(value, at, ["name", "frozenRows", "frozenColumns", "columns", "widths"])
|
|
154
|
+
const name = typeof input.name === "string" ? input.name.trim() : ""
|
|
155
|
+
if (
|
|
156
|
+
!name ||
|
|
157
|
+
name.length > SHEET_NAME_MAX ||
|
|
158
|
+
CONTROL.test(name) ||
|
|
159
|
+
/[/\\]/.test(name) ||
|
|
160
|
+
name === "." ||
|
|
161
|
+
name === ".."
|
|
162
|
+
) {
|
|
163
|
+
throw new WorkbookError(
|
|
164
|
+
`${at} needs a "name" of at most ${SHEET_NAME_MAX} characters without / or \\; its values go in sheets/<name>.csv.`
|
|
165
|
+
)
|
|
166
|
+
}
|
|
167
|
+
const sheetAt = `sheet '${name}'`
|
|
168
|
+
const columns: Record<string, SheetColumnFormat> = {}
|
|
169
|
+
for (const [column, format] of Object.entries(
|
|
170
|
+
record(input.columns ?? {}, `${sheetAt} "columns"`, null)
|
|
171
|
+
)) {
|
|
172
|
+
columns[column] = readColumnFormat(format, `${sheetAt} column '${column}'`)
|
|
173
|
+
}
|
|
174
|
+
const widths: Record<string, number> = {}
|
|
175
|
+
for (const [column, width] of Object.entries(
|
|
176
|
+
record(input.widths ?? {}, `${sheetAt} "widths"`, null)
|
|
177
|
+
)) {
|
|
178
|
+
if (typeof width !== "number" || !Number.isInteger(width) || width < 40 || width > 800) {
|
|
179
|
+
throw new WorkbookError(
|
|
180
|
+
`${sheetAt} gives column '${column}' a width of ${String(width)}; use 40 to 800 pixels.`
|
|
181
|
+
)
|
|
182
|
+
}
|
|
183
|
+
widths[column] = width
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
name,
|
|
187
|
+
frozenRows: integer(input.frozenRows, 1, 0, 10, `${sheetAt} "frozenRows"`),
|
|
188
|
+
frozenColumns: integer(input.frozenColumns, 0, 0, 5, `${sheetAt} "frozenColumns"`),
|
|
189
|
+
columns,
|
|
190
|
+
widths,
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function readColumnFormat(value: unknown, at: string): SheetColumnFormat {
|
|
195
|
+
if (typeof value === "string") return { type: columnType(value, at) }
|
|
196
|
+
const input = record(value, at, ["type", "currency", "decimals"])
|
|
197
|
+
const type = columnType(input.type, at)
|
|
198
|
+
if (input.currency !== undefined) {
|
|
199
|
+
if (type !== "currency")
|
|
200
|
+
throw new WorkbookError(`${at} sets "currency" but is not a currency column.`)
|
|
201
|
+
if (typeof input.currency !== "string" || !/^[A-Z]{3}$/.test(input.currency)) {
|
|
202
|
+
throw new WorkbookError(`${at} "currency" must be an ISO 4217 code such as "USD".`)
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (input.decimals !== undefined && !["number", "currency", "percent"].includes(type)) {
|
|
206
|
+
throw new WorkbookError(
|
|
207
|
+
`${at} sets "decimals" but is not a number, currency, or percent column.`
|
|
208
|
+
)
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
type,
|
|
212
|
+
...(typeof input.currency === "string" ? { currency: input.currency } : {}),
|
|
213
|
+
...(input.decimals === undefined
|
|
214
|
+
? {}
|
|
215
|
+
: { decimals: integer(input.decimals, 0, 0, 6, `${at} "decimals"`) }),
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function columnType(value: unknown, at: string): SheetColumnType {
|
|
220
|
+
if (typeof value === "string" && (SHEET_COLUMN_TYPES as readonly string[]).includes(value)) {
|
|
221
|
+
return value as SheetColumnType
|
|
222
|
+
}
|
|
223
|
+
throw new WorkbookError(
|
|
224
|
+
`${at} has type ${JSON.stringify(value)}; use one of ${SHEET_COLUMN_TYPES.join(", ")}.`
|
|
225
|
+
)
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function readChart(value: unknown, index: number, sheets: readonly WorkbookSheet[]): WorkbookChart {
|
|
229
|
+
const input = record(value, `chart ${index + 1}`, [
|
|
230
|
+
"name",
|
|
231
|
+
"type",
|
|
232
|
+
"sheet",
|
|
233
|
+
"x",
|
|
234
|
+
"y",
|
|
235
|
+
"title",
|
|
236
|
+
"stacked",
|
|
237
|
+
])
|
|
238
|
+
if (typeof input.name !== "string" || !CHART_NAME.test(input.name)) {
|
|
239
|
+
throw new WorkbookError(
|
|
240
|
+
`chart ${index + 1} needs a "name" of lowercase letters, digits, and hyphens, such as "revenue".`
|
|
241
|
+
)
|
|
242
|
+
}
|
|
243
|
+
const at = `chart '${input.name}'`
|
|
244
|
+
if (!(SHEET_CHART_TYPES as readonly unknown[]).includes(input.type)) {
|
|
245
|
+
throw new WorkbookError(
|
|
246
|
+
`${at} has type ${JSON.stringify(input.type)}; use one of ${SHEET_CHART_TYPES.join(", ")}.`
|
|
247
|
+
)
|
|
248
|
+
}
|
|
249
|
+
const type = input.type as SheetChartType
|
|
250
|
+
if (typeof input.sheet !== "string" || !sheets.some((sheet) => sheet.name === input.sheet)) {
|
|
251
|
+
throw new WorkbookError(
|
|
252
|
+
`${at} names sheet ${JSON.stringify(input.sheet)}, which the workbook does not have.`
|
|
253
|
+
)
|
|
254
|
+
}
|
|
255
|
+
if (typeof input.x !== "string" || !input.x) throw new WorkbookError(`${at} needs an "x" column.`)
|
|
256
|
+
const y = typeof input.y === "string" ? [input.y] : input.y
|
|
257
|
+
if (
|
|
258
|
+
!Array.isArray(y) ||
|
|
259
|
+
y.length === 0 ||
|
|
260
|
+
!y.every((column) => typeof column === "string" && column)
|
|
261
|
+
) {
|
|
262
|
+
throw new WorkbookError(`${at} needs a "y" column, or a list of them.`)
|
|
263
|
+
}
|
|
264
|
+
if (y.length > ARTIFACT_LIMITS.maxChartSeries) {
|
|
265
|
+
throw new WorkbookError(
|
|
266
|
+
`${at} plots ${y.length} columns; a chart reads well with at most ${ARTIFACT_LIMITS.maxChartSeries}. Split it, or chart the ones that matter.`
|
|
267
|
+
)
|
|
268
|
+
}
|
|
269
|
+
if (type === "pie" && y.length !== 1)
|
|
270
|
+
throw new WorkbookError(`${at} is a pie: give it one "y" column.`)
|
|
271
|
+
if (input.stacked !== undefined && typeof input.stacked !== "boolean") {
|
|
272
|
+
throw new WorkbookError(`${at} "stacked" must be true or false.`)
|
|
273
|
+
}
|
|
274
|
+
if (input.stacked === true && type !== "bar" && type !== "area") {
|
|
275
|
+
throw new WorkbookError(`${at} is a ${type} chart; only bar and area charts stack.`)
|
|
276
|
+
}
|
|
277
|
+
if (input.title !== undefined && (typeof input.title !== "string" || input.title.length > 120)) {
|
|
278
|
+
throw new WorkbookError(`${at} "title" must be text of at most 120 characters.`)
|
|
279
|
+
}
|
|
280
|
+
return {
|
|
281
|
+
name: input.name,
|
|
282
|
+
type,
|
|
283
|
+
sheet: input.sheet,
|
|
284
|
+
x: input.x,
|
|
285
|
+
y: y as string[],
|
|
286
|
+
...(typeof input.title === "string" && input.title.trim() ? { title: input.title.trim() } : {}),
|
|
287
|
+
stacked: input.stacked === true,
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
function record(
|
|
292
|
+
value: unknown,
|
|
293
|
+
at: string,
|
|
294
|
+
keys: readonly string[] | null
|
|
295
|
+
): Record<string, unknown> {
|
|
296
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
297
|
+
throw new WorkbookError(`${at} must be an object.`)
|
|
298
|
+
}
|
|
299
|
+
const input = value as Record<string, unknown>
|
|
300
|
+
const unknownKey = keys && Object.keys(input).find((key) => !keys.includes(key))
|
|
301
|
+
if (unknownKey) {
|
|
302
|
+
throw new WorkbookError(
|
|
303
|
+
`${at} has '${unknownKey}'; it takes ${keys.map((key) => `"${key}"`).join(", ")}.`
|
|
304
|
+
)
|
|
305
|
+
}
|
|
306
|
+
return input
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
function integer(value: unknown, fallback: number, min: number, max: number, at: string): number {
|
|
310
|
+
if (value === undefined) return fallback
|
|
311
|
+
if (typeof value !== "number" || !Number.isInteger(value) || value < min || value > max) {
|
|
312
|
+
throw new WorkbookError(`${at} must be a whole number from ${min} to ${max}.`)
|
|
313
|
+
}
|
|
314
|
+
return value
|
|
315
|
+
}
|
|
@@ -34,6 +34,7 @@ export type AuthzRequest =
|
|
|
34
34
|
| { readonly kind: "agent.run" }
|
|
35
35
|
| { readonly kind: "logs.observe" }
|
|
36
36
|
| { readonly kind: "aiUsage.observe" }
|
|
37
|
+
| { readonly kind: "activity.observe" }
|
|
37
38
|
| { readonly kind: "aiUsage.manage" }
|
|
38
39
|
| { readonly kind: "connector.manage"; readonly connectorId: string }
|
|
39
40
|
| { readonly kind: "object.query"; readonly touchedObjectTypeIds: readonly string[] }
|
|
@@ -86,6 +87,8 @@ function atomsFor(request: AuthzRequest): readonly Atom[] {
|
|
|
86
87
|
return [{ kind: "observe:logs" }]
|
|
87
88
|
case "aiUsage.observe":
|
|
88
89
|
return [{ kind: "observe:aiUsage" }]
|
|
90
|
+
case "activity.observe":
|
|
91
|
+
return [{ kind: "observe:activity" }]
|
|
89
92
|
case "aiUsage.manage":
|
|
90
93
|
return [{ kind: "manage:aiUsage" }]
|
|
91
94
|
case "connector.manage":
|
|
@@ -278,6 +281,8 @@ function deniedMessage(
|
|
|
278
281
|
return `[Sixb] Principal '${principalId}' is not allowed to observe project logs.`
|
|
279
282
|
case "aiUsage.observe":
|
|
280
283
|
return `[Sixb] Principal '${principalId}' is not allowed to observe project AI usage.`
|
|
284
|
+
case "activity.observe":
|
|
285
|
+
return `[Sixb] Principal '${principalId}' is not allowed to observe project activity.`
|
|
281
286
|
case "aiUsage.manage":
|
|
282
287
|
return `[Sixb] Principal '${principalId}' is not allowed to manage project AI usage limits.`
|
|
283
288
|
case "connector.manage":
|
|
@@ -23,11 +23,17 @@ export type GrantKind =
|
|
|
23
23
|
| "run:agent"
|
|
24
24
|
| "observe:logs"
|
|
25
25
|
| "observe:aiUsage"
|
|
26
|
+
| "observe:activity"
|
|
26
27
|
| "manage:connector"
|
|
27
28
|
| "manage:aiUsage"
|
|
28
29
|
|
|
29
30
|
/** Capabilities over one project-wide surface: held or not, with no ids to select. */
|
|
30
|
-
export type SingletonGrantKind =
|
|
31
|
+
export type SingletonGrantKind =
|
|
32
|
+
| "run:agent"
|
|
33
|
+
| "observe:logs"
|
|
34
|
+
| "observe:aiUsage"
|
|
35
|
+
| "observe:activity"
|
|
36
|
+
| "manage:aiUsage"
|
|
31
37
|
export type TargetedGrantKind = Exclude<GrantKind, SingletonGrantKind>
|
|
32
38
|
|
|
33
39
|
/** Registered id universes a grant kind ranges over, plus subtype expansion. */
|
|
@@ -130,13 +136,18 @@ export const GRANT_KINDS: {
|
|
|
130
136
|
"observe:logs": {
|
|
131
137
|
singleton: true,
|
|
132
138
|
subject: "logs",
|
|
133
|
-
fix:
|
|
139
|
+
fix: "Use can.observe(project.logs).",
|
|
134
140
|
},
|
|
135
141
|
"observe:aiUsage": {
|
|
136
142
|
singleton: true,
|
|
137
143
|
subject: "AI usage",
|
|
138
144
|
fix: "Use can.observe(agent.usage).",
|
|
139
145
|
},
|
|
146
|
+
"observe:activity": {
|
|
147
|
+
singleton: true,
|
|
148
|
+
subject: "activity",
|
|
149
|
+
fix: "Use can.observe(project.activity).",
|
|
150
|
+
},
|
|
140
151
|
"manage:connector": {
|
|
141
152
|
universeKey: "connectorIds",
|
|
142
153
|
subject: "connector",
|
|
@@ -202,6 +213,7 @@ export function emptyGrantSets(): MutableGrantIndex {
|
|
|
202
213
|
"run:agent": false,
|
|
203
214
|
"observe:logs": false,
|
|
204
215
|
"observe:aiUsage": false,
|
|
216
|
+
"observe:activity": false,
|
|
205
217
|
"manage:connector": new Set(),
|
|
206
218
|
"manage:aiUsage": false,
|
|
207
219
|
}
|
|
@@ -27,3 +27,72 @@ export function canonicalMediaType(value: unknown): string | null {
|
|
|
27
27
|
}
|
|
28
28
|
return canonical
|
|
29
29
|
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The media type a file's bytes declare by their leading signature, or `undefined` when they carry
|
|
33
|
+
* none this function knows. Only formats with an unambiguous signature are recognized; text formats
|
|
34
|
+
* have none and are left to the file name.
|
|
35
|
+
*/
|
|
36
|
+
export function sniffFileMediaType(bytes: Uint8Array): string | undefined {
|
|
37
|
+
if (startsWith(bytes, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])) return "image/png"
|
|
38
|
+
if (startsWith(bytes, [0xff, 0xd8, 0xff])) return "image/jpeg"
|
|
39
|
+
if (asciiAt(bytes, 0, "GIF87a") || asciiAt(bytes, 0, "GIF89a")) return "image/gif"
|
|
40
|
+
if (asciiAt(bytes, 0, "RIFF") && asciiAt(bytes, 8, "WEBP")) return "image/webp"
|
|
41
|
+
if (asciiAt(bytes, 0, "%PDF-")) return "application/pdf"
|
|
42
|
+
return undefined
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* The media type of a file handed over without one: its bytes' signature when they have one, else
|
|
47
|
+
* its extension, else `application/octet-stream`. Every place that classifies a sandbox or tool file
|
|
48
|
+
* goes through this one table, so the same file gets the same type wherever it comes from.
|
|
49
|
+
*/
|
|
50
|
+
export function inferFileMediaType(fileName: string, bytes?: Uint8Array): string {
|
|
51
|
+
const sniffed = bytes === undefined ? undefined : sniffFileMediaType(bytes)
|
|
52
|
+
if (sniffed) return sniffed
|
|
53
|
+
const dot = fileName.lastIndexOf(".")
|
|
54
|
+
const extension = dot < 0 ? "" : fileName.slice(dot).toLowerCase()
|
|
55
|
+
return EXTENSION_MEDIA_TYPES[extension] ?? "application/octet-stream"
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const EXTENSION_MEDIA_TYPES: Readonly<Record<string, string>> = {
|
|
59
|
+
".bmp": "image/bmp",
|
|
60
|
+
".css": "text/css",
|
|
61
|
+
".csv": "text/csv",
|
|
62
|
+
".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
|
63
|
+
".gif": "image/gif",
|
|
64
|
+
".htm": "text/html",
|
|
65
|
+
".html": "text/html",
|
|
66
|
+
".jpeg": "image/jpeg",
|
|
67
|
+
".jpg": "image/jpeg",
|
|
68
|
+
".js": "application/javascript",
|
|
69
|
+
".json": "application/json",
|
|
70
|
+
".jsonl": "application/x-ndjson",
|
|
71
|
+
".markdown": "text/markdown",
|
|
72
|
+
".md": "text/markdown",
|
|
73
|
+
".mjs": "application/javascript",
|
|
74
|
+
".pdf": "application/pdf",
|
|
75
|
+
".png": "image/png",
|
|
76
|
+
".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
|
|
77
|
+
".svg": "image/svg+xml",
|
|
78
|
+
".tsv": "text/tab-separated-values",
|
|
79
|
+
".txt": "text/plain",
|
|
80
|
+
".webp": "image/webp",
|
|
81
|
+
".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
82
|
+
".xml": "application/xml",
|
|
83
|
+
".yaml": "application/yaml",
|
|
84
|
+
".yml": "application/yaml",
|
|
85
|
+
".zip": "application/zip",
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function startsWith(bytes: Uint8Array, signature: readonly number[]): boolean {
|
|
89
|
+
return signature.every((byte, index) => bytes[index] === byte)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function asciiAt(bytes: Uint8Array, offset: number, value: string): boolean {
|
|
93
|
+
if (bytes.byteLength < offset + value.length) return false
|
|
94
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
95
|
+
if (bytes[offset + index] !== value.charCodeAt(index)) return false
|
|
96
|
+
}
|
|
97
|
+
return true
|
|
98
|
+
}
|
package/src/datasets/builders.ts
CHANGED
|
@@ -93,6 +93,17 @@ type PickColumns<
|
|
|
93
93
|
? readonly []
|
|
94
94
|
: readonly ColumnDefinitionOf<TColumns, TNames[number]>[]
|
|
95
95
|
|
|
96
|
+
/** A dataset read through some of its columns: `rawInvoices.pick("id", "title")`. */
|
|
97
|
+
type PickableDataset<TId extends string, TColumns extends readonly DatasetColumnDefinition[]> = {
|
|
98
|
+
/**
|
|
99
|
+
* The same dataset with only these columns, in this order. A pipeline step given it as an input
|
|
100
|
+
* reads nothing else, so its output inherits no other column's markings.
|
|
101
|
+
*/
|
|
102
|
+
pick<const TNames extends readonly [ColumnNameOf<TColumns>, ...ColumnNameOf<TColumns>[]]>(
|
|
103
|
+
...columns: TNames
|
|
104
|
+
): DatasetDefinition<TId, PickColumns<TColumns, TNames>>
|
|
105
|
+
}
|
|
106
|
+
|
|
96
107
|
type AddColumns<
|
|
97
108
|
TColumns extends readonly DatasetColumnDefinition[],
|
|
98
109
|
TAdd extends readonly DatasetColumnDefinition[],
|
|
@@ -140,7 +151,8 @@ type DatasetDefinitionResult<TId extends string, TOptions extends DefineDatasetO
|
|
|
140
151
|
FieldFromOptions<TOptions, "sequenceBy", string> &
|
|
141
152
|
FieldFromOptions<TOptions, "primaryKey", DatasetPrimaryKey> &
|
|
142
153
|
FieldFromOptions<TOptions, "partitionBy", readonly string[]> &
|
|
143
|
-
FieldFromOptions<TOptions, "description", string>
|
|
154
|
+
FieldFromOptions<TOptions, "description", string> &
|
|
155
|
+
PickableDataset<TId, TOptions["schema"]>
|
|
144
156
|
|
|
145
157
|
type DerivedDatasetDefinitionResult<
|
|
146
158
|
TId extends string,
|
|
@@ -153,7 +165,8 @@ type DerivedDatasetDefinitionResult<
|
|
|
153
165
|
FieldFromOptions<TOptions, "sequenceBy", string> &
|
|
154
166
|
FieldFromOptions<TOptions, "primaryKey", DatasetPrimaryKey> &
|
|
155
167
|
FieldFromOptions<TOptions, "partitionBy", readonly string[]> &
|
|
156
|
-
FieldFromOptions<TOptions, "description", string>
|
|
168
|
+
FieldFromOptions<TOptions, "description", string> &
|
|
169
|
+
PickableDataset<TId, DerivedColumns<TParent, TOptions>>
|
|
157
170
|
|
|
158
171
|
type CheckedDeriveDatasetOptions<
|
|
159
172
|
TParent extends DatasetDefinition,
|
|
@@ -217,9 +230,60 @@ function createDatasetDefinition(id: string, options: DefineDatasetOptions): Dat
|
|
|
217
230
|
}
|
|
218
231
|
|
|
219
232
|
assertDatasetDefinition(definition, (message) => new DatasetValidationError(message))
|
|
233
|
+
|
|
234
|
+
// Not enumerable: the definition stays plain data for cloning, spreading, and storage.
|
|
235
|
+
Object.defineProperty(definition, "pick", {
|
|
236
|
+
value: (...columns: string[]) => pickDatasetColumns(definition, columns),
|
|
237
|
+
})
|
|
238
|
+
|
|
220
239
|
return definition
|
|
221
240
|
}
|
|
222
241
|
|
|
242
|
+
const datasetPick: unique symbol = Symbol("sixb.datasetPick")
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Whether a definition was made by `pick()`. Only a pick may hold some of a dataset's columns: any
|
|
246
|
+
* other definition with a registered id stands for the whole dataset.
|
|
247
|
+
*/
|
|
248
|
+
export function isDatasetPick(dataset: DatasetDefinition): boolean {
|
|
249
|
+
return (dataset as { readonly [datasetPick]?: true })[datasetPick] === true
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
function pickDatasetColumns(
|
|
253
|
+
dataset: DatasetDefinition,
|
|
254
|
+
columnNames: readonly string[]
|
|
255
|
+
): DatasetDefinition {
|
|
256
|
+
if (columnNames.length === 0) {
|
|
257
|
+
throw new DatasetValidationError(
|
|
258
|
+
`[Sixb] Dataset '${dataset.id}' pick needs at least one column.`
|
|
259
|
+
)
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
const columnsByName = new Map(dataset.schema.columns.map((column) => [column.name, column]))
|
|
263
|
+
const picked = new Set<string>()
|
|
264
|
+
const columns = columnNames.map((columnName) => {
|
|
265
|
+
if (picked.has(columnName)) {
|
|
266
|
+
throw new DatasetValidationError(
|
|
267
|
+
`[Sixb] Dataset '${dataset.id}' pick lists column '${columnName}' twice.`
|
|
268
|
+
)
|
|
269
|
+
}
|
|
270
|
+
picked.add(columnName)
|
|
271
|
+
|
|
272
|
+
const column = columnsByName.get(columnName)
|
|
273
|
+
if (column === undefined) {
|
|
274
|
+
throw new DatasetValidationError(
|
|
275
|
+
`[Sixb] Dataset '${dataset.id}' has no column '${columnName}' to pick.`
|
|
276
|
+
)
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
return column
|
|
280
|
+
})
|
|
281
|
+
|
|
282
|
+
const pick: DatasetDefinition = { kind: "dataset", id: dataset.id, schema: { columns } }
|
|
283
|
+
Object.defineProperty(pick, datasetPick, { value: true })
|
|
284
|
+
return pick
|
|
285
|
+
}
|
|
286
|
+
|
|
223
287
|
function assertStringArray(value: unknown, field: string): asserts value is readonly string[] {
|
|
224
288
|
if (!Array.isArray(value)) {
|
|
225
289
|
throw new DatasetValidationError(`${field} must be an array of column names.`)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { DatasetColumnDefinition, DatasetDefinition } from "./types"
|
|
2
|
+
|
|
3
|
+
const indexes = new WeakMap<DatasetDefinition, ReadonlyMap<string, DatasetColumnDefinition>>()
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The columns of a dataset definition by name, built once per definition object. Registered
|
|
7
|
+
* definitions are not changed after startup, so every check and resolver can share one index.
|
|
8
|
+
*/
|
|
9
|
+
export function columnsByName(
|
|
10
|
+
dataset: DatasetDefinition
|
|
11
|
+
): ReadonlyMap<string, DatasetColumnDefinition> {
|
|
12
|
+
let index = indexes.get(dataset)
|
|
13
|
+
if (!index) {
|
|
14
|
+
index = new Map(dataset.schema.columns.map((column) => [column.name, column]))
|
|
15
|
+
indexes.set(dataset, index)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return index
|
|
19
|
+
}
|
|
@@ -11,6 +11,7 @@ import type { DatasetMergeCommitResult } from "../lake-storage/merge"
|
|
|
11
11
|
import { getDatasetPrimaryKeyColumns } from "../lake-storage/merge-validation"
|
|
12
12
|
import type { DatasetRow, DatasetVersion, LakeStorage } from "../lake-storage/types"
|
|
13
13
|
import type { SixbRuntimeContext } from "../runtime/types"
|
|
14
|
+
import type { DatasetVersionMarkings } from "../security/dataset-version-markings"
|
|
14
15
|
import { missingClearanceRedactions } from "../security/redactions"
|
|
15
16
|
import type { Redactions } from "../security/types"
|
|
16
17
|
import type { MergeChange } from "./changes"
|
|
@@ -42,7 +43,7 @@ export interface DatasetRows {
|
|
|
42
43
|
/** Columns each row holds. Redacted columns are left out. */
|
|
43
44
|
readonly columns: readonly string[]
|
|
44
45
|
/**
|
|
45
|
-
* Every column of the
|
|
46
|
+
* Every column of the version the reader cannot read, whether or not it was requested. Absent
|
|
46
47
|
* when the reader can read every column.
|
|
47
48
|
*/
|
|
48
49
|
readonly redactions?: Redactions
|
|
@@ -65,7 +66,8 @@ export function createDatasetsRuntime(
|
|
|
65
66
|
execution: ExecutionContext,
|
|
66
67
|
source: Pick<DatasetsRuntime, "list" | "getById">,
|
|
67
68
|
lakeStorage: LakeStorage,
|
|
68
|
-
blobStorage: Pick<BlobStorage, "stat"
|
|
69
|
+
blobStorage: Pick<BlobStorage, "stat">,
|
|
70
|
+
versionMarkings: DatasetVersionMarkings
|
|
69
71
|
): DatasetsRuntime {
|
|
70
72
|
const authority = resolveRuntimeAuthorizationForProject(runtime)
|
|
71
73
|
const allowed = (datasetId: string) =>
|
|
@@ -91,7 +93,11 @@ export function createDatasetsRuntime(
|
|
|
91
93
|
: await lakeStorage.getVersion(registered.id, input.versionId)
|
|
92
94
|
if (!version) return null
|
|
93
95
|
|
|
94
|
-
const redacted = redactedColumns(
|
|
96
|
+
const redacted = redactedColumns(
|
|
97
|
+
version,
|
|
98
|
+
versionMarkings,
|
|
99
|
+
assertRuntimeAuthorizationBound(runtime)
|
|
100
|
+
)
|
|
95
101
|
const selected = selectColumns(version, input.columns)
|
|
96
102
|
const columns = selected.filter((column) => !redacted.has(column))
|
|
97
103
|
const read = (readColumns: readonly string[] | undefined) =>
|
|
@@ -181,20 +187,28 @@ function selectColumns(version: DatasetVersion, requested: readonly string[] | u
|
|
|
181
187
|
}
|
|
182
188
|
|
|
183
189
|
/**
|
|
184
|
-
* Columns the reader cannot read. Trusted code reads every column, a principal reads
|
|
185
|
-
* clear, and any other authority is cleared for nothing.
|
|
190
|
+
* Columns of the version the reader cannot read. Trusted code reads every column, a principal reads
|
|
191
|
+
* what its roles clear, and any other authority is cleared for nothing.
|
|
192
|
+
*
|
|
193
|
+
* No version carries a marking the project does not declare on a column, so a reader cleared for
|
|
194
|
+
* every declared marking (all readers, when none is declared) reads every column without
|
|
195
|
+
* classifying the version.
|
|
186
196
|
*/
|
|
187
197
|
function redactedColumns(
|
|
188
|
-
|
|
198
|
+
version: DatasetVersion,
|
|
199
|
+
versionMarkings: DatasetVersionMarkings,
|
|
189
200
|
authority: ReturnType<typeof assertRuntimeAuthorizationBound>
|
|
190
201
|
): ReadonlySet<string> {
|
|
191
202
|
if (authority.type === "unrestricted") return new Set()
|
|
192
203
|
const clearances =
|
|
193
204
|
authority.type === "principal" ? (authority.context.clearances ?? new Set()) : new Set()
|
|
205
|
+
if ([...versionMarkings.everyMarking()].every((id) => clearances.has(id))) return new Set()
|
|
206
|
+
|
|
207
|
+
const { columns } = versionMarkings.classify(version)
|
|
194
208
|
return new Set(
|
|
195
|
-
|
|
196
|
-
.filter((
|
|
197
|
-
.map((column) => column
|
|
209
|
+
[...columns]
|
|
210
|
+
.filter(([, columnMarkings]) => [...columnMarkings].some((id) => !clearances.has(id)))
|
|
211
|
+
.map(([column]) => column)
|
|
198
212
|
)
|
|
199
213
|
}
|
|
200
214
|
|
package/src/errors/internal.ts
CHANGED
|
@@ -13,6 +13,7 @@ const SIXB_ERROR_CODE_SET: ReadonlySet<string> = new Set(SIXB_ERROR_CODES)
|
|
|
13
13
|
type SixbErrorCodeTuple = readonly [SixbErrorCode, ...SixbErrorCode[]]
|
|
14
14
|
|
|
15
15
|
export { SIXB_ERROR_CODES }
|
|
16
|
+
export { withFailureMessage } from "./failure-message"
|
|
16
17
|
|
|
17
18
|
export interface SixbErrorOptions {
|
|
18
19
|
readonly cause?: unknown
|