@stigmer/runner 3.15.3-dev.20260914100347 → 3.15.3-dev.20260916211208
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/README.md +1 -0
- package/dist/.build-fingerprint +1 -1
- package/dist/__test-utils__/approval-contract/types.d.ts +1 -1
- package/dist/__test-utils__/hermetic-activity.d.ts +61 -7
- package/dist/__test-utils__/hermetic-activity.js +100 -9
- package/dist/__test-utils__/hermetic-activity.js.map +1 -1
- package/dist/__test-utils__/model-registry-fixture.d.ts +22 -3
- package/dist/__test-utils__/model-registry-fixture.js +22 -7
- package/dist/__test-utils__/model-registry-fixture.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/contract-subject.d.ts +2 -2
- package/dist/activities/execute-cursor/__test-utils__/contract-subject.js +14 -11
- package/dist/activities/execute-cursor/__test-utils__/contract-subject.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/fold.d.ts +61 -0
- package/dist/activities/execute-cursor/__test-utils__/fold.js +94 -0
- package/dist/activities/execute-cursor/__test-utils__/fold.js.map +1 -0
- package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.js +1 -1
- package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.d.ts +52 -14
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js +46 -12
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/scripted-agent.d.ts +21 -28
- package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js +27 -11
- package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.d.ts +70 -26
- package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.js +82 -32
- package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.js.map +1 -1
- package/dist/activities/execute-cursor/adapter.d.ts +8 -7
- package/dist/activities/execute-cursor/adapter.js +13 -9
- package/dist/activities/execute-cursor/adapter.js.map +1 -1
- package/dist/activities/execute-cursor/approval-policy.d.ts +10 -10
- package/dist/activities/execute-cursor/approval-policy.js +12 -23
- package/dist/activities/execute-cursor/approval-policy.js.map +1 -1
- package/dist/activities/execute-cursor/approval-state.d.ts +35 -1
- package/dist/activities/execute-cursor/approval-state.js +65 -0
- package/dist/activities/execute-cursor/approval-state.js.map +1 -1
- package/dist/activities/execute-cursor/{message-translator.d.ts → boundary-rows.d.ts} +45 -341
- package/dist/activities/execute-cursor/boundary-rows.js +1018 -0
- package/dist/activities/execute-cursor/boundary-rows.js.map +1 -0
- package/dist/activities/execute-cursor/cursor-capabilities.d.ts +1 -1
- package/dist/activities/execute-cursor/cursor-capabilities.js +1 -1
- package/dist/activities/execute-cursor/cursor-event-recorder.d.ts +33 -14
- package/dist/activities/execute-cursor/cursor-event-recorder.js +43 -21
- package/dist/activities/execute-cursor/cursor-event-recorder.js.map +1 -1
- package/dist/activities/execute-cursor/prompt-builder.d.ts +3 -3
- package/dist/activities/execute-cursor/prompt-builder.js +4 -4
- package/dist/activities/execute-cursor/prompt-builder.js.map +1 -1
- package/dist/activities/execute-cursor/sdk-warmup.d.ts +15 -6
- package/dist/activities/execute-cursor/sdk-warmup.js +15 -6
- package/dist/activities/execute-cursor/sdk-warmup.js.map +1 -1
- package/dist/activities/execute-cursor/service-tier.js +1 -2
- package/dist/activities/execute-cursor/service-tier.js.map +1 -1
- package/dist/activities/execute-cursor/session-lifecycle.d.ts +38 -59
- package/dist/activities/execute-cursor/session-lifecycle.js +59 -96
- package/dist/activities/execute-cursor/session-lifecycle.js.map +1 -1
- package/dist/activities/execute-cursor/session-store.d.ts +100 -0
- package/dist/activities/execute-cursor/session-store.js +157 -0
- package/dist/activities/execute-cursor/session-store.js.map +1 -0
- package/dist/activities/execute-cursor/sub-agent-steps.d.ts +79 -0
- package/dist/activities/execute-cursor/sub-agent-steps.js +180 -0
- package/dist/activities/execute-cursor/sub-agent-steps.js.map +1 -0
- package/dist/activities/execute-cursor/tool-result.d.ts +49 -0
- package/dist/activities/execute-cursor/tool-result.js +130 -0
- package/dist/activities/execute-cursor/tool-result.js.map +1 -0
- package/dist/activities/execute-cursor/translator.d.ts +178 -0
- package/dist/activities/execute-cursor/translator.js +485 -0
- package/dist/activities/execute-cursor/translator.js.map +1 -0
- package/dist/activities/execute-cursor/turn-boundary.d.ts +15 -5
- package/dist/activities/execute-cursor/turn-boundary.js +10 -14
- package/dist/activities/execute-cursor/turn-boundary.js.map +1 -1
- package/dist/activities/execute-cursor/turn-settle.d.ts +11 -7
- package/dist/activities/execute-cursor/turn-settle.js +47 -34
- package/dist/activities/execute-cursor/turn-settle.js.map +1 -1
- package/dist/activities/execute-cursor/turn-setup.d.ts +2 -2
- package/dist/activities/execute-cursor/turn-setup.js +5 -5
- package/dist/activities/execute-cursor/turn-setup.js.map +1 -1
- package/dist/activities/execute-cursor/turn-stream.d.ts +23 -14
- package/dist/activities/execute-cursor/turn-stream.js +41 -28
- package/dist/activities/execute-cursor/turn-stream.js.map +1 -1
- package/dist/activities/execute-cursor/turn.d.ts +4 -4
- package/dist/activities/execute-cursor/turn.js +5 -5
- package/dist/activities/execute-cursor/usage-pricing.d.ts +2 -2
- package/dist/activities/execute-cursor/usage-pricing.js +2 -2
- package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.d.ts +2 -2
- package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.js +2 -2
- package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.d.ts +16 -11
- package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js +22 -10
- package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js.map +1 -1
- package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js +1 -1
- package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js.map +1 -1
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.d.ts +2 -3
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js +2 -3
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js.map +1 -1
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.d.ts +12 -3
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js +18 -4
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js.map +1 -1
- package/dist/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.d.ts +10 -1
- package/dist/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.js +24 -11
- package/dist/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.js.map +1 -1
- package/dist/activities/execute-deep-agent/adapter.d.ts +1 -1
- package/dist/activities/execute-deep-agent/adapter.js +1 -1
- package/dist/activities/execute-deep-agent/approval-file-change.d.ts +19 -19
- package/dist/activities/execute-deep-agent/approval-file-change.js +16 -15
- package/dist/activities/execute-deep-agent/approval-file-change.js.map +1 -1
- package/dist/activities/execute-deep-agent/deep-agent-capabilities.d.ts +2 -2
- package/dist/activities/execute-deep-agent/deep-agent-capabilities.js +2 -2
- package/dist/activities/execute-deep-agent/hitl.d.ts +2 -2
- package/dist/activities/execute-deep-agent/hitl.js +2 -2
- package/dist/activities/execute-deep-agent/inline-publisher.d.ts +13 -3
- package/dist/activities/execute-deep-agent/inline-publisher.js +3 -3
- package/dist/activities/execute-deep-agent/inline-publisher.js.map +1 -1
- package/dist/activities/execute-deep-agent/prompt-builder.d.ts +3 -3
- package/dist/activities/execute-deep-agent/prompt-builder.js +6 -7
- package/dist/activities/execute-deep-agent/prompt-builder.js.map +1 -1
- package/dist/activities/execute-deep-agent/streaming-side-effects.d.ts +16 -8
- package/dist/activities/execute-deep-agent/streaming-side-effects.js +20 -33
- package/dist/activities/execute-deep-agent/streaming-side-effects.js.map +1 -1
- package/dist/activities/execute-deep-agent/subagent-transformer.d.ts +3 -3
- package/dist/activities/execute-deep-agent/subagent-transformer.js +1 -1
- package/dist/activities/execute-deep-agent/translator.d.ts +134 -0
- package/dist/activities/execute-deep-agent/translator.js +418 -0
- package/dist/activities/execute-deep-agent/translator.js.map +1 -0
- package/dist/activities/execute-deep-agent/turn-settle.d.ts +13 -7
- package/dist/activities/execute-deep-agent/turn-settle.js +34 -45
- package/dist/activities/execute-deep-agent/turn-settle.js.map +1 -1
- package/dist/activities/execute-deep-agent/turn-setup.d.ts +8 -8
- package/dist/activities/execute-deep-agent/turn-setup.js +7 -7
- package/dist/activities/execute-deep-agent/turn-stream.d.ts +13 -10
- package/dist/activities/execute-deep-agent/turn-stream.js +44 -41
- package/dist/activities/execute-deep-agent/turn-stream.js.map +1 -1
- package/dist/activities/execute-deep-agent/turn.d.ts +3 -3
- package/dist/activities/execute-deep-agent/turn.js +3 -3
- package/dist/config.d.ts +2 -2
- package/dist/harness/approval-decisions.d.ts +1 -1
- package/dist/harness/approval-decisions.js +1 -1
- package/dist/harness/capabilities.d.ts +21 -11
- package/dist/harness/capabilities.js +2 -2
- package/dist/harness/capture.d.ts +4 -4
- package/dist/harness/capture.js +4 -4
- package/dist/harness/persist-chokepoint.d.ts +3 -3
- package/dist/harness/persist-chokepoint.js +3 -3
- package/dist/harness/registry.d.ts +2 -2
- package/dist/harness/registry.js +2 -2
- package/dist/harness/run-turn.d.ts +6 -4
- package/dist/harness/run-turn.js +31 -9
- package/dist/harness/run-turn.js.map +1 -1
- package/dist/harness/stop-controller.d.ts +1 -1
- package/dist/harness/stop-controller.js +1 -1
- package/dist/harness/terminal-table.d.ts +7 -7
- package/dist/harness/terminal-table.js +7 -7
- package/dist/harness/transcript/builder.d.ts +182 -0
- package/dist/harness/transcript/builder.js +693 -0
- package/dist/harness/transcript/builder.js.map +1 -0
- package/dist/harness/transcript/events.d.ts +218 -0
- package/dist/harness/transcript/events.js +50 -0
- package/dist/harness/transcript/events.js.map +1 -0
- package/dist/harness/transcript/state.d.ts +110 -0
- package/dist/harness/transcript/state.js +148 -0
- package/dist/harness/transcript/state.js.map +1 -0
- package/dist/harness/turn-context.d.ts +54 -38
- package/dist/harness/turn-context.js +42 -43
- package/dist/harness/turn-context.js.map +1 -1
- package/dist/harness/types.d.ts +63 -22
- package/dist/harness/types.js +12 -11
- package/dist/harness/types.js.map +1 -1
- package/dist/harness/usage-accumulator.d.ts +2 -2
- package/dist/harness/usage-accumulator.js +2 -2
- package/dist/harness-adapters.d.ts +5 -4
- package/dist/harness-adapters.js +5 -4
- package/dist/harness-adapters.js.map +1 -1
- package/dist/middleware/approval-gate.d.ts +6 -0
- package/dist/middleware/approval-gate.js +7 -57
- package/dist/middleware/approval-gate.js.map +1 -1
- package/dist/middleware/cost-advisory.d.ts +3 -3
- package/dist/middleware/cost-advisory.js +3 -3
- package/dist/middleware/index.d.ts +1 -1
- package/dist/middleware/index.js +1 -1
- package/dist/runner-manager.js +1 -1
- package/dist/runner-manager.js.map +1 -1
- package/dist/shared/approval-policy.d.ts +53 -0
- package/dist/shared/approval-policy.js +76 -0
- package/dist/shared/approval-policy.js.map +1 -1
- package/dist/shared/args-preview.d.ts +45 -22
- package/dist/shared/args-preview.js +51 -41
- package/dist/shared/args-preview.js.map +1 -1
- package/dist/shared/attachment-resolver.d.ts +4 -4
- package/dist/shared/attachment-resolver.js +4 -4
- package/dist/shared/attachment-vision.d.ts +2 -1
- package/dist/shared/attachment-vision.js.map +1 -1
- package/dist/shared/attachment-zip.d.ts +2 -2
- package/dist/shared/attachment-zip.js +2 -2
- package/dist/shared/cost-guard.d.ts +2 -2
- package/dist/shared/cost-guard.js +2 -2
- package/dist/shared/exact-apply.d.ts +1 -1
- package/dist/shared/exact-apply.js +1 -1
- package/dist/shared/execution-context.d.ts +2 -2
- package/dist/shared/execution-context.js +2 -2
- package/dist/shared/extract-structured-output.d.ts +2 -2
- package/dist/shared/extract-structured-output.js +2 -2
- package/dist/shared/filereview/cas-touched.d.ts +2 -2
- package/dist/shared/filereview/cas-touched.js +2 -2
- package/dist/shared/heartbeat.d.ts +1 -1
- package/dist/shared/heartbeat.js +1 -1
- package/dist/shared/llm-backend.d.ts +0 -4
- package/dist/shared/llm-backend.js +0 -4
- package/dist/shared/llm-backend.js.map +1 -1
- package/dist/shared/model-error.d.ts +1 -2
- package/dist/shared/model-error.js +1 -2
- package/dist/shared/model-error.js.map +1 -1
- package/dist/shared/persist-decision.d.ts +18 -24
- package/dist/shared/persist-decision.js +19 -11
- package/dist/shared/persist-decision.js.map +1 -1
- package/dist/shared/prompt-sections.d.ts +4 -4
- package/dist/shared/prompt-sections.js +4 -4
- package/dist/shared/skill-resolver.d.ts +3 -3
- package/dist/shared/skill-resolver.js +3 -3
- package/dist/shared/status-offload.d.ts +1 -1
- package/dist/shared/status-offload.js +2 -2
- package/dist/shared/status-offload.js.map +1 -1
- package/dist/shared/streaming-scheduler.d.ts +2 -7
- package/dist/shared/streaming-scheduler.js +6 -14
- package/dist/shared/streaming-scheduler.js.map +1 -1
- package/dist/shared/subagent-rows.d.ts +2 -2
- package/dist/shared/subagent-rows.js +2 -2
- package/dist/shared/todos.d.ts +3 -3
- package/dist/shared/todos.js +3 -3
- package/dist/shared/tool-row.d.ts +19 -1
- package/dist/shared/tool-row.js +36 -2
- package/dist/shared/tool-row.js.map +1 -1
- package/dist/shared/worker-shutdown.d.ts +1 -1
- package/dist/shared/worker-shutdown.js +1 -1
- package/dist/shared/workspace/session-provision.d.ts +1 -1
- package/dist/shared/workspace/session-provision.js +1 -1
- package/dist/shared/workspace/sources/empty.d.ts +1 -1
- package/dist/shared/workspace/sources/empty.js +1 -2
- package/dist/shared/workspace/sources/empty.js.map +1 -1
- package/dist/shared/workspace/sources/git.js +4 -4
- package/dist/shared/workspace/sources/git.js.map +1 -1
- package/dist/shared/workspace/sources/local-path.js +6 -6
- package/dist/shared/workspace/sources/local-path.js.map +1 -1
- package/dist/shared/workspace/stigmer-link.d.ts +1 -1
- package/dist/shared/workspace/stigmer-link.js +1 -1
- package/dist/shared/workspace/types.d.ts +2 -5
- package/dist/shared/workspace/types.js +0 -6
- package/dist/shared/workspace/types.js.map +1 -1
- package/dist/shared/workspace/writeback-coordinator.d.ts +17 -4
- package/dist/shared/workspace/writeback-coordinator.js +7 -9
- package/dist/shared/workspace/writeback-coordinator.js.map +1 -1
- package/package.json +5 -5
- package/src/__test-utils__/__tests__/execution-record-barrier.test.ts +70 -0
- package/src/__test-utils__/__tests__/harness-contract-self-check.test.ts +35 -1
- package/src/__test-utils__/approval-contract/contract.ts +1 -1
- package/src/__test-utils__/approval-contract/types.ts +1 -1
- package/src/__test-utils__/harness-boot-order-child.ts +1 -1
- package/src/__test-utils__/harness-contract/contract.ts +8 -8
- package/src/__test-utils__/harness-contract/recording-sink.ts +11 -1
- package/src/__test-utils__/harness-contract/runtime-contract.ts +52 -16
- package/src/__test-utils__/harness-contract/scripted-adapter.ts +47 -43
- package/src/__test-utils__/hermetic-activity.ts +113 -9
- package/src/__test-utils__/model-registry-fixture.ts +31 -7
- package/src/__test-utils__/module-specifiers.ts +32 -3
- package/src/__tests__/harness-boot-order.test.ts +1 -1
- package/src/__tests__/harness-contract.test.ts +1 -1
- package/src/__tests__/runner-manager.test.ts +1 -1
- package/src/activities/execute-cursor/__test-utils__/__tests__/scripted-double.test.ts +32 -8
- package/src/activities/execute-cursor/__test-utils__/contract-subject.ts +12 -10
- package/src/activities/execute-cursor/__test-utils__/fold.ts +116 -0
- package/src/activities/execute-cursor/__test-utils__/gateway-substrate.ts +1 -1
- package/src/activities/execute-cursor/__test-utils__/hermetic-cursor.ts +72 -19
- package/src/activities/execute-cursor/__test-utils__/scripted-agent.ts +35 -29
- package/src/activities/execute-cursor/__test-utils__/scripted-sdk.ts +94 -38
- package/src/activities/execute-cursor/__tests__/approval-gate.test.ts +2 -1
- package/src/activities/execute-cursor/__tests__/approval-state.test.ts +14 -21
- package/src/activities/execute-cursor/__tests__/build-prompt.test.ts +3 -3
- package/src/activities/execute-cursor/__tests__/coarse-fingerprint.test.ts +2 -1
- package/src/activities/execute-cursor/__tests__/cursor-baseurl-routing.test.ts +10 -8
- package/src/activities/execute-cursor/__tests__/cursor-event-recorder.test.ts +142 -0
- package/src/activities/execute-cursor/__tests__/cursor-fetch-interceptor-bypass.test.ts +24 -12
- package/src/activities/execute-cursor/__tests__/cursor-generate-image-live.test.ts +7 -2
- package/src/activities/execute-cursor/__tests__/cursor-hook-protocol-live.test.ts +163 -0
- package/src/activities/execute-cursor/__tests__/cursor-sdk-auth-smoke.test.ts +23 -20
- package/src/activities/execute-cursor/__tests__/cursor-transcript-live.test.ts +298 -0
- package/src/activities/execute-cursor/__tests__/deny-gate-exact-apply.test.ts +4 -2
- package/src/activities/execute-cursor/__tests__/fetch-interceptor.test.ts +1 -1
- package/src/activities/execute-cursor/__tests__/hermetic/deny-and-retry.test.ts +5 -2
- package/src/activities/execute-cursor/__tests__/hermetic/file-review-capture.test.ts +5 -2
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/mcp-tool-call.status.json +71 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/sdk-task-note.status.json +73 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/shell-output-delta.error-delta.status.json +78 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/shell-output-delta.output-first.status.json +72 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/shell-output-delta.status.json +72 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/sub-agent-delegation.status.json +109 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/thinking-turn.status.json +78 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/todo-write.status.json +119 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/tool-error.status.json +68 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/tool-only-step.status.json +67 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/unattributed-hook-block.status.json +1 -1
- package/src/activities/execute-cursor/__tests__/hermetic/harness-contract.test.ts +10 -7
- package/src/activities/execute-cursor/__tests__/hermetic/mcp-tool-call.test.ts +146 -0
- package/src/activities/execute-cursor/__tests__/hermetic/pause-vs-shutdown.test.ts +8 -5
- package/src/activities/execute-cursor/__tests__/hermetic/plain-turn.test.ts +6 -2
- package/src/activities/execute-cursor/__tests__/hermetic/recovery-fresh-agent.test.ts +4 -1
- package/src/activities/execute-cursor/__tests__/hermetic/run-wait-arms.test.ts +6 -2
- package/src/activities/execute-cursor/__tests__/hermetic/sdk-task-note.test.ts +122 -0
- package/src/activities/execute-cursor/__tests__/hermetic/shell-output-delta.test.ts +276 -0
- package/src/activities/execute-cursor/__tests__/hermetic/stream-self-stop-arms.test.ts +12 -9
- package/src/activities/execute-cursor/__tests__/hermetic/sub-agent-delegation.test.ts +196 -0
- package/src/activities/execute-cursor/__tests__/hermetic/thinking-turn.test.ts +145 -0
- package/src/activities/execute-cursor/__tests__/hermetic/thrown-error-arms.test.ts +4 -1
- package/src/activities/execute-cursor/__tests__/hermetic/todo-write.test.ts +165 -0
- package/src/activities/execute-cursor/__tests__/hermetic/tool-call.test.ts +7 -4
- package/src/activities/execute-cursor/__tests__/hermetic/tool-error.test.ts +138 -0
- package/src/activities/execute-cursor/__tests__/hermetic/tool-only-step.test.ts +130 -0
- package/src/activities/execute-cursor/__tests__/hermetic/unattributed-hook-block.test.ts +17 -2
- package/src/activities/execute-cursor/__tests__/hermetic/workspace-lock-timeout.test.ts +5 -2
- package/src/activities/execute-cursor/__tests__/hitl-ledger.test.ts +43 -60
- package/src/activities/execute-cursor/__tests__/hitl-resume-history.test.ts +23 -28
- package/src/activities/execute-cursor/__tests__/hook-script.test.ts +2 -1
- package/src/activities/execute-cursor/__tests__/http2-interceptor.test.ts +1 -1
- package/src/activities/execute-cursor/__tests__/prompt-goldens.test.ts +5 -5
- package/src/activities/execute-cursor/__tests__/same-identity-reproposal.test.ts +11 -13
- package/src/activities/execute-cursor/__tests__/sequential-gate-resume.test.ts +8 -11
- package/src/activities/execute-cursor/__tests__/session-lifecycle.test.ts +86 -58
- package/src/activities/execute-cursor/__tests__/session-store.test.ts +220 -0
- package/src/activities/execute-cursor/__tests__/tool-result-image.test.ts +8 -22
- package/src/activities/execute-cursor/__tests__/translator.test.ts +594 -0
- package/src/activities/execute-cursor/__tests__/turn-boundary.test.ts +8 -5
- package/src/activities/execute-cursor/__tests__/turn-stream.test.ts +87 -63
- package/src/activities/execute-cursor/adapter.ts +13 -9
- package/src/activities/execute-cursor/approval-policy.ts +12 -24
- package/src/activities/execute-cursor/approval-state.ts +66 -1
- package/src/activities/execute-cursor/boundary-rows.ts +1132 -0
- package/src/activities/execute-cursor/cursor-capabilities.ts +1 -1
- package/src/activities/execute-cursor/cursor-event-recorder.ts +57 -28
- package/src/activities/execute-cursor/fetch-interceptor.ts +1 -1
- package/src/activities/execute-cursor/http2-interceptor.ts +1 -1
- package/src/activities/execute-cursor/prompt-builder.ts +6 -6
- package/src/activities/execute-cursor/sdk-warmup.ts +15 -6
- package/src/activities/execute-cursor/service-tier.ts +1 -2
- package/src/activities/execute-cursor/session-lifecycle.ts +63 -109
- package/src/activities/execute-cursor/session-store.ts +187 -0
- package/src/activities/execute-cursor/sub-agent-steps.ts +188 -0
- package/src/activities/execute-cursor/tool-result.ts +128 -0
- package/src/activities/execute-cursor/translator.ts +541 -0
- package/src/activities/execute-cursor/turn-boundary.ts +21 -14
- package/src/activities/execute-cursor/turn-settle.ts +46 -34
- package/src/activities/execute-cursor/turn-setup.ts +5 -5
- package/src/activities/execute-cursor/turn-stream.ts +49 -46
- package/src/activities/execute-cursor/turn.ts +5 -5
- package/src/activities/execute-cursor/usage-pricing.ts +2 -2
- package/src/activities/execute-deep-agent/__test-utils__/contract-subject.ts +2 -2
- package/src/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.ts +23 -11
- package/src/activities/execute-deep-agent/__test-utils__/hitl-script.ts +1 -1
- package/src/activities/execute-deep-agent/__test-utils__/scripted-model-module.ts +2 -3
- package/src/activities/execute-deep-agent/__test-utils__/scripted-model.ts +25 -4
- package/src/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.ts +25 -11
- package/src/activities/execute-deep-agent/__tests__/adapter-graph-is-sdk-free.test.ts +1 -1
- package/src/activities/execute-deep-agent/__tests__/adapter-is-temporal-free.test.ts +1 -1
- package/src/activities/execute-deep-agent/__tests__/approval-file-change.test.ts +6 -17
- package/src/activities/execute-deep-agent/__tests__/hermetic/file-review-capture.test.ts +25 -8
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn1.status.json +2 -7
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn2.status.json +4 -14
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve.turn2.status.json +1 -5
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/file-review-capture.status.json +4 -7
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/gate.turn1.status.json +1 -5
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn1.status.json +2 -9
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn2.status.json +2 -9
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.after-tool.status.json +1 -4
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.mid-tool.status.json +1 -4
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/platform-stop.status.json +1 -4
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/recursion-limit.persisted.status.json +109 -76
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/reject.turn2.status.json +1 -5
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn2.status.json +2 -10
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn3.status.json +2 -10
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/skip.turn2.status.json +1 -5
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sub-agent-delegation.status.json +3 -6
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/tool-call.status.json +1 -4
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/worker-shutdown.status.json +1 -4
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/write-todos.status.json +92 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/harness-contract.test.ts +3 -3
- package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-approve-all-lease.test.ts +9 -5
- package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-round-trips.test.ts +3 -3
- package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-sequential-gates.test.ts +3 -3
- package/src/activities/execute-deep-agent/__tests__/hermetic/inline-artifact-across-gate.test.ts +7 -6
- package/src/activities/execute-deep-agent/__tests__/hermetic/pause-vs-shutdown.test.ts +10 -11
- package/src/activities/execute-deep-agent/__tests__/hermetic/plain-turn.test.ts +4 -4
- package/src/activities/execute-deep-agent/__tests__/hermetic/platform-stop.test.ts +9 -8
- package/src/activities/execute-deep-agent/__tests__/hermetic/recursion-limit.test.ts +21 -13
- package/src/activities/execute-deep-agent/__tests__/hermetic/resolution-error.test.ts +2 -2
- package/src/activities/execute-deep-agent/__tests__/hermetic/structured-output.test.ts +7 -7
- package/src/activities/execute-deep-agent/__tests__/hermetic/sub-agent-delegation.test.ts +28 -12
- package/src/activities/execute-deep-agent/__tests__/hermetic/tool-call.test.ts +21 -21
- package/src/activities/execute-deep-agent/__tests__/hermetic/workspace-lock-timeout.test.ts +5 -5
- package/src/activities/execute-deep-agent/__tests__/hermetic/write-todos.test.ts +160 -0
- package/src/activities/execute-deep-agent/__tests__/inline-publisher.test.ts +35 -30
- package/src/activities/execute-deep-agent/__tests__/prompt-builder.test.ts +3 -4
- package/src/activities/execute-deep-agent/__tests__/prompt-goldens.test.ts +12 -10
- package/src/activities/execute-deep-agent/__tests__/scripted-model.test.ts +13 -3
- package/src/activities/execute-deep-agent/__tests__/streaming-side-effects.test.ts +26 -18
- package/src/activities/execute-deep-agent/__tests__/subagent-wiring.test.ts +1 -1
- package/src/activities/execute-deep-agent/__tests__/{subagent-tracker.test.ts → translator-subagents.test.ts} +76 -57
- package/src/activities/execute-deep-agent/__tests__/{v3-status-builder.test.ts → translator-through-builder.test.ts} +213 -299
- package/src/activities/execute-deep-agent/__tests__/translator.test.ts +505 -0
- package/src/activities/execute-deep-agent/__tests__/turn-stream.test.ts +11 -29
- package/src/activities/execute-deep-agent/adapter.ts +1 -1
- package/src/activities/execute-deep-agent/approval-file-change.ts +20 -22
- package/src/activities/execute-deep-agent/deep-agent-capabilities.ts +2 -2
- package/src/activities/execute-deep-agent/hitl.ts +2 -2
- package/src/activities/execute-deep-agent/inline-publisher.ts +16 -5
- package/src/activities/execute-deep-agent/prompt-builder.ts +6 -7
- package/src/activities/execute-deep-agent/streaming-side-effects.ts +22 -31
- package/src/activities/execute-deep-agent/subagent-transformer.ts +3 -3
- package/src/activities/execute-deep-agent/translator.ts +463 -0
- package/src/activities/execute-deep-agent/turn-settle.ts +35 -43
- package/src/activities/execute-deep-agent/turn-setup.ts +8 -8
- package/src/activities/execute-deep-agent/turn-stream.ts +53 -51
- package/src/activities/execute-deep-agent/turn.ts +3 -3
- package/src/config.ts +2 -2
- package/src/harness/README.md +335 -0
- package/src/harness/__tests__/approval-decisions.test.ts +2 -2
- package/src/harness/__tests__/capture.test.ts +3 -3
- package/src/harness/__tests__/import-direction.test.ts +3 -2
- package/src/harness/__tests__/mount-skills.test.ts +4 -1
- package/src/harness/__tests__/readme-index.test.ts +339 -0
- package/src/harness/__tests__/run-turn.test.ts +131 -6
- package/src/harness/__tests__/transcript-is-engine-free.test.ts +83 -0
- package/src/harness/__tests__/transcript-writers.test.ts +191 -0
- package/src/harness/__tests__/turn-attachments-vision.test.ts +5 -2
- package/src/harness/__tests__/turn-context.test.ts +5 -5
- package/src/harness/approval-decisions.ts +1 -1
- package/src/harness/capabilities.ts +21 -11
- package/src/harness/capture.ts +4 -4
- package/src/harness/persist-chokepoint.ts +3 -3
- package/src/harness/registry.ts +2 -2
- package/src/harness/run-turn.ts +33 -9
- package/src/harness/stop-controller.ts +1 -1
- package/src/harness/terminal-table.ts +7 -7
- package/src/harness/transcript/__tests__/builder.test.ts +975 -0
- package/src/harness/transcript/__tests__/state.test.ts +143 -0
- package/src/harness/transcript/builder.ts +755 -0
- package/src/harness/transcript/events.ts +262 -0
- package/src/harness/transcript/state.ts +167 -0
- package/src/harness/turn-context.ts +61 -46
- package/src/harness/types.ts +64 -22
- package/src/harness/usage-accumulator.ts +2 -2
- package/src/harness-adapters.ts +5 -4
- package/src/middleware/__tests__/cost-advisory.test.ts +2 -2
- package/src/middleware/approval-gate.ts +7 -74
- package/src/middleware/cost-advisory.ts +3 -3
- package/src/middleware/index.ts +1 -1
- package/src/runner-manager.ts +1 -1
- package/src/shared/__tests__/approval-policy.test.ts +45 -0
- package/src/shared/__tests__/args-preview.test.ts +40 -20
- package/src/shared/__tests__/attachment-naming.test.ts +1 -1
- package/src/shared/__tests__/attachment-resolver.test.ts +5 -5
- package/src/shared/__tests__/attachment-zip.test.ts +1 -1
- package/src/shared/__tests__/blueprint-resolver.test.ts +1 -1
- package/src/shared/__tests__/cost-guard.test.ts +1 -1
- package/src/shared/__tests__/exact-apply.test.ts +2 -1
- package/src/shared/__tests__/persist-decision.test.ts +19 -33
- package/src/shared/__tests__/prompt-sections.test.ts +1 -1
- package/src/shared/__tests__/stamp-flowed-rows.test.ts +1 -1
- package/src/shared/__tests__/status-offload.test.ts +1 -1
- package/src/shared/__tests__/streaming-scheduler.test.ts +8 -9
- package/src/shared/__tests__/todos.test.ts +1 -1
- package/src/shared/__tests__/tool-row.test.ts +1 -1
- package/src/shared/approval-policy.ts +95 -0
- package/src/shared/args-preview.ts +51 -42
- package/src/shared/attachment-resolver.ts +4 -4
- package/src/shared/attachment-vision.ts +2 -1
- package/src/shared/attachment-zip.ts +2 -2
- package/src/shared/cost-guard.ts +2 -2
- package/src/shared/exact-apply.ts +1 -1
- package/src/shared/execution-context.ts +2 -2
- package/src/shared/extract-structured-output.ts +2 -2
- package/src/shared/filereview/__tests__/capture.test.ts +9 -5
- package/src/shared/filereview/__tests__/git-substrate.test.ts +4 -1
- package/src/shared/filereview/__tests__/proxy-reconcile.test.ts +3 -3
- package/src/shared/filereview/cas-touched.ts +2 -2
- package/src/shared/heartbeat.ts +1 -1
- package/src/shared/llm-backend.ts +0 -4
- package/src/shared/model-error.ts +1 -2
- package/src/shared/persist-decision.ts +19 -28
- package/src/shared/prompt-sections.ts +4 -4
- package/src/shared/skill-resolver.ts +3 -3
- package/src/shared/status-offload.ts +2 -2
- package/src/shared/streaming-scheduler.ts +8 -13
- package/src/shared/subagent-rows.ts +2 -2
- package/src/shared/todos.ts +3 -3
- package/src/shared/tool-row.ts +38 -2
- package/src/shared/worker-shutdown.ts +1 -1
- package/src/shared/workspace/__tests__/git-source.test.ts +3 -3
- package/src/shared/workspace/__tests__/provisioner.test.ts +5 -5
- package/src/shared/workspace/__tests__/session-provision.test.ts +2 -2
- package/src/shared/workspace/__tests__/writeback-coordinator.integration.test.ts +8 -9
- package/src/shared/workspace/__tests__/writeback-coordinator.test.ts +25 -25
- package/src/shared/workspace/provisioner.ts +1 -1
- package/src/shared/workspace/session-provision.ts +1 -1
- package/src/shared/workspace/sources/empty.ts +2 -2
- package/src/shared/workspace/sources/git.ts +3 -4
- package/src/shared/workspace/sources/local-path.ts +5 -6
- package/src/shared/workspace/stigmer-link.ts +1 -1
- package/src/shared/workspace/types.ts +2 -5
- package/src/shared/workspace/writeback-coordinator.ts +23 -12
- package/dist/activities/execute-cursor/delta-enricher.d.ts +0 -87
- package/dist/activities/execute-cursor/delta-enricher.js +0 -265
- package/dist/activities/execute-cursor/delta-enricher.js.map +0 -1
- package/dist/activities/execute-cursor/message-translator.js +0 -2040
- package/dist/activities/execute-cursor/message-translator.js.map +0 -1
- package/dist/activities/execute-cursor/todo-tracker.d.ts +0 -40
- package/dist/activities/execute-cursor/todo-tracker.js +0 -80
- package/dist/activities/execute-cursor/todo-tracker.js.map +0 -1
- package/dist/activities/execute-deep-agent/execution-state.d.ts +0 -54
- package/dist/activities/execute-deep-agent/execution-state.js +0 -68
- package/dist/activities/execute-deep-agent/execution-state.js.map +0 -1
- package/dist/activities/execute-deep-agent/status-builder-shared.d.ts +0 -65
- package/dist/activities/execute-deep-agent/status-builder-shared.js +0 -90
- package/dist/activities/execute-deep-agent/status-builder-shared.js.map +0 -1
- package/dist/activities/execute-deep-agent/subagent-tracker.d.ts +0 -113
- package/dist/activities/execute-deep-agent/subagent-tracker.js +0 -400
- package/dist/activities/execute-deep-agent/subagent-tracker.js.map +0 -1
- package/dist/activities/execute-deep-agent/v3-events.d.ts +0 -102
- package/dist/activities/execute-deep-agent/v3-events.js +0 -35
- package/dist/activities/execute-deep-agent/v3-events.js.map +0 -1
- package/dist/activities/execute-deep-agent/v3-protocol-normalizer.d.ts +0 -15
- package/dist/activities/execute-deep-agent/v3-protocol-normalizer.js +0 -235
- package/dist/activities/execute-deep-agent/v3-protocol-normalizer.js.map +0 -1
- package/dist/activities/execute-deep-agent/v3-status-builder.d.ts +0 -111
- package/dist/activities/execute-deep-agent/v3-status-builder.js +0 -457
- package/dist/activities/execute-deep-agent/v3-status-builder.js.map +0 -1
- package/dist/shared/execution-status-writer.d.ts +0 -31
- package/dist/shared/execution-status-writer.js +0 -43
- package/dist/shared/execution-status-writer.js.map +0 -1
- package/src/activities/execute-cursor/__tests__/delta-enricher.test.ts +0 -310
- package/src/activities/execute-cursor/__tests__/message-translator.test.ts +0 -1033
- package/src/activities/execute-cursor/__tests__/todo-tracker.test.ts +0 -498
- package/src/activities/execute-cursor/delta-enricher.ts +0 -307
- package/src/activities/execute-cursor/message-translator.ts +0 -2319
- package/src/activities/execute-cursor/todo-tracker.ts +0 -91
- package/src/activities/execute-deep-agent/__tests__/execution-state-extended.test.ts +0 -148
- package/src/activities/execute-deep-agent/__tests__/execution-state.test.ts +0 -154
- package/src/activities/execute-deep-agent/__tests__/status-builder-shared.test.ts +0 -47
- package/src/activities/execute-deep-agent/__tests__/v3-protocol-normalizer.test.ts +0 -324
- package/src/activities/execute-deep-agent/execution-state.ts +0 -78
- package/src/activities/execute-deep-agent/status-builder-shared.ts +0 -142
- package/src/activities/execute-deep-agent/subagent-tracker.ts +0 -479
- package/src/activities/execute-deep-agent/v3-events.ts +0 -153
- package/src/activities/execute-deep-agent/v3-protocol-normalizer.ts +0 -264
- package/src/activities/execute-deep-agent/v3-status-builder.ts +0 -565
- package/src/shared/execution-status-writer.ts +0 -56
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* - File review under the `cursor` harness id, with the two files the gate
|
|
19
19
|
* writes into the repo excluded from the mid-run progress diff
|
|
20
20
|
* ({@link CURSOR_RUNNER_OWNED_PATHS}). The capture itself is the runtime's
|
|
21
|
-
* (`harness/capture.ts`,
|
|
21
|
+
* (`harness/capture.ts`, since #1096); this adapter contributes only the hook
|
|
22
22
|
* sidecar it binds as the runtime's CAS observations (`turn-setup.ts`).
|
|
23
23
|
*/
|
|
24
24
|
|
|
@@ -1,57 +1,91 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Cursor
|
|
2
|
+
* The raw recording of the Cursor translator's input — both SDK channels, in
|
|
3
|
+
* arrival order — for checking the translator against what the real SDK sends.
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
* the
|
|
6
|
-
*
|
|
5
|
+
* Off unless `CURSOR_EVENT_RECORD_DIR` is set: `turn-settle.ts` reads the env
|
|
6
|
+
* once per turn and hands the directory in, so this module touches no process
|
|
7
|
+
* state and its tests need no env. When off, {@link createCursorEventRecorder}
|
|
8
|
+
* returns undefined and the loop's `recorder?.record(...)` costs nothing.
|
|
7
9
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
10
|
+
* Two channels, one sequence. The Cursor SDK hands the runner a turn on two
|
|
11
|
+
* channels: the discrete `run.stream()` `SDKMessage`s (message boundaries, tool
|
|
12
|
+
* calls, the result) and the fine-grained `onDelta` `InteractionUpdate`s (text
|
|
13
|
+
* and thinking tokens, live shell output, tool-call completion instants,
|
|
14
|
+
* usage). The translator (`translator.ts`) reads both, and the questions a
|
|
15
|
+
* recording exists to answer — what shape `shell-output-delta` carries, whether
|
|
16
|
+
* `tool-call-completed` arrives before or after the stream's own completed
|
|
17
|
+
* `tool_call` — are questions about the ORDER across channels. So the recorder
|
|
18
|
+
* owns one monotonic `seq` and stamps every line with its `channel`; a reader
|
|
19
|
+
* sorts nothing, it reads the file top to bottom. Until #1097's live-run gate
|
|
20
|
+
* this module recorded the stream channel alone, under the loop's own
|
|
21
|
+
* event counter, which could not place a delta relative to a stream event.
|
|
12
22
|
*
|
|
13
|
-
*
|
|
23
|
+
* Output: `<dir>/<executionId>.cursor-events.jsonl`, one JSON object per line,
|
|
24
|
+
* flushed once after the stream completes (`turn-settle.ts`). Payloads pass
|
|
25
|
+
* through {@link safeClone} so a cyclic event cannot fail the flush. The native
|
|
26
|
+
* harness's `v3-event-recorder.ts` is the same idea for its one channel.
|
|
14
27
|
*/
|
|
15
28
|
|
|
16
29
|
import { writeFile, mkdir } from "node:fs/promises";
|
|
17
30
|
import { join } from "node:path";
|
|
18
|
-
import type { SDKMessage } from "@cursor/sdk";
|
|
31
|
+
import type { InteractionUpdate, SDKMessage } from "@cursor/sdk";
|
|
32
|
+
|
|
33
|
+
/** Which of the SDK's two channels a recorded line came from. */
|
|
34
|
+
export type CursorRecordedChannel = "stream" | "delta";
|
|
19
35
|
|
|
20
36
|
export interface CursorEventRecorder {
|
|
21
|
-
|
|
37
|
+
/** A discrete `run.stream()` event, sequenced with the deltas around it. */
|
|
38
|
+
record(event: SDKMessage): void;
|
|
39
|
+
/** An `onDelta` update, sequenced with the stream events around it. */
|
|
40
|
+
recordDelta(update: InteractionUpdate): void;
|
|
41
|
+
/** Write every recorded line, once. A no-op when nothing was recorded. */
|
|
22
42
|
flush(): Promise<void>;
|
|
23
43
|
}
|
|
24
44
|
|
|
25
45
|
/**
|
|
26
|
-
* Create a recorder
|
|
27
|
-
*
|
|
46
|
+
* Create a recorder for `recordDir`, or undefined when there is none (the
|
|
47
|
+
* env var unset or empty) — the caller does `recorder?.record(event)`.
|
|
28
48
|
*/
|
|
29
49
|
export function createCursorEventRecorder(
|
|
30
50
|
executionId: string,
|
|
51
|
+
recordDir: string | undefined,
|
|
31
52
|
): CursorEventRecorder | undefined {
|
|
32
|
-
const recordDir = process.env.CURSOR_EVENT_RECORD_DIR;
|
|
33
53
|
if (!recordDir) return undefined;
|
|
34
54
|
return new FileCursorEventRecorder(executionId, recordDir);
|
|
35
55
|
}
|
|
36
56
|
|
|
37
57
|
class FileCursorEventRecorder implements CursorEventRecorder {
|
|
38
58
|
private readonly lines: string[] = [];
|
|
59
|
+
/** The one arrival counter both channels share (the header's reason). */
|
|
60
|
+
private seq = 0;
|
|
39
61
|
|
|
40
62
|
constructor(
|
|
41
63
|
private readonly executionId: string,
|
|
42
64
|
private readonly outputDir: string,
|
|
43
65
|
) {}
|
|
44
66
|
|
|
45
|
-
record(event: SDKMessage
|
|
46
|
-
|
|
47
|
-
seq,
|
|
48
|
-
capturedAt: new Date().toISOString(),
|
|
49
|
-
type: event.type,
|
|
67
|
+
record(event: SDKMessage): void {
|
|
68
|
+
this.append("stream", event.type, {
|
|
50
69
|
agent_id: event.agent_id,
|
|
51
70
|
run_id: event.run_id,
|
|
52
71
|
event: safeClone(event),
|
|
53
|
-
};
|
|
54
|
-
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
recordDelta(update: InteractionUpdate): void {
|
|
76
|
+
this.append("delta", update.type, { update: safeClone(update) });
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
private append(channel: CursorRecordedChannel, type: string, payload: Record<string, unknown>): void {
|
|
80
|
+
this.lines.push(
|
|
81
|
+
JSON.stringify({
|
|
82
|
+
seq: this.seq++,
|
|
83
|
+
capturedAt: new Date().toISOString(),
|
|
84
|
+
channel,
|
|
85
|
+
type,
|
|
86
|
+
...payload,
|
|
87
|
+
}),
|
|
88
|
+
);
|
|
55
89
|
}
|
|
56
90
|
|
|
57
91
|
async flush(): Promise<void> {
|
|
@@ -59,15 +93,10 @@ class FileCursorEventRecorder implements CursorEventRecorder {
|
|
|
59
93
|
|
|
60
94
|
await mkdir(this.outputDir, { recursive: true });
|
|
61
95
|
|
|
62
|
-
const filePath = join(
|
|
63
|
-
this.outputDir,
|
|
64
|
-
`${this.executionId}.cursor-events.jsonl`,
|
|
65
|
-
);
|
|
96
|
+
const filePath = join(this.outputDir, `${this.executionId}.cursor-events.jsonl`);
|
|
66
97
|
|
|
67
98
|
await writeFile(filePath, this.lines.join("\n") + "\n");
|
|
68
|
-
console.log(
|
|
69
|
-
`CursorEventRecorder: flushed ${this.lines.length} events to ${filePath}`,
|
|
70
|
-
);
|
|
99
|
+
console.log(`CursorEventRecorder: flushed ${this.lines.length} lines to ${filePath}`);
|
|
71
100
|
}
|
|
72
101
|
}
|
|
73
102
|
|
|
@@ -65,7 +65,7 @@ interface ProxyConfig {
|
|
|
65
65
|
* manager's token coordinator), so a rotation reaches the next request
|
|
66
66
|
* without a call into this module. Which credential it is differs per
|
|
67
67
|
* root — the static root's control-plane token, the manager's minted
|
|
68
|
-
* runner token
|
|
68
|
+
* runner token — and this module never knows which.
|
|
69
69
|
*/
|
|
70
70
|
proxyTokenRef: { readonly current: string | null };
|
|
71
71
|
executionId?: string;
|
|
@@ -64,7 +64,7 @@ interface Http2InterceptorConfig {
|
|
|
64
64
|
* installed this interceptor owns the ref and rotates it in place, so a
|
|
65
65
|
* rotation reaches the next `request()` on an already-open session without
|
|
66
66
|
* a call into this module (see fetch-interceptor.ts for the two roots'
|
|
67
|
-
* bindings
|
|
67
|
+
* bindings).
|
|
68
68
|
*/
|
|
69
69
|
proxyTokenRef: { readonly current: string | null };
|
|
70
70
|
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* user message and persist in the agent's own conversation store; a resumed
|
|
7
7
|
* agent receives only what is per-turn).
|
|
8
8
|
*
|
|
9
|
-
* What is this harness's and what is shared (
|
|
9
|
+
* What is this harness's and what is shared (since #1096):
|
|
10
10
|
* - Shared through `shared/prompt-sections.ts`: WHICH standing sections
|
|
11
11
|
* render and in WHAT order (`standingContextSections`) and the input-files
|
|
12
12
|
* bullet and disclosure lines (`inputFileLines`). Their WORDS come from
|
|
@@ -70,7 +70,7 @@ const RUNNER_PATH_MARKERS = [
|
|
|
70
70
|
] as const;
|
|
71
71
|
|
|
72
72
|
// The prompt renders the attachment resolver's own result type — a local
|
|
73
|
-
// structural twin (`AttachmentPromptEntry`) lived here until
|
|
73
|
+
// structural twin (`AttachmentPromptEntry`) lived here until #1096 and the
|
|
74
74
|
// projection into it was the one reason `turn-setup.ts` had a
|
|
75
75
|
// `prepareAttachmentPrompt` step; the twin dropped the size, so this
|
|
76
76
|
// harness's input-files line never carried it. One type, one truth: the
|
|
@@ -315,7 +315,7 @@ export function buildReinvocationPrompt(
|
|
|
315
315
|
} else if (action === ApprovalAction.REJECT) {
|
|
316
316
|
// A REJECT denies the tool and the run continues (stigmer#197); the
|
|
317
317
|
// runtime settles its row SKIPPED. Told apart from a SKIP in the prose
|
|
318
|
-
// so the model reads a refusal, not an omission (
|
|
318
|
+
// so the model reads a refusal, not an omission (since #1096).
|
|
319
319
|
rejected.push(describeApproval(pa));
|
|
320
320
|
}
|
|
321
321
|
}
|
|
@@ -566,8 +566,8 @@ export function formatWorkspaceContext(dirs: string[]): string {
|
|
|
566
566
|
/**
|
|
567
567
|
* The `<input_files>` section: this harness's intro around the shared lines
|
|
568
568
|
* (`prompt-sections.ts` `inputFileLines` says what each bullet and disclosure
|
|
569
|
-
* carries and why). The size on each bullet is new to this harness
|
|
570
|
-
*
|
|
569
|
+
* carries and why). The size on each bullet is new to this harness in #1096:
|
|
570
|
+
* the twin this builder rendered from had dropped it.
|
|
571
571
|
*/
|
|
572
572
|
export function formatInputFiles(
|
|
573
573
|
attachments: readonly ResolvedAttachment[],
|
|
@@ -755,7 +755,7 @@ export function buildToolApprovalRuleFile(): string {
|
|
|
755
755
|
// ---------------------------------------------------------------------------
|
|
756
756
|
// Prompt selection — which of the four shapes a turn sends, from how the
|
|
757
757
|
// agent resolved and whether the turn carries adjudicated approvals. Moved
|
|
758
|
-
// from `index.ts`
|
|
758
|
+
// from `index.ts` in #1070, body unchanged; `__tests__/build-prompt.test.ts`
|
|
759
759
|
// pins every branch.
|
|
760
760
|
// ---------------------------------------------------------------------------
|
|
761
761
|
|
|
@@ -3,10 +3,19 @@
|
|
|
3
3
|
*
|
|
4
4
|
* The first `Agent.create` in a pod pays the SDK's platform construction:
|
|
5
5
|
* four SQLite-backed stores (run/checkpoint/event stores + notifier) whose
|
|
6
|
-
* first use
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* first use compiles the schema migrations. The 2026-07-30 instrumented
|
|
7
|
+
* baseline (issue #209, @cursor/sdk 1.0.13) measured this at ~1.2s of the
|
|
8
|
+
* ~2.4s `resolve_agent` segment, with a 624ms floor — roughly half the cost
|
|
9
|
+
* was per-process warm-up, not per-session work. Part of that floor was the
|
|
10
|
+
* `sqlite3` native binding's load; since 1.0.31 (stigmer/stigmer#1053) the
|
|
11
|
+
* SDK's stores run on `node:sqlite`, which is inside the Node binary, and the
|
|
12
|
+
* session's store is opened by the runner itself (`session-store.ts`,
|
|
13
|
+
* `SqliteLocalAgentStore.open`) rather than through the platform this
|
|
14
|
+
* warm-up constructs. What this warm-up still saves at 1.0.31 is therefore a
|
|
15
|
+
* measurement, not a known quantity: its `durationMs` and the cold-start
|
|
16
|
+
* timeline answer it, and the harness program carries the question of
|
|
17
|
+
* whether to warm through the store the runner actually opens, or through
|
|
18
|
+
* the SDK's own `prewarmLocalWorkspace`, or not at all.
|
|
10
19
|
*
|
|
11
20
|
* Pool members idle between boot and claim, so constructing one throwaway
|
|
12
21
|
* platform there moves that per-process cost off the user-visible path.
|
|
@@ -32,8 +41,8 @@ export interface SdkWarmupResult {
|
|
|
32
41
|
|
|
33
42
|
/**
|
|
34
43
|
* Construct (and abandon) one SDK agent platform on a throwaway temp-dir
|
|
35
|
-
* state root, forcing the
|
|
36
|
-
*
|
|
44
|
+
* state root, forcing the store schema work to happen now instead of inside
|
|
45
|
+
* the first user-facing `Agent.create`.
|
|
37
46
|
*
|
|
38
47
|
* Total by construction — warm-up is an optimization and must never affect
|
|
39
48
|
* the member's ability to serve. The throwaway state root is a few KB on
|
|
@@ -53,8 +53,7 @@ const AUTO_MODEL_IDS = new Set(["default", "auto"]);
|
|
|
53
53
|
* the served variant deterministic while leaving effort knobs on their
|
|
54
54
|
* catalog defaults. `fast` changes the per-token price; `thinking` is
|
|
55
55
|
* price-neutral but changes token consumption and must never follow the
|
|
56
|
-
* account default. Sourced from the Cursor catalog
|
|
57
|
-
* (stigmer-cloud _projects/2026-08/20260806.04.model-service-tier).
|
|
56
|
+
* account default. Sourced from a survey of the Cursor catalog (2026-08).
|
|
58
57
|
*/
|
|
59
58
|
const FAST_PARAM_ID = "fast";
|
|
60
59
|
const THINKING_PARAM_ID = "thinking";
|
|
@@ -3,59 +3,63 @@
|
|
|
3
3
|
*
|
|
4
4
|
* SessionSpec.harness_state_id stores the Cursor agentId. This module handles
|
|
5
5
|
* creating new agents (first execution), resuming existing agents
|
|
6
|
-
* (subsequent executions)
|
|
7
|
-
* cleaning up agents (session deletion).
|
|
6
|
+
* (subsequent executions) and graceful fallback on resume failure.
|
|
8
7
|
*
|
|
9
8
|
* Two execution modes:
|
|
10
9
|
*
|
|
11
|
-
* - Local mode: Agent.create({ local: { cwd } })
|
|
12
|
-
*
|
|
13
|
-
*
|
|
10
|
+
* - Local mode: Agent.create({ local: { cwd, dirs, store, ... } }) over the
|
|
11
|
+
* session's own SQLite store (`session-store.ts`). Produces agent- prefixed
|
|
12
|
+
* IDs.
|
|
14
13
|
*
|
|
15
14
|
* - Cloud mode (feature-flagged): Agent.create({ cloud: { repos } })
|
|
16
|
-
* for git-backed workspaces. Produces bc- prefixed IDs. No
|
|
17
|
-
*
|
|
15
|
+
* for git-backed workspaces. Produces bc- prefixed IDs. No store — cloud
|
|
16
|
+
* state lives on Cursor's servers, not local SQLite.
|
|
18
17
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
18
|
+
* Nothing under `local` survives Agent.resume(): `cwd`, `dirs`,
|
|
19
|
+
* `settingSources`, `store` and `enableAgentRetries` are re-supplied on every
|
|
20
|
+
* resume, exactly like `mcpServers`, `agents` and the model params. Omitting
|
|
21
|
+
* `cwd` re-roots the resumed agent at process.cwd() and loads the "project"
|
|
22
|
+
* setting source (the .cursor/hooks.json carrying the HITL approval hook) from
|
|
23
|
+
* the wrong directory, silently disabling the gate on every resumed turn;
|
|
24
|
+
* omitting `store` would make the SDK look the agent up in a default store
|
|
25
|
+
* derived from `cwd`, not the one the session's records are in.
|
|
21
26
|
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
27
|
+
* Durability model: the session's SQLite store (agent records, runs,
|
|
28
|
+
* checkpoints) is the source of truth for conversation continuation. It lives
|
|
29
|
+
* under the durable workspace volume (`session-store.ts`) so Agent.resume()
|
|
30
|
+
* survives pod restart, reschedule, and snapshot restore. When resume
|
|
31
|
+
* nonetheless fails (store lost, corrupted, or agent unknown), this module
|
|
32
|
+
* creates a fresh agent and the caller starts a new turn from the user message
|
|
33
|
+
* plus re-injected instructions — there is no separate continuation store.
|
|
28
34
|
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
35
|
+
* Retries are the runner's, not the SDK's. `@cursor/sdk` 1.0.31 defaults
|
|
36
|
+
* `enableAgentRetries` to true for headless embedders (1.0.13 defaulted it to
|
|
37
|
+
* false); the runner already owns recovery from a dead or stalled transport —
|
|
38
|
+
* `withTimeout` around agent resolution, `resolveAgentWithTransportRecovery`
|
|
39
|
+
* (reset the transport, retry once), the two recovery spines in
|
|
40
|
+
* `turn-settle.ts`, and the stall detector — so the SDK's layer is pinned OFF
|
|
41
|
+
* to keep one retry authority and the 1.0.13 timing of every provider fault.
|
|
42
|
+
* Whether to adopt the SDK's retries and delete ours is an open design
|
|
43
|
+
* question for the harness program, recorded there; it is not decided here.
|
|
37
44
|
*/
|
|
38
45
|
|
|
39
|
-
import { mkdirSync } from "node:fs";
|
|
40
|
-
import { join } from "node:path";
|
|
41
|
-
|
|
42
46
|
import { Agent } from "@cursor/sdk";
|
|
43
47
|
import type {
|
|
44
48
|
SDKAgent,
|
|
45
|
-
CursorAgentPlatformOptions,
|
|
46
49
|
AgentDefinition,
|
|
50
|
+
LocalAgentOptions,
|
|
47
51
|
ModelParameterValue,
|
|
48
52
|
} from "@cursor/sdk";
|
|
53
|
+
import type { SqliteLocalAgentStore } from "@cursor/sdk/sqlite";
|
|
49
54
|
import { withTimeout, TimeoutError } from "../../shared/with-timeout.js";
|
|
50
55
|
import type { CloudRepo } from "../../shared/blueprint-resolver.js";
|
|
51
56
|
import type { CursorMcpServerConfig } from "./cursor-mcp-config.js";
|
|
57
|
+
import { sessionStore } from "./session-store.js";
|
|
52
58
|
|
|
53
59
|
// ---------------------------------------------------------------------------
|
|
54
60
|
// Constants
|
|
55
61
|
// ---------------------------------------------------------------------------
|
|
56
62
|
|
|
57
|
-
const CURSOR_SDK_STATE_DIR = ".stigmer/cursor-sdk-state";
|
|
58
|
-
|
|
59
63
|
/**
|
|
60
64
|
* Cursor SDK setting sources loaded for LOCAL agents.
|
|
61
65
|
*
|
|
@@ -199,64 +203,41 @@ export interface AgentResolution {
|
|
|
199
203
|
// ---------------------------------------------------------------------------
|
|
200
204
|
|
|
201
205
|
/**
|
|
202
|
-
*
|
|
203
|
-
*
|
|
204
|
-
*
|
|
205
|
-
* ensures the SDK's platform cache key is stable across activity
|
|
206
|
-
* invocations regardless of process.cwd().
|
|
206
|
+
* The `local` options a session's agent is created AND resumed with — one
|
|
207
|
+
* builder so the two calls cannot drift (see the module header for why every
|
|
208
|
+
* field is re-supplied on resume).
|
|
207
209
|
*
|
|
208
|
-
*
|
|
209
|
-
*
|
|
210
|
-
*
|
|
211
|
-
*
|
|
212
|
-
*
|
|
213
|
-
* keys it by sessionId so sessions sharing one volume (e.g. the child agent
|
|
214
|
-
* executions of a workflow sandbox) never collide. Created eagerly to
|
|
215
|
-
* prevent ENOENT on first SDK write.
|
|
216
|
-
*
|
|
217
|
-
* Both inputs are required and must be non-empty: the stateRoot is keyed by
|
|
218
|
-
* sessionId, so an empty sessionId would collapse every session sharing the
|
|
219
|
-
* volume onto the same store and corrupt their conversation state.
|
|
210
|
+
* Workspaces: the SDK takes ONE primary `cwd` (the default shell's directory
|
|
211
|
+
* and the agent's store scoping) plus `dirs` for the other roots of a
|
|
212
|
+
* multi-root workspace, merged cwd-first with duplicates dropped, so rules,
|
|
213
|
+
* skills and hooks load from every root. The session's first workspace
|
|
214
|
+
* directory is the primary, as it was when the SDK took the whole array.
|
|
220
215
|
*/
|
|
221
|
-
|
|
216
|
+
async function localAgentOptions(
|
|
222
217
|
sessionId: string,
|
|
223
218
|
workspaceRootDir: string,
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
"state store is keyed by sessionId; an empty value would collide across sessions " +
|
|
229
|
-
"sharing a workspace volume (e.g. a workflow sandbox's child agent executions).",
|
|
230
|
-
);
|
|
231
|
-
}
|
|
232
|
-
if (!workspaceRootDir) {
|
|
233
|
-
throw new Error(
|
|
234
|
-
"resolvePlatformOptions: workspaceRootDir is required but was empty. The Cursor " +
|
|
235
|
-
"SDK state store must live on the durable workspace volume to survive restarts.",
|
|
236
|
-
);
|
|
237
|
-
}
|
|
238
|
-
const stateRoot = join(workspaceRootDir, CURSOR_SDK_STATE_DIR, sessionId);
|
|
239
|
-
mkdirSync(stateRoot, { recursive: true });
|
|
219
|
+
workspaceDirs: readonly string[],
|
|
220
|
+
): Promise<LocalAgentOptions & { readonly store: SqliteLocalAgentStore }> {
|
|
221
|
+
const [cwd, ...dirs] = workspaceDirs;
|
|
222
|
+
const store = await sessionStore(sessionId, workspaceRootDir);
|
|
240
223
|
return {
|
|
241
|
-
|
|
242
|
-
|
|
224
|
+
cwd,
|
|
225
|
+
...(dirs.length > 0 ? { dirs } : {}),
|
|
226
|
+
settingSources: [...LOCAL_SETTING_SOURCES],
|
|
227
|
+
store,
|
|
228
|
+
// The runner is the one retry authority (module header).
|
|
229
|
+
enableAgentRetries: false,
|
|
243
230
|
};
|
|
244
231
|
}
|
|
245
232
|
|
|
246
233
|
/**
|
|
247
234
|
* Create a new local Cursor Agent for the first execution in a session.
|
|
248
|
-
*
|
|
249
|
-
* Supports multi-workspace: passes string[] when multiple dirs, string when single.
|
|
250
235
|
*/
|
|
251
236
|
export async function createAgent(options: CreateAgentOptions): Promise<SDKAgent> {
|
|
252
|
-
const
|
|
253
|
-
? options.workspaceDirs[0]
|
|
254
|
-
: options.workspaceDirs;
|
|
255
|
-
|
|
256
|
-
const platform = resolvePlatformOptions(options.sessionId, options.workspaceRootDir);
|
|
237
|
+
const local = await localAgentOptions(options.sessionId, options.workspaceRootDir, options.workspaceDirs);
|
|
257
238
|
console.log(
|
|
258
|
-
`createAgent: sessionId=${options.sessionId}, workspaceRef=${
|
|
259
|
-
`stateRoot=${
|
|
239
|
+
`createAgent: sessionId=${options.sessionId}, workspaceRef=${local.store.workspaceRef}, ` +
|
|
240
|
+
`stateRoot=${local.store.stateRoot}, process.cwd=${process.cwd()}`,
|
|
260
241
|
);
|
|
261
242
|
|
|
262
243
|
return Agent.create({
|
|
@@ -264,10 +245,9 @@ export async function createAgent(options: CreateAgentOptions): Promise<SDKAgent
|
|
|
264
245
|
// Always a full selection — id AND params. A bare { id } would let the
|
|
265
246
|
// catalog's default variant (account-influenced) pick the price (#357).
|
|
266
247
|
model: { id: options.model, params: options.modelParams },
|
|
267
|
-
local
|
|
248
|
+
local,
|
|
268
249
|
mcpServers: options.mcpServers as Record<string, any>,
|
|
269
250
|
agents: options.agents,
|
|
270
|
-
platform,
|
|
271
251
|
});
|
|
272
252
|
}
|
|
273
253
|
|
|
@@ -278,14 +258,10 @@ export async function createAgent(options: CreateAgentOptions): Promise<SDKAgent
|
|
|
278
258
|
* propagate or fall back to a fresh agent with continuation context.
|
|
279
259
|
*/
|
|
280
260
|
export async function resumeAgent(options: ResumeAgentOptions): Promise<SDKAgent> {
|
|
281
|
-
const
|
|
282
|
-
? options.workspaceDirs[0]
|
|
283
|
-
: options.workspaceDirs;
|
|
284
|
-
|
|
285
|
-
const platform = resolvePlatformOptions(options.sessionId, options.workspaceRootDir);
|
|
261
|
+
const local = await localAgentOptions(options.sessionId, options.workspaceRootDir, options.workspaceDirs);
|
|
286
262
|
console.log(
|
|
287
263
|
`resumeAgent: agentId=${options.agentId}, sessionId=${options.sessionId}, ` +
|
|
288
|
-
`workspaceRef=${
|
|
264
|
+
`workspaceRef=${local.store.workspaceRef}, stateRoot=${local.store.stateRoot}, ` +
|
|
289
265
|
`process.cwd=${process.cwd()}`,
|
|
290
266
|
);
|
|
291
267
|
|
|
@@ -296,16 +272,9 @@ export async function resumeAgent(options: ResumeAgentOptions): Promise<SDKAgent
|
|
|
296
272
|
// ledger, #357), but an id-only resume would fall back to the catalog
|
|
297
273
|
// default variant for the new turns.
|
|
298
274
|
model: options.model ? { id: options.model, params: options.modelParams } : undefined,
|
|
299
|
-
|
|
300
|
-
// re-supplied every turn. Omitting cwd makes the SDK fall back to
|
|
301
|
-
// process.cwd(), which re-roots the agent in the runner's own working
|
|
302
|
-
// directory and loads the "project" setting source — the .cursor/hooks.json
|
|
303
|
-
// carrying the HITL approval hook — from that wrong directory, silently
|
|
304
|
-
// disabling the approval gate on every resumed turn.
|
|
305
|
-
local: { cwd, settingSources: [...LOCAL_SETTING_SOURCES] },
|
|
275
|
+
local,
|
|
306
276
|
mcpServers: options.mcpServers as Record<string, any>,
|
|
307
277
|
agents: options.agents,
|
|
308
|
-
platform,
|
|
309
278
|
});
|
|
310
279
|
}
|
|
311
280
|
|
|
@@ -317,7 +286,7 @@ export async function resumeAgent(options: ResumeAgentOptions): Promise<SDKAgent
|
|
|
317
286
|
* Create a new cloud Cursor Agent for git-backed sessions.
|
|
318
287
|
*
|
|
319
288
|
* Cloud agents (bc- prefix) run on Cursor's servers with cloned repos.
|
|
320
|
-
* No
|
|
289
|
+
* No store — cloud state lives server-side, not in local SQLite.
|
|
321
290
|
* Model is optional — Cursor resolves the caller's configured default
|
|
322
291
|
* when omitted.
|
|
323
292
|
*/
|
|
@@ -341,7 +310,7 @@ export async function createCloudAgent(options: CreateCloudAgentOptions): Promis
|
|
|
341
310
|
*
|
|
342
311
|
* Throws on failure — the caller (resolveAgent) decides whether to
|
|
343
312
|
* propagate or fall back to a fresh cloud agent with continuation context.
|
|
344
|
-
* No
|
|
313
|
+
* No store — cloud state lives server-side.
|
|
345
314
|
*/
|
|
346
315
|
export async function resumeCloudAgent(options: ResumeCloudAgentOptions): Promise<SDKAgent> {
|
|
347
316
|
console.log(
|
|
@@ -365,8 +334,8 @@ export async function resumeCloudAgent(options: ResumeCloudAgentOptions): Promis
|
|
|
365
334
|
* graceful fallback if resume fails.
|
|
366
335
|
*
|
|
367
336
|
* The mode parameter determines which create/resume functions are used:
|
|
368
|
-
* - "local": createAgent / resumeAgent (
|
|
369
|
-
* - "cloud": createCloudAgent / resumeCloudAgent (no
|
|
337
|
+
* - "local": createAgent / resumeAgent (over the session's store)
|
|
338
|
+
* - "cloud": createCloudAgent / resumeCloudAgent (no store)
|
|
370
339
|
*
|
|
371
340
|
* When harnessStateId is non-empty (subsequent execution):
|
|
372
341
|
* 1. Attempt Agent.resume with mode-appropriate options.
|
|
@@ -536,18 +505,3 @@ export async function resolveAgentWithTransportRecovery(
|
|
|
536
505
|
return attempt(true);
|
|
537
506
|
}
|
|
538
507
|
}
|
|
539
|
-
|
|
540
|
-
/**
|
|
541
|
-
* Dispose a Cursor Agent when a session is deleted.
|
|
542
|
-
* Best-effort: logs and swallows errors.
|
|
543
|
-
*/
|
|
544
|
-
export async function disposeAgent(agentId: string, apiKey: string): Promise<void> {
|
|
545
|
-
try {
|
|
546
|
-
await Agent.archive(agentId, { apiKey });
|
|
547
|
-
} catch (err) {
|
|
548
|
-
console.warn(
|
|
549
|
-
`Failed to archive Cursor agent ${agentId}:`,
|
|
550
|
-
err instanceof Error ? err.message : err,
|
|
551
|
-
);
|
|
552
|
-
}
|
|
553
|
-
}
|