@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
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { describe, expect, test } from "bun:test"
|
|
1
|
+
import { describe, expect, setSystemTime, test } from "bun:test"
|
|
2
2
|
import type { AuthStorage } from "../storage/auth"
|
|
3
3
|
import type {
|
|
4
4
|
CreateExecutionInput,
|
|
5
|
+
ExecutionRecord,
|
|
5
6
|
ExecutionStorage,
|
|
6
7
|
TrustedPrimitiveKind,
|
|
7
8
|
} from "../storage/executions"
|
|
@@ -338,6 +339,126 @@ export function runExecutionStorageContractSuite<TStorage extends ExecutionStora
|
|
|
338
339
|
})
|
|
339
340
|
})
|
|
340
341
|
|
|
342
|
+
test("lists a session's roots in a window and everything they caused", async () => {
|
|
343
|
+
// Removal proof: drop `parent_execution_id IS NULL` from a provider's root read; the Agent
|
|
344
|
+
// execution, which copies the session, is listed twice.
|
|
345
|
+
await withStorage(async (storage) => {
|
|
346
|
+
await seedAuth(storage.auth)
|
|
347
|
+
await seedSharedSession(storage)
|
|
348
|
+
|
|
349
|
+
const userRequest = (id: string) =>
|
|
350
|
+
principalRequest({ id, credential: { type: "session", id: "session-user" } })
|
|
351
|
+
|
|
352
|
+
await createAt(storage, -60_000, userRequest("before"))
|
|
353
|
+
const root = await createAt(storage, 0, userRequest("root"))
|
|
354
|
+
await createAt(storage, 1_000, childOf(root, trustedPrimitive("root-action")))
|
|
355
|
+
await createAt(
|
|
356
|
+
storage,
|
|
357
|
+
2_000,
|
|
358
|
+
principalRequest({
|
|
359
|
+
id: "other-user",
|
|
360
|
+
principal: { type: "user", id: "user-other" },
|
|
361
|
+
credential: { type: "session", id: "session-other" },
|
|
362
|
+
})
|
|
363
|
+
)
|
|
364
|
+
await createAt(storage, 3_000, delegatedRequest("shared"))
|
|
365
|
+
await createAt(storage, 4_000, {
|
|
366
|
+
...childOf(root, agentExecution("root-agent")),
|
|
367
|
+
authorizationRef: root.authorizationRef,
|
|
368
|
+
})
|
|
369
|
+
await createAt(storage, 10 * 60_000, userRequest("after"))
|
|
370
|
+
// A descendant counts whenever it was created, after the window too.
|
|
371
|
+
await createAt(
|
|
372
|
+
storage,
|
|
373
|
+
11 * 60_000,
|
|
374
|
+
childOf(
|
|
375
|
+
{ id: "root-action", correlationId: root.correlationId },
|
|
376
|
+
trustedPrimitive("late-workflow", {}, "workflow")
|
|
377
|
+
)
|
|
378
|
+
)
|
|
379
|
+
|
|
380
|
+
const window = {
|
|
381
|
+
projectId,
|
|
382
|
+
from: new Date(createdAt.getTime() - 1_000),
|
|
383
|
+
to: new Date(createdAt.getTime() + 5 * 60_000),
|
|
384
|
+
limit: 10,
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
const user = await storage.executions.listBySession({
|
|
388
|
+
...window,
|
|
389
|
+
session: { type: "user", id: "session-user" },
|
|
390
|
+
})
|
|
391
|
+
expect(user.truncated).toBe(false)
|
|
392
|
+
expect(user.executions.map((execution) => execution.id)).toEqual([
|
|
393
|
+
"root",
|
|
394
|
+
"root-action",
|
|
395
|
+
"root-agent",
|
|
396
|
+
"late-workflow",
|
|
397
|
+
])
|
|
398
|
+
expect(user.executions[0]).toEqual(root)
|
|
399
|
+
|
|
400
|
+
const shared = await storage.executions.listBySession({
|
|
401
|
+
...window,
|
|
402
|
+
session: { type: "share", id: "share-session-one" },
|
|
403
|
+
})
|
|
404
|
+
expect(shared.executions.map((execution) => execution.id)).toEqual(["shared"])
|
|
405
|
+
|
|
406
|
+
// The session id is not a credential of any other kind.
|
|
407
|
+
await expect(
|
|
408
|
+
storage.executions.listBySession({
|
|
409
|
+
...window,
|
|
410
|
+
session: { type: "share", id: "session-user" },
|
|
411
|
+
})
|
|
412
|
+
).resolves.toEqual({ executions: [], truncated: false })
|
|
413
|
+
})
|
|
414
|
+
})
|
|
415
|
+
|
|
416
|
+
test("bounds a session's executions, keeping roots and the earliest first", async () => {
|
|
417
|
+
await withStorage(async (storage) => {
|
|
418
|
+
await seedAuth(storage.auth)
|
|
419
|
+
|
|
420
|
+
for (const [index, id] of ["first", "second", "third"].entries()) {
|
|
421
|
+
const root = await createAt(
|
|
422
|
+
storage,
|
|
423
|
+
index * 1_000,
|
|
424
|
+
principalRequest({ id, credential: { type: "session", id: "session-user" } })
|
|
425
|
+
)
|
|
426
|
+
await createAt(storage, index * 1_000 + 500, childOf(root, trustedPrimitive(`${id}-run`)))
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
const list = (limit: number) =>
|
|
430
|
+
storage.executions.listBySession({
|
|
431
|
+
projectId,
|
|
432
|
+
session: { type: "user", id: "session-user" },
|
|
433
|
+
from: createdAt,
|
|
434
|
+
to: new Date(createdAt.getTime() + 60_000),
|
|
435
|
+
limit,
|
|
436
|
+
})
|
|
437
|
+
|
|
438
|
+
const roots = await list(2)
|
|
439
|
+
expect(roots.truncated).toBe(true)
|
|
440
|
+
expect(roots.executions.map((execution) => execution.id)).toEqual(["first", "second"])
|
|
441
|
+
|
|
442
|
+
const partial = await list(4)
|
|
443
|
+
expect(partial.truncated).toBe(true)
|
|
444
|
+
expect(partial.executions).toHaveLength(4)
|
|
445
|
+
expect(partial.executions.map((execution) => execution.id)).toEqual(
|
|
446
|
+
expect.arrayContaining(["first", "second", "third"])
|
|
447
|
+
)
|
|
448
|
+
|
|
449
|
+
const all = await list(6)
|
|
450
|
+
expect(all.truncated).toBe(false)
|
|
451
|
+
expect(all.executions.map((execution) => execution.id)).toEqual([
|
|
452
|
+
"first",
|
|
453
|
+
"first-run",
|
|
454
|
+
"second",
|
|
455
|
+
"second-run",
|
|
456
|
+
"third",
|
|
457
|
+
"third-run",
|
|
458
|
+
])
|
|
459
|
+
})
|
|
460
|
+
})
|
|
461
|
+
|
|
341
462
|
test("participates in storage transactions and rollback", async () => {
|
|
342
463
|
await withStorage(async (storage) => {
|
|
343
464
|
await expect(
|
|
@@ -355,6 +476,31 @@ export function runExecutionStorageContractSuite<TStorage extends ExecutionStora
|
|
|
355
476
|
})
|
|
356
477
|
}
|
|
357
478
|
|
|
479
|
+
/** Creates an execution at `offsetMs` after the fixtures' creation time: storage stamps it. */
|
|
480
|
+
async function createAt(
|
|
481
|
+
storage: ExecutionStorageContractStorage,
|
|
482
|
+
offsetMs: number,
|
|
483
|
+
input: CreateExecutionInput
|
|
484
|
+
): Promise<ExecutionRecord> {
|
|
485
|
+
setSystemTime(new Date(createdAt.getTime() + offsetMs))
|
|
486
|
+
try {
|
|
487
|
+
return await storage.executions.create(input)
|
|
488
|
+
} finally {
|
|
489
|
+
setSystemTime()
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
function childOf(
|
|
494
|
+
parent: Pick<ExecutionRecord, "id" | "correlationId">,
|
|
495
|
+
input: CreateExecutionInput
|
|
496
|
+
): CreateExecutionInput {
|
|
497
|
+
return {
|
|
498
|
+
...input,
|
|
499
|
+
source: { type: "execution", executionId: parent.id },
|
|
500
|
+
correlationId: parent.correlationId,
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
|
|
358
504
|
async function seedAuth(auth: AuthStorage): Promise<void> {
|
|
359
505
|
await auth.users.create({
|
|
360
506
|
id: "user-one",
|
package/src/testing/index.ts
CHANGED
|
@@ -9,6 +9,10 @@ export {
|
|
|
9
9
|
type ActionRunStorageContractSuiteOptions,
|
|
10
10
|
runActionRunStorageContractSuite,
|
|
11
11
|
} from "./action-run-storage-contract"
|
|
12
|
+
export {
|
|
13
|
+
type ActivityStorageContractSuiteOptions,
|
|
14
|
+
runActivityStorageContractSuite,
|
|
15
|
+
} from "./activity-storage-contract"
|
|
12
16
|
export { createTestAgentExecution } from "./agent-execution"
|
|
13
17
|
export {
|
|
14
18
|
type AgentStorageContractSuiteOptions,
|
|
@@ -34,6 +38,11 @@ export {
|
|
|
34
38
|
runAiUsageStorageContractSuite,
|
|
35
39
|
seedAiUsageStorageContractExecutions,
|
|
36
40
|
} from "./ai-usage-storage-contract"
|
|
41
|
+
export {
|
|
42
|
+
type ArtifactStorageContractStorage,
|
|
43
|
+
type ArtifactStorageContractSuiteOptions,
|
|
44
|
+
runArtifactStorageContractSuite,
|
|
45
|
+
} from "./artifact-storage-contract"
|
|
37
46
|
export {
|
|
38
47
|
type AuthStorageContractSuiteOptions,
|
|
39
48
|
runAuthStorageContractSuite,
|
|
@@ -285,6 +285,44 @@ export function runLakeMergeStorageContractSuite<TStorage extends LakeStorage>(
|
|
|
285
285
|
expect(await storage.listVersions(invoices.id)).toHaveLength(1)
|
|
286
286
|
})
|
|
287
287
|
})
|
|
288
|
+
|
|
289
|
+
test("a merge keeps its parent's lineage", async () => {
|
|
290
|
+
await withStorage(async (storage) => {
|
|
291
|
+
await storage.createDataset(invoices)
|
|
292
|
+
|
|
293
|
+
const source = (column: string) => ({ datasetId: "contract.source", column })
|
|
294
|
+
const lineage = {
|
|
295
|
+
rows: [source("tenant")],
|
|
296
|
+
columns: { id: [source("id")], note: [source("amount")], status: [source("state")] },
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
const pipeline = { kind: "pipeline", id: "contract-pipeline" } as const
|
|
300
|
+
const seed = await storage.beginWrite({ dataset: invoices, producer: pipeline, lineage })
|
|
301
|
+
await seed.writeRows([{ id: "inv_1", status: "open", note: "120.00" }])
|
|
302
|
+
await seed.commit()
|
|
303
|
+
|
|
304
|
+
const sync = { kind: "sync", id: "sync-invoices" } as const
|
|
305
|
+
const merge = await storage.beginMerge({ dataset: invoices, producer: sync })
|
|
306
|
+
await merge.writeChanges([change.upsert({ id: "inv_2", status: "paid", note: null })])
|
|
307
|
+
const merged = expectCreated(await merge.commit())
|
|
308
|
+
|
|
309
|
+
// Its own rows depend on its own columns only; the rows it keeps, on what they did.
|
|
310
|
+
expect(merged.lineage).toEqual(lineage)
|
|
311
|
+
expect((await storage.getVersion(invoices.id, merged.versionId))?.lineage).toEqual(lineage)
|
|
312
|
+
|
|
313
|
+
// A parent that records no lineage could hold anything, and so could the merge.
|
|
314
|
+
const unanalyzed = await storage.beginWrite({ dataset: invoices, producer: pipeline })
|
|
315
|
+
await unanalyzed.writeRows([{ id: "inv_1", status: "open", note: "120.00" }])
|
|
316
|
+
const legacy = await unanalyzed.commit()
|
|
317
|
+
|
|
318
|
+
const next = await storage.beginMerge({ dataset: invoices, producer: sync })
|
|
319
|
+
await next.writeChanges([change.upsert({ id: "inv_3", status: "open", note: null })])
|
|
320
|
+
|
|
321
|
+
expect(expectCreated(await next.commit()).lineage).toEqual({
|
|
322
|
+
unknown: `version '${legacy.versionId}' of '${invoices.id}' recorded no column lineage`,
|
|
323
|
+
})
|
|
324
|
+
})
|
|
325
|
+
})
|
|
288
326
|
})
|
|
289
327
|
}
|
|
290
328
|
|
|
@@ -2,7 +2,14 @@ import { describe, expect, test } from "bun:test"
|
|
|
2
2
|
import type { FileRef } from "../blob-storage"
|
|
3
3
|
import { col, type DatasetDefinition, defineDataset } from "../datasets"
|
|
4
4
|
import { LakeStorageError } from "../lake-storage/errors"
|
|
5
|
-
import type {
|
|
5
|
+
import type {
|
|
6
|
+
BeginDatasetWriteInput,
|
|
7
|
+
DatasetColumnRef,
|
|
8
|
+
DatasetProducer,
|
|
9
|
+
DatasetRow,
|
|
10
|
+
DatasetWriteCommitResult,
|
|
11
|
+
LakeStorage,
|
|
12
|
+
} from "../lake-storage/types"
|
|
6
13
|
|
|
7
14
|
export type LakeStorageSchemaEvolutionCapability = "strict" | "addNullableColumns"
|
|
8
15
|
|
|
@@ -16,6 +23,8 @@ export interface LakeStorageContractSuiteOptions<TStorage extends LakeStorage =
|
|
|
16
23
|
* `strict`, which allows metadata-only merges but rejects schema evolution.
|
|
17
24
|
*/
|
|
18
25
|
readonly schemaEvolution?: LakeStorageSchemaEvolutionCapability
|
|
26
|
+
/** Open the same lake again, to check what a provider persists. */
|
|
27
|
+
readonly reopen?: (storage: TStorage) => TStorage | Promise<TStorage>
|
|
19
28
|
/**
|
|
20
29
|
* Version id that is syntactically valid for the provider but should not
|
|
21
30
|
* exist. Defaults to a generic id accepted by providers without format
|
|
@@ -65,6 +74,30 @@ const invoiceRef: FileRef = {
|
|
|
65
74
|
logicalPath: "invoices/invoice.txt",
|
|
66
75
|
}
|
|
67
76
|
|
|
77
|
+
const pipeline: DatasetProducer = { kind: "pipeline", id: "contract-pipeline", stepId: "copy" }
|
|
78
|
+
const source = (column: string): DatasetColumnRef => ({ datasetId: "contract.source", column })
|
|
79
|
+
|
|
80
|
+
/** A step that copies `contract.source` columns, as resolved lineage. */
|
|
81
|
+
const copied = {
|
|
82
|
+
rows: [],
|
|
83
|
+
columns: { customerName: [source("name")], orderId: [source("id")] },
|
|
84
|
+
}
|
|
85
|
+
/** The same step, before a fix: it wrote amounts into `customerName`. */
|
|
86
|
+
const fromAmount = {
|
|
87
|
+
rows: [],
|
|
88
|
+
columns: { customerName: [source("amount")], orderId: [source("id")] },
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async function write(
|
|
92
|
+
storage: LakeStorage,
|
|
93
|
+
input: Pick<BeginDatasetWriteInput, "producer" | "lineage" | "mode">,
|
|
94
|
+
rows: readonly DatasetRow[]
|
|
95
|
+
): Promise<DatasetWriteCommitResult> {
|
|
96
|
+
const session = await storage.beginWrite({ dataset: writeDataset, ...input })
|
|
97
|
+
await session.writeRows(rows)
|
|
98
|
+
return session.commit()
|
|
99
|
+
}
|
|
100
|
+
|
|
68
101
|
/**
|
|
69
102
|
* Runs the shared `LakeStorage` contract against any provider.
|
|
70
103
|
*
|
|
@@ -612,7 +645,7 @@ export function runLakeStorageContractSuite<TStorage extends LakeStorage>(
|
|
|
612
645
|
|
|
613
646
|
test("versions changed input lineage even when output rows are identical", () =>
|
|
614
647
|
withStorage(async (storage) => {
|
|
615
|
-
// Regression proof: omit
|
|
648
|
+
// Regression proof: omit hasDatasetProvenanceChanges in the provider's no-op branch.
|
|
616
649
|
// The updated input reference is lost and the stale writer is no longer fenced.
|
|
617
650
|
await storage.createDataset(writeDataset)
|
|
618
651
|
await storage.createDataset(definitionDataset)
|
|
@@ -644,6 +677,68 @@ export function runLakeStorageContractSuite<TStorage extends LakeStorage>(
|
|
|
644
677
|
expect(await collectRows(storage.readRows({ datasetId: writeDataset.id }))).toEqual(rows)
|
|
645
678
|
}))
|
|
646
679
|
|
|
680
|
+
test("versions changed column lineage even when output rows are identical", () =>
|
|
681
|
+
withStorage(async (storage) => {
|
|
682
|
+
// Regression proof: compare only inputs in the provider's no-op branch. The rerun
|
|
683
|
+
// reuses the version without lineage, and its rows stay classified with every marking.
|
|
684
|
+
await storage.createDataset(writeDataset)
|
|
685
|
+
const rows = [{ orderId: "ord_1", customerName: "Ada" }]
|
|
686
|
+
const commit = async (
|
|
687
|
+
write: Pick<BeginDatasetWriteInput, "producer" | "lineage" | "mode">,
|
|
688
|
+
expectedLatestVersionId: string | null,
|
|
689
|
+
written: readonly DatasetRow[] = rows
|
|
690
|
+
) => {
|
|
691
|
+
const session = await storage.beginWrite({ dataset: writeDataset, ...write })
|
|
692
|
+
await session.writeRows(written)
|
|
693
|
+
return session.commit({ expectedLatestVersionId })
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
const initial = await commit({ producer: pipeline }, null)
|
|
697
|
+
expect(initial.lineage).toBeUndefined()
|
|
698
|
+
|
|
699
|
+
const analyzed = await commit({ producer: pipeline, lineage: copied }, initial.versionId)
|
|
700
|
+
expect(analyzed).toMatchObject({ outcome: "created", lineage: copied })
|
|
701
|
+
|
|
702
|
+
// Order and repetition do not change a lineage.
|
|
703
|
+
const reordered = {
|
|
704
|
+
rows: [],
|
|
705
|
+
columns: {
|
|
706
|
+
orderId: [...copied.columns.orderId, ...copied.columns.orderId],
|
|
707
|
+
customerName: copied.columns.customerName,
|
|
708
|
+
},
|
|
709
|
+
}
|
|
710
|
+
expect(
|
|
711
|
+
await commit({ producer: pipeline, lineage: reordered }, analyzed.versionId)
|
|
712
|
+
).toMatchObject({ outcome: "unchanged", versionId: analyzed.versionId })
|
|
713
|
+
|
|
714
|
+
// A run that recorded no lineage is a change too: reusing the analyzed version would
|
|
715
|
+
// classify its rows by a lineage the run did not record.
|
|
716
|
+
const unanalyzed = await commit({ producer: pipeline }, analyzed.versionId)
|
|
717
|
+
expect(unanalyzed).toMatchObject({ outcome: "created" })
|
|
718
|
+
expect(
|
|
719
|
+
(await storage.getVersion(writeDataset.id, unanalyzed.versionId))?.lineage
|
|
720
|
+
).toBeUndefined()
|
|
721
|
+
|
|
722
|
+
// An empty append compares what it would store, after merging its parent's lineage.
|
|
723
|
+
const analyzedAgain = await commit(
|
|
724
|
+
{ producer: pipeline, lineage: copied },
|
|
725
|
+
unanalyzed.versionId
|
|
726
|
+
)
|
|
727
|
+
|
|
728
|
+
const append = { producer: pipeline, mode: "append" } as const
|
|
729
|
+
const narrower = { rows: [], columns: { ...copied.columns, customerName: [] } }
|
|
730
|
+
expect(
|
|
731
|
+
await commit({ ...append, lineage: narrower }, analyzedAgain.versionId, [])
|
|
732
|
+
).toMatchObject({ outcome: "unchanged", versionId: analyzedAgain.versionId })
|
|
733
|
+
|
|
734
|
+
const wider = { rows: [source("tenant")], columns: copied.columns }
|
|
735
|
+
const widened = await commit({ ...append, lineage: wider }, analyzedAgain.versionId, [])
|
|
736
|
+
expect(widened).toMatchObject({
|
|
737
|
+
outcome: "created",
|
|
738
|
+
lineage: { rows: [source("tenant")], columns: copied.columns },
|
|
739
|
+
})
|
|
740
|
+
}))
|
|
741
|
+
|
|
647
742
|
test("creates an initial empty append version", async () => {
|
|
648
743
|
await withStorage(async (storage) => {
|
|
649
744
|
await storage.createDataset(writeDataset)
|
|
@@ -939,6 +1034,156 @@ export function runLakeStorageContractSuite<TStorage extends LakeStorage>(
|
|
|
939
1034
|
})
|
|
940
1035
|
})
|
|
941
1036
|
})
|
|
1037
|
+
|
|
1038
|
+
describe("resolved column lineage", () => {
|
|
1039
|
+
test("stores the lineage of every version, in a canonical form, across reopening", async () => {
|
|
1040
|
+
let storage = await options.createStorage()
|
|
1041
|
+
try {
|
|
1042
|
+
// A provider that stores lineage says so: Sixb then reads a version without lineage as
|
|
1043
|
+
// one committed before the provider recorded it, not as one whose lineage was dropped.
|
|
1044
|
+
expect(storage.recordsLineage).toBe(true)
|
|
1045
|
+
|
|
1046
|
+
await storage.createDataset(writeDataset)
|
|
1047
|
+
const synced = await write(storage, { producer: { kind: "sync", id: "contract-sync" } }, [
|
|
1048
|
+
{ orderId: "ord_1", customerName: "Ada" },
|
|
1049
|
+
])
|
|
1050
|
+
|
|
1051
|
+
// Outside pipelines, a version depends on its own columns only.
|
|
1052
|
+
expect(synced.lineage).toEqual({ rows: [], columns: { customerName: [], orderId: [] } })
|
|
1053
|
+
|
|
1054
|
+
const repeated = {
|
|
1055
|
+
rows: [source("tenant"), source("tenant")],
|
|
1056
|
+
columns: {
|
|
1057
|
+
orderId: [source("id")],
|
|
1058
|
+
customerName: [source("name"), source("amount"), source("name")],
|
|
1059
|
+
dropped: [source("id")],
|
|
1060
|
+
},
|
|
1061
|
+
}
|
|
1062
|
+
const computed = await write(storage, { producer: pipeline, lineage: repeated }, [
|
|
1063
|
+
{ orderId: "ord_1", customerName: "Ada" },
|
|
1064
|
+
])
|
|
1065
|
+
|
|
1066
|
+
const canonical = {
|
|
1067
|
+
rows: [source("tenant")],
|
|
1068
|
+
columns: {
|
|
1069
|
+
customerName: [source("amount"), source("name")],
|
|
1070
|
+
orderId: [source("id")],
|
|
1071
|
+
},
|
|
1072
|
+
}
|
|
1073
|
+
expect(computed.lineage).toEqual(canonical)
|
|
1074
|
+
|
|
1075
|
+
if (options.reopen) storage = await options.reopen(storage)
|
|
1076
|
+
|
|
1077
|
+
expect((await storage.getVersion(writeDataset.id, computed.versionId))?.lineage).toEqual(
|
|
1078
|
+
canonical
|
|
1079
|
+
)
|
|
1080
|
+
expect((await storage.getLatestVersion(writeDataset.id))?.lineage).toEqual(canonical)
|
|
1081
|
+
|
|
1082
|
+
const listed = await storage.listVersions(writeDataset.id)
|
|
1083
|
+
expect(Object.fromEntries(listed.map((v) => [v.versionId, v.lineage]))).toEqual({
|
|
1084
|
+
[computed.versionId]: canonical,
|
|
1085
|
+
[synced.versionId]: synced.lineage,
|
|
1086
|
+
})
|
|
1087
|
+
} finally {
|
|
1088
|
+
await options.teardown?.(storage)
|
|
1089
|
+
}
|
|
1090
|
+
})
|
|
1091
|
+
|
|
1092
|
+
test("an append keeps its parent's lineage and a snapshot replaces it", () =>
|
|
1093
|
+
withStorage(async (storage) => {
|
|
1094
|
+
await storage.createDataset(writeDataset)
|
|
1095
|
+
await write(storage, { producer: pipeline, lineage: fromAmount }, [
|
|
1096
|
+
{ orderId: "ord_1", customerName: "120.00" },
|
|
1097
|
+
])
|
|
1098
|
+
|
|
1099
|
+
const appended = await write(
|
|
1100
|
+
storage,
|
|
1101
|
+
{ producer: pipeline, lineage: copied, mode: "append" },
|
|
1102
|
+
[{ orderId: "ord_2", customerName: "Grace" }]
|
|
1103
|
+
)
|
|
1104
|
+
|
|
1105
|
+
expect(appended.lineage).toEqual({
|
|
1106
|
+
rows: [],
|
|
1107
|
+
columns: {
|
|
1108
|
+
customerName: [source("amount"), source("name")],
|
|
1109
|
+
orderId: [source("id")],
|
|
1110
|
+
},
|
|
1111
|
+
})
|
|
1112
|
+
|
|
1113
|
+
const replaced = await write(storage, { producer: pipeline, lineage: copied }, [
|
|
1114
|
+
{ orderId: "ord_2", customerName: "Grace" },
|
|
1115
|
+
])
|
|
1116
|
+
expect(replaced.lineage).toEqual(copied)
|
|
1117
|
+
}))
|
|
1118
|
+
|
|
1119
|
+
test("a version that keeps rows of an unknown history records it as unknown", () =>
|
|
1120
|
+
withStorage(async (storage) => {
|
|
1121
|
+
await storage.createDataset(writeDataset)
|
|
1122
|
+
const unanalyzed = await write(storage, { producer: pipeline }, [
|
|
1123
|
+
{ orderId: "ord_1", customerName: "Ada" },
|
|
1124
|
+
])
|
|
1125
|
+
expect(unanalyzed.lineage).toBeUndefined()
|
|
1126
|
+
|
|
1127
|
+
const unknown = {
|
|
1128
|
+
unknown: `version '${unanalyzed.versionId}' of '${writeDataset.id}' recorded no column lineage`,
|
|
1129
|
+
}
|
|
1130
|
+
|
|
1131
|
+
const synced = await write(
|
|
1132
|
+
storage,
|
|
1133
|
+
{ producer: { kind: "sync", id: "contract-sync" }, mode: "append" },
|
|
1134
|
+
[{ orderId: "ord_2", customerName: "Grace" }]
|
|
1135
|
+
)
|
|
1136
|
+
expect(synced.lineage).toEqual(unknown)
|
|
1137
|
+
|
|
1138
|
+
// The reason keeps naming where the lineage was lost.
|
|
1139
|
+
const computed = await write(
|
|
1140
|
+
storage,
|
|
1141
|
+
{ producer: pipeline, lineage: copied, mode: "append" },
|
|
1142
|
+
[{ orderId: "ord_3", customerName: "Katherine" }]
|
|
1143
|
+
)
|
|
1144
|
+
|
|
1145
|
+
expect(computed.lineage).toEqual(unknown)
|
|
1146
|
+
expect((await storage.getVersion(writeDataset.id, computed.versionId))?.lineage).toEqual(
|
|
1147
|
+
unknown
|
|
1148
|
+
)
|
|
1149
|
+
|
|
1150
|
+
const replaced = await write(storage, { producer: pipeline, lineage: copied }, [
|
|
1151
|
+
{ orderId: "ord_3", customerName: "Katherine" },
|
|
1152
|
+
])
|
|
1153
|
+
expect(replaced.lineage).toEqual(copied)
|
|
1154
|
+
}))
|
|
1155
|
+
|
|
1156
|
+
test("a schema change keeps its parent's lineage", () =>
|
|
1157
|
+
withStorage(async (storage) => {
|
|
1158
|
+
if (schemaEvolution === "strict") return
|
|
1159
|
+
|
|
1160
|
+
const initial = defineDataset("contract.lineage.schema_evolution", {
|
|
1161
|
+
schema: [col("invoiceId", "string")],
|
|
1162
|
+
})
|
|
1163
|
+
const widened = defineDataset("contract.lineage.schema_evolution", {
|
|
1164
|
+
schema: [col("invoiceId", "string"), col("currency", "string", { nullable: true })],
|
|
1165
|
+
})
|
|
1166
|
+
|
|
1167
|
+
await storage.createDataset(initial)
|
|
1168
|
+
const session = await storage.beginWrite({
|
|
1169
|
+
dataset: initial,
|
|
1170
|
+
producer: pipeline,
|
|
1171
|
+
lineage: { rows: [source("tenant")], columns: { invoiceId: [source("id")] } },
|
|
1172
|
+
})
|
|
1173
|
+
await session.writeRows([{ invoiceId: "inv_1" }])
|
|
1174
|
+
await session.commit()
|
|
1175
|
+
|
|
1176
|
+
await storage.createDataset(widened)
|
|
1177
|
+
const [schemaVersion] = await storage.listVersions(initial.id, 1)
|
|
1178
|
+
expect(schemaVersion?.mode).toBe("schema")
|
|
1179
|
+
|
|
1180
|
+
// Its rows hold no currency yet.
|
|
1181
|
+
expect(schemaVersion?.lineage).toEqual({
|
|
1182
|
+
rows: [source("tenant")],
|
|
1183
|
+
columns: { currency: [], invoiceId: [source("id")] },
|
|
1184
|
+
})
|
|
1185
|
+
}))
|
|
1186
|
+
})
|
|
942
1187
|
})
|
|
943
1188
|
}
|
|
944
1189
|
|
|
@@ -2128,6 +2128,7 @@ function observeActionRunRecords(storage: ContractStorage) {
|
|
|
2128
2128
|
},
|
|
2129
2129
|
recordEffects: (input) => actionRuns.recordEffects(input),
|
|
2130
2130
|
getById: (input) => actionRuns.getById(input),
|
|
2131
|
+
getByExecutionIds: (input) => actionRuns.getByExecutionIds(input),
|
|
2131
2132
|
list: (input) => actionRuns.list(input),
|
|
2132
2133
|
}
|
|
2133
2134
|
return run(
|
|
@@ -721,6 +721,60 @@ export function runOntologyStorageContractSuite<TStorage extends OntologyStorage
|
|
|
721
721
|
})
|
|
722
722
|
})
|
|
723
723
|
|
|
724
|
+
test("lists the dataset version each active source applied, in one read", async () => {
|
|
725
|
+
await withStorage(async (storage) => {
|
|
726
|
+
expect(
|
|
727
|
+
await storage.ontology.sources.listActive({ projectId: "contract-project" })
|
|
728
|
+
).toEqual([])
|
|
729
|
+
|
|
730
|
+
const devices = await createReadyEmptyCandidate(storage, "run-a", "candidate-a", "01")
|
|
731
|
+
await activateEmptyCandidate(storage, devices, null, "commit-a", "2026-01-03T00:00:00.000Z")
|
|
732
|
+
|
|
733
|
+
const others = await createReadyEmptyCandidate(
|
|
734
|
+
storage,
|
|
735
|
+
"run-b",
|
|
736
|
+
"candidate-b",
|
|
737
|
+
"02",
|
|
738
|
+
"contract.others"
|
|
739
|
+
)
|
|
740
|
+
await activateEmptyCandidate(storage, others, null, "commit-b", "2026-01-04T00:00:00.000Z")
|
|
741
|
+
|
|
742
|
+
// A newer version supersedes the first one; a ready candidate is not active yet.
|
|
743
|
+
const newer = await createReadyEmptyCandidate(storage, "run-c", "candidate-c", "05")
|
|
744
|
+
const activeDevices = await storage.ontology.sources.getActive({
|
|
745
|
+
projectId: "contract-project",
|
|
746
|
+
source: devices.source,
|
|
747
|
+
})
|
|
748
|
+
await activateEmptyCandidate(
|
|
749
|
+
storage,
|
|
750
|
+
newer,
|
|
751
|
+
activeDevices,
|
|
752
|
+
"commit-c",
|
|
753
|
+
"2026-01-06T00:00:00.000Z"
|
|
754
|
+
)
|
|
755
|
+
await createReadyEmptyCandidate(storage, "run-d", "candidate-d", "07", "contract.pending")
|
|
756
|
+
|
|
757
|
+
const active = await storage.ontology.sources.listActive({ projectId: "contract-project" })
|
|
758
|
+
expect(
|
|
759
|
+
[...active].sort((a, b) => a.source.projectionId.localeCompare(b.source.projectionId))
|
|
760
|
+
).toEqual([
|
|
761
|
+
{
|
|
762
|
+
source: { projectionId: "contract.devices" },
|
|
763
|
+
datasetVersion: newer.identity.datasetVersion,
|
|
764
|
+
projectionRevision: "projection-contract-revision",
|
|
765
|
+
},
|
|
766
|
+
{
|
|
767
|
+
source: { projectionId: "contract.others" },
|
|
768
|
+
datasetVersion: others.identity.datasetVersion,
|
|
769
|
+
projectionRevision: "projection-contract-revision",
|
|
770
|
+
},
|
|
771
|
+
])
|
|
772
|
+
expect(await storage.ontology.sources.listActive({ projectId: "other-project" })).toEqual(
|
|
773
|
+
[]
|
|
774
|
+
)
|
|
775
|
+
})
|
|
776
|
+
})
|
|
777
|
+
|
|
724
778
|
test("rolls back exact rows, commits, and outbox writes through one transaction facade", async () => {
|
|
725
779
|
await withStorage(async (storage) => {
|
|
726
780
|
await expect(
|
|
@@ -1025,9 +1079,10 @@ async function createReadyEmptyCandidate(
|
|
|
1025
1079
|
storage: OntologyStorageContractStorage,
|
|
1026
1080
|
runId: string,
|
|
1027
1081
|
materializationId: string,
|
|
1028
|
-
versionId: string
|
|
1082
|
+
versionId: string,
|
|
1083
|
+
projectionId?: string
|
|
1029
1084
|
): Promise<ReadyCandidate> {
|
|
1030
|
-
const identity = replacementIdentity(versionId)
|
|
1085
|
+
const identity = replacementIdentity(versionId, projectionId)
|
|
1031
1086
|
const run = await startTestProjectionRun(storage, {
|
|
1032
1087
|
id: runId,
|
|
1033
1088
|
projectId: "contract-project",
|
|
@@ -80,6 +80,21 @@ export function runShareGrantStorageContractSuite<TStorage extends ShareGrantSto
|
|
|
80
80
|
})
|
|
81
81
|
})
|
|
82
82
|
|
|
83
|
+
test("reads several grants at once, in the order asked", async () => {
|
|
84
|
+
await withStorage(async (storage) => {
|
|
85
|
+
const first = await storage.create(grantInput())
|
|
86
|
+
const second = await storage.create(
|
|
87
|
+
grantInput({ id: "shr_2", tokenHash: "b".repeat(64), definitionId: "invoice" })
|
|
88
|
+
)
|
|
89
|
+
await storage.create(grantInput({ id: "shr_3", projectId: "other-project" }))
|
|
90
|
+
|
|
91
|
+
await expect(
|
|
92
|
+
storage.getByIds({ projectId, ids: ["shr_2", "missing", "shr_1", "shr_2", "shr_3"] })
|
|
93
|
+
).resolves.toEqual([second, first])
|
|
94
|
+
await expect(storage.getByIds({ projectId, ids: [] })).resolves.toEqual([])
|
|
95
|
+
})
|
|
96
|
+
})
|
|
97
|
+
|
|
83
98
|
test("lists a bounded deterministic page with total and hasMore", async () => {
|
|
84
99
|
await withStorage(async (storage) => {
|
|
85
100
|
await storage.create(grantInput({ id: "shr_a", tokenHash: "b".repeat(64) }))
|
|
@@ -3,6 +3,7 @@ import { isActionDefinition } from "../actions"
|
|
|
3
3
|
import { AGENT_REASONING_LEVELS, isAgentToolDefinition } from "../agents"
|
|
4
4
|
import { isModelReasoning } from "../models/language-model"
|
|
5
5
|
import type { SchemaOrRef } from "../ontology"
|
|
6
|
+
import type { SandboxFactory } from "../sandboxes"
|
|
6
7
|
import type { ScheduleDefinition, ScheduleDefinitionForEvent } from "../schedules"
|
|
7
8
|
import { isScheduleDefinition } from "../schedules"
|
|
8
9
|
import { isGroupDefinition } from "../security"
|
|
@@ -25,6 +26,7 @@ import type {
|
|
|
25
26
|
WorkflowTriggerDefinition,
|
|
26
27
|
} from "./types"
|
|
27
28
|
import {
|
|
29
|
+
assertAgentStepSandbox,
|
|
28
30
|
assertNonEmpty,
|
|
29
31
|
isAgentStepDefinition,
|
|
30
32
|
isInterventionDefinition,
|
|
@@ -137,6 +139,7 @@ export function defineAgentStep<const TId extends string>(
|
|
|
137
139
|
const groupIds = groupIdsFromAgentStepConfig(id, config)
|
|
138
140
|
const toolNames = toolNamesFromAgentStepConfig(id, config)
|
|
139
141
|
const skillNames = skillNamesFromAgentStepConfig(id, config)
|
|
142
|
+
const sandbox = sandboxFromAgentStepConfig(id, config)
|
|
140
143
|
|
|
141
144
|
return {
|
|
142
145
|
input(input: RuntimeWorkflowInput): unknown {
|
|
@@ -156,6 +159,7 @@ export function defineAgentStep<const TId extends string>(
|
|
|
156
159
|
groupIds,
|
|
157
160
|
toolNames,
|
|
158
161
|
skillNames,
|
|
162
|
+
...(sandbox === undefined ? {} : { sandbox }),
|
|
159
163
|
input,
|
|
160
164
|
output,
|
|
161
165
|
prompt,
|
|
@@ -231,6 +235,16 @@ function skillNamesFromAgentStepConfig(
|
|
|
231
235
|
return Object.freeze(skillNames)
|
|
232
236
|
}
|
|
233
237
|
|
|
238
|
+
function sandboxFromAgentStepConfig(
|
|
239
|
+
stepId: string,
|
|
240
|
+
config: DefineAgentStepConfig
|
|
241
|
+
): SandboxFactory | undefined {
|
|
242
|
+
if (config.sandbox === undefined) return undefined
|
|
243
|
+
|
|
244
|
+
assertAgentStepSandbox(config.sandbox, `Agent step "${stepId}"`)
|
|
245
|
+
return config.sandbox
|
|
246
|
+
}
|
|
247
|
+
|
|
234
248
|
function assertUniqueAgentStepValues(
|
|
235
249
|
stepId: string,
|
|
236
250
|
kind: "group" | "tool" | "skill",
|