@sixb/core 0.1.20 → 0.1.22
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/commit-edits.d.ts +3 -1
- package/dist/actions/commit-edits.d.ts.map +1 -1
- package/dist/actions/execution.d.ts.map +1 -1
- package/dist/actions/index.js +71 -60
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/read-facade.d.ts +9 -1
- package/dist/actions/read-facade.d.ts.map +1 -1
- package/dist/actions/request.d.ts +15 -1
- package/dist/actions/request.d.ts.map +1 -1
- package/dist/actions/run/context.d.ts +1 -0
- package/dist/actions/run/context.d.ts.map +1 -1
- package/dist/actions/run/execute.d.ts +2 -3
- package/dist/actions/run/execute.d.ts.map +1 -1
- package/dist/actions/run/executor.d.ts +3 -0
- package/dist/actions/run/executor.d.ts.map +1 -1
- package/dist/actions/run/normalize.d.ts +2 -1
- package/dist/actions/run/normalize.d.ts.map +1 -1
- package/dist/actions/run/signals.d.ts +1 -3
- package/dist/actions/run/signals.d.ts.map +1 -1
- package/dist/actions/run/types.d.ts +16 -1
- package/dist/actions/run/types.d.ts.map +1 -1
- package/dist/actions/run-authorization.d.ts +23 -0
- package/dist/actions/run-authorization.d.ts.map +1 -1
- package/dist/actions/types/context.d.ts +17 -1
- package/dist/actions/types/context.d.ts.map +1 -1
- package/dist/actions/validators.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 +103 -0
- package/dist/activity/timeline.d.ts.map +1 -0
- package/dist/agents/accounting.d.ts +15 -0
- package/dist/agents/accounting.d.ts.map +1 -0
- package/dist/agents/adapters.d.ts.map +1 -1
- package/dist/agents/agent-mail.d.ts +9 -0
- package/dist/agents/agent-mail.d.ts.map +1 -0
- package/dist/agents/api-gateway.d.ts +5 -0
- package/dist/agents/api-gateway.d.ts.map +1 -1
- package/dist/agents/approval-continuation.d.ts +23 -0
- package/dist/agents/approval-continuation.d.ts.map +1 -0
- package/dist/agents/approval-executor.d.ts +56 -0
- package/dist/agents/approval-executor.d.ts.map +1 -0
- package/dist/agents/approval-outcome.d.ts +8 -0
- package/dist/agents/approval-outcome.d.ts.map +1 -0
- package/dist/agents/approvals.d.ts +210 -0
- package/dist/agents/approvals.d.ts.map +1 -0
- package/dist/agents/authority.d.ts +10 -0
- package/dist/agents/authority.d.ts.map +1 -1
- package/dist/agents/builders.d.ts.map +1 -1
- package/dist/agents/cancel.d.ts +23 -0
- package/dist/agents/cancel.d.ts.map +1 -0
- package/dist/agents/child-question.d.ts +18 -0
- package/dist/agents/child-question.d.ts.map +1 -0
- package/dist/agents/children.d.ts +99 -0
- package/dist/agents/children.d.ts.map +1 -0
- package/dist/agents/context/index.js +1 -1
- package/dist/agents/context-compaction.d.ts.map +1 -1
- package/dist/agents/errors.d.ts +13 -1
- package/dist/agents/errors.d.ts.map +1 -1
- package/dist/agents/execution.d.ts +180 -14
- package/dist/agents/execution.d.ts.map +1 -1
- package/dist/agents/fork.d.ts +16 -0
- package/dist/agents/fork.d.ts.map +1 -0
- package/dist/agents/ids.d.ts +7 -0
- package/dist/agents/ids.d.ts.map +1 -1
- package/dist/agents/index.d.ts +20 -8
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +170 -84
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/memory-execution.d.ts +57 -0
- package/dist/agents/memory-execution.d.ts.map +1 -0
- package/dist/agents/memory.d.ts +49 -0
- package/dist/agents/memory.d.ts.map +1 -0
- package/dist/agents/message.d.ts +50 -1
- package/dist/agents/message.d.ts.map +1 -1
- package/dist/agents/model-loop.d.ts +19 -0
- package/dist/agents/model-loop.d.ts.map +1 -1
- package/dist/agents/model-routing.d.ts +19 -0
- package/dist/agents/model-routing.d.ts.map +1 -0
- package/dist/agents/participants.d.ts +18 -0
- package/dist/agents/participants.d.ts.map +1 -0
- package/dist/agents/reference.d.ts.map +1 -1
- package/dist/agents/request.d.ts +36 -2
- package/dist/agents/request.d.ts.map +1 -1
- package/dist/agents/run-scope.d.ts +51 -0
- package/dist/agents/run-scope.d.ts.map +1 -0
- package/dist/agents/skills.d.ts.map +1 -1
- package/dist/agents/streams/index.d.ts +3 -2
- package/dist/agents/streams/index.d.ts.map +1 -1
- package/dist/agents/streams/index.js +8 -4
- package/dist/agents/streams/index.js.map +1 -1
- package/dist/agents/streams/internal.d.ts +1 -1
- package/dist/agents/streams/internal.d.ts.map +1 -1
- package/dist/agents/streams/internal.js +6 -4
- package/dist/agents/streams/internal.js.map +1 -1
- package/dist/agents/streams/protocol.d.ts +122 -3
- package/dist/agents/streams/protocol.d.ts.map +1 -1
- package/dist/agents/subagent-runs.d.ts +12 -0
- package/dist/agents/subagent-runs.d.ts.map +1 -0
- package/dist/agents/thread-access.d.ts +53 -0
- package/dist/agents/thread-access.d.ts.map +1 -0
- package/dist/agents/tool-definition.d.ts +5 -4
- package/dist/agents/tool-definition.d.ts.map +1 -1
- package/dist/agents/types.d.ts +31 -12
- 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/access.d.ts +52 -0
- package/dist/artifacts/access.d.ts.map +1 -0
- package/dist/artifacts/address.d.ts +48 -0
- package/dist/artifacts/address.d.ts.map +1 -0
- package/dist/artifacts/canvas.d.ts +92 -0
- package/dist/artifacts/canvas.d.ts.map +1 -0
- package/dist/artifacts/csv.d.ts +27 -0
- package/dist/artifacts/csv.d.ts.map +1 -0
- package/dist/artifacts/errors.d.ts +16 -0
- package/dist/artifacts/errors.d.ts.map +1 -0
- package/dist/artifacts/execution.d.ts +138 -0
- package/dist/artifacts/execution.d.ts.map +1 -0
- package/dist/artifacts/formula/check.d.ts +24 -0
- package/dist/artifacts/formula/check.d.ts.map +1 -0
- package/dist/artifacts/formula/evaluate.d.ts +32 -0
- package/dist/artifacts/formula/evaluate.d.ts.map +1 -0
- package/dist/artifacts/formula/index.d.ts +38 -0
- package/dist/artifacts/formula/index.d.ts.map +1 -0
- package/dist/artifacts/formula/parser.d.ts +67 -0
- package/dist/artifacts/formula/parser.d.ts.map +1 -0
- package/dist/artifacts/frames/assets.d.ts +30 -0
- package/dist/artifacts/frames/assets.d.ts.map +1 -0
- package/dist/artifacts/frames/entries.d.ts +19 -0
- package/dist/artifacts/frames/entries.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 +12 -0
- package/dist/artifacts/frames/index.d.ts.map +1 -0
- package/dist/artifacts/frames/index.js +1285 -0
- package/dist/artifacts/frames/index.js.map +16 -0
- package/dist/artifacts/frames/kit.d.ts +71 -0
- package/dist/artifacts/frames/kit.d.ts.map +1 -0
- package/dist/artifacts/frames/probe.d.ts +45 -0
- package/dist/artifacts/frames/probe.d.ts.map +1 -0
- package/dist/artifacts/frames/protocol.d.ts +167 -0
- package/dist/artifacts/frames/protocol.d.ts.map +1 -0
- package/dist/artifacts/frames/runtime.d.ts +31 -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 +22 -0
- package/dist/artifacts/index.d.ts.map +1 -0
- package/dist/artifacts/index.js +247 -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 +58 -0
- package/dist/artifacts/limits.d.ts.map +1 -0
- package/dist/artifacts/live-sheet.d.ts +65 -0
- package/dist/artifacts/live-sheet.d.ts.map +1 -0
- package/dist/artifacts/outline.d.ts +70 -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 +7 -0
- package/dist/artifacts/publish/index.d.ts.map +1 -0
- package/dist/artifacts/publish/index.js +76 -0
- package/dist/{chunk-7n30ybym.js.map → artifacts/publish/index.js.map} +1 -1
- package/dist/artifacts/publish/publish.d.ts +84 -0
- package/dist/artifacts/publish/publish.d.ts.map +1 -0
- package/dist/artifacts/publish/queries.d.ts +33 -0
- package/dist/artifacts/publish/queries.d.ts.map +1 -0
- package/dist/artifacts/publish/references.d.ts +30 -0
- package/dist/artifacts/publish/references.d.ts.map +1 -0
- package/dist/artifacts/publish/validate/canvas.d.ts +18 -0
- package/dist/artifacts/publish/validate/canvas.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/html.d.ts +20 -0
- package/dist/artifacts/publish/validate/html.d.ts.map +1 -0
- package/dist/artifacts/publish/validate/page.d.ts +15 -0
- package/dist/artifacts/publish/validate/page.d.ts.map +1 -0
- package/dist/artifacts/publish/validate/sheet.d.ts +23 -0
- package/dist/artifacts/publish/validate/sheet.d.ts.map +1 -0
- package/dist/artifacts/publish/validate/slides.d.ts +15 -0
- package/dist/artifacts/publish/validate/slides.d.ts.map +1 -0
- package/dist/artifacts/queries.d.ts +95 -0
- package/dist/artifacts/queries.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 +47 -0
- package/dist/artifacts/resolve.d.ts.map +1 -0
- package/dist/artifacts/run-query.d.ts +26 -0
- package/dist/artifacts/run-query.d.ts.map +1 -0
- package/dist/artifacts/serialize-query.d.ts +12 -0
- package/dist/artifacts/serialize-query.d.ts.map +1 -0
- package/dist/artifacts/sheet-rules.d.ts +26 -0
- package/dist/artifacts/sheet-rules.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/tones.d.ts +8 -0
- package/dist/artifacts/tones.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 +135 -0
- package/dist/artifacts/workbook.d.ts.map +1 -0
- package/dist/auth/index.d.ts +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +16 -13
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/member-events.d.ts +13 -0
- package/dist/auth/member-events.d.ts.map +1 -0
- package/dist/auth/profile.d.ts +11 -0
- package/dist/auth/profile.d.ts.map +1 -0
- package/dist/auth/runtime.d.ts +31 -3
- package/dist/auth/runtime.d.ts.map +1 -1
- package/dist/auth/strategy.d.ts +3 -1
- package/dist/auth/strategy.d.ts.map +1 -1
- package/dist/auth/strategy.js +7 -3
- package/dist/auth/strategy.js.map +1 -1
- package/dist/auth/types.d.ts +30 -1
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/authorization/decision.d.ts +17 -0
- package/dist/authorization/decision.d.ts.map +1 -1
- package/dist/authorization/event-visibility.d.ts +5 -1
- package/dist/authorization/event-visibility.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.d.ts +2 -2
- package/dist/authorization/index.d.ts.map +1 -1
- package/dist/authorization/index.js +14 -9
- package/dist/authorization/index.js.map +1 -1
- package/dist/authorization/resolve.d.ts +19 -1
- package/dist/authorization/resolve.d.ts.map +1 -1
- package/dist/authorization/run-visibility.d.ts +8 -1
- package/dist/authorization/run-visibility.d.ts.map +1 -1
- package/dist/authorization/types.d.ts +14 -0
- package/dist/authorization/types.d.ts.map +1 -1
- 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 +76 -66
- package/dist/bootstrap/index.js.map +2 -2
- package/dist/{chunk-tg2cw67r.js → chunk-02bzjgnt.js} +6 -6
- package/dist/{chunk-tg2cw67r.js.map → chunk-02bzjgnt.js.map} +1 -1
- package/dist/{chunk-mfs23znk.js → chunk-07kkp2e1.js} +1 -1
- package/dist/{chunk-6p49a5cq.js → chunk-098anw4f.js} +21 -19
- package/dist/chunk-098anw4f.js.map +12 -0
- package/dist/{chunk-fkgc1wt8.js → chunk-0phpbbvm.js} +3 -3
- package/dist/{chunk-ere85b8y.js → chunk-0xmt5p5y.js} +116 -27
- package/dist/chunk-0xmt5p5y.js.map +14 -0
- package/dist/{chunk-t6f3tdnr.js → chunk-16a9dmfy.js} +33 -2
- package/dist/{chunk-t6f3tdnr.js.map → chunk-16a9dmfy.js.map} +5 -4
- package/dist/{chunk-hkc3jct7.js → chunk-18sk89cg.js} +18 -10
- package/dist/chunk-18sk89cg.js.map +10 -0
- package/dist/{chunk-way52z4h.js → chunk-1t6k1avb.js} +6 -12
- package/dist/{chunk-way52z4h.js.map → chunk-1t6k1avb.js.map} +3 -4
- package/dist/chunk-2626mh4m.js +693 -0
- package/dist/chunk-2626mh4m.js.map +19 -0
- package/dist/{chunk-qczk96d9.js → chunk-2adz0h75.js} +13 -4
- package/dist/chunk-2adz0h75.js.map +11 -0
- package/dist/{chunk-3t2hgbgd.js → chunk-2fn60nvs.js} +40 -8
- package/dist/chunk-2fn60nvs.js.map +15 -0
- package/dist/{chunk-99nd4rc1.js → chunk-2gjj5dx3.js} +5 -4
- package/dist/{chunk-99nd4rc1.js.map → chunk-2gjj5dx3.js.map} +3 -3
- package/dist/chunk-3fqxbn31.js +107 -0
- package/dist/chunk-3fqxbn31.js.map +11 -0
- package/dist/{chunk-y0c4e6ex.js → chunk-3gbefjg5.js} +1 -1
- package/dist/{chunk-yzwja0mj.js → chunk-45ngkxkp.js} +52 -31
- package/dist/chunk-45ngkxkp.js.map +13 -0
- package/dist/{chunk-fa02jy15.js → chunk-48jezz3j.js} +1 -1
- package/dist/{chunk-ren4kg2j.js → chunk-4b26qwbg.js} +13 -13
- package/dist/{chunk-ren4kg2j.js.map → chunk-4b26qwbg.js.map} +1 -1
- package/dist/{chunk-9k93ah50.js → chunk-4f3ydv7t.js} +33 -69
- package/dist/chunk-4f3ydv7t.js.map +10 -0
- package/dist/chunk-4y26vs3v.js +97 -0
- package/dist/chunk-4y26vs3v.js.map +10 -0
- package/dist/{chunk-4as3wt1c.js → chunk-4ymrcdbm.js} +7 -3
- package/dist/chunk-4ymrcdbm.js.map +12 -0
- package/dist/{chunk-hcbyfxbe.js → chunk-5grk14e5.js} +76 -2
- package/dist/{chunk-hcbyfxbe.js.map → chunk-5grk14e5.js.map} +4 -3
- package/dist/chunk-5tfev0fv.js +676 -0
- package/dist/chunk-5tfev0fv.js.map +15 -0
- package/dist/chunk-65abf64x.js +13 -0
- package/dist/chunk-65abf64x.js.map +10 -0
- package/dist/{chunk-hvsb78a1.js → chunk-65pyhyas.js} +114 -107
- package/dist/chunk-65pyhyas.js.map +20 -0
- package/dist/{chunk-1sr8ryzk.js → chunk-661ezhks.js} +303 -6
- package/dist/chunk-661ezhks.js.map +11 -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-c85m1hyj.js → chunk-6n69k945.js} +2 -2
- package/dist/{chunk-xfs8x8m9.js → chunk-6p0pastb.js} +5 -5
- package/dist/{chunk-rrzt8jdy.js → chunk-6rrtzea3.js} +116 -110
- package/dist/chunk-6rrtzea3.js.map +14 -0
- package/dist/{chunk-t7x8dmn0.js → chunk-6y0mkhex.js} +3 -3
- package/dist/{chunk-es1gxsbf.js → chunk-73v685wb.js} +14 -16
- package/dist/chunk-73v685wb.js.map +12 -0
- package/dist/{chunk-6c6sn0bh.js → chunk-7gr4j2eq.js} +7930 -5973
- package/dist/chunk-7gr4j2eq.js.map +120 -0
- package/dist/{chunk-hjzdd750.js → chunk-7mc2wkre.js} +391 -91
- package/dist/chunk-7mc2wkre.js.map +50 -0
- package/dist/chunk-7z5p905k.js +1660 -0
- package/dist/chunk-7z5p905k.js.map +22 -0
- 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-yxd3nnqt.js → chunk-9mab3dvg.js} +26 -2
- package/dist/chunk-9mab3dvg.js.map +11 -0
- package/dist/chunk-9wr3yajk.js +42 -0
- package/dist/chunk-9wr3yajk.js.map +10 -0
- package/dist/chunk-a3faa34j.js +74 -0
- package/dist/chunk-a3faa34j.js.map +10 -0
- package/dist/chunk-az47zep4.js +41 -0
- package/dist/chunk-az47zep4.js.map +10 -0
- package/dist/{chunk-v9xd5wzd.js → chunk-bab05bhg.js} +1 -1
- package/dist/{chunk-5j58wjct.js → chunk-bktev1ds.js} +14 -11
- package/dist/{chunk-5j58wjct.js.map → chunk-bktev1ds.js.map} +3 -3
- package/dist/{chunk-b38szspf.js → chunk-c0vk1djt.js} +5 -3
- package/dist/chunk-c0vk1djt.js.map +11 -0
- package/dist/chunk-c69nj7se.js +3 -0
- package/dist/chunk-c69nj7se.js.map +9 -0
- package/dist/{chunk-0yh890a4.js → chunk-c844dkwd.js} +35 -7
- package/dist/{chunk-0yh890a4.js.map → chunk-c844dkwd.js.map} +3 -3
- package/dist/{chunk-d09tj99x.js → chunk-cdk3egjj.js} +24 -5
- package/dist/chunk-cdk3egjj.js.map +12 -0
- package/dist/chunk-cswhawa2.js +113 -0
- package/dist/chunk-cswhawa2.js.map +10 -0
- package/dist/{chunk-gc4ntf7d.js → chunk-cwdzcv37.js} +1 -1
- package/dist/chunk-d2m879s4.js +288 -0
- package/dist/chunk-d2m879s4.js.map +12 -0
- package/dist/chunk-d7vyc7k6.js +10 -0
- package/dist/chunk-d7vyc7k6.js.map +10 -0
- package/dist/{chunk-vyf9kfqf.js → chunk-dp0cdtj2.js} +2 -2
- package/dist/{chunk-6x0pqh32.js → chunk-e5wf5vz0.js} +3 -1
- package/dist/chunk-e5wf5vz0.js.map +10 -0
- package/dist/{chunk-bx9q3cwv.js → chunk-efmm01gj.js} +108 -1045
- package/dist/chunk-efmm01gj.js.map +18 -0
- package/dist/{chunk-tw03bsmb.js → chunk-eptrvnby.js} +224 -3
- package/dist/chunk-eptrvnby.js.map +12 -0
- package/dist/{chunk-n33z5bjw.js → chunk-ezne9wc9.js} +1762 -502
- package/dist/chunk-ezne9wc9.js.map +71 -0
- package/dist/chunk-fe8zwt8b.js +688 -0
- package/dist/chunk-fe8zwt8b.js.map +19 -0
- package/dist/chunk-ff5xkv0p.js +211 -0
- package/dist/chunk-ff5xkv0p.js.map +10 -0
- package/dist/{chunk-br3k6qbf.js → chunk-fm62y49k.js} +1 -1
- package/dist/{chunk-nq6gpjt7.js → chunk-fntqb7qy.js} +30 -4
- package/dist/{chunk-nq6gpjt7.js.map → chunk-fntqb7qy.js.map} +5 -5
- package/dist/{chunk-1zq2p6g0.js → chunk-fp2kq35z.js} +26 -10
- package/dist/{chunk-1zq2p6g0.js.map → chunk-fp2kq35z.js.map} +5 -5
- package/dist/chunk-g5bvzyyr.js +32 -0
- package/dist/chunk-g5bvzyyr.js.map +10 -0
- package/dist/{chunk-9ybhtmg4.js → chunk-g663fahq.js} +2 -2
- package/dist/{chunk-k6q3n2sc.js → chunk-gvj5cd3b.js} +29 -13
- package/dist/chunk-gvj5cd3b.js.map +12 -0
- package/dist/{chunk-yevzdx4y.js → chunk-h33shhq6.js} +10 -12
- package/dist/{chunk-yevzdx4y.js.map → chunk-h33shhq6.js.map} +3 -4
- package/dist/{chunk-vpq4shxz.js → chunk-h3pbv7n8.js} +1771 -36
- package/dist/chunk-h3pbv7n8.js.map +48 -0
- package/dist/chunk-hke9aeen.js +9 -0
- package/dist/chunk-hke9aeen.js.map +10 -0
- package/dist/chunk-hn2r7z41.js.map +1 -1
- package/dist/{chunk-pbcbn83d.js → chunk-hqsp2sx4.js} +54 -8
- package/dist/chunk-hqsp2sx4.js.map +14 -0
- package/dist/{chunk-9w055r5b.js → chunk-hwarjrgf.js} +1 -1
- package/dist/{chunk-9dmt152s.js → chunk-hyesv9dv.js} +2 -2
- package/dist/chunk-hz5d43gn.js +45 -0
- package/dist/chunk-hz5d43gn.js.map +10 -0
- package/dist/{chunk-91mg3nj9.js → chunk-j936th07.js} +86 -41
- package/dist/chunk-j936th07.js.map +12 -0
- package/dist/chunk-jcfw4h7m.js +9 -0
- package/dist/chunk-jcfw4h7m.js.map +10 -0
- package/dist/chunk-kcqpk9w1.js +75 -0
- package/dist/chunk-kcqpk9w1.js.map +10 -0
- package/dist/{chunk-x6m907x7.js → chunk-m2nevja0.js} +6 -7
- package/dist/{chunk-x6m907x7.js.map → chunk-m2nevja0.js.map} +3 -3
- package/dist/{chunk-x9v4cx1d.js → chunk-m36fw8ft.js} +1 -1
- package/dist/{chunk-a40ad1ft.js → chunk-mbsbxarb.js} +1 -1
- package/dist/chunk-mzx71snp.js +129 -0
- package/dist/chunk-mzx71snp.js.map +10 -0
- package/dist/{chunk-6aawea28.js → chunk-n8q5j6y5.js} +1 -1
- package/dist/{chunk-dk8tkk5f.js → chunk-n9zpx9c6.js} +4 -4
- package/dist/{chunk-7t429e3f.js → chunk-npcr0228.js} +1 -1
- package/dist/chunk-nydf3dbe.js +663 -0
- package/dist/chunk-nydf3dbe.js.map +13 -0
- package/dist/chunk-pdt5cw8z.js +233 -0
- package/dist/chunk-pdt5cw8z.js.map +11 -0
- package/dist/{chunk-rj69qcrd.js → chunk-pgrf64hp.js} +55 -7
- package/dist/chunk-pgrf64hp.js.map +12 -0
- package/dist/{chunk-z4m0yz8c.js → chunk-q4pmvkg0.js} +1 -1
- package/dist/chunk-qhqgp4jf.js +1418 -0
- package/dist/chunk-qhqgp4jf.js.map +22 -0
- package/dist/chunk-qx00vjrj.js +144 -0
- package/dist/chunk-qx00vjrj.js.map +13 -0
- package/dist/{chunk-5e43w60z.js → chunk-r6szek0x.js} +184 -7
- package/dist/chunk-r6szek0x.js.map +10 -0
- package/dist/{chunk-v4jbb3rs.js → chunk-rap5w0x0.js} +156 -2
- package/dist/chunk-rap5w0x0.js.map +10 -0
- package/dist/{chunk-pfp1txq2.js → chunk-sgx82nnt.js} +5 -31
- package/dist/{chunk-pfp1txq2.js.map → chunk-sgx82nnt.js.map} +3 -4
- package/dist/{chunk-bkpke1sg.js → chunk-t5608tkq.js} +3 -1
- package/dist/{chunk-bkpke1sg.js.map → chunk-t5608tkq.js.map} +3 -3
- package/dist/{chunk-29yx306f.js → chunk-tdxfsg1c.js} +507 -265
- package/dist/chunk-tdxfsg1c.js.map +23 -0
- package/dist/chunk-vabga7fk.js +176 -0
- package/dist/chunk-vabga7fk.js.map +12 -0
- package/dist/{chunk-gsjm1wms.js → chunk-vhbw5sqm.js} +33 -3
- package/dist/chunk-vhbw5sqm.js.map +10 -0
- package/dist/{chunk-tpn40322.js → chunk-vpgwq5nf.js} +104 -17
- package/dist/chunk-vpgwq5nf.js.map +21 -0
- package/dist/{chunk-0rbyz4qy.js → chunk-vyt322b6.js} +586 -171
- package/dist/{chunk-0rbyz4qy.js.map → chunk-vyt322b6.js.map} +12 -9
- package/dist/chunk-waqk73p1.js +2380 -0
- package/dist/chunk-waqk73p1.js.map +23 -0
- 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-wsc1brye.js +27 -0
- package/dist/chunk-wsc1brye.js.map +10 -0
- package/dist/chunk-x0v3jd47.js +124 -0
- package/dist/chunk-x0v3jd47.js.map +10 -0
- package/dist/{chunk-96yw3pwd.js → chunk-y7dbmaqh.js} +28 -2
- package/dist/chunk-y7dbmaqh.js.map +10 -0
- package/dist/{chunk-d0bqz29d.js → chunk-yc9ners4.js} +124 -19
- package/dist/{chunk-d0bqz29d.js.map → chunk-yc9ners4.js.map} +8 -8
- package/dist/{chunk-8mx7qw3y.js → chunk-zbc929zg.js} +29 -5
- package/dist/chunk-zbc929zg.js.map +13 -0
- package/dist/chunk-zrvhsq7f.js +37 -0
- package/dist/chunk-zrvhsq7f.js.map +10 -0
- 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/catalog.d.ts +26 -0
- package/dist/errors/catalog.d.ts.map +1 -1
- 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/definitions.d.ts +7 -0
- package/dist/events/definitions.d.ts.map +1 -1
- package/dist/events/execution.d.ts +12 -2
- package/dist/events/execution.d.ts.map +1 -1
- package/dist/events/index.d.ts +2 -3
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +9 -11
- package/dist/events/index.js.map +1 -1
- package/dist/events/scope.d.ts.map +1 -1
- package/dist/events/scope.js +1 -1
- package/dist/events/selectors/builder.d.ts +12 -1
- package/dist/events/selectors/builder.d.ts.map +1 -1
- package/dist/events/selectors/index.d.ts +2 -2
- package/dist/events/selectors/index.d.ts.map +1 -1
- package/dist/events/selectors/index.js +2 -2
- package/dist/events/selectors/types.d.ts +19 -3
- package/dist/events/selectors/types.d.ts.map +1 -1
- package/dist/events/service.d.ts +17 -2
- package/dist/events/service.d.ts.map +1 -1
- package/dist/events/types/index.d.ts +3 -1
- package/dist/events/types/index.d.ts.map +1 -1
- package/dist/events/types/users.d.ts +63 -0
- package/dist/events/types/users.d.ts.map +1 -0
- package/dist/events/view-conditions.d.ts +34 -0
- package/dist/events/view-conditions.d.ts.map +1 -0
- package/dist/execution/agent.d.ts +15 -0
- package/dist/execution/agent.d.ts.map +1 -1
- package/dist/execution/agent.js +72 -59
- package/dist/execution/agent.js.map +1 -1
- package/dist/execution/authorization.d.ts.map +1 -1
- package/dist/execution/authorized-object-reader.d.ts +102 -12
- package/dist/execution/authorized-object-reader.d.ts.map +1 -1
- package/dist/execution/lineage.d.ts +7 -0
- package/dist/execution/lineage.d.ts.map +1 -0
- 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 +66 -0
- package/dist/execution/object-reader-security.d.ts.map +1 -0
- package/dist/execution/object-reader-users.d.ts +20 -0
- package/dist/execution/object-reader-users.d.ts.map +1 -0
- package/dist/execution/preparation.d.ts +23 -0
- package/dist/execution/preparation.d.ts.map +1 -0
- package/dist/execution/primitive.js +70 -59
- package/dist/execution/primitive.js.map +1 -1
- package/dist/execution/request.d.ts +2 -1
- package/dist/execution/request.d.ts.map +1 -1
- package/dist/execution/request.js +72 -57
- package/dist/execution/request.js.map +3 -3
- package/dist/execution/unique-lookup.d.ts +14 -0
- package/dist/execution/unique-lookup.d.ts.map +1 -0
- package/dist/execution/visible-objects.d.ts +12 -0
- package/dist/execution/visible-objects.d.ts.map +1 -0
- package/dist/http/api-routes.d.ts +17 -0
- package/dist/http/api-routes.d.ts.map +1 -1
- package/dist/http/index.js +1 -1
- package/dist/index.d.ts +49 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +168 -142
- 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/materialization/errors.d.ts +25 -0
- package/dist/materialization/errors.d.ts.map +1 -1
- package/dist/materialization/event-envelopes.d.ts +5 -0
- package/dist/materialization/event-envelopes.d.ts.map +1 -1
- package/dist/materialization/index.d.ts +1 -1
- package/dist/materialization/index.d.ts.map +1 -1
- package/dist/materialization/index.js +14 -8
- package/dist/materialization/index.js.map +1 -1
- package/dist/materialization/model.d.ts +20 -2
- package/dist/materialization/model.d.ts.map +1 -1
- package/dist/materializer/edits/commit.d.ts.map +1 -1
- package/dist/materializer/edits/load-state.d.ts +5 -1
- package/dist/materializer/edits/load-state.d.ts.map +1 -1
- package/dist/materializer/edits/plan.d.ts.map +1 -1
- package/dist/materializer/edits/unique-values.d.ts +47 -0
- package/dist/materializer/edits/unique-values.d.ts.map +1 -0
- package/dist/materializer/edits/working-state.d.ts +6 -1
- package/dist/materializer/edits/working-state.d.ts.map +1 -1
- package/dist/materializer/execution/work-records.d.ts +7 -1
- package/dist/materializer/execution/work-records.d.ts.map +1 -1
- package/dist/materializer/index.js +51 -46
- package/dist/materializer/index.js.map +1 -1
- package/dist/materializer/projections/replacement-plan.d.ts.map +1 -1
- package/dist/materializer/projections/source-materialization.d.ts +1 -0
- package/dist/materializer/projections/source-materialization.d.ts.map +1 -1
- package/dist/materializer/shared/normalize.d.ts.map +1 -1
- package/dist/materializer/shared/projection-run.d.ts +0 -1
- package/dist/materializer/shared/projection-run.d.ts.map +1 -1
- package/dist/materializer/telemetry/plan.d.ts.map +1 -1
- package/dist/models/audio/catalog.d.ts +13 -1
- package/dist/models/audio/catalog.d.ts.map +1 -1
- package/dist/models/audio/errors.d.ts +6 -1
- package/dist/models/audio/errors.d.ts.map +1 -1
- package/dist/models/audio/runtime.d.ts.map +1 -1
- package/dist/models/audio/speech.d.ts +8 -0
- package/dist/models/audio/speech.d.ts.map +1 -0
- package/dist/models/audio/types.d.ts +93 -0
- package/dist/models/audio/types.d.ts.map +1 -1
- package/dist/models/calls.d.ts +27 -0
- package/dist/models/calls.d.ts.map +1 -0
- package/dist/models/catalog-index.d.ts +7 -4
- package/dist/models/catalog-index.d.ts.map +1 -1
- package/dist/models/catalog.d.ts +55 -3
- package/dist/models/catalog.d.ts.map +1 -1
- package/dist/models/decision/runtime.d.ts +6 -1
- package/dist/models/decision/runtime.d.ts.map +1 -1
- package/dist/models/decision/validation.d.ts +4 -1
- package/dist/models/decision/validation.d.ts.map +1 -1
- package/dist/models/definitions.d.ts +23 -1
- package/dist/models/definitions.d.ts.map +1 -1
- package/dist/models/events.d.ts +12 -1
- package/dist/models/events.d.ts.map +1 -1
- package/dist/models/execution/binding.d.ts +3 -1
- package/dist/models/execution/binding.d.ts.map +1 -1
- package/dist/models/execution/index.d.ts +1 -0
- package/dist/models/execution/index.d.ts.map +1 -1
- package/dist/models/execution/index.js +50 -39
- package/dist/models/execution/index.js.map +1 -1
- package/dist/models/execution/model-call-accounting.d.ts.map +1 -1
- package/dist/models/execution/model-call-recorder.d.ts +3 -0
- package/dist/models/execution/model-call-recorder.d.ts.map +1 -1
- package/dist/models/execution/usage.d.ts.map +1 -1
- package/dist/models/execution.d.ts +4 -2
- package/dist/models/execution.d.ts.map +1 -1
- package/dist/models/generation-types.d.ts +8 -1
- package/dist/models/generation-types.d.ts.map +1 -1
- package/dist/models/image/catalog.d.ts +13 -0
- package/dist/models/image/catalog.d.ts.map +1 -0
- package/dist/models/image/errors.d.ts +8 -0
- package/dist/models/image/errors.d.ts.map +1 -0
- package/dist/models/image/runtime.d.ts +8 -0
- package/dist/models/image/runtime.d.ts.map +1 -0
- package/dist/models/image/types.d.ts +103 -0
- package/dist/models/image/types.d.ts.map +1 -0
- package/dist/models/index.d.ts +12 -8
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +17 -7
- package/dist/models/index.js.map +1 -1
- package/dist/models/input-file.d.ts +9 -0
- package/dist/models/input-file.d.ts.map +1 -0
- package/dist/models/language-model.d.ts +13 -0
- package/dist/models/language-model.d.ts.map +1 -1
- package/dist/models/pricing.d.ts +25 -10
- package/dist/models/pricing.d.ts.map +1 -1
- package/dist/models/rate-card.d.ts +44 -6
- package/dist/models/rate-card.d.ts.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/conditional-writes.d.ts +37 -0
- package/dist/objects/conditional-writes.d.ts.map +1 -0
- package/dist/objects/execution.d.ts +2 -0
- package/dist/objects/execution.d.ts.map +1 -1
- package/dist/objects/index.d.ts +1 -0
- package/dist/objects/index.d.ts.map +1 -1
- package/dist/objects/index.js +77 -60
- package/dist/objects/index.js.map +1 -1
- package/dist/objects/link/authorization.d.ts +11 -5
- package/dist/objects/link/authorization.d.ts.map +1 -1
- package/dist/objects/link/endpoints.d.ts +21 -2
- package/dist/objects/link/endpoints.d.ts.map +1 -1
- package/dist/objects/link/remove.d.ts.map +1 -1
- package/dist/objects/link/upsert-batch.d.ts.map +1 -1
- package/dist/objects/link/upsert.d.ts.map +1 -1
- package/dist/objects/materializer-adapter.d.ts +13 -4
- package/dist/objects/materializer-adapter.d.ts.map +1 -1
- package/dist/objects/object/delete.d.ts +3 -0
- 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/current-user.d.ts +17 -0
- package/dist/objects/query/current-user.d.ts.map +1 -0
- package/dist/objects/query/executor.d.ts +14 -0
- package/dist/objects/query/executor.d.ts.map +1 -1
- package/dist/objects/query/index.d.ts +2 -2
- package/dist/objects/query/index.d.ts.map +1 -1
- package/dist/objects/query/index.js +55 -49
- package/dist/objects/query/index.js.map +1 -1
- package/dist/objects/query/ir.d.ts +19 -1
- package/dist/objects/query/ir.d.ts.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/objects/query/matches-predicate.d.ts +9 -0
- package/dist/objects/query/matches-predicate.d.ts.map +1 -0
- package/dist/objects/query/normalize.d.ts.map +1 -1
- package/dist/objects/query/user-expansions.d.ts +27 -0
- package/dist/objects/query/user-expansions.d.ts.map +1 -0
- package/dist/objects/query/validate.d.ts.map +1 -1
- package/dist/objects/runtime-batch.d.ts +3 -1
- package/dist/objects/runtime-batch.d.ts.map +1 -1
- package/dist/objects/sdk/object-set.d.ts.map +1 -1
- package/dist/objects/sdk/query-executor.d.ts +6 -0
- package/dist/objects/sdk/query-executor.d.ts.map +1 -1
- package/dist/objects/serialize.d.ts +39 -0
- package/dist/objects/serialize.d.ts.map +1 -0
- package/dist/objects/unique-violation.d.ts +22 -0
- package/dist/objects/unique-violation.d.ts.map +1 -0
- package/dist/ontology/builders.d.ts +3 -1
- 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.d.ts +2 -2
- package/dist/ontology/index.d.ts.map +1 -1
- package/dist/ontology/index.js +13 -9
- package/dist/ontology/index.js.map +1 -1
- package/dist/ontology/internal.js +9 -7
- package/dist/ontology/internal.js.map +3 -3
- package/dist/ontology/json-schema.d.ts.map +1 -1
- package/dist/ontology/primitives.d.ts +3 -0
- package/dist/ontology/primitives.d.ts.map +1 -1
- package/dist/ontology/registry.d.ts +6 -0
- package/dist/ontology/registry.d.ts.map +1 -1
- package/dist/ontology/types.d.ts +9 -0
- package/dist/ontology/types.d.ts.map +1 -1
- package/dist/ontology/unique-values.d.ts +26 -0
- package/dist/ontology/unique-values.d.ts.map +1 -0
- package/dist/ontology/user-ref.d.ts +23 -0
- package/dist/ontology/user-ref.d.ts.map +1 -1
- package/dist/ontology/validation/properties.d.ts.map +1 -1
- package/dist/ontology/validation/schema.d.ts.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 +61 -46
- 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 +42 -38
- package/dist/projections/internal.js.map +1 -1
- package/dist/projections/registry.d.ts +4 -0
- package/dist/projections/registry.d.ts.map +1 -1
- package/dist/projections/revision.d.ts +15 -0
- package/dist/projections/revision.d.ts.map +1 -1
- package/dist/projections/run-dispatch.d.ts.map +1 -1
- package/dist/projections/types.d.ts +2 -0
- package/dist/projections/types.d.ts.map +1 -1
- package/dist/query.d.ts +4 -2
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +2 -2
- package/dist/rules/execution.d.ts.map +1 -1
- package/dist/runtime/ai-cost.d.ts +2 -0
- package/dist/runtime/ai-cost.d.ts.map +1 -1
- package/dist/runtime/ai-usage.d.ts +7 -0
- package/dist/runtime/ai-usage.d.ts.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/index.d.ts +1 -1
- package/dist/runtime/index.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 +58 -50
- 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 +10 -0
- package/dist/runtime/sixb.d.ts.map +1 -1
- package/dist/runtime/types.d.ts +66 -8
- package/dist/runtime/types.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 +15 -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/schedules/builders.d.ts.map +1 -1
- package/dist/schedules/index.js +3 -3
- package/dist/schedules/runtime.d.ts.map +1 -1
- package/dist/schedules/validation.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 +13 -4
- 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 +7 -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/registry.d.ts +6 -0
- package/dist/security/registry.d.ts.map +1 -1
- package/dist/security/types.d.ts +64 -6
- package/dist/security/types.d.ts.map +1 -1
- package/dist/security/validation.d.ts.map +1 -1
- package/dist/security/view-conditions.d.ts +37 -0
- package/dist/security/view-conditions.d.ts.map +1 -0
- package/dist/shares/execution.d.ts.map +1 -1
- package/dist/shares/internal.js +40 -36
- 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/provider.js +1 -1
- package/dist/storage/action-runs/types.d.ts +9 -1
- 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/errors.d.ts +3 -1
- package/dist/storage/agents/errors.d.ts.map +1 -1
- package/dist/storage/agents/in-memory.d.ts +124 -3
- package/dist/storage/agents/in-memory.d.ts.map +1 -1
- package/dist/storage/agents/index.d.ts +2 -2
- package/dist/storage/agents/index.d.ts.map +1 -1
- package/dist/storage/agents/provider.d.ts +154 -4
- package/dist/storage/agents/provider.d.ts.map +1 -1
- package/dist/storage/agents/provider.js +60 -8
- package/dist/storage/agents/provider.js.map +1 -1
- package/dist/storage/agents/types.d.ts +573 -20
- package/dist/storage/agents/types.d.ts.map +1 -1
- package/dist/storage/ai-cost/analytics.d.ts +10 -1
- package/dist/storage/ai-cost/analytics.d.ts.map +1 -1
- package/dist/storage/ai-cost/groups.d.ts +9 -0
- package/dist/storage/ai-cost/groups.d.ts.map +1 -1
- package/dist/storage/ai-cost/index.d.ts +1 -1
- package/dist/storage/ai-cost/index.d.ts.map +1 -1
- package/dist/storage/ai-cost/provider.d.ts +2 -1
- package/dist/storage/ai-cost/provider.d.ts.map +1 -1
- package/dist/storage/ai-cost/provider.js +11 -5
- package/dist/storage/ai-cost/provider.js.map +1 -1
- package/dist/storage/ai-cost/types.d.ts +14 -2
- package/dist/storage/ai-cost/types.d.ts.map +1 -1
- package/dist/storage/ai-cost/validation.d.ts.map +1 -1
- package/dist/storage/ai-limits/enforcement.js +6 -5
- package/dist/storage/ai-limits/enforcement.js.map +1 -1
- package/dist/storage/ai-limits/provider.d.ts +1 -1
- package/dist/storage/ai-limits/provider.d.ts.map +1 -1
- package/dist/storage/ai-limits/provider.js +3 -2
- package/dist/storage/ai-limits/provider.js.map +1 -1
- package/dist/storage/ai-usage/in-memory.d.ts +5 -1
- package/dist/storage/ai-usage/in-memory.d.ts.map +1 -1
- package/dist/storage/ai-usage/index.d.ts +2 -2
- package/dist/storage/ai-usage/index.d.ts.map +1 -1
- package/dist/storage/ai-usage/record.d.ts +5 -1
- package/dist/storage/ai-usage/record.d.ts.map +1 -1
- package/dist/storage/ai-usage/types.d.ts +33 -0
- package/dist/storage/ai-usage/types.d.ts.map +1 -1
- package/dist/storage/ai-usage/usage.d.ts +2 -0
- package/dist/storage/ai-usage/usage.d.ts.map +1 -1
- package/dist/storage/artifacts/errors.d.ts +18 -0
- package/dist/storage/artifacts/errors.d.ts.map +1 -0
- package/dist/storage/artifacts/in-memory.d.ts +55 -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 +34 -0
- package/dist/storage/artifacts/record.d.ts.map +1 -0
- package/dist/storage/artifacts/types.d.ts +263 -0
- package/dist/storage/artifacts/types.d.ts.map +1 -0
- package/dist/storage/auth/in-memory/auth-storage.d.ts +3 -2
- package/dist/storage/auth/in-memory/auth-storage.d.ts.map +1 -1
- 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/in-memory/users.d.ts +7 -3
- package/dist/storage/auth/in-memory/users.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 +59 -9
- 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 +3 -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 +46 -0
- package/dist/storage/executions/types.d.ts.map +1 -1
- package/dist/storage/file-upload-sessions/provider.js +17 -14
- package/dist/storage/file-upload-sessions/provider.js.map +1 -1
- 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 +15 -11
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +78 -66
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/internal.d.ts +4 -1
- package/dist/storage/internal.d.ts.map +1 -1
- package/dist/storage/internal.js +80 -19
- package/dist/storage/internal.js.map +1 -1
- package/dist/storage/migrations/migrate-storage.d.ts +4 -1
- package/dist/storage/migrations/migrate-storage.d.ts.map +1 -1
- package/dist/storage/migrations/prepare-unique-properties.d.ts +18 -0
- package/dist/storage/migrations/prepare-unique-properties.d.ts.map +1 -0
- package/dist/storage/objects/guard.d.ts +1 -1
- package/dist/storage/objects/guard.d.ts.map +1 -1
- package/dist/storage/objects/in-memory/conditional-reader.d.ts +5 -0
- package/dist/storage/objects/in-memory/conditional-reader.d.ts.map +1 -0
- package/dist/storage/objects/in-memory/query.d.ts.map +1 -1
- package/dist/storage/objects/in-memory/read-scope.d.ts +3 -9
- package/dist/storage/objects/in-memory/read-scope.d.ts.map +1 -1
- package/dist/storage/objects/in-memory/read-source.d.ts +10 -1
- package/dist/storage/objects/in-memory/read-source.d.ts.map +1 -1
- package/dist/storage/objects/in-memory/scoped-reader.d.ts +14 -0
- package/dist/storage/objects/in-memory/scoped-reader.d.ts.map +1 -0
- package/dist/storage/objects/in-memory/selected-reader.d.ts.map +1 -1
- package/dist/storage/objects/in-memory/storage.d.ts +36 -1
- package/dist/storage/objects/in-memory/storage.d.ts.map +1 -1
- package/dist/storage/objects/index.d.ts +2 -2
- package/dist/storage/objects/index.d.ts.map +1 -1
- package/dist/storage/objects/read-scope.d.ts +9 -1
- package/dist/storage/objects/read-scope.d.ts.map +1 -1
- package/dist/storage/objects/types.d.ts +64 -1
- package/dist/storage/objects/types.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/index.d.ts +2 -0
- package/dist/storage/ontology/in-memory/index.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/materializations.d.ts +1 -0
- package/dist/storage/ontology/in-memory/materializations.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/replacement-plans.d.ts.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/in-memory/unique-values.d.ts +32 -0
- package/dist/storage/ontology/in-memory/unique-values.d.ts.map +1 -0
- package/dist/storage/ontology/index.d.ts +5 -2
- package/dist/storage/ontology/index.d.ts.map +1 -1
- package/dist/storage/ontology/materializations.d.ts +34 -1
- package/dist/storage/ontology/materializations.d.ts.map +1 -1
- package/dist/storage/ontology/provider-work.d.ts +15 -2
- package/dist/storage/ontology/provider-work.d.ts.map +1 -1
- package/dist/storage/ontology/provider.d.ts +1 -1
- package/dist/storage/ontology/provider.d.ts.map +1 -1
- package/dist/storage/ontology/provider.js +9 -4
- package/dist/storage/ontology/provider.js.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/ontology/unique-values.d.ts +54 -0
- package/dist/storage/ontology/unique-values.d.ts.map +1 -0
- package/dist/storage/operation-scope.d.ts +1 -1
- package/dist/storage/operation-scope.d.ts.map +1 -1
- package/dist/storage/operation-scope.js +1 -1
- package/dist/storage/projection-runs/in-memory.d.ts +0 -6
- package/dist/storage/projection-runs/in-memory.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/provider.js +4 -3
- package/dist/storage/share-grants/provider.js.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 +6 -2
- 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 +18 -14
- 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 +49 -45
- 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-approval-storage-contract.d.ts +17 -0
- package/dist/testing/agent-approval-storage-contract.d.ts.map +1 -0
- package/dist/testing/agent-memory-storage-contract.d.ts +12 -0
- package/dist/testing/agent-memory-storage-contract.d.ts.map +1 -0
- package/dist/testing/agent-storage-contract.d.ts.map +1 -1
- package/dist/testing/ai-cost-storage-contract.d.ts.map +1 -1
- package/dist/testing/ai-limit-storage-contract.d.ts +0 -1
- package/dist/testing/ai-limit-storage-contract.d.ts.map +1 -1
- package/dist/testing/ai-model-call-groups-contract.d.ts.map +1 -1
- package/dist/testing/ai-usage-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 +13 -0
- package/dist/testing/auth-storage-contract.d.ts.map +1 -1
- package/dist/testing/broker-contract.d.ts +5 -0
- package/dist/testing/broker-contract.d.ts.map +1 -1
- package/dist/testing/effective-storage-contract.d.ts.map +1 -1
- package/dist/testing/execution-storage-contract.d.ts.map +1 -1
- package/dist/testing/file-upload-session-storage-contract.d.ts.map +1 -1
- package/dist/testing/index.d.ts +11 -5
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +9340 -3794
- package/dist/testing/index.js.map +32 -26
- 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/materializer-storage-contract.d.ts.map +1 -1
- package/dist/testing/object-conditional-read-scope-contract.d.ts +11 -0
- package/dist/testing/object-conditional-read-scope-contract.d.ts.map +1 -0
- package/dist/testing/object-query-contract.d.ts +0 -2
- package/dist/testing/object-query-contract.d.ts.map +1 -1
- package/dist/testing/ontology-storage-contract.d.ts.map +1 -1
- package/dist/testing/projection-run-storage-contract.d.ts.map +1 -1
- package/dist/testing/queues-contract.d.ts +5 -0
- package/dist/testing/queues-contract.d.ts.map +1 -1
- package/dist/testing/sandboxes-contract.d.ts.map +1 -1
- package/dist/testing/share-grant-storage-contract.d.ts.map +1 -1
- package/dist/testing/share-session-storage-contract.d.ts.map +1 -1
- package/dist/testing/unique-values-contract.d.ts +21 -0
- package/dist/testing/unique-values-contract.d.ts.map +1 -0
- package/dist/testing/webhook-execution.d.ts +0 -8
- package/dist/testing/webhook-execution.d.ts.map +1 -1
- package/dist/testing/webhook-run-storage-contract.d.ts.map +1 -1
- package/dist/users/execution.d.ts +40 -0
- package/dist/users/execution.d.ts.map +1 -0
- package/dist/users/index.d.ts +3 -0
- package/dist/users/index.d.ts.map +1 -0
- package/dist/webhooks/internal.js +42 -38
- package/dist/webhooks/internal.js.map +2 -2
- package/dist/workers/index.js +5 -7
- package/dist/workers/index.js.map +4 -4
- package/dist/workers/queue-worker.d.ts +0 -2
- package/dist/workers/queue-worker.d.ts.map +1 -1
- package/dist/workers/worker.d.ts +0 -2
- package/dist/workers/worker.d.ts.map +1 -1
- package/dist/workflows/builders.d.ts.map +1 -1
- package/dist/workflows/index.js +76 -66
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/request.d.ts +12 -1
- package/dist/workflows/request.d.ts.map +1 -1
- package/dist/workflows/types.d.ts +15 -2
- 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/commit-edits.ts +6 -1
- package/src/actions/execution.ts +55 -23
- package/src/actions/read-facade.ts +33 -0
- package/src/actions/request.ts +234 -66
- package/src/actions/run/context.ts +47 -1
- package/src/actions/run/execute.ts +13 -6
- package/src/actions/run/executor.ts +11 -2
- package/src/actions/run/normalize.ts +12 -2
- package/src/actions/run/phases.ts +2 -0
- package/src/actions/run/run-action.ts +12 -3
- package/src/actions/run/signals.ts +3 -9
- package/src/actions/run/types.ts +17 -1
- package/src/actions/run-authorization.ts +95 -0
- package/src/actions/types/context.ts +20 -3
- package/src/actions/validators.ts +19 -8
- package/src/activity/README.md +158 -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 +385 -0
- package/src/agents/accounting.ts +59 -0
- package/src/agents/adapters.ts +10 -0
- package/src/agents/agent-mail.ts +29 -0
- package/src/agents/api-gateway.ts +14 -3
- package/src/agents/approval-continuation.ts +48 -0
- package/src/agents/approval-executor.ts +318 -0
- package/src/agents/approval-outcome.ts +59 -0
- package/src/agents/approvals.ts +566 -0
- package/src/agents/authority.ts +24 -1
- package/src/agents/builders.ts +5 -3
- package/src/agents/cancel.ts +103 -0
- package/src/agents/child-question.ts +46 -0
- package/src/agents/children.ts +404 -0
- package/src/agents/context-compaction.ts +12 -0
- package/src/agents/errors.ts +31 -0
- package/src/agents/execution.ts +788 -90
- package/src/agents/fork.ts +158 -0
- package/src/agents/ids.ts +18 -6
- package/src/agents/index.ts +63 -3
- package/src/agents/memory-execution.ts +186 -0
- package/src/agents/memory.ts +178 -0
- package/src/agents/message.ts +57 -0
- package/src/agents/model-loop.ts +93 -6
- package/src/agents/model-routing.ts +193 -0
- package/src/agents/participants.ts +213 -0
- package/src/agents/reference.ts +2 -0
- package/src/agents/request.ts +398 -64
- package/src/agents/run-scope.ts +134 -0
- package/src/agents/skills.ts +6 -0
- package/src/agents/streams/index.ts +5 -0
- package/src/agents/streams/internal.ts +1 -0
- package/src/agents/streams/protocol.ts +385 -7
- package/src/agents/subagent-runs.ts +41 -0
- package/src/agents/thread-access.ts +137 -0
- package/src/agents/tool-definition.ts +5 -3
- package/src/agents/types.ts +43 -18
- package/src/agents/validation.ts +4 -0
- package/src/artifacts/access.ts +125 -0
- package/src/artifacts/address.ts +132 -0
- package/src/artifacts/canvas.ts +369 -0
- package/src/artifacts/csv.ts +118 -0
- package/src/artifacts/errors.ts +32 -0
- package/src/artifacts/execution.ts +553 -0
- package/src/artifacts/formula/check.ts +171 -0
- package/src/artifacts/formula/evaluate.ts +288 -0
- package/src/artifacts/formula/index.ts +199 -0
- package/src/artifacts/formula/parser.ts +357 -0
- package/src/artifacts/frames/assets.ts +104 -0
- package/src/artifacts/frames/entries.ts +35 -0
- package/src/artifacts/frames/grants.ts +125 -0
- package/src/artifacts/frames/index.ts +21 -0
- package/src/artifacts/frames/kit.ts +569 -0
- package/src/artifacts/frames/probe.ts +357 -0
- package/src/artifacts/frames/protocol.ts +328 -0
- package/src/artifacts/frames/runtime.ts +458 -0
- package/src/artifacts/html.ts +25 -0
- package/src/artifacts/ids.ts +18 -0
- package/src/artifacts/index.ts +125 -0
- package/src/artifacts/kinds.ts +8 -0
- package/src/artifacts/limits.ts +58 -0
- package/src/artifacts/live-sheet.ts +345 -0
- package/src/artifacts/outline.ts +95 -0
- package/src/artifacts/publish/files.ts +87 -0
- package/src/artifacts/publish/index.ts +14 -0
- package/src/artifacts/publish/publish.ts +336 -0
- package/src/artifacts/publish/queries.ts +336 -0
- package/src/artifacts/publish/references.ts +135 -0
- package/src/artifacts/publish/validate/canvas.ts +118 -0
- package/src/artifacts/publish/validate/document.ts +114 -0
- package/src/artifacts/publish/validate/file.ts +19 -0
- package/src/artifacts/publish/validate/html.ts +78 -0
- package/src/artifacts/publish/validate/page.ts +65 -0
- package/src/artifacts/publish/validate/sheet.ts +297 -0
- package/src/artifacts/publish/validate/slides.ts +82 -0
- package/src/artifacts/queries.ts +512 -0
- package/src/artifacts/references.ts +11 -0
- package/src/artifacts/resolve.ts +112 -0
- package/src/artifacts/run-query.ts +212 -0
- package/src/artifacts/serialize-query.ts +25 -0
- package/src/artifacts/sheet-rules.ts +180 -0
- package/src/artifacts/theme.ts +116 -0
- package/src/artifacts/tones.ts +20 -0
- package/src/artifacts/warnings.ts +10 -0
- package/src/artifacts/workbook.ts +674 -0
- package/src/auth/index.ts +4 -0
- package/src/auth/member-events.ts +114 -0
- package/src/auth/profile.ts +118 -0
- package/src/auth/runtime.ts +190 -9
- package/src/auth/strategy.ts +3 -0
- package/src/auth/types.ts +32 -0
- package/src/authorization/decision.ts +52 -0
- package/src/authorization/event-visibility.ts +17 -16
- package/src/authorization/grant-kinds.ts +46 -2
- package/src/authorization/index.ts +6 -1
- package/src/authorization/resolve.ts +58 -1
- package/src/authorization/run-visibility.ts +8 -1
- package/src/authorization/types.ts +14 -0
- 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/catalog.ts +26 -1
- package/src/errors/internal.ts +18 -8
- package/src/events/definitions.ts +26 -0
- package/src/events/execution.ts +171 -21
- package/src/events/index.ts +10 -1
- package/src/events/scope.ts +2 -0
- package/src/events/selectors/builder.ts +50 -0
- package/src/events/selectors/index.ts +4 -0
- package/src/events/selectors/types.ts +32 -1
- package/src/events/service.ts +55 -2
- package/src/events/types/index.ts +10 -0
- package/src/events/types/users.ts +73 -0
- package/src/events/view-conditions.ts +241 -0
- package/src/execution/agent.ts +25 -0
- package/src/execution/authorization.ts +70 -0
- package/src/execution/authorized-object-reader.ts +486 -266
- package/src/execution/lineage.ts +14 -0
- package/src/execution/object-reader-clearance.ts +91 -0
- package/src/execution/object-reader-ontology.ts +60 -0
- package/src/execution/object-reader-security.ts +270 -0
- package/src/execution/object-reader-users.ts +122 -0
- package/src/execution/preparation.ts +78 -0
- package/src/execution/request.ts +2 -0
- package/src/execution/unique-lookup.ts +55 -0
- package/src/execution/visible-objects.ts +26 -0
- package/src/http/api-routes.ts +331 -7
- package/src/index.ts +169 -4
- 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/materialization/errors.ts +37 -0
- package/src/materialization/event-envelopes.ts +11 -3
- package/src/materialization/index.ts +1 -0
- package/src/materialization/model.ts +24 -4
- package/src/materializer/README.md +7 -1
- package/src/materializer/edits/commit.ts +56 -12
- package/src/materializer/edits/load-state.ts +15 -7
- package/src/materializer/edits/operations.ts +12 -0
- package/src/materializer/edits/plan.ts +2 -0
- package/src/materializer/edits/unique-values.ts +255 -0
- package/src/materializer/edits/working-state.ts +8 -1
- package/src/materializer/execution/work-records.ts +47 -0
- package/src/materializer/projections/finish-run.ts +0 -1
- package/src/materializer/projections/replace.ts +1 -1
- package/src/materializer/projections/replacement-plan.ts +4 -1
- package/src/materializer/projections/source-materialization.ts +2 -1
- package/src/materializer/shared/normalize.ts +37 -6
- package/src/materializer/shared/projection-run.ts +1 -2
- package/src/materializer/telemetry/append.ts +14 -17
- package/src/materializer/telemetry/plan.ts +2 -0
- package/src/models/audio/catalog.ts +89 -10
- package/src/models/audio/errors.ts +18 -1
- package/src/models/audio/runtime.ts +10 -13
- package/src/models/audio/speech.ts +261 -0
- package/src/models/audio/types.ts +97 -0
- package/src/models/calls.ts +100 -0
- package/src/models/catalog-index.ts +21 -2
- package/src/models/catalog.ts +211 -35
- package/src/models/decision/runtime.ts +21 -22
- package/src/models/decision/validation.ts +4 -1
- package/src/models/definitions.ts +57 -8
- package/src/models/events.ts +72 -1
- package/src/models/execution/README.md +34 -5
- package/src/models/execution/binding.ts +3 -1
- package/src/models/execution/embedding.ts +1 -0
- package/src/models/execution/index.ts +5 -0
- package/src/models/execution/model-call-accounting.ts +3 -1
- package/src/models/execution/model-call-recorder.ts +29 -1
- package/src/models/execution/usage.ts +8 -0
- package/src/models/execution.ts +20 -22
- package/src/models/generation-types.ts +8 -1
- package/src/models/image/catalog.ts +89 -0
- package/src/models/image/errors.ts +19 -0
- package/src/models/image/runtime.ts +335 -0
- package/src/models/image/types.ts +111 -0
- package/src/models/index.ts +38 -4
- package/src/models/{audio/file.ts → input-file.ts} +22 -13
- package/src/models/language-model.ts +13 -0
- package/src/models/pricing.ts +263 -42
- package/src/models/rate-card.ts +161 -12
- package/src/objects/authorized-ontology-view.ts +1 -0
- package/src/objects/clearance-redaction.ts +138 -0
- package/src/objects/conditional-writes.ts +109 -0
- package/src/objects/execution.ts +4 -0
- package/src/objects/index.ts +8 -0
- package/src/objects/link/authorization.ts +37 -8
- package/src/objects/link/endpoints.ts +42 -11
- package/src/objects/link/remove.ts +27 -12
- package/src/objects/link/upsert-batch.ts +9 -5
- package/src/objects/link/upsert.ts +20 -14
- package/src/objects/materializer-adapter.ts +55 -18
- package/src/objects/object/delete.ts +26 -7
- package/src/objects/object/upsert-batch.ts +46 -18
- package/src/objects/object/upsert.ts +25 -8
- package/src/objects/property-clearance.ts +171 -152
- package/src/objects/query/clearance-admission.ts +112 -0
- package/src/objects/query/current-user.ts +76 -0
- package/src/objects/query/executor.ts +39 -103
- package/src/objects/query/explain.ts +20 -7
- package/src/objects/query/index.ts +2 -0
- package/src/objects/query/ir.ts +20 -0
- package/src/objects/query/link-query-clearance.ts +73 -0
- package/src/objects/query/links.ts +8 -0
- package/src/objects/query/matches-predicate.ts +108 -0
- package/src/objects/query/normalize.ts +50 -19
- package/src/objects/query/scalar-values.ts +19 -3
- package/src/objects/query/user-expansions.ts +65 -0
- package/src/objects/query/validate.ts +248 -10
- package/src/objects/runtime-batch.ts +8 -2
- package/src/objects/sdk/object-set.ts +12 -1
- package/src/objects/sdk/query-builder.ts +39 -8
- package/src/objects/sdk/query-executor.ts +6 -0
- package/src/objects/serialize.ts +79 -0
- package/src/objects/unique-violation.ts +59 -0
- package/src/objects/vectors/handle.ts +3 -3
- package/src/ontology/builders.ts +15 -1
- package/src/ontology/docs-markdown.ts +2 -1
- package/src/ontology/index.ts +2 -2
- package/src/ontology/json-schema.ts +4 -0
- package/src/ontology/primitives.ts +21 -8
- package/src/ontology/registry.ts +16 -0
- package/src/ontology/types.ts +9 -0
- package/src/ontology/unique-values.ts +84 -0
- package/src/ontology/user-ref.ts +39 -0
- package/src/ontology/validation/properties.ts +43 -0
- package/src/ontology/validation/schema.ts +9 -1
- package/src/pipelines/index.ts +2 -0
- package/src/pipelines/lineage.ts +45 -0
- package/src/projections/internal.ts +2 -2
- package/src/projections/registry.ts +16 -10
- package/src/projections/revision.ts +112 -45
- package/src/projections/run-dispatch.ts +38 -25
- package/src/projections/types.ts +2 -0
- package/src/query.ts +5 -0
- package/src/rules/execution.ts +43 -11
- package/src/runtime/ai-cost.ts +30 -0
- package/src/runtime/ai-usage.ts +32 -1
- package/src/runtime/create.ts +4 -0
- package/src/runtime/host.ts +73 -1
- package/src/runtime/index.ts +2 -0
- package/src/runtime/internal.ts +2 -0
- package/src/runtime/ontology-mutations.ts +19 -4
- package/src/runtime/resolve-definitions.ts +69 -3
- package/src/runtime/sixb.ts +53 -9
- package/src/runtime/types.ts +99 -9
- 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/schedules/builders.ts +3 -1
- package/src/schedules/runtime.ts +6 -0
- package/src/schedules/validation.ts +23 -1
- package/src/security/README.md +62 -0
- 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 +191 -11
- package/src/security/index.ts +5 -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 +13 -0
- package/src/security/projection-markings.ts +421 -0
- package/src/security/redactions.ts +7 -2
- package/src/security/registry.ts +32 -7
- package/src/security/types.ts +68 -5
- package/src/security/validation.ts +34 -11
- package/src/security/view-conditions.ts +215 -0
- package/src/shares/execution.ts +43 -10
- package/src/storage/action-runs/in-memory.ts +18 -0
- package/src/storage/action-runs/types.ts +10 -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/errors.ts +3 -0
- package/src/storage/agents/in-memory.ts +789 -32
- package/src/storage/agents/index.ts +42 -0
- package/src/storage/agents/provider.ts +730 -16
- package/src/storage/agents/types.ts +628 -27
- package/src/storage/ai-cost/analytics.ts +60 -7
- package/src/storage/ai-cost/codec.ts +6 -1
- package/src/storage/ai-cost/groups.ts +44 -1
- package/src/storage/ai-cost/index.ts +1 -0
- package/src/storage/ai-cost/provider.ts +2 -0
- package/src/storage/ai-cost/types.ts +18 -1
- package/src/storage/ai-cost/validation.ts +39 -12
- package/src/storage/ai-limits/provider.ts +4 -7
- package/src/storage/ai-usage/in-memory.ts +28 -1
- package/src/storage/ai-usage/index.ts +9 -1
- package/src/storage/ai-usage/record.ts +44 -7
- package/src/storage/ai-usage/types.ts +38 -0
- package/src/storage/ai-usage/usage.ts +15 -1
- package/src/storage/artifacts/errors.ts +28 -0
- package/src/storage/artifacts/in-memory.ts +388 -0
- package/src/storage/artifacts/index.ts +35 -0
- package/src/storage/artifacts/record.ts +260 -0
- package/src/storage/artifacts/types.ts +293 -0
- package/src/storage/auth/in-memory/auth-storage.ts +27 -2
- package/src/storage/auth/in-memory/sessions.ts +21 -0
- package/src/storage/auth/in-memory/users.ts +40 -6
- package/src/storage/auth/index.ts +3 -0
- package/src/storage/auth/types.ts +61 -7
- package/src/storage/executions/in-memory.ts +93 -1
- package/src/storage/executions/index.ts +5 -0
- package/src/storage/executions/provider.ts +12 -0
- package/src/storage/executions/types.ts +47 -0
- package/src/storage/in-memory/index.ts +16 -0
- package/src/storage/index.ts +132 -1
- package/src/storage/internal.ts +39 -1
- package/src/storage/migrations/migrate-storage.ts +8 -1
- package/src/storage/migrations/prepare-unique-properties.ts +161 -0
- package/src/storage/objects/guard.ts +7 -3
- package/src/storage/objects/in-memory/conditional-reader.ts +72 -0
- package/src/storage/objects/in-memory/query.ts +4 -105
- package/src/storage/objects/in-memory/read-scope.ts +15 -14
- package/src/storage/objects/in-memory/read-source.ts +11 -1
- package/src/storage/objects/in-memory/scoped-reader.ts +243 -0
- package/src/storage/objects/in-memory/selected-reader.ts +6 -231
- package/src/storage/objects/in-memory/storage.ts +183 -1
- package/src/storage/objects/index.ts +9 -1
- package/src/storage/objects/read-scope.ts +191 -0
- package/src/storage/objects/types.ts +68 -1
- package/src/storage/ontology/in-memory/index.ts +3 -0
- package/src/storage/ontology/in-memory/materializations.ts +35 -0
- package/src/storage/ontology/in-memory/replacement-plans.ts +4 -0
- package/src/storage/ontology/in-memory/sources.ts +23 -0
- package/src/storage/ontology/in-memory/unique-values.ts +62 -0
- package/src/storage/ontology/index.ts +12 -0
- package/src/storage/ontology/materializations.ts +35 -1
- package/src/storage/ontology/provider-work.ts +76 -0
- package/src/storage/ontology/provider.ts +3 -0
- package/src/storage/ontology/sources.ts +17 -0
- package/src/storage/ontology/unique-values.ts +56 -0
- package/src/storage/operation-scope.ts +9 -1
- package/src/storage/projection-runs/in-memory.ts +3 -35
- 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 +6 -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-approval-storage-contract.ts +1117 -0
- package/src/testing/agent-memory-storage-contract.ts +400 -0
- package/src/testing/agent-storage-contract.ts +1206 -50
- package/src/testing/ai-cost-storage-contract.ts +31 -1
- package/src/testing/ai-limit-storage-contract.ts +9 -7
- package/src/testing/ai-model-call-groups-contract.ts +76 -0
- package/src/testing/ai-usage-storage-contract.ts +120 -13
- package/src/testing/artifact-storage-contract.ts +851 -0
- package/src/testing/auth-storage-contract.ts +597 -73
- package/src/testing/broker-contract.ts +28 -23
- package/src/testing/effective-storage-contract.ts +3 -8
- package/src/testing/execution-storage-contract.ts +200 -1
- package/src/testing/file-upload-session-storage-contract.ts +12 -24
- package/src/testing/index.ts +26 -4
- package/src/testing/lake-merge-storage-contract.ts +38 -0
- package/src/testing/lake-storage-contract.ts +269 -30
- package/src/testing/materializer-storage-contract.ts +37 -9
- package/src/testing/object-conditional-read-scope-contract.ts +634 -0
- package/src/testing/object-query-contract.ts +386 -186
- package/src/testing/ontology-storage-contract.ts +286 -22
- package/src/testing/projection-run-storage-contract.ts +8 -18
- package/src/testing/queues-contract.ts +39 -70
- package/src/testing/sandboxes-contract.ts +3 -14
- package/src/testing/share-grant-storage-contract.ts +28 -16
- package/src/testing/share-session-storage-contract.ts +4 -14
- package/src/testing/unique-values-contract.ts +907 -0
- package/src/testing/webhook-execution.ts +1 -1
- package/src/testing/webhook-run-storage-contract.ts +6 -9
- package/src/users/execution.ts +131 -0
- package/src/users/index.ts +2 -0
- package/src/workers/queue-worker.ts +1 -3
- package/src/workers/worker.ts +1 -3
- package/src/workflows/builders.ts +20 -0
- package/src/workflows/request.ts +46 -8
- package/src/workflows/types.ts +15 -2
- package/src/workflows/validation.ts +95 -9
- package/dist/chunk-1k89ecfr.js +0 -85
- package/dist/chunk-1k89ecfr.js.map +0 -10
- package/dist/chunk-1sr8ryzk.js.map +0 -11
- package/dist/chunk-29yx306f.js.map +0 -22
- package/dist/chunk-3t2hgbgd.js.map +0 -15
- package/dist/chunk-4as3wt1c.js.map +0 -12
- package/dist/chunk-4vyr1j8f.js +0 -128
- package/dist/chunk-4vyr1j8f.js.map +0 -11
- package/dist/chunk-5e43w60z.js.map +0 -10
- package/dist/chunk-6c6sn0bh.js.map +0 -106
- package/dist/chunk-6p49a5cq.js.map +0 -12
- package/dist/chunk-6x0pqh32.js.map +0 -10
- package/dist/chunk-7n30ybym.js +0 -3
- package/dist/chunk-7n440zgt.js +0 -261
- package/dist/chunk-7n440zgt.js.map +0 -12
- package/dist/chunk-8mx7qw3y.js.map +0 -13
- package/dist/chunk-91mg3nj9.js.map +0 -12
- package/dist/chunk-96yw3pwd.js.map +0 -10
- package/dist/chunk-9gyp8hg1.js +0 -363
- package/dist/chunk-9gyp8hg1.js.map +0 -14
- package/dist/chunk-9k93ah50.js.map +0 -11
- package/dist/chunk-b38szspf.js.map +0 -11
- package/dist/chunk-bx9q3cwv.js.map +0 -19
- package/dist/chunk-d09tj99x.js.map +0 -12
- package/dist/chunk-ere85b8y.js.map +0 -15
- package/dist/chunk-es1gxsbf.js.map +0 -13
- package/dist/chunk-gsjm1wms.js.map +0 -10
- package/dist/chunk-hjzdd750.js.map +0 -49
- package/dist/chunk-hkc3jct7.js.map +0 -10
- package/dist/chunk-hvsb78a1.js.map +0 -20
- package/dist/chunk-k6q3n2sc.js.map +0 -12
- package/dist/chunk-n33z5bjw.js.map +0 -66
- package/dist/chunk-pbcbn83d.js.map +0 -14
- package/dist/chunk-pqajwytd.js +0 -68
- package/dist/chunk-pqajwytd.js.map +0 -11
- package/dist/chunk-qczk96d9.js.map +0 -11
- package/dist/chunk-rdghfsss.js +0 -39
- package/dist/chunk-rdghfsss.js.map +0 -10
- package/dist/chunk-rj69qcrd.js.map +0 -11
- 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 +0 -307
- package/dist/chunk-s54c868q.js.map +0 -12
- package/dist/chunk-tpn40322.js.map +0 -19
- package/dist/chunk-tw03bsmb.js.map +0 -11
- package/dist/chunk-v4jbb3rs.js.map +0 -10
- package/dist/chunk-vpq4shxz.js.map +0 -39
- package/dist/chunk-yxd3nnqt.js.map +0 -11
- package/dist/chunk-yzwja0mj.js.map +0 -14
- package/dist/events/toStoredEvent.d.ts +0 -9
- package/dist/events/toStoredEvent.d.ts.map +0 -1
- package/dist/models/audio/file.d.ts +0 -9
- package/dist/models/audio/file.d.ts.map +0 -1
- package/src/events/toStoredEvent.ts +0 -33
- /package/dist/{chunk-mfs23znk.js.map → chunk-07kkp2e1.js.map} +0 -0
- /package/dist/{chunk-fkgc1wt8.js.map → chunk-0phpbbvm.js.map} +0 -0
- /package/dist/{chunk-y0c4e6ex.js.map → chunk-3gbefjg5.js.map} +0 -0
- /package/dist/{chunk-fa02jy15.js.map → chunk-48jezz3j.js.map} +0 -0
- /package/dist/{chunk-c85m1hyj.js.map → chunk-6n69k945.js.map} +0 -0
- /package/dist/{chunk-xfs8x8m9.js.map → chunk-6p0pastb.js.map} +0 -0
- /package/dist/{chunk-t7x8dmn0.js.map → chunk-6y0mkhex.js.map} +0 -0
- /package/dist/{chunk-v9xd5wzd.js.map → chunk-bab05bhg.js.map} +0 -0
- /package/dist/{chunk-gc4ntf7d.js.map → chunk-cwdzcv37.js.map} +0 -0
- /package/dist/{chunk-vyf9kfqf.js.map → chunk-dp0cdtj2.js.map} +0 -0
- /package/dist/{chunk-br3k6qbf.js.map → chunk-fm62y49k.js.map} +0 -0
- /package/dist/{chunk-9ybhtmg4.js.map → chunk-g663fahq.js.map} +0 -0
- /package/dist/{chunk-9w055r5b.js.map → chunk-hwarjrgf.js.map} +0 -0
- /package/dist/{chunk-9dmt152s.js.map → chunk-hyesv9dv.js.map} +0 -0
- /package/dist/{chunk-x9v4cx1d.js.map → chunk-m36fw8ft.js.map} +0 -0
- /package/dist/{chunk-a40ad1ft.js.map → chunk-mbsbxarb.js.map} +0 -0
- /package/dist/{chunk-6aawea28.js.map → chunk-n8q5j6y5.js.map} +0 -0
- /package/dist/{chunk-dk8tkk5f.js.map → chunk-n9zpx9c6.js.map} +0 -0
- /package/dist/{chunk-7t429e3f.js.map → chunk-npcr0228.js.map} +0 -0
- /package/dist/{chunk-z4m0yz8c.js.map → chunk-q4pmvkg0.js.map} +0 -0
|
@@ -1,17 +1,25 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test"
|
|
2
|
+
import { createHash } from "node:crypto"
|
|
2
3
|
import { AGENT_MESSAGE_CONTENT_VERSION } from "../agents/message"
|
|
4
|
+
import { projectAgentThreadModelContext } from "../agents/thread-context-projection"
|
|
3
5
|
import type { Principal } from "../auth"
|
|
6
|
+
import type { FileRef } from "../blob-storage/types"
|
|
4
7
|
import type { SixbFailure } from "../errors/types"
|
|
5
8
|
import {
|
|
9
|
+
type AddAgentThreadParticipantsInput,
|
|
6
10
|
type AgentRunExecution,
|
|
7
11
|
type AgentRunFailureCode,
|
|
8
12
|
type AgentStorage,
|
|
9
13
|
AgentStorageError,
|
|
10
14
|
type AgentStorageErrorCode,
|
|
15
|
+
type AgentThreadParticipantRecord,
|
|
16
|
+
type ConversationAgentRunSpec,
|
|
11
17
|
type CreateAgentContextCheckpointInput,
|
|
12
18
|
type CreateAgentRunInput,
|
|
13
19
|
type CreateAgentThreadInput,
|
|
14
20
|
type CreateSubagentRunInput,
|
|
21
|
+
type ForkAgentThreadInput,
|
|
22
|
+
type ListAgentThreadChildrenInput,
|
|
15
23
|
type StartAgentRunInput,
|
|
16
24
|
} from "../storage/agents"
|
|
17
25
|
import type { AuthStorage } from "../storage/auth"
|
|
@@ -37,6 +45,7 @@ export interface AgentStorageContractSuiteOptions<
|
|
|
37
45
|
const projectId = "project-a"
|
|
38
46
|
const otherProjectId = "project-b"
|
|
39
47
|
const owner: Principal = { type: "user", id: "usr_1" }
|
|
48
|
+
const otherUser: Principal = { type: "user", id: "usr_2" }
|
|
40
49
|
const serviceAccount: Extract<Principal, { readonly type: "serviceAccount" }> = {
|
|
41
50
|
type: "serviceAccount",
|
|
42
51
|
id: "svc_agent_sales",
|
|
@@ -72,6 +81,30 @@ function threadInput(overrides: Partial<CreateAgentThreadInput> = {}): CreateAge
|
|
|
72
81
|
}
|
|
73
82
|
}
|
|
74
83
|
|
|
84
|
+
function participantsInput(
|
|
85
|
+
userIds: readonly string[],
|
|
86
|
+
addedAt = at("2026-06-23T11:00:00.000Z")
|
|
87
|
+
): AddAgentThreadParticipantsInput {
|
|
88
|
+
return {
|
|
89
|
+
projectId,
|
|
90
|
+
threadId: "thr_1",
|
|
91
|
+
principals: userIds.map((id) => ({ type: "user", id })),
|
|
92
|
+
addedBy: owner,
|
|
93
|
+
maxParticipants: 10,
|
|
94
|
+
addedAt,
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function participant(userId: string, addedAt: Date): AgentThreadParticipantRecord {
|
|
99
|
+
return {
|
|
100
|
+
projectId,
|
|
101
|
+
threadId: "thr_1",
|
|
102
|
+
principal: { type: "user", id: userId },
|
|
103
|
+
addedAt,
|
|
104
|
+
addedBy: owner,
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
75
108
|
function execution(
|
|
76
109
|
token: string,
|
|
77
110
|
queueLeaseExpiresAt = at("2026-06-23T10:05:00.000Z")
|
|
@@ -103,6 +136,18 @@ function runInput(overrides: Partial<TestRunInput> = {}): TestRunInput {
|
|
|
103
136
|
}
|
|
104
137
|
}
|
|
105
138
|
|
|
139
|
+
/** A content-addressed reference, as blob storage returns it. */
|
|
140
|
+
function testFileRef(fileName: string): FileRef {
|
|
141
|
+
const hex = createHash("sha256").update(fileName).digest("hex")
|
|
142
|
+
return {
|
|
143
|
+
blobId: `blob_${hex}`,
|
|
144
|
+
digest: `sha256:${hex}`,
|
|
145
|
+
sizeBytes: 12,
|
|
146
|
+
fileName,
|
|
147
|
+
mediaType: "text/csv",
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
106
151
|
function subagentInput(
|
|
107
152
|
parentExecutionToken: string,
|
|
108
153
|
overrides: Partial<CreateSubagentRunInput> = {}
|
|
@@ -121,7 +166,10 @@ function subagentInput(
|
|
|
121
166
|
task: "Research the open orders.",
|
|
122
167
|
toolNames: ["search_orders"],
|
|
123
168
|
maxSteps: 25,
|
|
169
|
+
files: [{ path: "reports/orders.csv", fileRef: testFileRef("orders.csv") }],
|
|
124
170
|
},
|
|
171
|
+
thread: { id: `thread_${id}`, create: true },
|
|
172
|
+
trigger: { id: `task_${id}`, parts: [{ type: "text", text: "Research the open orders." }] },
|
|
125
173
|
maxActiveChildren: 4,
|
|
126
174
|
createdAt: at("2026-06-23T10:01:00.000Z"),
|
|
127
175
|
...overrides,
|
|
@@ -267,6 +315,143 @@ async function prepareCheckpointCandidate(
|
|
|
267
315
|
)
|
|
268
316
|
}
|
|
269
317
|
|
|
318
|
+
const forkedFile = {
|
|
319
|
+
blobId: "blob_report",
|
|
320
|
+
digest: `sha256:${"a".repeat(64)}`,
|
|
321
|
+
sizeBytes: 12,
|
|
322
|
+
fileName: "report.csv",
|
|
323
|
+
mediaType: "text/csv",
|
|
324
|
+
} as const
|
|
325
|
+
|
|
326
|
+
function forkInput(overrides: Partial<ForkAgentThreadInput> = {}): ForkAgentThreadInput {
|
|
327
|
+
return {
|
|
328
|
+
projectId,
|
|
329
|
+
sourceThreadId: "thr_1",
|
|
330
|
+
id: "thr_fork",
|
|
331
|
+
ownerPrincipal: otherUser,
|
|
332
|
+
title: "Slipped deals",
|
|
333
|
+
createdAt: at("2026-06-23T11:00:00.000Z"),
|
|
334
|
+
...overrides,
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Two finished turns, then a third still running, each compacted by the run that follows:
|
|
340
|
+
* `checkpoint_1` (written by finished `run_2`) and `checkpoint_2` (written by running `run_3`,
|
|
341
|
+
* anchored on its trigger `m5`).
|
|
342
|
+
*/
|
|
343
|
+
async function prepareForkSource(
|
|
344
|
+
storage: AgentStorage,
|
|
345
|
+
fixture: AgentStorageContractStorage,
|
|
346
|
+
/** The summary of the checkpoint the third turn writes. */
|
|
347
|
+
summary = "Three deals slipped; Acme waits on legal review."
|
|
348
|
+
): Promise<void> {
|
|
349
|
+
await storage.threads.create(threadInput({ title: "Slipped deals" }))
|
|
350
|
+
await storage.messages.append({
|
|
351
|
+
id: "m1",
|
|
352
|
+
projectId,
|
|
353
|
+
threadId: "thr_1",
|
|
354
|
+
runId: null,
|
|
355
|
+
role: "user",
|
|
356
|
+
authorPrincipal: owner,
|
|
357
|
+
parts: [
|
|
358
|
+
{ type: "text", text: "Which deals slipped?" },
|
|
359
|
+
{ type: "file", fileRef: forkedFile },
|
|
360
|
+
],
|
|
361
|
+
metadata: { source: "chat" },
|
|
362
|
+
createdAt: at("2026-06-23T10:00:01.000Z"),
|
|
363
|
+
})
|
|
364
|
+
await createAndStartRun(storage, fixture, runInput({ id: "run_1", triggerMessageId: "m1" }))
|
|
365
|
+
await storage.messages.append({
|
|
366
|
+
id: "m2",
|
|
367
|
+
projectId,
|
|
368
|
+
threadId: "thr_1",
|
|
369
|
+
runId: "run_1",
|
|
370
|
+
role: "assistant",
|
|
371
|
+
authorPrincipal: owner,
|
|
372
|
+
parts: [
|
|
373
|
+
{ type: "step-start" },
|
|
374
|
+
{
|
|
375
|
+
type: "tool-call",
|
|
376
|
+
toolCallId: "call_1",
|
|
377
|
+
toolName: "bash",
|
|
378
|
+
input: { cmd: "report" },
|
|
379
|
+
state: "output-available",
|
|
380
|
+
output: { file: forkedFile },
|
|
381
|
+
},
|
|
382
|
+
{ type: "text", text: "Three deals slipped." },
|
|
383
|
+
],
|
|
384
|
+
createdAt: at("2026-06-23T10:00:02.000Z"),
|
|
385
|
+
completedAt: at("2026-06-23T10:00:03.000Z"),
|
|
386
|
+
})
|
|
387
|
+
await storage.runs.finish({
|
|
388
|
+
id: "run_1",
|
|
389
|
+
projectId,
|
|
390
|
+
executionToken: "exec_1",
|
|
391
|
+
status: "succeeded",
|
|
392
|
+
})
|
|
393
|
+
|
|
394
|
+
await storage.messages.append({
|
|
395
|
+
id: "m3",
|
|
396
|
+
projectId,
|
|
397
|
+
threadId: "thr_1",
|
|
398
|
+
runId: null,
|
|
399
|
+
role: "user",
|
|
400
|
+
authorPrincipal: owner,
|
|
401
|
+
parts: [{ type: "text", text: "Why did Acme slip?" }],
|
|
402
|
+
createdAt: at("2026-06-23T10:00:04.000Z"),
|
|
403
|
+
})
|
|
404
|
+
await createAndStartRun(
|
|
405
|
+
storage,
|
|
406
|
+
fixture,
|
|
407
|
+
runInput({ id: "run_2", triggerMessageId: "m3", execution: execution("exec_2") })
|
|
408
|
+
)
|
|
409
|
+
await storage.checkpoints.create(checkpointInput())
|
|
410
|
+
await storage.messages.append({
|
|
411
|
+
id: "m4",
|
|
412
|
+
projectId,
|
|
413
|
+
threadId: "thr_1",
|
|
414
|
+
runId: "run_2",
|
|
415
|
+
role: "assistant",
|
|
416
|
+
parts: [{ type: "text", text: "Legal review." }],
|
|
417
|
+
createdAt: at("2026-06-23T10:00:05.000Z"),
|
|
418
|
+
})
|
|
419
|
+
await storage.runs.finish({
|
|
420
|
+
id: "run_2",
|
|
421
|
+
projectId,
|
|
422
|
+
executionToken: "exec_2",
|
|
423
|
+
status: "succeeded",
|
|
424
|
+
})
|
|
425
|
+
|
|
426
|
+
await storage.messages.append({
|
|
427
|
+
id: "m5",
|
|
428
|
+
projectId,
|
|
429
|
+
threadId: "thr_1",
|
|
430
|
+
runId: null,
|
|
431
|
+
role: "user",
|
|
432
|
+
parts: [{ type: "text", text: "Draft the emails." }],
|
|
433
|
+
createdAt: at("2026-06-23T10:00:06.000Z"),
|
|
434
|
+
})
|
|
435
|
+
await createAndStartRun(
|
|
436
|
+
storage,
|
|
437
|
+
fixture,
|
|
438
|
+
runInput({ id: "run_3", triggerMessageId: "m5", execution: execution("exec_3") })
|
|
439
|
+
)
|
|
440
|
+
await storage.checkpoints.create(
|
|
441
|
+
checkpointInput({
|
|
442
|
+
id: "checkpoint_2",
|
|
443
|
+
createdByRunId: "run_3",
|
|
444
|
+
expectedPreviousCheckpointId: "checkpoint_1",
|
|
445
|
+
expectedHeadSeq: 5,
|
|
446
|
+
executionToken: "exec_3",
|
|
447
|
+
summary,
|
|
448
|
+
summarizedThroughSeq: 4,
|
|
449
|
+
observedHeadSeq: 5,
|
|
450
|
+
createdAt: at("2026-06-23T10:05:00.000Z"),
|
|
451
|
+
})
|
|
452
|
+
)
|
|
453
|
+
}
|
|
454
|
+
|
|
270
455
|
/**
|
|
271
456
|
* Runs the shared `AgentStorage` contract against any storage implementation.
|
|
272
457
|
*
|
|
@@ -565,6 +750,20 @@ export function runAgentStorageContractSuite<TStorage extends AgentStorageContra
|
|
|
565
750
|
})
|
|
566
751
|
})
|
|
567
752
|
|
|
753
|
+
test("reads several threads at once, in the order asked", async () => {
|
|
754
|
+
await withStorage(async (storage) => {
|
|
755
|
+
const first = await storage.threads.create(threadInput())
|
|
756
|
+
const second = await storage.threads.create(threadInput({ id: "thr_2" }))
|
|
757
|
+
await storage.threads.create(threadInput({ id: "thr_3", projectId: otherProjectId }))
|
|
758
|
+
|
|
759
|
+
await expect(
|
|
760
|
+
storage.threads.getByIds({ projectId, ids: ["thr_2", "missing", "thr_1", "thr_2"] })
|
|
761
|
+
).resolves.toEqual([second, first])
|
|
762
|
+
await expect(storage.threads.getByIds({ projectId, ids: ["thr_3"] })).resolves.toEqual([])
|
|
763
|
+
await expect(storage.threads.getByIds({ projectId, ids: [] })).resolves.toEqual([])
|
|
764
|
+
})
|
|
765
|
+
})
|
|
766
|
+
|
|
568
767
|
test("lists threads with filters, ordering, and pagination", async () => {
|
|
569
768
|
await withStorage(async (storage) => {
|
|
570
769
|
await storage.threads.create(
|
|
@@ -609,6 +808,200 @@ export function runAgentStorageContractSuite<TStorage extends AgentStorageContra
|
|
|
609
808
|
})
|
|
610
809
|
})
|
|
611
810
|
|
|
811
|
+
// ── participants ───────────────────────────────────────────────────────────────────────────
|
|
812
|
+
|
|
813
|
+
test("adds participants once and keeps when and by whom they were first added", async () => {
|
|
814
|
+
await withStorage(async (storage) => {
|
|
815
|
+
await storage.threads.create(threadInput())
|
|
816
|
+
|
|
817
|
+
const first = await storage.threads.addParticipants(
|
|
818
|
+
participantsInput(["usr_cleo", "usr_bob"], at("2026-06-23T11:00:00.000Z"))
|
|
819
|
+
)
|
|
820
|
+
expect(first).toEqual([
|
|
821
|
+
participant("usr_bob", at("2026-06-23T11:00:00.000Z")),
|
|
822
|
+
participant("usr_cleo", at("2026-06-23T11:00:00.000Z")),
|
|
823
|
+
])
|
|
824
|
+
|
|
825
|
+
const again = await storage.threads.addParticipants({
|
|
826
|
+
...participantsInput(["usr_cleo", "usr_dan"], at("2026-06-23T12:00:00.000Z")),
|
|
827
|
+
addedBy: { type: "system", id: "system" },
|
|
828
|
+
})
|
|
829
|
+
expect(again).toEqual([
|
|
830
|
+
participant("usr_bob", at("2026-06-23T11:00:00.000Z")),
|
|
831
|
+
participant("usr_cleo", at("2026-06-23T11:00:00.000Z")),
|
|
832
|
+
{
|
|
833
|
+
...participant("usr_dan", at("2026-06-23T12:00:00.000Z")),
|
|
834
|
+
addedBy: { type: "system", id: "system" },
|
|
835
|
+
},
|
|
836
|
+
])
|
|
837
|
+
|
|
838
|
+
expect(
|
|
839
|
+
await storage.threads.listParticipants({ projectId, threadIds: ["thr_1", "thr_1"] })
|
|
840
|
+
).toEqual(again)
|
|
841
|
+
})
|
|
842
|
+
})
|
|
843
|
+
|
|
844
|
+
// Regression proof: compare ids with localeCompare in compareAgentThreadParticipants; it puts
|
|
845
|
+
// "usr_a" before "usr_B", where PostgreSQL's "C" collation and SQLite put "usr_B" first.
|
|
846
|
+
test("orders participants added at once by their ids' bytes, alike everywhere", async () => {
|
|
847
|
+
await withStorage(async (storage) => {
|
|
848
|
+
await storage.threads.create(threadInput())
|
|
849
|
+
await storage.threads.create(threadInput({ id: "thr_2" }))
|
|
850
|
+
for (const threadId of ["thr_2", "thr_1"]) {
|
|
851
|
+
await storage.threads.addParticipants({
|
|
852
|
+
...participantsInput(["usr_a", "usr_B", "usr_é"]),
|
|
853
|
+
threadId,
|
|
854
|
+
})
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
const listed = await storage.threads.listParticipants({
|
|
858
|
+
projectId,
|
|
859
|
+
threadIds: ["thr_2", "thr_1"],
|
|
860
|
+
})
|
|
861
|
+
expect(listed.map((record) => `${record.principal.id}@${record.threadId}`)).toEqual([
|
|
862
|
+
"usr_B@thr_1",
|
|
863
|
+
"usr_B@thr_2",
|
|
864
|
+
"usr_a@thr_1",
|
|
865
|
+
"usr_a@thr_2",
|
|
866
|
+
"usr_é@thr_1",
|
|
867
|
+
"usr_é@thr_2",
|
|
868
|
+
])
|
|
869
|
+
})
|
|
870
|
+
})
|
|
871
|
+
|
|
872
|
+
test("lets one of several adds racing for the last place win", async () => {
|
|
873
|
+
// Concurrent calls rarely interleave here; the PostgreSQL suite holds a transaction open to
|
|
874
|
+
// prove its row lock. This checks the outcome every provider must give.
|
|
875
|
+
await withStorage(async (storage) => {
|
|
876
|
+
await storage.threads.create(threadInput())
|
|
877
|
+
await storage.threads.addParticipants(participantsInput(["usr_bob"]))
|
|
878
|
+
|
|
879
|
+
const racers = ["usr_cleo", "usr_dan", "usr_eve", "usr_fay", "usr_gus"]
|
|
880
|
+
const race = await Promise.allSettled(
|
|
881
|
+
racers.map((id) =>
|
|
882
|
+
storage.threads.addParticipants({ ...participantsInput([id]), maxParticipants: 2 })
|
|
883
|
+
)
|
|
884
|
+
)
|
|
885
|
+
expect(race.filter((result) => result.status === "fulfilled")).toHaveLength(1)
|
|
886
|
+
for (const result of race) {
|
|
887
|
+
if (result.status === "rejected") {
|
|
888
|
+
expect(result.reason).toMatchObject({ code: "participant_limit" })
|
|
889
|
+
}
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
expect(
|
|
893
|
+
await storage.threads.listParticipants({ projectId, threadIds: ["thr_1"] })
|
|
894
|
+
).toHaveLength(2)
|
|
895
|
+
})
|
|
896
|
+
})
|
|
897
|
+
|
|
898
|
+
test("refuses participants past the limit, and missing threads", async () => {
|
|
899
|
+
await withStorage(async (storage) => {
|
|
900
|
+
await storage.threads.create(threadInput())
|
|
901
|
+
await storage.threads.addParticipants(participantsInput(["usr_bob"]))
|
|
902
|
+
|
|
903
|
+
// Regression proof: drop the limit check in participantsToAdd; the third user is added.
|
|
904
|
+
await expectAgentError(
|
|
905
|
+
storage.threads.addParticipants({
|
|
906
|
+
...participantsInput(["usr_cleo", "usr_dan"]),
|
|
907
|
+
maxParticipants: 2,
|
|
908
|
+
}),
|
|
909
|
+
"participant_limit"
|
|
910
|
+
)
|
|
911
|
+
await expectAgentError(
|
|
912
|
+
storage.threads.addParticipants({ ...participantsInput(["usr_bob"]), threadId: "nope" }),
|
|
913
|
+
"thread_not_found"
|
|
914
|
+
)
|
|
915
|
+
|
|
916
|
+
// A refused add adds no one, and someone already there does not count twice.
|
|
917
|
+
const kept = await storage.threads.addParticipants({
|
|
918
|
+
...participantsInput(["usr_bob", "usr_cleo"]),
|
|
919
|
+
maxParticipants: 2,
|
|
920
|
+
})
|
|
921
|
+
expect(kept.map((record) => record.principal.id)).toEqual(["usr_bob", "usr_cleo"])
|
|
922
|
+
})
|
|
923
|
+
})
|
|
924
|
+
|
|
925
|
+
test("removes a participant and lists the threads shared with a user", async () => {
|
|
926
|
+
await withStorage(async (storage) => {
|
|
927
|
+
await storage.threads.create(
|
|
928
|
+
threadInput({ id: "thr_a", createdAt: at("2026-06-23T10:00:00.000Z") })
|
|
929
|
+
)
|
|
930
|
+
await storage.threads.create(
|
|
931
|
+
threadInput({ id: "thr_b", createdAt: at("2026-06-23T10:01:00.000Z") })
|
|
932
|
+
)
|
|
933
|
+
await storage.threads.create(
|
|
934
|
+
threadInput({ id: "thr_c", createdAt: at("2026-06-23T10:02:00.000Z") })
|
|
935
|
+
)
|
|
936
|
+
await storage.threads.create(threadInput({ id: "thr_a", projectId: otherProjectId }))
|
|
937
|
+
for (const threadId of ["thr_a", "thr_c"]) {
|
|
938
|
+
await storage.threads.addParticipants({ ...participantsInput(["usr_bob"]), threadId })
|
|
939
|
+
}
|
|
940
|
+
await storage.threads.addParticipants({
|
|
941
|
+
...participantsInput(["usr_bob"]),
|
|
942
|
+
projectId: otherProjectId,
|
|
943
|
+
threadId: "thr_a",
|
|
944
|
+
})
|
|
945
|
+
|
|
946
|
+
const bob = { type: "user", id: "usr_bob" } as const
|
|
947
|
+
const shared = await storage.threads.list({
|
|
948
|
+
projectId,
|
|
949
|
+
participantPrincipal: bob,
|
|
950
|
+
order: "asc",
|
|
951
|
+
})
|
|
952
|
+
expect(shared.threads.map((thread) => thread.id)).toEqual(["thr_a", "thr_c"])
|
|
953
|
+
expect(shared.total).toBe(2)
|
|
954
|
+
|
|
955
|
+
const page = await storage.threads.list({
|
|
956
|
+
projectId,
|
|
957
|
+
participantPrincipal: bob,
|
|
958
|
+
order: "desc",
|
|
959
|
+
limit: 1,
|
|
960
|
+
})
|
|
961
|
+
expect(page.threads.map((thread) => thread.id)).toEqual(["thr_c"])
|
|
962
|
+
expect(page.hasMore).toBe(true)
|
|
963
|
+
|
|
964
|
+
expect(
|
|
965
|
+
await storage.threads.removeParticipant({ projectId, threadId: "thr_a", principal: bob })
|
|
966
|
+
).toBe(true)
|
|
967
|
+
expect(
|
|
968
|
+
await storage.threads.removeParticipant({ projectId, threadId: "thr_a", principal: bob })
|
|
969
|
+
).toBe(false)
|
|
970
|
+
expect(
|
|
971
|
+
await storage.threads.removeParticipant({ projectId, threadId: "nope", principal: bob })
|
|
972
|
+
).toBe(false)
|
|
973
|
+
|
|
974
|
+
const after = await storage.threads.list({ projectId, participantPrincipal: bob })
|
|
975
|
+
expect(after.threads.map((thread) => thread.id)).toEqual(["thr_c"])
|
|
976
|
+
expect(
|
|
977
|
+
await storage.threads.listParticipants({ projectId, threadIds: ["thr_a", "thr_b"] })
|
|
978
|
+
).toEqual([])
|
|
979
|
+
expect(
|
|
980
|
+
await storage.threads.listParticipants({
|
|
981
|
+
projectId: otherProjectId,
|
|
982
|
+
threadIds: ["thr_a"],
|
|
983
|
+
})
|
|
984
|
+
).toHaveLength(1)
|
|
985
|
+
})
|
|
986
|
+
})
|
|
987
|
+
|
|
988
|
+
test("rolls participants back with their transaction", async () => {
|
|
989
|
+
await withStorage(async (storage, fixture) => {
|
|
990
|
+
await storage.threads.create(threadInput())
|
|
991
|
+
|
|
992
|
+
await expect(
|
|
993
|
+
fixture.transaction(async (tx) => {
|
|
994
|
+
await tx.agents?.threads.addParticipants(participantsInput(["usr_bob"]))
|
|
995
|
+
throw new Error("rollback")
|
|
996
|
+
})
|
|
997
|
+
).rejects.toThrow("rollback")
|
|
998
|
+
|
|
999
|
+
expect(await storage.threads.listParticipants({ projectId, threadIds: ["thr_1"] })).toEqual(
|
|
1000
|
+
[]
|
|
1001
|
+
)
|
|
1002
|
+
})
|
|
1003
|
+
})
|
|
1004
|
+
|
|
612
1005
|
// ── durable queued runs ────────────────────────────────────────────────────────────────────
|
|
613
1006
|
|
|
614
1007
|
test("creates a queued run before execution and claims the thread", async () => {
|
|
@@ -648,6 +1041,37 @@ export function runAgentStorageContractSuite<TStorage extends AgentStorageContra
|
|
|
648
1041
|
})
|
|
649
1042
|
})
|
|
650
1043
|
|
|
1044
|
+
test("keeps a turn's tier and the probabilities Sixb picked it from", async () => {
|
|
1045
|
+
await withStorage(async (storage, fixture) => {
|
|
1046
|
+
await storage.threads.create(threadInput())
|
|
1047
|
+
const spec = {
|
|
1048
|
+
model: { provider: "test", modelId: "large" },
|
|
1049
|
+
tier: "heavy" as const,
|
|
1050
|
+
tierProbabilities: { light: 0.05, standard: 0.25, heavy: 0.7 },
|
|
1051
|
+
reasoning: "high" as const,
|
|
1052
|
+
}
|
|
1053
|
+
|
|
1054
|
+
await createRun(storage, fixture, runInput({ id: "run_1", spec }))
|
|
1055
|
+
expect((await storage.runs.getById({ projectId, id: "run_1" }))?.spec).toEqual(spec)
|
|
1056
|
+
|
|
1057
|
+
// Proven by removal: drop the tier checks from assertConversationAgentRunSpec.
|
|
1058
|
+
for (const invalid of [
|
|
1059
|
+
{ ...spec, tier: "medium" },
|
|
1060
|
+
{ ...spec, tierProbabilities: { light: 0.3, standard: 0.7 } },
|
|
1061
|
+
{ ...spec, tierProbabilities: { ...spec.tierProbabilities, heavy: 1.5 } },
|
|
1062
|
+
]) {
|
|
1063
|
+
await expectAgentError(
|
|
1064
|
+
createRun(
|
|
1065
|
+
storage,
|
|
1066
|
+
fixture,
|
|
1067
|
+
runInput({ id: "run_2", spec: invalid as ConversationAgentRunSpec })
|
|
1068
|
+
),
|
|
1069
|
+
"invalid_input"
|
|
1070
|
+
)
|
|
1071
|
+
}
|
|
1072
|
+
})
|
|
1073
|
+
})
|
|
1074
|
+
|
|
651
1075
|
test("rejects a run whose durable execution does not match its Agent authority", async () => {
|
|
652
1076
|
await withStorage(async (storage, fixture) => {
|
|
653
1077
|
await storage.threads.create(threadInput())
|
|
@@ -723,7 +1147,7 @@ export function runAgentStorageContractSuite<TStorage extends AgentStorageContra
|
|
|
723
1147
|
|
|
724
1148
|
// ── durable child runs ─────────────────────────────────────────────────────────────────────
|
|
725
1149
|
|
|
726
|
-
test("creates
|
|
1150
|
+
test("creates a child's thread, its task and its run at once, and replays them exactly", async () => {
|
|
727
1151
|
await withStorage(async (storage, fixture) => {
|
|
728
1152
|
await createRunningParent(storage, fixture)
|
|
729
1153
|
const input = subagentInput("parent_token")
|
|
@@ -732,14 +1156,51 @@ export function runAgentStorageContractSuite<TStorage extends AgentStorageContra
|
|
|
732
1156
|
expect(child).toMatchObject({
|
|
733
1157
|
kind: "subagent",
|
|
734
1158
|
id: "child_1",
|
|
1159
|
+
threadId: "thread_child_1",
|
|
1160
|
+
triggerMessageId: "task_child_1",
|
|
735
1161
|
parentRunId: "parent_1",
|
|
736
1162
|
spawnKey: "research-orders",
|
|
737
1163
|
status: "queued",
|
|
738
1164
|
attempt: 0,
|
|
739
1165
|
spec: input.spec,
|
|
740
1166
|
})
|
|
741
|
-
expect(
|
|
742
|
-
|
|
1167
|
+
await expect(storage.threads.getById({ projectId, id: "thread_child_1" })).resolves.toEqual(
|
|
1168
|
+
{
|
|
1169
|
+
id: "thread_child_1",
|
|
1170
|
+
projectId,
|
|
1171
|
+
kind: "subagent",
|
|
1172
|
+
parent: { threadId: "parent_thread", spawnedBy: "parent_1", key: "research-orders" },
|
|
1173
|
+
ownerPrincipal: owner,
|
|
1174
|
+
status: "active",
|
|
1175
|
+
activeRunId: "child_1",
|
|
1176
|
+
lastMessageAt: at("2026-06-23T10:01:00.000Z"),
|
|
1177
|
+
messageCount: 1,
|
|
1178
|
+
createdAt: at("2026-06-23T10:01:00.000Z"),
|
|
1179
|
+
updatedAt: at("2026-06-23T10:01:00.000Z"),
|
|
1180
|
+
}
|
|
1181
|
+
)
|
|
1182
|
+
const task = {
|
|
1183
|
+
id: "task_child_1",
|
|
1184
|
+
projectId,
|
|
1185
|
+
threadId: "thread_child_1",
|
|
1186
|
+
runId: "child_1",
|
|
1187
|
+
role: "user",
|
|
1188
|
+
seq: 1,
|
|
1189
|
+
parts: [{ type: "text", text: "Research the open orders." }],
|
|
1190
|
+
contentVersion: AGENT_MESSAGE_CONTENT_VERSION,
|
|
1191
|
+
createdAt: at("2026-06-23T10:01:00.000Z"),
|
|
1192
|
+
}
|
|
1193
|
+
await expect(
|
|
1194
|
+
storage.messages.list({ projectId, threadId: "thread_child_1" })
|
|
1195
|
+
).resolves.toMatchObject({ messages: [task], total: 1 })
|
|
1196
|
+
|
|
1197
|
+
// A replay writes nothing more, whatever trigger it brings.
|
|
1198
|
+
await expect(
|
|
1199
|
+
storage.runs.createSubagent({ ...input, trigger: { ...input.trigger, id: "other" } })
|
|
1200
|
+
).resolves.toEqual(child)
|
|
1201
|
+
await expect(
|
|
1202
|
+
storage.messages.list({ projectId, threadId: "thread_child_1" })
|
|
1203
|
+
).resolves.toMatchObject({ total: 1 })
|
|
743
1204
|
await expectAgentError(
|
|
744
1205
|
storage.runs.createSubagent({
|
|
745
1206
|
...input,
|
|
@@ -754,12 +1215,332 @@ export function runAgentStorageContractSuite<TStorage extends AgentStorageContra
|
|
|
754
1215
|
parentRunId: "parent_1",
|
|
755
1216
|
})
|
|
756
1217
|
expect(listed.runs.map((run) => run.id)).toEqual(["child_1"])
|
|
1218
|
+
await expect(
|
|
1219
|
+
storage.runs.list({ projectId, threadId: "thread_child_1" })
|
|
1220
|
+
).resolves.toMatchObject({ runs: [{ id: "child_1" }], total: 1 })
|
|
757
1221
|
await expect(
|
|
758
1222
|
storage.runs.list({ projectId, kinds: ["conversation"] })
|
|
759
1223
|
).resolves.toMatchObject({ runs: [{ id: "parent_1" }], total: 1 })
|
|
760
1224
|
await expect(
|
|
761
|
-
storage.threads.getById({ projectId, id: "parent_thread" })
|
|
762
|
-
).resolves.toMatchObject({ activeRunId: "parent_1" })
|
|
1225
|
+
storage.threads.getById({ projectId, id: "parent_thread" })
|
|
1226
|
+
).resolves.toMatchObject({ activeRunId: "parent_1", messageCount: 0 })
|
|
1227
|
+
})
|
|
1228
|
+
})
|
|
1229
|
+
|
|
1230
|
+
test("rolls a child's thread back with its run", async () => {
|
|
1231
|
+
await withStorage(async (storage, fixture) => {
|
|
1232
|
+
await createRunningParent(storage, fixture)
|
|
1233
|
+
const input = subagentInput("parent_token")
|
|
1234
|
+
await createTestAgentExecution(fixture, {
|
|
1235
|
+
projectId,
|
|
1236
|
+
runId: input.id,
|
|
1237
|
+
executionId: input.executionId,
|
|
1238
|
+
sourceExecutionId: "test_agent_execution:parent_1",
|
|
1239
|
+
authority: "inherited",
|
|
1240
|
+
})
|
|
1241
|
+
|
|
1242
|
+
const rolledBack = await fixture
|
|
1243
|
+
.transaction(async (tx) => {
|
|
1244
|
+
await tx.agents?.runs.createSubagent(input)
|
|
1245
|
+
throw new Error("rollback")
|
|
1246
|
+
})
|
|
1247
|
+
.catch((error: unknown) => error)
|
|
1248
|
+
expect(rolledBack).toMatchObject({ message: "rollback" })
|
|
1249
|
+
|
|
1250
|
+
await expect(storage.threads.getById({ projectId, id: "thread_child_1" })).resolves.toBe(
|
|
1251
|
+
null
|
|
1252
|
+
)
|
|
1253
|
+
await expect(storage.messages.getById({ projectId, id: "task_child_1" })).resolves.toBe(
|
|
1254
|
+
null
|
|
1255
|
+
)
|
|
1256
|
+
await expect(storage.runs.getById({ projectId, id: "child_1" })).resolves.toBe(null)
|
|
1257
|
+
})
|
|
1258
|
+
})
|
|
1259
|
+
|
|
1260
|
+
test("keeps a sub-agent's workspace on its thread, fenced by the thread's active run", async () => {
|
|
1261
|
+
// Removal proofs: require `sandboxParams` again in transitionAgentThreadSandbox, and the
|
|
1262
|
+
// child's acquire is refused as unconfigured; fence on `run.kind === "conversation"` again,
|
|
1263
|
+
// and it is refused as lost; drop `startSubagentWorkspaceAgain`, and the destroyed
|
|
1264
|
+
// workspace cannot be started again.
|
|
1265
|
+
await withStorage(async (storage, fixture) => {
|
|
1266
|
+
await createRunningParent(storage, fixture)
|
|
1267
|
+
await createSubagent(storage, fixture)
|
|
1268
|
+
await storage.runs.start({
|
|
1269
|
+
projectId,
|
|
1270
|
+
id: "child_1",
|
|
1271
|
+
execution: execution("child_token", new Date("2099-01-01")),
|
|
1272
|
+
})
|
|
1273
|
+
const acquire = {
|
|
1274
|
+
projectId,
|
|
1275
|
+
id: "thread_child_1",
|
|
1276
|
+
action: "acquire" as const,
|
|
1277
|
+
runId: "child_1",
|
|
1278
|
+
executionToken: "child_token",
|
|
1279
|
+
name: "child-workspace",
|
|
1280
|
+
sourceFingerprint: "b".repeat(64),
|
|
1281
|
+
}
|
|
1282
|
+
|
|
1283
|
+
// The turn it runs under does not own the child's thread.
|
|
1284
|
+
await expectAgentError(
|
|
1285
|
+
storage.threads.transitionSandbox({
|
|
1286
|
+
...acquire,
|
|
1287
|
+
runId: "parent_1",
|
|
1288
|
+
executionToken: "parent_token",
|
|
1289
|
+
}),
|
|
1290
|
+
"execution_lost"
|
|
1291
|
+
)
|
|
1292
|
+
await expect(storage.threads.transitionSandbox(acquire)).resolves.toMatchObject({
|
|
1293
|
+
name: "child-workspace",
|
|
1294
|
+
status: "busy",
|
|
1295
|
+
owner: { runId: "child_1", executionToken: "child_token" },
|
|
1296
|
+
})
|
|
1297
|
+
await storage.threads.transitionSandbox({
|
|
1298
|
+
...acquire,
|
|
1299
|
+
action: "settle",
|
|
1300
|
+
status: "ready",
|
|
1301
|
+
initialized: true,
|
|
1302
|
+
})
|
|
1303
|
+
await expect(
|
|
1304
|
+
storage.threads.getById({ projectId, id: "thread_child_1" })
|
|
1305
|
+
).resolves.toMatchObject({
|
|
1306
|
+
sandboxState: { name: "child-workspace", status: "ready", initialized: true },
|
|
1307
|
+
})
|
|
1308
|
+
|
|
1309
|
+
// A run that destroyed it, or left it unsaved, leaves the next a fresh one to start.
|
|
1310
|
+
await storage.threads.transitionSandbox(acquire)
|
|
1311
|
+
await storage.threads.transitionSandbox({
|
|
1312
|
+
...acquire,
|
|
1313
|
+
action: "settle",
|
|
1314
|
+
status: "unavailable",
|
|
1315
|
+
initialized: true,
|
|
1316
|
+
})
|
|
1317
|
+
await expectAgentError(storage.threads.transitionSandbox(acquire), "invalid_state")
|
|
1318
|
+
await expect(
|
|
1319
|
+
storage.threads.transitionSandbox({ ...acquire, name: "child-workspace-2" })
|
|
1320
|
+
).resolves.toEqual({
|
|
1321
|
+
name: "child-workspace-2",
|
|
1322
|
+
status: "busy",
|
|
1323
|
+
initialized: false,
|
|
1324
|
+
resetAt: expect.any(String),
|
|
1325
|
+
sourceFingerprint: acquire.sourceFingerprint,
|
|
1326
|
+
owner: { runId: "child_1", executionToken: "child_token" },
|
|
1327
|
+
})
|
|
1328
|
+
})
|
|
1329
|
+
})
|
|
1330
|
+
|
|
1331
|
+
test("runs one child run at a time in its thread", async () => {
|
|
1332
|
+
// Removal proof: drop the active-run check on a child's thread; `child_2` is admitted while
|
|
1333
|
+
// `child_1` still runs.
|
|
1334
|
+
await withStorage(async (storage, fixture) => {
|
|
1335
|
+
await createRunningParent(storage, fixture)
|
|
1336
|
+
await createSubagent(storage, fixture)
|
|
1337
|
+
await storage.runs.start({
|
|
1338
|
+
projectId,
|
|
1339
|
+
id: "child_1",
|
|
1340
|
+
execution: execution("child_token"),
|
|
1341
|
+
})
|
|
1342
|
+
await storage.runs.finish({
|
|
1343
|
+
projectId,
|
|
1344
|
+
id: "parent_1",
|
|
1345
|
+
executionToken: "parent_token",
|
|
1346
|
+
status: "succeeded",
|
|
1347
|
+
})
|
|
1348
|
+
await createAndStartRun(
|
|
1349
|
+
storage,
|
|
1350
|
+
fixture,
|
|
1351
|
+
runInput({
|
|
1352
|
+
id: "parent_2",
|
|
1353
|
+
threadId: "parent_thread",
|
|
1354
|
+
triggerMessageId: "msg_user_2",
|
|
1355
|
+
execution: execution("parent_token_2"),
|
|
1356
|
+
})
|
|
1357
|
+
)
|
|
1358
|
+
const next = subagentInput("parent_token_2", {
|
|
1359
|
+
id: "child_2",
|
|
1360
|
+
parentRunId: "parent_2",
|
|
1361
|
+
thread: { id: "thread_child_1", create: false },
|
|
1362
|
+
trigger: { id: "trigger_child_2", parts: [{ type: "text", text: "Go on." }] },
|
|
1363
|
+
createdAt: at("2026-06-23T10:03:00.000Z"),
|
|
1364
|
+
})
|
|
1365
|
+
await createTestAgentExecution(fixture, {
|
|
1366
|
+
projectId,
|
|
1367
|
+
runId: next.id,
|
|
1368
|
+
executionId: next.executionId,
|
|
1369
|
+
sourceExecutionId: "test_agent_execution:parent_2",
|
|
1370
|
+
authority: "inherited",
|
|
1371
|
+
})
|
|
1372
|
+
|
|
1373
|
+
await expectAgentError(storage.runs.createSubagent(next), "active_run_exists")
|
|
1374
|
+
await expectAgentError(
|
|
1375
|
+
storage.runs.createSubagent({ ...next, spawnKey: "another-child" }),
|
|
1376
|
+
"invalid_input"
|
|
1377
|
+
)
|
|
1378
|
+
await expectAgentError(
|
|
1379
|
+
storage.runs.createSubagent({ ...next, thread: { id: "missing", create: false } }),
|
|
1380
|
+
"thread_not_found"
|
|
1381
|
+
)
|
|
1382
|
+
await expectAgentError(
|
|
1383
|
+
storage.runs.createSubagent({ ...next, thread: { id: "thread_child_1", create: true } }),
|
|
1384
|
+
"duplicate_id"
|
|
1385
|
+
)
|
|
1386
|
+
|
|
1387
|
+
await storage.runs.finish({
|
|
1388
|
+
projectId,
|
|
1389
|
+
id: "child_1",
|
|
1390
|
+
executionToken: "child_token",
|
|
1391
|
+
status: "succeeded",
|
|
1392
|
+
result: { text: "Three open orders." },
|
|
1393
|
+
})
|
|
1394
|
+
await expect(
|
|
1395
|
+
storage.threads.getById({ projectId, id: "thread_child_1" })
|
|
1396
|
+
).resolves.toMatchObject({ activeRunId: null })
|
|
1397
|
+
|
|
1398
|
+
await expect(storage.runs.createSubagent(next)).resolves.toMatchObject({
|
|
1399
|
+
id: "child_2",
|
|
1400
|
+
threadId: "thread_child_1",
|
|
1401
|
+
triggerMessageId: "trigger_child_2",
|
|
1402
|
+
parentRunId: "parent_2",
|
|
1403
|
+
})
|
|
1404
|
+
await expect(
|
|
1405
|
+
storage.threads.getById({ projectId, id: "thread_child_1" })
|
|
1406
|
+
).resolves.toMatchObject({
|
|
1407
|
+
parent: { threadId: "parent_thread", spawnedBy: "parent_1", key: "research-orders" },
|
|
1408
|
+
activeRunId: "child_2",
|
|
1409
|
+
messageCount: 2,
|
|
1410
|
+
lastMessageAt: at("2026-06-23T10:03:00.000Z"),
|
|
1411
|
+
})
|
|
1412
|
+
const { messages } = await storage.messages.list({ projectId, threadId: "thread_child_1" })
|
|
1413
|
+
expect(messages.map(({ id, seq, runId }) => ({ id, seq, runId }))).toEqual([
|
|
1414
|
+
{ id: "task_child_1", seq: 1, runId: "child_1" },
|
|
1415
|
+
{ id: "trigger_child_2", seq: 2, runId: "child_2" },
|
|
1416
|
+
])
|
|
1417
|
+
})
|
|
1418
|
+
})
|
|
1419
|
+
|
|
1420
|
+
test("deletes a dead child run's messages whole, its trigger included", async () => {
|
|
1421
|
+
await withStorage(async (storage, fixture) => {
|
|
1422
|
+
await createRunningParent(storage, fixture)
|
|
1423
|
+
await createSubagent(storage, fixture)
|
|
1424
|
+
await storage.runs.start({ projectId, id: "child_1", execution: execution("child_token") })
|
|
1425
|
+
await storage.messages.append({
|
|
1426
|
+
id: "work_child_1",
|
|
1427
|
+
projectId,
|
|
1428
|
+
threadId: "thread_child_1",
|
|
1429
|
+
runId: "child_1",
|
|
1430
|
+
role: "assistant",
|
|
1431
|
+
parts: [{ type: "text", text: "Looking." }],
|
|
1432
|
+
createdAt: at("2026-06-23T10:02:00.000Z"),
|
|
1433
|
+
})
|
|
1434
|
+
|
|
1435
|
+
await expect(
|
|
1436
|
+
storage.messages.deleteByRunId({
|
|
1437
|
+
projectId,
|
|
1438
|
+
threadId: "thread_child_1",
|
|
1439
|
+
runId: "child_1",
|
|
1440
|
+
})
|
|
1441
|
+
).resolves.toBe(2)
|
|
1442
|
+
await expect(
|
|
1443
|
+
storage.threads.getById({ projectId, id: "thread_child_1" })
|
|
1444
|
+
).resolves.toMatchObject({ messageCount: 0, lastMessageAt: undefined })
|
|
1445
|
+
})
|
|
1446
|
+
})
|
|
1447
|
+
|
|
1448
|
+
test("never lists a child's thread", async () => {
|
|
1449
|
+
// Removal proof: drop the conversation filter from `threads.list`; the child's thread is
|
|
1450
|
+
// listed with its owner's conversations.
|
|
1451
|
+
await withStorage(async (storage, fixture) => {
|
|
1452
|
+
await createRunningParent(storage, fixture)
|
|
1453
|
+
await createSubagent(storage, fixture)
|
|
1454
|
+
// A participant of the conversation lists it among what is shared with them, alone.
|
|
1455
|
+
const reader = { type: "user", id: "usr_reader" } as const
|
|
1456
|
+
await storage.threads.addParticipants({
|
|
1457
|
+
...participantsInput([reader.id]),
|
|
1458
|
+
threadId: "parent_thread",
|
|
1459
|
+
})
|
|
1460
|
+
|
|
1461
|
+
for (const input of [
|
|
1462
|
+
{},
|
|
1463
|
+
{ ownerPrincipal: owner },
|
|
1464
|
+
{ participantPrincipal: reader },
|
|
1465
|
+
{ statuses: ["active" as const] },
|
|
1466
|
+
]) {
|
|
1467
|
+
await expect(storage.threads.list({ projectId, ...input })).resolves.toMatchObject({
|
|
1468
|
+
threads: [{ id: "parent_thread" }],
|
|
1469
|
+
total: 1,
|
|
1470
|
+
})
|
|
1471
|
+
}
|
|
1472
|
+
})
|
|
1473
|
+
})
|
|
1474
|
+
|
|
1475
|
+
test("lists a conversation's sub-agent threads, oldest first, by the turn that spawned them", async () => {
|
|
1476
|
+
await withStorage(async (storage, fixture) => {
|
|
1477
|
+
await createRunningParent(storage, fixture)
|
|
1478
|
+
await createSubagent(storage, fixture, {
|
|
1479
|
+
id: "child_b",
|
|
1480
|
+
spawnKey: "b",
|
|
1481
|
+
createdAt: at("2026-06-23T10:02:00.000Z"),
|
|
1482
|
+
})
|
|
1483
|
+
await createSubagent(storage, fixture, {
|
|
1484
|
+
id: "child_a",
|
|
1485
|
+
spawnKey: "a",
|
|
1486
|
+
createdAt: at("2026-06-23T10:01:00.000Z"),
|
|
1487
|
+
})
|
|
1488
|
+
const children = (input: Partial<ListAgentThreadChildrenInput> = {}) =>
|
|
1489
|
+
storage.threads
|
|
1490
|
+
.listChildren({ projectId, parentThreadId: "parent_thread", ...input })
|
|
1491
|
+
.then((threads) => threads.map((thread) => thread.id))
|
|
1492
|
+
|
|
1493
|
+
expect(await children()).toEqual(["thread_child_a", "thread_child_b"])
|
|
1494
|
+
expect(await children({ parentRunId: "parent_1" })).toEqual([
|
|
1495
|
+
"thread_child_a",
|
|
1496
|
+
"thread_child_b",
|
|
1497
|
+
])
|
|
1498
|
+
expect(await children({ parentRunId: "parent_2" })).toEqual([])
|
|
1499
|
+
expect(await children({ limit: 1, offset: 1 })).toEqual(["thread_child_b"])
|
|
1500
|
+
expect(
|
|
1501
|
+
await storage.threads.listChildren({ projectId, parentThreadId: "thread_child_a" })
|
|
1502
|
+
).toEqual([])
|
|
1503
|
+
expect(
|
|
1504
|
+
(await storage.threads.listChildren({ projectId, parentThreadId: "parent_thread" }))[0]
|
|
1505
|
+
).toMatchObject({
|
|
1506
|
+
kind: "subagent",
|
|
1507
|
+
parent: { threadId: "parent_thread", spawnedBy: "parent_1", key: "a" },
|
|
1508
|
+
})
|
|
1509
|
+
})
|
|
1510
|
+
})
|
|
1511
|
+
|
|
1512
|
+
test("keeps a child's thread out of what only a conversation does", async () => {
|
|
1513
|
+
await withStorage(async (storage, fixture) => {
|
|
1514
|
+
await createRunningParent(storage, fixture)
|
|
1515
|
+
await createSubagent(storage, fixture)
|
|
1516
|
+
|
|
1517
|
+
await expectAgentError(
|
|
1518
|
+
storage.threads.fork(forkInput({ sourceThreadId: "thread_child_1" })),
|
|
1519
|
+
"thread_not_conversation"
|
|
1520
|
+
)
|
|
1521
|
+
await expectAgentError(
|
|
1522
|
+
storage.threads.addParticipants({
|
|
1523
|
+
...participantsInput(["usr_bob"]),
|
|
1524
|
+
threadId: "thread_child_1",
|
|
1525
|
+
}),
|
|
1526
|
+
"thread_not_conversation"
|
|
1527
|
+
)
|
|
1528
|
+
await expectAgentError(
|
|
1529
|
+
createRun(
|
|
1530
|
+
storage,
|
|
1531
|
+
fixture,
|
|
1532
|
+
runInput({ id: "turn_in_child", threadId: "thread_child_1" })
|
|
1533
|
+
),
|
|
1534
|
+
"thread_not_conversation"
|
|
1535
|
+
)
|
|
1536
|
+
|
|
1537
|
+
// A fork of the conversation copies its messages, never its children's.
|
|
1538
|
+
const fork = await storage.threads.fork(forkInput({ sourceThreadId: "parent_thread" }))
|
|
1539
|
+
expect(fork).toMatchObject({ kind: "conversation", messageCount: 0 })
|
|
1540
|
+
expect(fork).not.toHaveProperty("parent")
|
|
1541
|
+
await expect(
|
|
1542
|
+
storage.threads.list({ projectId, ownerPrincipal: otherUser })
|
|
1543
|
+
).resolves.toMatchObject({ threads: [{ id: "thr_fork" }], total: 1 })
|
|
763
1544
|
})
|
|
764
1545
|
})
|
|
765
1546
|
|
|
@@ -861,22 +1642,28 @@ export function runAgentStorageContractSuite<TStorage extends AgentStorageContra
|
|
|
861
1642
|
id: "child_1",
|
|
862
1643
|
executionToken: "child_token",
|
|
863
1644
|
status: "succeeded",
|
|
864
|
-
result: {},
|
|
1645
|
+
result: { text: " " },
|
|
1646
|
+
}),
|
|
1647
|
+
"invalid_input"
|
|
1648
|
+
)
|
|
1649
|
+
|
|
1650
|
+
await expectAgentError(
|
|
1651
|
+
storage.runs.finish({
|
|
1652
|
+
projectId,
|
|
1653
|
+
id: "child_1",
|
|
1654
|
+
executionToken: "child_token",
|
|
1655
|
+
status: "succeeded",
|
|
1656
|
+
result: {
|
|
1657
|
+
text: "Three open orders.",
|
|
1658
|
+
files: [{ path: "../orders.png", fileRef: testFileRef("orders.png") }],
|
|
1659
|
+
},
|
|
865
1660
|
}),
|
|
866
1661
|
"invalid_input"
|
|
867
1662
|
)
|
|
868
1663
|
|
|
869
1664
|
const result = {
|
|
870
1665
|
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
|
-
],
|
|
1666
|
+
files: [{ path: "charts/orders.png", fileRef: testFileRef("orders.png") }],
|
|
880
1667
|
}
|
|
881
1668
|
const completed = await storage.runs.finish({
|
|
882
1669
|
projectId,
|
|
@@ -950,32 +1737,7 @@ export function runAgentStorageContractSuite<TStorage extends AgentStorageContra
|
|
|
950
1737
|
|
|
951
1738
|
// ── execution reclaim ───────────────────────────────────────────────────────────────────────
|
|
952
1739
|
|
|
953
|
-
test("
|
|
954
|
-
await withStorage(async (storage, fixture) => {
|
|
955
|
-
await storage.threads.create(threadInput())
|
|
956
|
-
await createAndStartRun(storage, fixture, runInput({ id: "run_1" }))
|
|
957
|
-
|
|
958
|
-
const reclaimed = await storage.runs.reclaim({
|
|
959
|
-
projectId,
|
|
960
|
-
id: "run_1",
|
|
961
|
-
execution: execution("exec_2"),
|
|
962
|
-
})
|
|
963
|
-
expect(reclaimed).toMatchObject({ status: "running", attempt: 2 })
|
|
964
|
-
expect(reclaimed.execution?.token).toBe("exec_2")
|
|
965
|
-
|
|
966
|
-
await expectAgentError(
|
|
967
|
-
storage.runs.finish({
|
|
968
|
-
projectId,
|
|
969
|
-
id: "run_1",
|
|
970
|
-
executionToken: "exec_1",
|
|
971
|
-
status: "succeeded",
|
|
972
|
-
}),
|
|
973
|
-
"execution_lost"
|
|
974
|
-
)
|
|
975
|
-
})
|
|
976
|
-
})
|
|
977
|
-
|
|
978
|
-
test("projects confirmed queue ownership monotonically and fences stale executions", async () => {
|
|
1740
|
+
test("projects confirmed queue ownership monotonically and reclaim fences stale executions", async () => {
|
|
979
1741
|
await withStorage(async (storage, fixture) => {
|
|
980
1742
|
await storage.threads.create(threadInput())
|
|
981
1743
|
await createAndStartRun(
|
|
@@ -1005,11 +1767,22 @@ export function runAgentStorageContractSuite<TStorage extends AgentStorageContra
|
|
|
1005
1767
|
})
|
|
1006
1768
|
expect(older.execution?.queueLeaseExpiresAt.toISOString()).toBe("2026-06-23T10:03:00.000Z")
|
|
1007
1769
|
|
|
1008
|
-
await storage.runs.reclaim({
|
|
1770
|
+
const reclaimed = await storage.runs.reclaim({
|
|
1009
1771
|
projectId,
|
|
1010
1772
|
id: "run_1",
|
|
1011
1773
|
execution: execution("exec_2", at("2026-06-23T10:04:00.000Z")),
|
|
1012
1774
|
})
|
|
1775
|
+
expect(reclaimed).toMatchObject({ status: "running", attempt: 2 })
|
|
1776
|
+
expect(reclaimed.execution?.token).toBe("exec_2")
|
|
1777
|
+
await expectAgentError(
|
|
1778
|
+
storage.runs.finish({
|
|
1779
|
+
projectId,
|
|
1780
|
+
id: "run_1",
|
|
1781
|
+
executionToken: "exec_1",
|
|
1782
|
+
status: "succeeded",
|
|
1783
|
+
}),
|
|
1784
|
+
"execution_lost"
|
|
1785
|
+
)
|
|
1013
1786
|
await expectAgentError(
|
|
1014
1787
|
storage.runs.confirmExecutionOwnership({
|
|
1015
1788
|
projectId,
|
|
@@ -1087,11 +1860,10 @@ export function runAgentStorageContractSuite<TStorage extends AgentStorageContra
|
|
|
1087
1860
|
finishReason: "stop",
|
|
1088
1861
|
diagnostics: [
|
|
1089
1862
|
{
|
|
1090
|
-
code: "
|
|
1863
|
+
code: "step_limit_reached",
|
|
1091
1864
|
severity: "warning",
|
|
1092
|
-
scope: "
|
|
1093
|
-
|
|
1094
|
-
message: "This generated file was skipped.",
|
|
1865
|
+
scope: "run",
|
|
1866
|
+
message: "The Agent reached its 100-step limit before producing a final answer.",
|
|
1095
1867
|
},
|
|
1096
1868
|
],
|
|
1097
1869
|
completedAt: at("2026-06-23T10:07:00.000Z"),
|
|
@@ -1103,11 +1875,10 @@ export function runAgentStorageContractSuite<TStorage extends AgentStorageContra
|
|
|
1103
1875
|
})
|
|
1104
1876
|
expect(finished.diagnostics).toEqual([
|
|
1105
1877
|
{
|
|
1106
|
-
code: "
|
|
1878
|
+
code: "step_limit_reached",
|
|
1107
1879
|
severity: "warning",
|
|
1108
|
-
scope: "
|
|
1109
|
-
|
|
1110
|
-
message: "This generated file was skipped.",
|
|
1880
|
+
scope: "run",
|
|
1881
|
+
message: "The Agent reached its 100-step limit before producing a final answer.",
|
|
1111
1882
|
},
|
|
1112
1883
|
])
|
|
1113
1884
|
await expect(
|
|
@@ -1397,6 +2168,70 @@ export function runAgentStorageContractSuite<TStorage extends AgentStorageContra
|
|
|
1397
2168
|
})
|
|
1398
2169
|
})
|
|
1399
2170
|
|
|
2171
|
+
// Guard proof: make `countsAsThreadMessage` return true; the thread, its fork and the count
|
|
2172
|
+
// after a run's messages go read 2, 2 and 2.
|
|
2173
|
+
test("counts only the messages the conversation shows", async () => {
|
|
2174
|
+
await withStorage(async (storage, fixture) => {
|
|
2175
|
+
await storage.threads.create(threadInput())
|
|
2176
|
+
await storage.messages.append({
|
|
2177
|
+
id: "msg_user_1",
|
|
2178
|
+
projectId,
|
|
2179
|
+
threadId: "thr_1",
|
|
2180
|
+
runId: null,
|
|
2181
|
+
role: "user",
|
|
2182
|
+
parts: [{ type: "text", text: "Mark INV-2041 paid" }],
|
|
2183
|
+
createdAt: at("2026-06-23T10:00:30.000Z"),
|
|
2184
|
+
})
|
|
2185
|
+
// What Sixb writes to resume a turn once its calls are decided: the chat shows none of it.
|
|
2186
|
+
await storage.messages.append({
|
|
2187
|
+
id: "msg_resume_1",
|
|
2188
|
+
projectId,
|
|
2189
|
+
threadId: "thr_1",
|
|
2190
|
+
runId: null,
|
|
2191
|
+
role: "user",
|
|
2192
|
+
authorPrincipal: owner,
|
|
2193
|
+
parts: [
|
|
2194
|
+
{
|
|
2195
|
+
type: "approval-outcome",
|
|
2196
|
+
approvalId: "apr_1",
|
|
2197
|
+
status: "approved",
|
|
2198
|
+
call: {
|
|
2199
|
+
kind: "action",
|
|
2200
|
+
actionId: "mark-paid",
|
|
2201
|
+
subject: { kind: "object", objectTypeId: "invoice", primaryId: "INV-2041" },
|
|
2202
|
+
},
|
|
2203
|
+
},
|
|
2204
|
+
],
|
|
2205
|
+
createdAt: at("2026-06-23T10:02:00.000Z"),
|
|
2206
|
+
})
|
|
2207
|
+
|
|
2208
|
+
const thread = await storage.threads.getById({ projectId, id: "thr_1" })
|
|
2209
|
+
expect(thread).toMatchObject({ messageCount: 1 })
|
|
2210
|
+
// It is still the thread's latest message.
|
|
2211
|
+
expect(thread?.lastMessageAt?.toISOString()).toBe("2026-06-23T10:02:00.000Z")
|
|
2212
|
+
expect((await storage.threads.fork(forkInput())).messageCount).toBe(1)
|
|
2213
|
+
|
|
2214
|
+
await createAndStartRun(storage, fixture, runInput({ id: "run_1" }))
|
|
2215
|
+
await storage.messages.append({
|
|
2216
|
+
id: "msg_asst_1",
|
|
2217
|
+
projectId,
|
|
2218
|
+
threadId: "thr_1",
|
|
2219
|
+
runId: "run_1",
|
|
2220
|
+
role: "assistant",
|
|
2221
|
+
parts: [{ type: "text", text: "Marked paid." }],
|
|
2222
|
+
createdAt: at("2026-06-23T10:03:00.000Z"),
|
|
2223
|
+
})
|
|
2224
|
+
expect(await storage.threads.getById({ projectId, id: "thr_1" })).toMatchObject({
|
|
2225
|
+
messageCount: 2,
|
|
2226
|
+
})
|
|
2227
|
+
|
|
2228
|
+
await storage.messages.deleteByRunId({ projectId, threadId: "thr_1", runId: "run_1" })
|
|
2229
|
+
expect(await storage.threads.getById({ projectId, id: "thr_1" })).toMatchObject({
|
|
2230
|
+
messageCount: 1,
|
|
2231
|
+
})
|
|
2232
|
+
})
|
|
2233
|
+
})
|
|
2234
|
+
|
|
1400
2235
|
test("lists messages with role filter, ordering, and pagination", async () => {
|
|
1401
2236
|
await withStorage(async (storage, fixture) => {
|
|
1402
2237
|
await storage.threads.create(threadInput())
|
|
@@ -1542,15 +2377,20 @@ export function runAgentStorageContractSuite<TStorage extends AgentStorageContra
|
|
|
1542
2377
|
await expect(
|
|
1543
2378
|
storage.checkpoints.getByRunIds({
|
|
1544
2379
|
projectId,
|
|
2380
|
+
threadId: "thr_1",
|
|
1545
2381
|
runIds: ["run_2", "missing", "run_2"],
|
|
1546
2382
|
})
|
|
1547
2383
|
).resolves.toEqual([created])
|
|
1548
2384
|
await expect(
|
|
1549
2385
|
storage.checkpoints.getByRunIds({
|
|
1550
2386
|
projectId: otherProjectId,
|
|
2387
|
+
threadId: "thr_1",
|
|
1551
2388
|
runIds: ["run_2"],
|
|
1552
2389
|
})
|
|
1553
2390
|
).resolves.toEqual([])
|
|
2391
|
+
await expect(
|
|
2392
|
+
storage.checkpoints.getByRunIds({ projectId, threadId: "thr_2", runIds: ["run_2"] })
|
|
2393
|
+
).resolves.toEqual([])
|
|
1554
2394
|
|
|
1555
2395
|
const retained = await storage.messages.list({
|
|
1556
2396
|
projectId,
|
|
@@ -1728,5 +2568,321 @@ export function runAgentStorageContractSuite<TStorage extends AgentStorageContra
|
|
|
1728
2568
|
)
|
|
1729
2569
|
})
|
|
1730
2570
|
})
|
|
2571
|
+
|
|
2572
|
+
test("forks the finished history into a thread its caller owns alone", async () => {
|
|
2573
|
+
// Removal proof: copy every message while a turn is running; `m5` lands in the fork.
|
|
2574
|
+
await withStorage(async (storage, fixture) => {
|
|
2575
|
+
await prepareForkSource(storage, fixture)
|
|
2576
|
+
const sourceBefore = await storage.threads.getById({ projectId, id: "thr_1" })
|
|
2577
|
+
const source = await storage.messages.list({ projectId, threadId: "thr_1" })
|
|
2578
|
+
|
|
2579
|
+
const fork = await storage.threads.fork(forkInput())
|
|
2580
|
+
|
|
2581
|
+
expect(fork).toEqual({
|
|
2582
|
+
id: "thr_fork",
|
|
2583
|
+
projectId,
|
|
2584
|
+
kind: "conversation",
|
|
2585
|
+
ownerPrincipal: otherUser,
|
|
2586
|
+
title: "Slipped deals",
|
|
2587
|
+
status: "active",
|
|
2588
|
+
activeRunId: null,
|
|
2589
|
+
messageCount: 4,
|
|
2590
|
+
createdAt: at("2026-06-23T11:00:00.000Z"),
|
|
2591
|
+
updatedAt: at("2026-06-23T11:00:00.000Z"),
|
|
2592
|
+
})
|
|
2593
|
+
expect(await storage.threads.getById({ projectId, id: "thr_fork" })).toEqual(fork)
|
|
2594
|
+
|
|
2595
|
+
const copied = await storage.messages.list({ projectId, threadId: "thr_fork" })
|
|
2596
|
+
const finished = source.messages.slice(0, 4)
|
|
2597
|
+
expect(copied.messages.map(({ id: _id, threadId: _threadId, ...rest }) => rest)).toEqual(
|
|
2598
|
+
finished.map(({ id: _id, threadId: _threadId, ...rest }) => rest)
|
|
2599
|
+
)
|
|
2600
|
+
expect(copied.messages.every((message) => message.threadId === "thr_fork")).toBe(true)
|
|
2601
|
+
|
|
2602
|
+
const copiedIds = copied.messages.map((message) => message.id)
|
|
2603
|
+
expect(new Set(copiedIds).size).toBe(4)
|
|
2604
|
+
expect(copiedIds.some((id) => source.messages.some((message) => message.id === id))).toBe(
|
|
2605
|
+
false
|
|
2606
|
+
)
|
|
2607
|
+
|
|
2608
|
+
// A fork of an old conversation sorts with what its owner just did.
|
|
2609
|
+
// Removal proof: give the fork the last copied message's time; it sorts after the source.
|
|
2610
|
+
const listed = await storage.threads.list({ projectId })
|
|
2611
|
+
expect(listed.threads.map((thread) => thread.id)).toEqual(["thr_fork", "thr_1"])
|
|
2612
|
+
|
|
2613
|
+
// The source keeps everything, its running turn included.
|
|
2614
|
+
expect(await storage.threads.getById({ projectId, id: "thr_1" })).toEqual(sourceBefore)
|
|
2615
|
+
expect((await storage.messages.list({ projectId, threadId: "thr_1" })).messages).toEqual(
|
|
2616
|
+
source.messages
|
|
2617
|
+
)
|
|
2618
|
+
|
|
2619
|
+
const next = await storage.messages.append({
|
|
2620
|
+
id: "m_fork_next",
|
|
2621
|
+
projectId,
|
|
2622
|
+
threadId: "thr_fork",
|
|
2623
|
+
runId: null,
|
|
2624
|
+
role: "user",
|
|
2625
|
+
parts: [{ type: "text", text: "Draft them for me." }],
|
|
2626
|
+
})
|
|
2627
|
+
expect(next.seq).toBe(5)
|
|
2628
|
+
expect(await storage.threads.getById({ projectId, id: "thr_fork" })).toMatchObject({
|
|
2629
|
+
messageCount: 5,
|
|
2630
|
+
lastMessageAt: next.createdAt,
|
|
2631
|
+
})
|
|
2632
|
+
})
|
|
2633
|
+
})
|
|
2634
|
+
|
|
2635
|
+
test("copies a failed last turn with the checkpoint it wrote", async () => {
|
|
2636
|
+
await withStorage(async (storage, fixture) => {
|
|
2637
|
+
await prepareForkSource(storage, fixture)
|
|
2638
|
+
await storage.runs.finish({
|
|
2639
|
+
id: "run_3",
|
|
2640
|
+
projectId,
|
|
2641
|
+
executionToken: "exec_3",
|
|
2642
|
+
status: "failed",
|
|
2643
|
+
})
|
|
2644
|
+
|
|
2645
|
+
const fork = await storage.threads.fork(forkInput())
|
|
2646
|
+
|
|
2647
|
+
expect(fork.messageCount).toBe(5)
|
|
2648
|
+
expect(
|
|
2649
|
+
await storage.checkpoints.getLatest({ projectId, threadId: "thr_fork" })
|
|
2650
|
+
).toMatchObject({ createdByRunId: "run_3", summarizedThroughSeq: 4, observedHeadSeq: 5 })
|
|
2651
|
+
})
|
|
2652
|
+
})
|
|
2653
|
+
|
|
2654
|
+
test("forks a fork, which copies the same run's checkpoint again", async () => {
|
|
2655
|
+
await withStorage(async (storage, fixture) => {
|
|
2656
|
+
await prepareForkSource(storage, fixture)
|
|
2657
|
+
await storage.threads.fork(forkInput())
|
|
2658
|
+
|
|
2659
|
+
const second = await storage.threads.fork(
|
|
2660
|
+
forkInput({ id: "thr_fork_of_fork", sourceThreadId: "thr_fork" })
|
|
2661
|
+
)
|
|
2662
|
+
|
|
2663
|
+
expect(second.messageCount).toBe(4)
|
|
2664
|
+
const copies = await Promise.all(
|
|
2665
|
+
["thr_1", "thr_fork", "thr_fork_of_fork"].map((threadId) =>
|
|
2666
|
+
storage.checkpoints.getByRunIds({ projectId, threadId, runIds: ["run_2"] })
|
|
2667
|
+
)
|
|
2668
|
+
)
|
|
2669
|
+
expect(copies.map(([checkpoint]) => checkpoint?.threadId)).toEqual([
|
|
2670
|
+
"thr_1",
|
|
2671
|
+
"thr_fork",
|
|
2672
|
+
"thr_fork_of_fork",
|
|
2673
|
+
])
|
|
2674
|
+
expect(new Set(copies.map(([checkpoint]) => checkpoint?.id)).size).toBe(3)
|
|
2675
|
+
expect(
|
|
2676
|
+
await storage.checkpoints.getLatest({ projectId, threadId: "thr_fork_of_fork" })
|
|
2677
|
+
).toEqual(copies[2]?.[0])
|
|
2678
|
+
})
|
|
2679
|
+
})
|
|
2680
|
+
|
|
2681
|
+
test("keeps the latest checkpoint that does not anchor on the running turn", async () => {
|
|
2682
|
+
// Removal proof: drop the observed-head condition when choosing the checkpoint; the fork
|
|
2683
|
+
// keeps `checkpoint_2`, which anchors on the running turn's message the fork does not have.
|
|
2684
|
+
await withStorage(async (storage, fixture) => {
|
|
2685
|
+
await prepareForkSource(storage, fixture)
|
|
2686
|
+
const [first, second] = await storage.checkpoints.getByRunIds({
|
|
2687
|
+
projectId,
|
|
2688
|
+
threadId: "thr_1",
|
|
2689
|
+
runIds: ["run_2", "run_3"],
|
|
2690
|
+
})
|
|
2691
|
+
|
|
2692
|
+
await storage.threads.fork(forkInput())
|
|
2693
|
+
|
|
2694
|
+
const kept = await storage.checkpoints.getLatest({ projectId, threadId: "thr_fork" })
|
|
2695
|
+
if (!kept || !first) throw new Error("Expected the fork to keep checkpoint_1.")
|
|
2696
|
+
|
|
2697
|
+
const { id: keptId, threadId: keptThreadId, previousCheckpointId, ...copied } = kept
|
|
2698
|
+
const { id: _firstId, threadId: _firstThreadId, ...original } = first
|
|
2699
|
+
expect(copied).toEqual(original)
|
|
2700
|
+
expect(keptId).not.toBe(first.id)
|
|
2701
|
+
expect(keptThreadId).toBe("thr_fork")
|
|
2702
|
+
expect(previousCheckpointId).toBeUndefined()
|
|
2703
|
+
|
|
2704
|
+
// The fork's projection reads the kept checkpoint and the copied tail after it.
|
|
2705
|
+
const tail = await storage.messages.list({
|
|
2706
|
+
projectId,
|
|
2707
|
+
threadId: "thr_fork",
|
|
2708
|
+
afterSeq: kept.summarizedThroughSeq,
|
|
2709
|
+
order: "asc",
|
|
2710
|
+
})
|
|
2711
|
+
expect(
|
|
2712
|
+
projectAgentThreadModelContext({ checkpoint: kept, messages: tail.messages })
|
|
2713
|
+
).toHaveLength(3)
|
|
2714
|
+
|
|
2715
|
+
await expect(
|
|
2716
|
+
storage.checkpoints.getByRunIds({ projectId, threadId: "thr_fork", runIds: ["run_2"] })
|
|
2717
|
+
).resolves.toEqual([kept])
|
|
2718
|
+
await expect(
|
|
2719
|
+
storage.checkpoints.getByRunIds({
|
|
2720
|
+
projectId,
|
|
2721
|
+
threadId: "thr_1",
|
|
2722
|
+
runIds: ["run_2", "run_3"],
|
|
2723
|
+
})
|
|
2724
|
+
).resolves.toEqual([first, second])
|
|
2725
|
+
|
|
2726
|
+
// Once the turn has finished, the checkpoint it wrote anchors on copied history.
|
|
2727
|
+
await storage.messages.append({
|
|
2728
|
+
id: "m6",
|
|
2729
|
+
projectId,
|
|
2730
|
+
threadId: "thr_1",
|
|
2731
|
+
runId: "run_3",
|
|
2732
|
+
role: "assistant",
|
|
2733
|
+
parts: [{ type: "text", text: "Drafted." }],
|
|
2734
|
+
})
|
|
2735
|
+
await storage.runs.finish({
|
|
2736
|
+
id: "run_3",
|
|
2737
|
+
projectId,
|
|
2738
|
+
executionToken: "exec_3",
|
|
2739
|
+
status: "succeeded",
|
|
2740
|
+
})
|
|
2741
|
+
await storage.threads.fork(forkInput({ id: "thr_fork_2" }))
|
|
2742
|
+
|
|
2743
|
+
expect(
|
|
2744
|
+
await storage.checkpoints.getLatest({ projectId, threadId: "thr_fork_2" })
|
|
2745
|
+
).toMatchObject({
|
|
2746
|
+
createdByRunId: "run_3",
|
|
2747
|
+
threadId: "thr_fork_2",
|
|
2748
|
+
summarizedThroughSeq: 4,
|
|
2749
|
+
observedHeadSeq: 5,
|
|
2750
|
+
})
|
|
2751
|
+
expect((await storage.threads.getById({ projectId, id: "thr_fork_2" }))?.messageCount).toBe(
|
|
2752
|
+
6
|
|
2753
|
+
)
|
|
2754
|
+
})
|
|
2755
|
+
})
|
|
2756
|
+
|
|
2757
|
+
test("forks an empty thread and rejects a missing source or a taken id", async () => {
|
|
2758
|
+
await withStorage(async (storage) => {
|
|
2759
|
+
await storage.threads.create(threadInput())
|
|
2760
|
+
|
|
2761
|
+
const fork = await storage.threads.fork(forkInput({ title: undefined }))
|
|
2762
|
+
expect(fork).toMatchObject({ messageCount: 0, activeRunId: null })
|
|
2763
|
+
expect(fork.createdAt).toEqual(at("2026-06-23T11:00:00.000Z"))
|
|
2764
|
+
expect(fork.lastMessageAt).toBeUndefined()
|
|
2765
|
+
expect(fork.title).toBeUndefined()
|
|
2766
|
+
|
|
2767
|
+
await expectAgentError(storage.threads.fork(forkInput()), "duplicate_id")
|
|
2768
|
+
await expectAgentError(
|
|
2769
|
+
storage.threads.fork(forkInput({ id: "thr_other", sourceThreadId: "missing" })),
|
|
2770
|
+
"thread_not_found"
|
|
2771
|
+
)
|
|
2772
|
+
await expectAgentError(
|
|
2773
|
+
storage.threads.fork(forkInput({ id: "thr_other", projectId: otherProjectId })),
|
|
2774
|
+
"thread_not_found"
|
|
2775
|
+
)
|
|
2776
|
+
})
|
|
2777
|
+
})
|
|
2778
|
+
|
|
2779
|
+
// Regression proof: drop the remap from a provider's fork; the copy then names the source's
|
|
2780
|
+
// artifact, which the fork's readers may not reach.
|
|
2781
|
+
test("names the fork's copies of the source's artifacts in the messages it copies", async () => {
|
|
2782
|
+
await withStorage(async (storage) => {
|
|
2783
|
+
await storage.threads.create(threadInput())
|
|
2784
|
+
const text = "See  and art_0000000009."
|
|
2785
|
+
await storage.messages.append({
|
|
2786
|
+
id: "msg_shown",
|
|
2787
|
+
projectId,
|
|
2788
|
+
threadId: "thr_1",
|
|
2789
|
+
runId: null,
|
|
2790
|
+
role: "user",
|
|
2791
|
+
parts: [{ type: "text", text }],
|
|
2792
|
+
})
|
|
2793
|
+
|
|
2794
|
+
await storage.threads.fork(
|
|
2795
|
+
forkInput({ artifactCopies: { art_0000000001: "art_000000copy1" } })
|
|
2796
|
+
)
|
|
2797
|
+
|
|
2798
|
+
const [copy] = (await storage.messages.list({ projectId, threadId: "thr_fork" })).messages
|
|
2799
|
+
expect(copy?.parts).toEqual([
|
|
2800
|
+
{
|
|
2801
|
+
type: "text",
|
|
2802
|
+
text: "See  and art_0000000009.",
|
|
2803
|
+
},
|
|
2804
|
+
])
|
|
2805
|
+
const [source] = (await storage.messages.list({ projectId, threadId: "thr_1" })).messages
|
|
2806
|
+
expect(source?.parts).toEqual([{ type: "text", text }])
|
|
2807
|
+
})
|
|
2808
|
+
})
|
|
2809
|
+
|
|
2810
|
+
// Regression proof: drop the summary's remap in planAgentThreadFork; the copied checkpoint
|
|
2811
|
+
// then names the source's artifact.
|
|
2812
|
+
test("names the fork's copies in the checkpoint summary it copies", async () => {
|
|
2813
|
+
await withStorage(async (storage, fixture) => {
|
|
2814
|
+
const summary = "Drafted art_0000000001 for Acme; art_0000000009 is the source data."
|
|
2815
|
+
await prepareForkSource(storage, fixture, summary)
|
|
2816
|
+
await storage.runs.finish({
|
|
2817
|
+
id: "run_3",
|
|
2818
|
+
projectId,
|
|
2819
|
+
executionToken: "exec_3",
|
|
2820
|
+
status: "failed",
|
|
2821
|
+
})
|
|
2822
|
+
|
|
2823
|
+
await storage.threads.fork(
|
|
2824
|
+
forkInput({ artifactCopies: { art_0000000001: "art_000000copy1" } })
|
|
2825
|
+
)
|
|
2826
|
+
|
|
2827
|
+
expect(
|
|
2828
|
+
(await storage.checkpoints.getLatest({ projectId, threadId: "thr_fork" }))?.summary
|
|
2829
|
+
).toBe("Drafted art_000000copy1 for Acme; art_0000000009 is the source data.")
|
|
2830
|
+
expect(
|
|
2831
|
+
(await storage.checkpoints.getLatest({ projectId, threadId: "thr_1" }))?.summary
|
|
2832
|
+
).toBe(summary)
|
|
2833
|
+
})
|
|
2834
|
+
})
|
|
2835
|
+
|
|
2836
|
+
test("starts a forked workspace with a new, reset sandbox", async () => {
|
|
2837
|
+
await withStorage(async (storage) => {
|
|
2838
|
+
await storage.threads.create(threadInput({ sandboxParams: { repo: "deals" } }))
|
|
2839
|
+
|
|
2840
|
+
const fork = await storage.threads.fork(
|
|
2841
|
+
forkInput({ sandboxParams: { repo: "deals" }, sandboxName: "sixb-sb-fork" })
|
|
2842
|
+
)
|
|
2843
|
+
expect(fork.sandboxParams).toEqual({ repo: "deals" })
|
|
2844
|
+
expect(fork.sandboxState).toEqual({
|
|
2845
|
+
name: "sixb-sb-fork",
|
|
2846
|
+
status: "new",
|
|
2847
|
+
initialized: false,
|
|
2848
|
+
resetAt: "2026-06-23T11:00:00.000Z",
|
|
2849
|
+
})
|
|
2850
|
+
|
|
2851
|
+
await expectAgentError(
|
|
2852
|
+
storage.threads.fork(forkInput({ id: "thr_2", sandboxParams: { repo: "deals" } })),
|
|
2853
|
+
"invalid_input"
|
|
2854
|
+
)
|
|
2855
|
+
await expectAgentError(
|
|
2856
|
+
storage.threads.fork(forkInput({ id: "thr_2", sandboxName: "sixb-sb-fork" })),
|
|
2857
|
+
"invalid_input"
|
|
2858
|
+
)
|
|
2859
|
+
await expectAgentError(
|
|
2860
|
+
storage.threads.fork(
|
|
2861
|
+
forkInput({ id: "thr_2", sandboxParams: {}, sandboxName: "../invalid" })
|
|
2862
|
+
),
|
|
2863
|
+
"invalid_input"
|
|
2864
|
+
)
|
|
2865
|
+
expect(await storage.threads.getById({ projectId, id: "thr_2" })).toBeNull()
|
|
2866
|
+
})
|
|
2867
|
+
})
|
|
2868
|
+
|
|
2869
|
+
test("rolls back a fork with its containing storage transaction", async () => {
|
|
2870
|
+
await withStorage(async (storage, fixture) => {
|
|
2871
|
+
await prepareForkSource(storage, fixture)
|
|
2872
|
+
const rollback = new Error("rollback fork")
|
|
2873
|
+
|
|
2874
|
+
await expect(
|
|
2875
|
+
fixture.transaction(async (tx) => {
|
|
2876
|
+
if (!tx.agents) throw new Error("Expected agent storage in transaction.")
|
|
2877
|
+
await tx.agents.threads.fork(forkInput())
|
|
2878
|
+
throw rollback
|
|
2879
|
+
})
|
|
2880
|
+
).rejects.toBe(rollback)
|
|
2881
|
+
|
|
2882
|
+
expect(await storage.threads.getById({ projectId, id: "thr_fork" })).toBeNull()
|
|
2883
|
+
expect((await storage.messages.list({ projectId, threadId: "thr_fork" })).total).toBe(0)
|
|
2884
|
+
expect(await storage.checkpoints.getLatest({ projectId, threadId: "thr_fork" })).toBeNull()
|
|
2885
|
+
})
|
|
2886
|
+
})
|
|
1731
2887
|
})
|
|
1732
2888
|
}
|