@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
|
@@ -565,6 +565,20 @@ export function runAgentStorageContractSuite<TStorage extends AgentStorageContra
|
|
|
565
565
|
})
|
|
566
566
|
})
|
|
567
567
|
|
|
568
|
+
test("reads several threads at once, in the order asked", async () => {
|
|
569
|
+
await withStorage(async (storage) => {
|
|
570
|
+
const first = await storage.threads.create(threadInput())
|
|
571
|
+
const second = await storage.threads.create(threadInput({ id: "thr_2" }))
|
|
572
|
+
await storage.threads.create(threadInput({ id: "thr_3", projectId: otherProjectId }))
|
|
573
|
+
|
|
574
|
+
await expect(
|
|
575
|
+
storage.threads.getByIds({ projectId, ids: ["thr_2", "missing", "thr_1", "thr_2"] })
|
|
576
|
+
).resolves.toEqual([second, first])
|
|
577
|
+
await expect(storage.threads.getByIds({ projectId, ids: ["thr_3"] })).resolves.toEqual([])
|
|
578
|
+
await expect(storage.threads.getByIds({ projectId, ids: [] })).resolves.toEqual([])
|
|
579
|
+
})
|
|
580
|
+
})
|
|
581
|
+
|
|
568
582
|
test("lists threads with filters, ordering, and pagination", async () => {
|
|
569
583
|
await withStorage(async (storage) => {
|
|
570
584
|
await storage.threads.create(
|
|
@@ -861,23 +875,12 @@ export function runAgentStorageContractSuite<TStorage extends AgentStorageContra
|
|
|
861
875
|
id: "child_1",
|
|
862
876
|
executionToken: "child_token",
|
|
863
877
|
status: "succeeded",
|
|
864
|
-
result: {},
|
|
878
|
+
result: { text: " " },
|
|
865
879
|
}),
|
|
866
880
|
"invalid_input"
|
|
867
881
|
)
|
|
868
882
|
|
|
869
|
-
const result = {
|
|
870
|
-
text: "Three open orders.",
|
|
871
|
-
files: [
|
|
872
|
-
{
|
|
873
|
-
blobId: `blob_${"a".repeat(64)}`,
|
|
874
|
-
digest: `sha256:${"a".repeat(64)}` as const,
|
|
875
|
-
fileName: "orders.csv",
|
|
876
|
-
mediaType: "text/csv",
|
|
877
|
-
sizeBytes: 42,
|
|
878
|
-
},
|
|
879
|
-
],
|
|
880
|
-
}
|
|
883
|
+
const result = { text: "Three open orders." }
|
|
881
884
|
const completed = await storage.runs.finish({
|
|
882
885
|
projectId,
|
|
883
886
|
id: "child_1",
|
|
@@ -1087,11 +1090,10 @@ export function runAgentStorageContractSuite<TStorage extends AgentStorageContra
|
|
|
1087
1090
|
finishReason: "stop",
|
|
1088
1091
|
diagnostics: [
|
|
1089
1092
|
{
|
|
1090
|
-
code: "
|
|
1093
|
+
code: "step_limit_reached",
|
|
1091
1094
|
severity: "warning",
|
|
1092
|
-
scope: "
|
|
1093
|
-
|
|
1094
|
-
message: "This generated file was skipped.",
|
|
1095
|
+
scope: "run",
|
|
1096
|
+
message: "The Agent reached its 100-step limit before producing a final answer.",
|
|
1095
1097
|
},
|
|
1096
1098
|
],
|
|
1097
1099
|
completedAt: at("2026-06-23T10:07:00.000Z"),
|
|
@@ -1103,11 +1105,10 @@ export function runAgentStorageContractSuite<TStorage extends AgentStorageContra
|
|
|
1103
1105
|
})
|
|
1104
1106
|
expect(finished.diagnostics).toEqual([
|
|
1105
1107
|
{
|
|
1106
|
-
code: "
|
|
1108
|
+
code: "step_limit_reached",
|
|
1107
1109
|
severity: "warning",
|
|
1108
|
-
scope: "
|
|
1109
|
-
|
|
1110
|
-
message: "This generated file was skipped.",
|
|
1110
|
+
scope: "run",
|
|
1111
|
+
message: "The Agent reached its 100-step limit before producing a final answer.",
|
|
1111
1112
|
},
|
|
1112
1113
|
])
|
|
1113
1114
|
await expect(
|
|
@@ -0,0 +1,517 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test"
|
|
2
|
+
import type { Principal } from "../auth"
|
|
3
|
+
import type { FileRef } from "../blob-storage"
|
|
4
|
+
import {
|
|
5
|
+
type ArtifactFrameGrantRecord,
|
|
6
|
+
type ArtifactStorage,
|
|
7
|
+
ArtifactStorageError,
|
|
8
|
+
type ArtifactStorageErrorCode,
|
|
9
|
+
type ArtifactVersionInput,
|
|
10
|
+
type CreateArtifactInput,
|
|
11
|
+
} from "../storage/artifacts"
|
|
12
|
+
import type { Storage } from "../storage/types"
|
|
13
|
+
|
|
14
|
+
export interface ArtifactStorageContractStorage extends Pick<Storage, "transaction"> {
|
|
15
|
+
readonly artifacts: ArtifactStorage
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface ArtifactStorageContractSuiteOptions<
|
|
19
|
+
TStorage extends ArtifactStorageContractStorage = ArtifactStorageContractStorage,
|
|
20
|
+
> {
|
|
21
|
+
/** Returns a fresh, empty storage bundle for every test. */
|
|
22
|
+
readonly createStorage: () => TStorage | Promise<TStorage>
|
|
23
|
+
readonly teardown?: (storage: TStorage) => void | Promise<void>
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const projectId = "artifact-contract"
|
|
27
|
+
const otherProjectId = "artifact-contract-other"
|
|
28
|
+
const owner: Principal = { type: "user", id: "usr_owner" }
|
|
29
|
+
const otherOwner: Principal = { type: "user", id: "usr_other" }
|
|
30
|
+
const agentRun = { threadId: "thr_1", runId: "run_1" }
|
|
31
|
+
const t0 = new Date("2026-10-17T10:00:00.000Z")
|
|
32
|
+
const minute = 60 * 1000
|
|
33
|
+
|
|
34
|
+
/** Provider-neutral persistence contract for artifacts and their versions. */
|
|
35
|
+
export function runArtifactStorageContractSuite<TStorage extends ArtifactStorageContractStorage>(
|
|
36
|
+
label: string,
|
|
37
|
+
options: ArtifactStorageContractSuiteOptions<TStorage>
|
|
38
|
+
): void {
|
|
39
|
+
const withStorage = async (
|
|
40
|
+
run: (artifacts: ArtifactStorage, storage: TStorage) => Promise<void>
|
|
41
|
+
): Promise<void> => {
|
|
42
|
+
const storage = await options.createStorage()
|
|
43
|
+
try {
|
|
44
|
+
await run(storage.artifacts, storage)
|
|
45
|
+
} finally {
|
|
46
|
+
await options.teardown?.(storage)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
describe(label, () => {
|
|
51
|
+
test("creates an artifact with its first version and reads both back", async () => {
|
|
52
|
+
await withStorage(async (artifacts) => {
|
|
53
|
+
const created = await artifacts.create(createInput())
|
|
54
|
+
|
|
55
|
+
expect(created.artifact).toEqual({
|
|
56
|
+
projectId,
|
|
57
|
+
id: "art_report",
|
|
58
|
+
kind: "document",
|
|
59
|
+
title: "Q3 report",
|
|
60
|
+
owner,
|
|
61
|
+
latestVersion: 1,
|
|
62
|
+
createdAt: t0,
|
|
63
|
+
updatedAt: t0,
|
|
64
|
+
})
|
|
65
|
+
expect(created.version).toEqual({
|
|
66
|
+
projectId,
|
|
67
|
+
artifactId: "art_report",
|
|
68
|
+
version: 1,
|
|
69
|
+
...versionInput(),
|
|
70
|
+
})
|
|
71
|
+
expect(await artifacts.get({ projectId, id: "art_report" })).toEqual(created.artifact)
|
|
72
|
+
expect(
|
|
73
|
+
await artifacts.getVersion({ projectId, artifactId: "art_report", version: 1 })
|
|
74
|
+
).toEqual(created.version)
|
|
75
|
+
})
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
test("rejects a second artifact with the same id in the same project", async () => {
|
|
79
|
+
await withStorage(async (artifacts) => {
|
|
80
|
+
await artifacts.create(createInput())
|
|
81
|
+
|
|
82
|
+
await expectArtifactError(artifacts.create(createInput()), "artifact_exists")
|
|
83
|
+
await artifacts.create(createInput({ projectId: otherProjectId }))
|
|
84
|
+
})
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
test("numbers versions in order and makes the newest the latest", async () => {
|
|
88
|
+
await withStorage(async (artifacts) => {
|
|
89
|
+
await artifacts.create(createInput())
|
|
90
|
+
const second = await artifacts.publish(
|
|
91
|
+
publishInput({ title: "Q3 report, revised", createdAt: at(1) })
|
|
92
|
+
)
|
|
93
|
+
const third = await artifacts.publish(publishInput({ createdAt: at(2) }))
|
|
94
|
+
|
|
95
|
+
expect(second.version.version).toBe(2)
|
|
96
|
+
expect(third.version.version).toBe(3)
|
|
97
|
+
expect(third.artifact).toMatchObject({ latestVersion: 3, updatedAt: at(2), createdAt: t0 })
|
|
98
|
+
expect(second.artifact.title).toBe("Q3 report, revised")
|
|
99
|
+
expect((await artifacts.get({ projectId, id: "art_report" }))?.title).toBe("Q3 report")
|
|
100
|
+
})
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
test("keeps the kind fixed and refuses versions for a missing artifact", async () => {
|
|
104
|
+
await withStorage(async (artifacts) => {
|
|
105
|
+
await artifacts.create(createInput())
|
|
106
|
+
|
|
107
|
+
await expectArtifactError(
|
|
108
|
+
artifacts.publish({ ...publishInput(), kind: "slides" }),
|
|
109
|
+
"artifact_kind_mismatch"
|
|
110
|
+
)
|
|
111
|
+
await expectArtifactError(
|
|
112
|
+
artifacts.publish({ ...publishInput(), artifactId: "art_missing" }),
|
|
113
|
+
"artifact_not_found"
|
|
114
|
+
)
|
|
115
|
+
await expectArtifactError(
|
|
116
|
+
artifacts.publish({ ...publishInput(), projectId: otherProjectId }),
|
|
117
|
+
"artifact_not_found"
|
|
118
|
+
)
|
|
119
|
+
expect((await artifacts.get({ projectId, id: "art_report" }))?.latestVersion).toBe(1)
|
|
120
|
+
})
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
test("stores a version's files, outline, references, and origin exactly", async () => {
|
|
124
|
+
await withStorage(async (artifacts) => {
|
|
125
|
+
const version = versionInput({
|
|
126
|
+
entry: "index.html",
|
|
127
|
+
files: [
|
|
128
|
+
{ path: "index.html", file: fileRef("a", "text/html") },
|
|
129
|
+
{ path: "img/fleet one.jpg", file: fileRef("b", "image/jpeg") },
|
|
130
|
+
],
|
|
131
|
+
outline: { kind: "slides", slides: [{ title: "Q3 review" }, {}] },
|
|
132
|
+
references: [
|
|
133
|
+
{
|
|
134
|
+
address: "artifact:art_numbers#chart=revenue",
|
|
135
|
+
as: "embed",
|
|
136
|
+
at: "3",
|
|
137
|
+
resolvedVersion: 2,
|
|
138
|
+
},
|
|
139
|
+
{ address: "artifact:art_report#methodology", as: "link", at: "5", resolvedVersion: 1 },
|
|
140
|
+
],
|
|
141
|
+
origin: undefined,
|
|
142
|
+
})
|
|
143
|
+
const created = await artifacts.create(createInput({ kind: "slides", version }))
|
|
144
|
+
|
|
145
|
+
expect(created.version).not.toHaveProperty("origin")
|
|
146
|
+
expect(
|
|
147
|
+
await artifacts.getVersion({ projectId, artifactId: "art_report", version: 1 })
|
|
148
|
+
).toEqual({ projectId, artifactId: "art_report", version: 1, ...version })
|
|
149
|
+
})
|
|
150
|
+
})
|
|
151
|
+
|
|
152
|
+
test("lists the latest versions that refer to an artifact, at any version, file, or part", async () => {
|
|
153
|
+
await withStorage(async (artifacts) => {
|
|
154
|
+
const refer = (address: string) => ({
|
|
155
|
+
address,
|
|
156
|
+
as: "embed" as const,
|
|
157
|
+
at: "",
|
|
158
|
+
resolvedVersion: 1,
|
|
159
|
+
})
|
|
160
|
+
const create = (id: string, addresses: string[], project = projectId) =>
|
|
161
|
+
artifacts.create(
|
|
162
|
+
createInput({
|
|
163
|
+
projectId: project,
|
|
164
|
+
id,
|
|
165
|
+
version: versionInput({ references: addresses.map(refer) }),
|
|
166
|
+
})
|
|
167
|
+
)
|
|
168
|
+
await create("art_numbers", [])
|
|
169
|
+
await create("art_whole", ["artifact:art_numbers"])
|
|
170
|
+
await create("art_pinned", ["artifact:art_numbers@1/figures/a.svg"])
|
|
171
|
+
await create("art_chart", ["artifact:art_numbers#chart=revenue"])
|
|
172
|
+
// A longer id that starts with the same letters is another artifact.
|
|
173
|
+
await create("art_longer", ["artifact:art_numbersx#chart=revenue"])
|
|
174
|
+
await create("art_elsewhere", ["artifact:art_numbers"], otherProjectId)
|
|
175
|
+
// Only the latest version counts: this one dropped its reference.
|
|
176
|
+
await create("art_dropped", ["artifact:art_numbers#Summary"])
|
|
177
|
+
await artifacts.publish(publishInput({ createdAt: at(1) }, "art_dropped"))
|
|
178
|
+
|
|
179
|
+
const referencing = await artifacts.listReferencingVersions({
|
|
180
|
+
projectId,
|
|
181
|
+
artifactId: "art_numbers",
|
|
182
|
+
})
|
|
183
|
+
// In artifact id order, whatever order they were published in. To see this fail, drop the
|
|
184
|
+
// sort in `InMemoryArtifactStorage.listReferencingVersions`.
|
|
185
|
+
expect(referencing.map((version) => version.artifactId)).toEqual([
|
|
186
|
+
"art_chart",
|
|
187
|
+
"art_pinned",
|
|
188
|
+
"art_whole",
|
|
189
|
+
])
|
|
190
|
+
expect(
|
|
191
|
+
referencing.find((version) => version.artifactId === "art_chart")?.references
|
|
192
|
+
).toEqual([refer("artifact:art_numbers#chart=revenue")])
|
|
193
|
+
})
|
|
194
|
+
})
|
|
195
|
+
|
|
196
|
+
test("stores frame grants by token hash, expires them in batches, and drops them with the artifact", async () => {
|
|
197
|
+
await withStorage(async (artifacts) => {
|
|
198
|
+
await artifacts.create(createInput())
|
|
199
|
+
const grant = (seed: string, expiresInMinutes: number) =>
|
|
200
|
+
frameGrant(seed, { expiresAt: at(expiresInMinutes) })
|
|
201
|
+
await artifacts.createFrameGrant(grant("a", 60))
|
|
202
|
+
await artifacts.createFrameGrant(grant("b", 5))
|
|
203
|
+
await artifacts.createFrameGrant(grant("c", 10))
|
|
204
|
+
|
|
205
|
+
expect(await artifacts.findFrameGrant({ projectId, tokenHash: "a".repeat(64) })).toEqual(
|
|
206
|
+
grant("a", 60)
|
|
207
|
+
)
|
|
208
|
+
expect(
|
|
209
|
+
await artifacts.findFrameGrant({ projectId: otherProjectId, tokenHash: "a".repeat(64) })
|
|
210
|
+
).toBeNull()
|
|
211
|
+
await expectArtifactError(
|
|
212
|
+
artifacts.createFrameGrant({ ...grant("d", 60), artifactId: "art_missing" }),
|
|
213
|
+
"artifact_not_found"
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
// Expired before minute 30: b and c, one at a time.
|
|
217
|
+
const expiredBefore = at(30)
|
|
218
|
+
expect(
|
|
219
|
+
await artifacts.deleteExpiredFrameGrants({ projectId, expiredBefore, limit: 1 })
|
|
220
|
+
).toBe(1)
|
|
221
|
+
expect(
|
|
222
|
+
await artifacts.deleteExpiredFrameGrants({ projectId, expiredBefore, limit: 10 })
|
|
223
|
+
).toBe(1)
|
|
224
|
+
expect(await artifacts.findFrameGrant({ projectId, tokenHash: "b".repeat(64) })).toBeNull()
|
|
225
|
+
expect(
|
|
226
|
+
await artifacts.findFrameGrant({ projectId, tokenHash: "a".repeat(64) })
|
|
227
|
+
).not.toBeNull()
|
|
228
|
+
|
|
229
|
+
await artifacts.delete({ projectId, id: "art_report" })
|
|
230
|
+
expect(await artifacts.findFrameGrant({ projectId, tokenHash: "a".repeat(64) })).toBeNull()
|
|
231
|
+
})
|
|
232
|
+
})
|
|
233
|
+
|
|
234
|
+
test("lists the latest of each artifact, most recently updated first", async () => {
|
|
235
|
+
await withStorage(async (artifacts) => {
|
|
236
|
+
await artifacts.create(createInput({ id: "art_a" }))
|
|
237
|
+
await artifacts.create(
|
|
238
|
+
createInput({ id: "art_b", version: versionInput({ createdAt: at(1) }) })
|
|
239
|
+
)
|
|
240
|
+
await artifacts.create(
|
|
241
|
+
createInput({ id: "art_c", version: versionInput({ createdAt: at(2) }) })
|
|
242
|
+
)
|
|
243
|
+
await artifacts.publish(publishInput({ createdAt: at(3) }, "art_a"))
|
|
244
|
+
|
|
245
|
+
const all = await artifacts.list({ projectId })
|
|
246
|
+
expect(all.artifacts.map((artifact) => artifact.id)).toEqual(["art_a", "art_c", "art_b"])
|
|
247
|
+
expect(all).toMatchObject({ total: 3, hasMore: false })
|
|
248
|
+
|
|
249
|
+
const page = await artifacts.list({ projectId, limit: 2, offset: 1 })
|
|
250
|
+
expect(page.artifacts.map((artifact) => artifact.id)).toEqual(["art_c", "art_b"])
|
|
251
|
+
expect(page).toMatchObject({ total: 3, hasMore: false })
|
|
252
|
+
expect((await artifacts.list({ projectId, limit: 1 })).hasMore).toBe(true)
|
|
253
|
+
})
|
|
254
|
+
})
|
|
255
|
+
|
|
256
|
+
test("lists one kind, counting only that kind", async () => {
|
|
257
|
+
await withStorage(async (artifacts) => {
|
|
258
|
+
await artifacts.create(createInput({ id: "art_doc" }))
|
|
259
|
+
await artifacts.create(createInput({ id: "art_deck_a", kind: "slides" }))
|
|
260
|
+
await artifacts.create(
|
|
261
|
+
createInput({
|
|
262
|
+
id: "art_deck_b",
|
|
263
|
+
kind: "slides",
|
|
264
|
+
version: versionInput({ createdAt: at(1) }),
|
|
265
|
+
})
|
|
266
|
+
)
|
|
267
|
+
const decks = await artifacts.list({ projectId, kind: "slides", limit: 1 })
|
|
268
|
+
expect(decks.artifacts.map((artifact) => artifact.id)).toEqual(["art_deck_b"])
|
|
269
|
+
expect(decks).toMatchObject({ total: 2, hasMore: true })
|
|
270
|
+
expect((await artifacts.list({ projectId, kind: "sheet" })).total).toBe(0)
|
|
271
|
+
})
|
|
272
|
+
})
|
|
273
|
+
|
|
274
|
+
test("lists by owner, by the thread a version came from, and only within the project", async () => {
|
|
275
|
+
await withStorage(async (artifacts) => {
|
|
276
|
+
await artifacts.create(createInput({ id: "art_mine" }))
|
|
277
|
+
await artifacts.create(
|
|
278
|
+
createInput({
|
|
279
|
+
id: "art_theirs",
|
|
280
|
+
owner: otherOwner,
|
|
281
|
+
version: versionInput({
|
|
282
|
+
author: otherOwner,
|
|
283
|
+
origin: { threadId: "thr_2", runId: "run_2" },
|
|
284
|
+
}),
|
|
285
|
+
})
|
|
286
|
+
)
|
|
287
|
+
await artifacts.create(
|
|
288
|
+
createInput({ id: "art_api", version: versionInput({ origin: undefined }) })
|
|
289
|
+
)
|
|
290
|
+
await artifacts.publish(
|
|
291
|
+
publishInput(
|
|
292
|
+
{ origin: { threadId: "thr_3", runId: "run_3" }, createdAt: at(1) },
|
|
293
|
+
"art_api"
|
|
294
|
+
)
|
|
295
|
+
)
|
|
296
|
+
await artifacts.create(createInput({ projectId: otherProjectId, id: "art_elsewhere" }))
|
|
297
|
+
|
|
298
|
+
const ids = async (input: Parameters<ArtifactStorage["list"]>[0]) =>
|
|
299
|
+
(await artifacts.list(input)).artifacts.map((artifact) => artifact.id).sort()
|
|
300
|
+
|
|
301
|
+
expect(await ids({ projectId, owner })).toEqual(["art_api", "art_mine"])
|
|
302
|
+
expect(await ids({ projectId, owner: otherOwner })).toEqual(["art_theirs"])
|
|
303
|
+
expect(await ids({ projectId, originThreadId: "thr_1" })).toEqual(["art_mine"])
|
|
304
|
+
expect(await ids({ projectId, originThreadId: "thr_3" })).toEqual(["art_api"])
|
|
305
|
+
expect(await ids({ projectId, owner, originThreadId: "thr_2" })).toEqual([])
|
|
306
|
+
expect(await ids({ projectId: otherProjectId })).toEqual(["art_elsewhere"])
|
|
307
|
+
})
|
|
308
|
+
})
|
|
309
|
+
|
|
310
|
+
test("lists versions newest first, a page at a time", async () => {
|
|
311
|
+
await withStorage(async (artifacts) => {
|
|
312
|
+
await artifacts.create(createInput())
|
|
313
|
+
await artifacts.publish(publishInput({ createdAt: at(1) }))
|
|
314
|
+
await artifacts.publish(publishInput({ createdAt: at(2) }))
|
|
315
|
+
|
|
316
|
+
const all = await artifacts.listVersions({ projectId, artifactId: "art_report" })
|
|
317
|
+
expect(all.versions.map((version) => version.version)).toEqual([3, 2, 1])
|
|
318
|
+
expect(all).toMatchObject({ total: 3, hasMore: false })
|
|
319
|
+
|
|
320
|
+
const page = await artifacts.listVersions({
|
|
321
|
+
projectId,
|
|
322
|
+
artifactId: "art_report",
|
|
323
|
+
limit: 1,
|
|
324
|
+
offset: 1,
|
|
325
|
+
})
|
|
326
|
+
expect(page.versions.map((version) => version.version)).toEqual([2])
|
|
327
|
+
expect(page).toMatchObject({ total: 3, hasMore: true })
|
|
328
|
+
expect(await artifacts.listVersions({ projectId, artifactId: "art_missing" })).toEqual({
|
|
329
|
+
versions: [],
|
|
330
|
+
hasMore: false,
|
|
331
|
+
total: 0,
|
|
332
|
+
})
|
|
333
|
+
})
|
|
334
|
+
})
|
|
335
|
+
|
|
336
|
+
test("deletes an artifact with every version", async () => {
|
|
337
|
+
await withStorage(async (artifacts) => {
|
|
338
|
+
await artifacts.create(createInput())
|
|
339
|
+
await artifacts.publish(publishInput({ createdAt: at(1) }))
|
|
340
|
+
|
|
341
|
+
expect(await artifacts.delete({ projectId: otherProjectId, id: "art_report" })).toBe(false)
|
|
342
|
+
expect(await artifacts.delete({ projectId, id: "art_report" })).toBe(true)
|
|
343
|
+
expect(await artifacts.get({ projectId, id: "art_report" })).toBeNull()
|
|
344
|
+
expect(
|
|
345
|
+
await artifacts.getVersion({ projectId, artifactId: "art_report", version: 1 })
|
|
346
|
+
).toBeNull()
|
|
347
|
+
expect(await artifacts.delete({ projectId, id: "art_report" })).toBe(false)
|
|
348
|
+
|
|
349
|
+
// The id is free again, and numbering starts over for the new artifact.
|
|
350
|
+
expect((await artifacts.create(createInput())).version.version).toBe(1)
|
|
351
|
+
})
|
|
352
|
+
})
|
|
353
|
+
|
|
354
|
+
test("deletes a run's versions, repoints latest, and never reuses a number", async () => {
|
|
355
|
+
await withStorage(async (artifacts) => {
|
|
356
|
+
await artifacts.create(
|
|
357
|
+
createInput({ version: versionInput({ origin: { threadId: "thr_1", runId: "run_0" } }) })
|
|
358
|
+
)
|
|
359
|
+
await artifacts.publish(
|
|
360
|
+
publishInput({
|
|
361
|
+
title: "Kept",
|
|
362
|
+
createdAt: at(1),
|
|
363
|
+
origin: { threadId: "thr_1", runId: "run_0" },
|
|
364
|
+
})
|
|
365
|
+
)
|
|
366
|
+
await artifacts.publish(publishInput({ title: "Retried", createdAt: at(2) }))
|
|
367
|
+
await artifacts.create(
|
|
368
|
+
createInput({ id: "art_new_in_run", version: versionInput({ createdAt: at(2) }) })
|
|
369
|
+
)
|
|
370
|
+
await artifacts.create(
|
|
371
|
+
createInput({
|
|
372
|
+
id: "art_other_run",
|
|
373
|
+
version: versionInput({ origin: { threadId: "thr_1", runId: "run_9" } }),
|
|
374
|
+
})
|
|
375
|
+
)
|
|
376
|
+
await artifacts.createFrameGrant(frameGrant("a"))
|
|
377
|
+
await artifacts.createFrameGrant(frameGrant("b", { artifactId: "art_new_in_run" }))
|
|
378
|
+
|
|
379
|
+
expect(
|
|
380
|
+
await artifacts.deleteVersionsByOrigin({ projectId: otherProjectId, runId: "run_1" })
|
|
381
|
+
).toBe(0)
|
|
382
|
+
expect(await artifacts.deleteVersionsByOrigin({ projectId, runId: "run_1" })).toBe(2)
|
|
383
|
+
|
|
384
|
+
expect(await artifacts.get({ projectId, id: "art_report" })).toMatchObject({
|
|
385
|
+
title: "Kept",
|
|
386
|
+
latestVersion: 2,
|
|
387
|
+
updatedAt: at(1),
|
|
388
|
+
})
|
|
389
|
+
expect(
|
|
390
|
+
await artifacts.getVersion({ projectId, artifactId: "art_report", version: 3 })
|
|
391
|
+
).toBeNull()
|
|
392
|
+
expect(await artifacts.get({ projectId, id: "art_new_in_run" })).toBeNull()
|
|
393
|
+
expect(await artifacts.get({ projectId, id: "art_other_run" })).not.toBeNull()
|
|
394
|
+
// A deleted artifact's frame grants go with it; a kept one's stay. To see this fail, delete
|
|
395
|
+
// the artifact from the map alone in `InMemoryArtifactStorage.deleteVersionsByOrigin`.
|
|
396
|
+
expect(await artifacts.findFrameGrant({ projectId, tokenHash: "b".repeat(64) })).toBeNull()
|
|
397
|
+
expect(
|
|
398
|
+
await artifacts.findFrameGrant({ projectId, tokenHash: "a".repeat(64) })
|
|
399
|
+
).not.toBeNull()
|
|
400
|
+
|
|
401
|
+
// Version 3 belonged to the retried run; the next one is 4, so an address pinned to @3
|
|
402
|
+
// can never land on different content.
|
|
403
|
+
expect((await artifacts.publish(publishInput({ createdAt: at(3) }))).version.version).toBe(
|
|
404
|
+
4
|
|
405
|
+
)
|
|
406
|
+
})
|
|
407
|
+
})
|
|
408
|
+
|
|
409
|
+
test("rolls back with its containing storage transaction", async () => {
|
|
410
|
+
await withStorage(async (artifacts, storage) => {
|
|
411
|
+
await artifacts.create(createInput())
|
|
412
|
+
const rollback = new Error("rollback artifact publish")
|
|
413
|
+
|
|
414
|
+
await expect(
|
|
415
|
+
storage.transaction(async (tx) => {
|
|
416
|
+
if (!tx.artifacts) throw new Error("Expected artifact storage in the transaction.")
|
|
417
|
+
await tx.artifacts.publish(publishInput({ createdAt: at(1) }))
|
|
418
|
+
await tx.artifacts.create(createInput({ id: "art_rolled_back" }))
|
|
419
|
+
await tx.artifacts.createFrameGrant(frameGrant("a"))
|
|
420
|
+
expect((await tx.artifacts.get({ projectId, id: "art_report" }))?.latestVersion).toBe(2)
|
|
421
|
+
throw rollback
|
|
422
|
+
})
|
|
423
|
+
).rejects.toBe(rollback)
|
|
424
|
+
|
|
425
|
+
expect((await artifacts.get({ projectId, id: "art_report" }))?.latestVersion).toBe(1)
|
|
426
|
+
expect(await artifacts.get({ projectId, id: "art_rolled_back" })).toBeNull()
|
|
427
|
+
// To see this fail, leave frame grants out of `InMemoryArtifactStorage.restore`.
|
|
428
|
+
expect(await artifacts.findFrameGrant({ projectId, tokenHash: "a".repeat(64) })).toBeNull()
|
|
429
|
+
expect((await artifacts.publish(publishInput({ createdAt: at(2) }))).version.version).toBe(
|
|
430
|
+
2
|
|
431
|
+
)
|
|
432
|
+
})
|
|
433
|
+
})
|
|
434
|
+
})
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
async function expectArtifactError(
|
|
438
|
+
promise: Promise<unknown>,
|
|
439
|
+
code: ArtifactStorageErrorCode
|
|
440
|
+
): Promise<void> {
|
|
441
|
+
const error = await promise.then(
|
|
442
|
+
() => null,
|
|
443
|
+
(caught: unknown) => caught
|
|
444
|
+
)
|
|
445
|
+
expect(error).toBeInstanceOf(ArtifactStorageError)
|
|
446
|
+
expect((error as ArtifactStorageError).code).toBe(code)
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
function createInput(overrides: Partial<CreateArtifactInput> = {}): CreateArtifactInput {
|
|
450
|
+
return {
|
|
451
|
+
projectId,
|
|
452
|
+
id: "art_report",
|
|
453
|
+
kind: "document",
|
|
454
|
+
owner,
|
|
455
|
+
version: versionInput(),
|
|
456
|
+
...overrides,
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
function publishInput(overrides: Partial<ArtifactVersionInput> = {}, artifactId = "art_report") {
|
|
461
|
+
return {
|
|
462
|
+
projectId,
|
|
463
|
+
artifactId,
|
|
464
|
+
kind: "document" as const,
|
|
465
|
+
version: versionInput({ origin: agentRun, ...overrides }),
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
function versionInput(overrides: Partial<ArtifactVersionInput> = {}): ArtifactVersionInput {
|
|
470
|
+
const input: ArtifactVersionInput = {
|
|
471
|
+
title: "Q3 report",
|
|
472
|
+
entry: "document.md",
|
|
473
|
+
files: [{ path: "document.md", file: fileRef("d", "text/markdown") }],
|
|
474
|
+
outline: { kind: "document", headings: [{ depth: 2, text: "Revenue", slug: "revenue" }] },
|
|
475
|
+
references: [],
|
|
476
|
+
author: owner,
|
|
477
|
+
origin: agentRun,
|
|
478
|
+
createdAt: t0,
|
|
479
|
+
...overrides,
|
|
480
|
+
}
|
|
481
|
+
if (input.origin) return input
|
|
482
|
+
const { origin: _origin, ...withoutOrigin } = input
|
|
483
|
+
return withoutOrigin
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
function frameGrant(
|
|
487
|
+
seed: string,
|
|
488
|
+
overrides: Partial<ArtifactFrameGrantRecord> = {}
|
|
489
|
+
): ArtifactFrameGrantRecord {
|
|
490
|
+
return {
|
|
491
|
+
projectId,
|
|
492
|
+
tokenHash: seed.repeat(64).slice(0, 64),
|
|
493
|
+
artifactId: "art_report",
|
|
494
|
+
version: 1,
|
|
495
|
+
targets: [
|
|
496
|
+
{ address: "artifact:art_other/figures/revenue.svg", artifactId: "art_other", version: 3 },
|
|
497
|
+
],
|
|
498
|
+
createdAt: t0,
|
|
499
|
+
expiresAt: at(60),
|
|
500
|
+
...overrides,
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
function fileRef(seed: string, mediaType: string): FileRef {
|
|
505
|
+
const hex = seed.repeat(64).slice(0, 64)
|
|
506
|
+
return {
|
|
507
|
+
blobId: `blob_${hex}`,
|
|
508
|
+
digest: `sha256:${hex}`,
|
|
509
|
+
sizeBytes: 42,
|
|
510
|
+
fileName: `${seed}.bin`,
|
|
511
|
+
mediaType,
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
function at(minutes: number): Date {
|
|
516
|
+
return new Date(t0.getTime() + minutes * minute)
|
|
517
|
+
}
|
|
@@ -292,6 +292,53 @@ export function runAuthStorageContractSuite<TStorage extends AuthStorage>(
|
|
|
292
292
|
})
|
|
293
293
|
})
|
|
294
294
|
|
|
295
|
+
test("lists all of a user's sessions, revoked and expired ones too, newest first", async () => {
|
|
296
|
+
await withStorage(async (storage) => {
|
|
297
|
+
await createUser(storage)
|
|
298
|
+
await createUser(storage, { id: "usr_2", email: "ben@acme.com" })
|
|
299
|
+
|
|
300
|
+
const session = (id: string, createdAt: string, userId = "usr_1") =>
|
|
301
|
+
storage.sessions.create({
|
|
302
|
+
id,
|
|
303
|
+
projectId,
|
|
304
|
+
userId,
|
|
305
|
+
strategyId: "magic-link",
|
|
306
|
+
tokenHash: `hash-${id}`,
|
|
307
|
+
createdAt: at(createdAt),
|
|
308
|
+
expiresAt: at("2026-05-15T10:00:00.000Z"),
|
|
309
|
+
})
|
|
310
|
+
|
|
311
|
+
await session("ses_oldest", "2026-05-14T10:00:00.000Z")
|
|
312
|
+
await session("ses_revoked", "2026-05-14T10:01:00.000Z")
|
|
313
|
+
// Created at the same instant as the one above: the cursor skips within the tie.
|
|
314
|
+
await session("ses_also", "2026-05-14T10:01:00.000Z")
|
|
315
|
+
await session("ses_newest", "2026-05-14T10:02:00.000Z")
|
|
316
|
+
await session("ses_other", "2026-05-14T10:03:00.000Z", "usr_2")
|
|
317
|
+
await storage.sessions.revoke({
|
|
318
|
+
projectId,
|
|
319
|
+
id: "ses_revoked",
|
|
320
|
+
revokedAt: at("2026-05-14T10:05:00.000Z"),
|
|
321
|
+
})
|
|
322
|
+
|
|
323
|
+
const first = await storage.sessions.listByUserId({ projectId, userId: "usr_1", limit: 2 })
|
|
324
|
+
expect(first.hasMore).toBe(true)
|
|
325
|
+
expect(first.sessions.map((entry) => entry.id)).toEqual(["ses_newest", "ses_revoked"])
|
|
326
|
+
expect(first.sessions[1]?.revokedAt?.toISOString()).toBe("2026-05-14T10:05:00.000Z")
|
|
327
|
+
|
|
328
|
+
const rest = await storage.sessions.listByUserId({
|
|
329
|
+
projectId,
|
|
330
|
+
userId: "usr_1",
|
|
331
|
+
limit: 2,
|
|
332
|
+
before: { createdAt: at("2026-05-14T10:01:00.000Z"), skip: 1 },
|
|
333
|
+
})
|
|
334
|
+
expect(rest.hasMore).toBe(false)
|
|
335
|
+
expect(rest.sessions.map((entry) => entry.id)).toEqual(["ses_also", "ses_oldest"])
|
|
336
|
+
await expect(
|
|
337
|
+
storage.sessions.listByUserId({ projectId: otherProjectId, userId: "usr_1", limit: 2 })
|
|
338
|
+
).resolves.toEqual({ sessions: [], hasMore: false })
|
|
339
|
+
})
|
|
340
|
+
})
|
|
341
|
+
|
|
295
342
|
test("persists and enforces an optional absolute session deadline", async () => {
|
|
296
343
|
await withStorage(async (storage) => {
|
|
297
344
|
await createUser(storage)
|