@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,424 @@
|
|
|
1
|
+
import type { ActionObjectSubject } from "../actions"
|
|
2
|
+
import { unreadableActionRunTypes } from "../actions/run-authorization"
|
|
3
|
+
import { AuthorizationError, canViewActionRun, canViewWorkflowRun } from "../authorization"
|
|
4
|
+
import { resolveExecutionCosts } from "../runtime/ai-cost"
|
|
5
|
+
import type { SixbRuntimeContext } from "../runtime/types"
|
|
6
|
+
import type { ActionRunStatus } from "../storage/action-runs"
|
|
7
|
+
import { ACTIVITY_MAX_VISIT_MS, ACTIVITY_MIN_IDLE_TIMEOUT_MS } from "../storage/activity/policy"
|
|
8
|
+
import type { ActivityVisit, StoredActivityVisitPage } from "../storage/activity/types"
|
|
9
|
+
import type { AgentRunStatus, ConversationAgentRunRecord } from "../storage/agents"
|
|
10
|
+
import type { AiCostSummary } from "../storage/ai-cost"
|
|
11
|
+
import type { ExecutionRecord } from "../storage/executions"
|
|
12
|
+
import { objectBatchKey } from "../storage/objects/keys"
|
|
13
|
+
import type { ShareGrantRecord } from "../storage/share-grants"
|
|
14
|
+
import type { WorkflowRunStatus } from "../storage/workflow-runs"
|
|
15
|
+
import { type ActivityConnection, readActivityConnection } from "./connection"
|
|
16
|
+
import type { ActivityVisitView } from "./shares"
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* At most this many page views and interactions together, and as many recorded executions, make a
|
|
20
|
+
* visit's timeline.
|
|
21
|
+
*/
|
|
22
|
+
export const ACTIVITY_TIMELINE_LIMIT = 200
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* How far around its activity a visit claims its session's executions. A click right after a
|
|
26
|
+
* return reaches the server before the activity that opens the visit, and the last action before
|
|
27
|
+
* leaving may come after the last activity sent. Half the shortest idle timeout keeps the visits of
|
|
28
|
+
* one session from claiming the same execution.
|
|
29
|
+
*/
|
|
30
|
+
const SESSION_GRACE_MS = ACTIVITY_MIN_IDLE_TIMEOUT_MS / 2
|
|
31
|
+
|
|
32
|
+
export interface ActivityPageEntry {
|
|
33
|
+
readonly kind: "page"
|
|
34
|
+
readonly at: Date
|
|
35
|
+
readonly sequence: number
|
|
36
|
+
readonly route: string
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** An interaction the app marked, on the page it happened on. */
|
|
40
|
+
export interface ActivityInteractionEntry {
|
|
41
|
+
readonly kind: "interaction"
|
|
42
|
+
readonly at: Date
|
|
43
|
+
readonly sequence: number
|
|
44
|
+
readonly name: string
|
|
45
|
+
readonly route: string
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface ActivityActionEntry {
|
|
49
|
+
readonly kind: "action"
|
|
50
|
+
readonly at: Date
|
|
51
|
+
readonly executionId: string
|
|
52
|
+
readonly actionId: string
|
|
53
|
+
readonly runId: string
|
|
54
|
+
/** `incomplete` when no outcome is recorded: the run is in flight, or was interrupted. */
|
|
55
|
+
readonly status: ActionRunStatus | "incomplete"
|
|
56
|
+
/** Whether the viewer may read the run itself, as Observability › Runs shows it. */
|
|
57
|
+
readonly runVisible: boolean
|
|
58
|
+
/** The object it applied to, only when the viewer can read that object. */
|
|
59
|
+
readonly object?: { readonly objectTypeId: string; readonly primaryId: string }
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface ActivityWorkflowEntry {
|
|
63
|
+
readonly kind: "workflow"
|
|
64
|
+
readonly at: Date
|
|
65
|
+
readonly executionId: string
|
|
66
|
+
readonly workflowId: string
|
|
67
|
+
readonly runId: string
|
|
68
|
+
readonly status: WorkflowRunStatus | "incomplete"
|
|
69
|
+
/** Whether the viewer may read the run itself, as Observability › Runs shows it. */
|
|
70
|
+
readonly runVisible: boolean
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** A conversation's run: its metadata only, never its title or messages. */
|
|
74
|
+
export interface ActivityAgentEntry {
|
|
75
|
+
readonly kind: "agent"
|
|
76
|
+
readonly at: Date
|
|
77
|
+
readonly executionId: string
|
|
78
|
+
readonly runId: string
|
|
79
|
+
readonly threadId: string
|
|
80
|
+
readonly status: AgentRunStatus
|
|
81
|
+
/** Messages in the thread now, every run's. */
|
|
82
|
+
readonly messages: number
|
|
83
|
+
/** The run's model calls with those of its subagents and tools; absent without any. */
|
|
84
|
+
readonly cost?: AiCostSummary
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export type ActivityTimelineEntry =
|
|
88
|
+
| ActivityPageEntry
|
|
89
|
+
| ActivityInteractionEntry
|
|
90
|
+
| ActivityActionEntry
|
|
91
|
+
| ActivityWorkflowEntry
|
|
92
|
+
| ActivityAgentEntry
|
|
93
|
+
|
|
94
|
+
export interface ActivityVisitTimeline {
|
|
95
|
+
readonly visit: ActivityVisitView
|
|
96
|
+
/** Absent once the session is gone, or without an auth or share store. */
|
|
97
|
+
readonly connection?: ActivityConnection
|
|
98
|
+
/**
|
|
99
|
+
* By time. Page views and interactions come in their sequence, and before executions at the same
|
|
100
|
+
* instant.
|
|
101
|
+
*/
|
|
102
|
+
readonly entries: readonly ActivityTimelineEntry[]
|
|
103
|
+
/**
|
|
104
|
+
* More than {@link ACTIVITY_TIMELINE_LIMIT} page views and interactions, or recorded executions.
|
|
105
|
+
* The timeline then stops at the last page view or interaction, or the last root execution, it
|
|
106
|
+
* could keep.
|
|
107
|
+
*/
|
|
108
|
+
readonly truncated: boolean
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* A visit's timeline: its page views and interactions, and what its session started while it
|
|
113
|
+
* lasted. One bounded read per source, each batched over the visit; see `README.md`.
|
|
114
|
+
*/
|
|
115
|
+
export async function composeActivityTimeline(
|
|
116
|
+
runtime: SixbRuntimeContext,
|
|
117
|
+
input: {
|
|
118
|
+
readonly page: StoredActivityVisitPage
|
|
119
|
+
/** The visit, named by its link's share. */
|
|
120
|
+
readonly visit: ActivityVisitView
|
|
121
|
+
/** That link's grant, read with the name. */
|
|
122
|
+
readonly grant?: ShareGrantRecord
|
|
123
|
+
},
|
|
124
|
+
now: Date
|
|
125
|
+
): Promise<ActivityVisitTimeline> {
|
|
126
|
+
const { page, visit } = input
|
|
127
|
+
const { storage, projectId } = runtime
|
|
128
|
+
|
|
129
|
+
const [ledger, connection] = await Promise.all([
|
|
130
|
+
storage.executions.listBySession({
|
|
131
|
+
projectId,
|
|
132
|
+
session: { type: visit.actor.type, id: page.sessionId },
|
|
133
|
+
...sessionWindow(visit),
|
|
134
|
+
limit: ACTIVITY_TIMELINE_LIMIT,
|
|
135
|
+
}),
|
|
136
|
+
readActivityConnection(runtime, page, input.grant, now),
|
|
137
|
+
])
|
|
138
|
+
const executions = ledger.executions
|
|
139
|
+
|
|
140
|
+
const ofKind = (kind: "action" | "workflow") =>
|
|
141
|
+
executions.flatMap((execution) =>
|
|
142
|
+
execution.executor.type === "primitive" && execution.executor.kind === kind
|
|
143
|
+
? [execution.id]
|
|
144
|
+
: []
|
|
145
|
+
)
|
|
146
|
+
const agentRunIds = executions.flatMap((execution) =>
|
|
147
|
+
execution.executor.type === "agent" ? [execution.executor.runId] : []
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
// Only what an Agent ran can count toward a conversation's cost.
|
|
151
|
+
const byId = new Map(executions.map((execution) => [execution.id, execution]))
|
|
152
|
+
const withAgent = executions.filter((execution) =>
|
|
153
|
+
lineage(execution, byId).some((ancestor) => ancestor.executor.type === "agent")
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
const [actionRuns, workflowRuns, agentRuns, costs] = await Promise.all([
|
|
157
|
+
storage.actionRuns?.getByExecutionIds({ projectId, executionIds: ofKind("action") }) ?? [],
|
|
158
|
+
storage.workflowRuns?.getByExecutionIds({ projectId, executionIds: ofKind("workflow") }) ?? [],
|
|
159
|
+
storage.agents?.runs.getByIds({ projectId, ids: agentRunIds }) ?? [],
|
|
160
|
+
resolveExecutionCosts({
|
|
161
|
+
storage: storage.aiCosts,
|
|
162
|
+
projectId,
|
|
163
|
+
executionIds: withAgent.map((execution) => execution.id),
|
|
164
|
+
}),
|
|
165
|
+
])
|
|
166
|
+
|
|
167
|
+
// A subagent's cost goes to the conversation above it. A Workflow's Agent steps have none.
|
|
168
|
+
const conversations = new Map(
|
|
169
|
+
agentRuns.flatMap((run) =>
|
|
170
|
+
run.kind === "conversation" ? [[run.executionId, run] as const] : []
|
|
171
|
+
)
|
|
172
|
+
)
|
|
173
|
+
const subjects = actionRuns.flatMap((run) => (run.subject.kind === "object" ? [run.subject] : []))
|
|
174
|
+
|
|
175
|
+
const [threads, readable, unreadableRunTypes] = await Promise.all([
|
|
176
|
+
storage.agents?.threads.getByIds({
|
|
177
|
+
projectId,
|
|
178
|
+
ids: [...conversations.values()].map((run) => run.threadId),
|
|
179
|
+
}) ?? [],
|
|
180
|
+
readableObjects(runtime, subjects),
|
|
181
|
+
subjects.length > 0 ? unreadableActionRunTypes(runtime.objectReader) : new Set<string>(),
|
|
182
|
+
])
|
|
183
|
+
|
|
184
|
+
const actionRunByExecution = new Map(actionRuns.map((run) => [run.executionId, run]))
|
|
185
|
+
const workflowRunByExecution = new Map(workflowRuns.map((run) => [run.executionId, run]))
|
|
186
|
+
const messagesByThread = new Map(threads.map((thread) => [thread.id, thread.messageCount]))
|
|
187
|
+
const costByAgent = rollUpCosts(byId, conversations, withAgent, costs)
|
|
188
|
+
|
|
189
|
+
const executionEntries = executions.flatMap((execution): ActivityTimelineEntry[] => {
|
|
190
|
+
const at = new Date(execution.createdAt)
|
|
191
|
+
const executor = execution.executor
|
|
192
|
+
const authority = execution.authorizationRef
|
|
193
|
+
|
|
194
|
+
if (executor.type === "primitive" && authority.type === "trustedPrimitive") {
|
|
195
|
+
if (executor.kind === "action") {
|
|
196
|
+
const run = actionRunByExecution.get(execution.id)
|
|
197
|
+
const subject = run?.subject.kind === "object" ? run.subject : undefined
|
|
198
|
+
const object =
|
|
199
|
+
subject && readable.has(objectBatchKey(subject.objectTypeId, subject.primaryId))
|
|
200
|
+
? { objectTypeId: subject.objectTypeId, primaryId: subject.primaryId }
|
|
201
|
+
: undefined
|
|
202
|
+
|
|
203
|
+
// As the runs page decides: the action and its subject's type, and the type's markings.
|
|
204
|
+
const runVisible =
|
|
205
|
+
run !== undefined &&
|
|
206
|
+
canViewActionRun(runtime.authorization, run) &&
|
|
207
|
+
(subject === undefined || !unreadableRunTypes.has(subject.objectTypeId))
|
|
208
|
+
|
|
209
|
+
return [
|
|
210
|
+
{
|
|
211
|
+
kind: "action",
|
|
212
|
+
at,
|
|
213
|
+
executionId: execution.id,
|
|
214
|
+
actionId: authority.primitive.id,
|
|
215
|
+
runId: executor.runId,
|
|
216
|
+
status: run?.status ?? "incomplete",
|
|
217
|
+
runVisible,
|
|
218
|
+
...(object === undefined ? {} : { object }),
|
|
219
|
+
},
|
|
220
|
+
]
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
if (executor.kind === "workflow") {
|
|
224
|
+
const run = workflowRunByExecution.get(execution.id)
|
|
225
|
+
return [
|
|
226
|
+
{
|
|
227
|
+
kind: "workflow",
|
|
228
|
+
at,
|
|
229
|
+
executionId: execution.id,
|
|
230
|
+
workflowId: authority.primitive.id,
|
|
231
|
+
runId: executor.runId,
|
|
232
|
+
status: run?.status ?? "incomplete",
|
|
233
|
+
runVisible: run !== undefined && canViewWorkflowRun(runtime.authorization, run),
|
|
234
|
+
},
|
|
235
|
+
]
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
const conversation = conversations.get(execution.id)
|
|
240
|
+
if (conversation) {
|
|
241
|
+
const cost = costByAgent.get(execution.id)
|
|
242
|
+
return [
|
|
243
|
+
{
|
|
244
|
+
kind: "agent",
|
|
245
|
+
at,
|
|
246
|
+
executionId: execution.id,
|
|
247
|
+
runId: conversation.id,
|
|
248
|
+
threadId: conversation.threadId,
|
|
249
|
+
status: conversation.status,
|
|
250
|
+
messages: messagesByThread.get(conversation.threadId) ?? 0,
|
|
251
|
+
...(cost === undefined ? {} : { cost }),
|
|
252
|
+
},
|
|
253
|
+
]
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
return []
|
|
257
|
+
})
|
|
258
|
+
|
|
259
|
+
// Recorded entries come first at an equal instant, in their sequence: the sort is stable.
|
|
260
|
+
const recorded = [
|
|
261
|
+
...page.pageViews.map(
|
|
262
|
+
(pageView): ActivityPageEntry => ({
|
|
263
|
+
kind: "page",
|
|
264
|
+
at: new Date(pageView.receivedAt),
|
|
265
|
+
sequence: pageView.sequence,
|
|
266
|
+
route: pageView.route,
|
|
267
|
+
})
|
|
268
|
+
),
|
|
269
|
+
...page.interactions.map(
|
|
270
|
+
(interaction): ActivityInteractionEntry => ({
|
|
271
|
+
kind: "interaction",
|
|
272
|
+
at: new Date(interaction.receivedAt),
|
|
273
|
+
sequence: interaction.sequence,
|
|
274
|
+
name: interaction.name,
|
|
275
|
+
route: interaction.route,
|
|
276
|
+
})
|
|
277
|
+
),
|
|
278
|
+
].sort((left, right) => left.sequence - right.sequence)
|
|
279
|
+
|
|
280
|
+
// Past the last page view, interaction or root kept, a source left rows out: the timeline stops
|
|
281
|
+
// there.
|
|
282
|
+
const cutoffs = [
|
|
283
|
+
page.hasMore ? recorded.at(-1)?.at : undefined,
|
|
284
|
+
ledger.truncated
|
|
285
|
+
? executions.filter((execution) => execution.source.type !== "execution").at(-1)?.createdAt
|
|
286
|
+
: undefined,
|
|
287
|
+
].flatMap((at) => (at === undefined ? [] : [at.getTime()]))
|
|
288
|
+
const cutoff = cutoffs.length > 0 ? Math.min(...cutoffs) : Number.POSITIVE_INFINITY
|
|
289
|
+
|
|
290
|
+
const entries = [...recorded, ...executionEntries]
|
|
291
|
+
.filter((entry) => entry.at.getTime() <= cutoff)
|
|
292
|
+
.sort((left, right) => left.at.getTime() - right.at.getTime())
|
|
293
|
+
|
|
294
|
+
return {
|
|
295
|
+
visit,
|
|
296
|
+
...(connection === undefined ? {} : { connection }),
|
|
297
|
+
entries,
|
|
298
|
+
truncated: page.hasMore || ledger.truncated,
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Roots created in `[start - grace, last activity + grace)`, cut where the session's next visit
|
|
304
|
+
* may start once this one is a day old.
|
|
305
|
+
*/
|
|
306
|
+
function sessionWindow(visit: ActivityVisit): { readonly from: Date; readonly to: Date } {
|
|
307
|
+
const startedAt = visit.startedAt.getTime()
|
|
308
|
+
return {
|
|
309
|
+
from: new Date(startedAt - SESSION_GRACE_MS),
|
|
310
|
+
to: new Date(
|
|
311
|
+
Math.min(
|
|
312
|
+
visit.lastSeenAt.getTime() + SESSION_GRACE_MS,
|
|
313
|
+
startedAt + ACTIVITY_MAX_VISIT_MS - SESSION_GRACE_MS
|
|
314
|
+
)
|
|
315
|
+
),
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/** An execution, then its parent and the parent's, as far as the visit's executions go. */
|
|
320
|
+
function lineage(
|
|
321
|
+
execution: ExecutionRecord,
|
|
322
|
+
byId: ReadonlyMap<string, ExecutionRecord>
|
|
323
|
+
): readonly ExecutionRecord[] {
|
|
324
|
+
const chain: ExecutionRecord[] = []
|
|
325
|
+
let current: ExecutionRecord | undefined = execution
|
|
326
|
+
|
|
327
|
+
while (current) {
|
|
328
|
+
chain.push(current)
|
|
329
|
+
current = current.source.type === "execution" ? byId.get(current.source.executionId) : undefined
|
|
330
|
+
}
|
|
331
|
+
return chain
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/** Each conversation's cost: its own calls and those of everything below it, each counted once. */
|
|
335
|
+
function rollUpCosts(
|
|
336
|
+
byId: ReadonlyMap<string, ExecutionRecord>,
|
|
337
|
+
conversations: ReadonlyMap<string, ConversationAgentRunRecord>,
|
|
338
|
+
withAgent: readonly ExecutionRecord[],
|
|
339
|
+
costs: readonly (AiCostSummary | undefined)[]
|
|
340
|
+
): ReadonlyMap<string, AiCostSummary> {
|
|
341
|
+
const grouped = new Map<string, AiCostSummary[]>()
|
|
342
|
+
|
|
343
|
+
withAgent.forEach((execution, index) => {
|
|
344
|
+
const cost = costs[index]
|
|
345
|
+
const owner = lineage(execution, byId).find((ancestor) => conversations.has(ancestor.id))
|
|
346
|
+
if (!cost || !owner) {
|
|
347
|
+
return
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
const summaries = grouped.get(owner.id) ?? []
|
|
351
|
+
summaries.push(cost)
|
|
352
|
+
grouped.set(owner.id, summaries)
|
|
353
|
+
})
|
|
354
|
+
|
|
355
|
+
return new Map(
|
|
356
|
+
[...grouped].flatMap(([owner, summaries]) => {
|
|
357
|
+
const total = addCosts(summaries)
|
|
358
|
+
return total ? [[owner, total] as const] : []
|
|
359
|
+
})
|
|
360
|
+
)
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
function addCosts(summaries: readonly AiCostSummary[]): AiCostSummary | undefined {
|
|
364
|
+
const amounts = new Map<string, bigint>()
|
|
365
|
+
let ratedCallCount = 0
|
|
366
|
+
let unpriceableCallCount = 0
|
|
367
|
+
let unvaluedCallCount = 0
|
|
368
|
+
|
|
369
|
+
for (const summary of summaries) {
|
|
370
|
+
for (const money of summary.amounts) {
|
|
371
|
+
amounts.set(money.currency, (amounts.get(money.currency) ?? 0n) + BigInt(money.amountNanos))
|
|
372
|
+
}
|
|
373
|
+
ratedCallCount += summary.ratedCallCount
|
|
374
|
+
unpriceableCallCount += summary.unpriceableCallCount
|
|
375
|
+
unvaluedCallCount += summary.unvaluedCallCount
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
if (ratedCallCount + unpriceableCallCount + unvaluedCallCount === 0) {
|
|
379
|
+
return undefined
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
return {
|
|
383
|
+
amounts: [...amounts]
|
|
384
|
+
.sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
|
|
385
|
+
.map(([currency, amount]) => ({ currency, amountNanos: amount.toString() })),
|
|
386
|
+
ratedCallCount,
|
|
387
|
+
unpriceableCallCount,
|
|
388
|
+
unvaluedCallCount,
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* The action subjects the viewer can read, through its own object reader: object type grants,
|
|
394
|
+
* markings and existence alike. One batch per object type, as a type the viewer cannot see fails
|
|
395
|
+
* its whole batch.
|
|
396
|
+
*/
|
|
397
|
+
async function readableObjects(
|
|
398
|
+
runtime: SixbRuntimeContext,
|
|
399
|
+
subjects: readonly ActionObjectSubject[]
|
|
400
|
+
): Promise<ReadonlySet<string>> {
|
|
401
|
+
const byType = new Map<string, Map<string, ActionObjectSubject>>()
|
|
402
|
+
for (const subject of subjects) {
|
|
403
|
+
const items = byType.get(subject.objectTypeId) ?? new Map()
|
|
404
|
+
items.set(subject.primaryId, subject)
|
|
405
|
+
byType.set(subject.objectTypeId, items)
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
const readable = new Set<string>()
|
|
409
|
+
await Promise.all(
|
|
410
|
+
[...byType.values()].map(async (items) => {
|
|
411
|
+
try {
|
|
412
|
+
const rows = await runtime.objectReader.getByPrimaryIdBatch({ items: [...items.values()] })
|
|
413
|
+
for (const key of rows.keys()) {
|
|
414
|
+
readable.add(key)
|
|
415
|
+
}
|
|
416
|
+
} catch (error) {
|
|
417
|
+
if (!(error instanceof AuthorizationError)) {
|
|
418
|
+
throw error
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
})
|
|
422
|
+
)
|
|
423
|
+
return readable
|
|
424
|
+
}
|
package/src/agents/index.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
export type { PropertyClearance } from "../objects/property-clearance"
|
|
2
|
+
export {
|
|
3
|
+
captureSandboxEnv,
|
|
4
|
+
sandboxCredentialIssue,
|
|
5
|
+
staticSandboxRecipe,
|
|
6
|
+
} from "../sandboxes/configuration"
|
|
2
7
|
export type {
|
|
3
8
|
AgentFileDataProjection,
|
|
4
9
|
AgentFileDataResolverInput,
|
|
@@ -156,14 +161,14 @@ export type {
|
|
|
156
161
|
AgentDescriptor,
|
|
157
162
|
AgentReasoning,
|
|
158
163
|
AgentReference,
|
|
159
|
-
AgentToolArtifact,
|
|
160
|
-
AgentToolArtifactPutInput,
|
|
161
|
-
AgentToolArtifacts,
|
|
162
164
|
AgentToolAttachments,
|
|
163
165
|
AgentToolContent,
|
|
164
166
|
AgentToolDefinition,
|
|
165
167
|
AgentToolDescriptionBuilder,
|
|
168
|
+
AgentToolFile,
|
|
166
169
|
AgentToolFileContent,
|
|
170
|
+
AgentToolFilePutInput,
|
|
171
|
+
AgentToolFiles,
|
|
167
172
|
AgentToolHandler,
|
|
168
173
|
AgentToolHandlerResult,
|
|
169
174
|
AgentToolInputBuilder,
|
package/src/agents/request.ts
CHANGED
|
@@ -253,6 +253,11 @@ export async function retryAgentRun(
|
|
|
253
253
|
threadId: failedRun.threadId,
|
|
254
254
|
runId: failedRun.id,
|
|
255
255
|
})
|
|
256
|
+
// What the failed turn published goes with what it said, so the retry starts clean.
|
|
257
|
+
await tx.artifacts?.deleteVersionsByOrigin({
|
|
258
|
+
projectId: runtime.projectId,
|
|
259
|
+
runId: failedRun.id,
|
|
260
|
+
})
|
|
256
261
|
await tx.executions.create(durableExecution)
|
|
257
262
|
return agents.runs.create({
|
|
258
263
|
id: runId,
|
package/src/agents/skills.ts
CHANGED
|
@@ -50,6 +50,12 @@ export function createAgentSkillCatalog(
|
|
|
50
50
|
const skills = Object.freeze([...(definitions ?? [])])
|
|
51
51
|
const skillsByName = new Map<string, AgentSkillDefinition>()
|
|
52
52
|
for (const skill of skills) {
|
|
53
|
+
// As discovery refuses them: the worker adds its built-in skills under this prefix.
|
|
54
|
+
if (skill.name.startsWith("sixb-")) {
|
|
55
|
+
throw new RuntimeError(
|
|
56
|
+
`[Sixb] Agent Skill name '${skill.name}' uses the reserved 'sixb-' prefix.`
|
|
57
|
+
)
|
|
58
|
+
}
|
|
53
59
|
if (skillsByName.has(skill.name)) {
|
|
54
60
|
throw new RuntimeError(`[Sixb] Duplicate Agent Skill name: ${skill.name}`)
|
|
55
61
|
}
|
package/src/agents/types.ts
CHANGED
|
@@ -80,22 +80,22 @@ export type AgentToolRunInfo =
|
|
|
80
80
|
readonly stepId: string
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
/** Input accepted by the run-scoped
|
|
84
|
-
export interface
|
|
83
|
+
/** Input accepted by the run-scoped file publisher exposed to agent tools. */
|
|
84
|
+
export interface AgentToolFilePutInput {
|
|
85
85
|
readonly body: BlobBody
|
|
86
86
|
readonly fileName: string
|
|
87
87
|
readonly mediaType?: string
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
/** A
|
|
91
|
-
export interface
|
|
90
|
+
/** A file a tool stored durably, and the path of its copy inside the current run sandbox. */
|
|
91
|
+
export interface AgentToolFile {
|
|
92
92
|
readonly fileRef: FileRef
|
|
93
93
|
readonly sandboxPath: string
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
-
/** The narrow
|
|
97
|
-
export interface
|
|
98
|
-
put(input:
|
|
96
|
+
/** The narrow file-writing surface available to an agent tool call. */
|
|
97
|
+
export interface AgentToolFiles {
|
|
98
|
+
put(input: AgentToolFilePutInput): Promise<AgentToolFile>
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
/**
|
|
@@ -159,7 +159,7 @@ export interface AgentToolRunContext<
|
|
|
159
159
|
readonly run: AgentToolRunInfo
|
|
160
160
|
readonly sixb: AgentToolRuntimeFacade
|
|
161
161
|
readonly logger: Logger
|
|
162
|
-
readonly
|
|
162
|
+
readonly files: AgentToolFiles
|
|
163
163
|
readonly attachments: AgentToolAttachments
|
|
164
164
|
}
|
|
165
165
|
|
package/src/agents/validation.ts
CHANGED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { isArtifactId } from "./ids"
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* An address to an artifact, or to a part of one:
|
|
5
|
+
*
|
|
6
|
+
* ```text
|
|
7
|
+
* artifact:<id>[@<version>][/<file>][#<part>]
|
|
8
|
+
* ```
|
|
9
|
+
*
|
|
10
|
+
* Without a version it follows the latest one. What a part names depends on the target's kind: a
|
|
11
|
+
* sheet (`Summary`), a range of one (`Summary!A1:D12`), a chart (`chart=revenue`), a document's
|
|
12
|
+
* section by its slug (`methodology`), or a slide (`4`).
|
|
13
|
+
*/
|
|
14
|
+
export interface ArtifactAddress {
|
|
15
|
+
readonly artifactId: string
|
|
16
|
+
readonly version?: number
|
|
17
|
+
/** A file inside the artifact, by its path. */
|
|
18
|
+
readonly path?: string
|
|
19
|
+
readonly part?: string
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const SCHEME = "artifact:"
|
|
23
|
+
|
|
24
|
+
/** Whether a URL is written in the `artifact:` scheme, well formed or not. */
|
|
25
|
+
export function isArtifactAddress(value: string): boolean {
|
|
26
|
+
return value.trim().toLowerCase().startsWith(SCHEME)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Reads an address; `null` when it is not a well-formed `artifact:` address. */
|
|
30
|
+
export function parseArtifactAddress(value: string): ArtifactAddress | null {
|
|
31
|
+
const text = value.trim()
|
|
32
|
+
if (!isArtifactAddress(text)) return null
|
|
33
|
+
const hashAt = text.indexOf("#")
|
|
34
|
+
const head = text.slice(SCHEME.length, hashAt === -1 ? undefined : hashAt)
|
|
35
|
+
const part = hashAt === -1 ? undefined : decode(text.slice(hashAt + 1))
|
|
36
|
+
const slashAt = head.indexOf("/")
|
|
37
|
+
const target = slashAt === -1 ? head : head.slice(0, slashAt)
|
|
38
|
+
const path = slashAt === -1 ? undefined : decodePath(head.slice(slashAt + 1))
|
|
39
|
+
const [artifactId = "", version, ...rest] = target.split("@")
|
|
40
|
+
if (!isArtifactId(artifactId) || rest.length > 0) return null
|
|
41
|
+
if (version !== undefined && !/^[1-9]\d{0,8}$/.test(version)) return null
|
|
42
|
+
if (path === null || part === null || part === "") return null
|
|
43
|
+
return {
|
|
44
|
+
artifactId,
|
|
45
|
+
...(version === undefined ? {} : { version: Number(version) }),
|
|
46
|
+
...(path === undefined ? {} : { path }),
|
|
47
|
+
...(part === undefined ? {} : { part }),
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Writes an address so it survives inside Markdown: spaces and the characters that end a link
|
|
53
|
+
* are escaped, and the rest of a part stays readable (`Q3%20numbers!A1:D12`).
|
|
54
|
+
*/
|
|
55
|
+
export function formatArtifactAddress(address: ArtifactAddress): string {
|
|
56
|
+
const escaped = (text: string) =>
|
|
57
|
+
encodeURI(text).replace(
|
|
58
|
+
/[#()[\]<>]/g,
|
|
59
|
+
(character) => `%${character.charCodeAt(0).toString(16).toUpperCase()}`
|
|
60
|
+
)
|
|
61
|
+
return [
|
|
62
|
+
SCHEME,
|
|
63
|
+
address.artifactId,
|
|
64
|
+
address.version === undefined ? "" : `@${address.version}`,
|
|
65
|
+
address.path === undefined ? "" : `/${address.path.split("/").map(escaped).join("/")}`,
|
|
66
|
+
address.part === undefined ? "" : `#${escaped(address.part)}`,
|
|
67
|
+
].join("")
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** A rectangle of cells, zero-based, where row 0 is the header row (`A1`). */
|
|
71
|
+
export interface CellRange {
|
|
72
|
+
readonly top: number
|
|
73
|
+
readonly left: number
|
|
74
|
+
readonly bottom: number
|
|
75
|
+
readonly right: number
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** What a part names in a sheet: a sheet, a range of one, or a chart. */
|
|
79
|
+
export type SheetPart =
|
|
80
|
+
| { readonly type: "sheet"; readonly sheet: string; readonly range?: CellRange }
|
|
81
|
+
| { readonly type: "chart"; readonly chart: string }
|
|
82
|
+
|
|
83
|
+
/** Reads a sheet part: `chart=revenue`, `Summary`, or `Summary!A1:D12`. */
|
|
84
|
+
export function parseSheetPart(part: string): SheetPart | null {
|
|
85
|
+
if (part.startsWith("chart=")) {
|
|
86
|
+
const chart = part.slice("chart=".length)
|
|
87
|
+
return chart ? { type: "chart", chart } : null
|
|
88
|
+
}
|
|
89
|
+
const bangAt = part.lastIndexOf("!")
|
|
90
|
+
if (bangAt === -1) return { type: "sheet", sheet: part }
|
|
91
|
+
const sheet = part.slice(0, bangAt)
|
|
92
|
+
const range = parseCellRange(part.slice(bangAt + 1))
|
|
93
|
+
return sheet && range ? { type: "sheet", sheet, range } : null
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** Reads `B2` or `A1:D12`, in either corner order. */
|
|
97
|
+
export function parseCellRange(text: string): CellRange | null {
|
|
98
|
+
const corners = text.split(":")
|
|
99
|
+
if (corners.length > 2) return null
|
|
100
|
+
const cells = corners.map(parseCell)
|
|
101
|
+
const [start, end = start] = cells
|
|
102
|
+
if (!start || !end) return null
|
|
103
|
+
return {
|
|
104
|
+
top: Math.min(start.row, end.row),
|
|
105
|
+
left: Math.min(start.column, end.column),
|
|
106
|
+
bottom: Math.max(start.row, end.row),
|
|
107
|
+
right: Math.max(start.column, end.column),
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function parseCell(text: string): { readonly row: number; readonly column: number } | null {
|
|
112
|
+
const match = /^([A-Za-z]{1,3})([1-9]\d{0,6})$/.exec(text.trim())
|
|
113
|
+
if (!match?.[1] || !match[2]) return null
|
|
114
|
+
let column = 0
|
|
115
|
+
for (const letter of match[1].toUpperCase()) column = column * 26 + letter.charCodeAt(0) - 64
|
|
116
|
+
return { row: Number(match[2]) - 1, column: column - 1 }
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function decode(text: string): string | null {
|
|
120
|
+
try {
|
|
121
|
+
return decodeURIComponent(text)
|
|
122
|
+
} catch {
|
|
123
|
+
return null
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** A relative file path: no empty, `.`, or `..` segment. */
|
|
128
|
+
function decodePath(text: string): string | null {
|
|
129
|
+
const segments = text.split("/").map(decode)
|
|
130
|
+
if (segments.some((segment) => !segment || segment === "." || segment === "..")) return null
|
|
131
|
+
return segments.join("/")
|
|
132
|
+
}
|