@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
|
@@ -41,14 +41,15 @@ describeWithCursorKey("SDK routing with CURSOR_BACKEND_URL unset", () => {
|
|
|
41
41
|
mkdirSync(stateRoot, { recursive: true });
|
|
42
42
|
|
|
43
43
|
const { Agent } = await import("@cursor/sdk");
|
|
44
|
+
const { SqliteLocalAgentStore } = await import("@cursor/sdk/sqlite");
|
|
44
45
|
|
|
45
46
|
const agent = await Agent.create({
|
|
46
47
|
apiKey: CURSOR_API_KEY,
|
|
47
48
|
model: { id: "claude-sonnet-4" },
|
|
48
|
-
local: {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
stateRoot,
|
|
49
|
+
local: {
|
|
50
|
+
cwd: stateRoot,
|
|
51
|
+
// 1.0.31: the store is caller-owned (`session-store.ts` in production).
|
|
52
|
+
store: await SqliteLocalAgentStore.open({ workspaceRef: `routing-test-${Date.now()}`, stateRoot }),
|
|
52
53
|
},
|
|
53
54
|
});
|
|
54
55
|
|
|
@@ -62,14 +63,15 @@ describeWithCursorKey("SDK routing with CURSOR_BACKEND_URL unset", () => {
|
|
|
62
63
|
mkdirSync(stateRoot, { recursive: true });
|
|
63
64
|
|
|
64
65
|
const { Agent } = await import("@cursor/sdk");
|
|
66
|
+
const { SqliteLocalAgentStore } = await import("@cursor/sdk/sqlite");
|
|
65
67
|
|
|
66
68
|
const agent = await Agent.create({
|
|
67
69
|
apiKey: CURSOR_API_KEY,
|
|
68
70
|
model: { id: "claude-sonnet-4" },
|
|
69
|
-
local: {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
stateRoot,
|
|
71
|
+
local: {
|
|
72
|
+
cwd: stateRoot,
|
|
73
|
+
// 1.0.31: the store is caller-owned (`session-store.ts` in production).
|
|
74
|
+
store: await SqliteLocalAgentStore.open({ workspaceRef: `routing-send-test-${Date.now()}`, stateRoot }),
|
|
73
75
|
},
|
|
74
76
|
});
|
|
75
77
|
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Cursor event recorder's contract (`cursor-event-recorder.ts`): off when
|
|
3
|
+
* no directory is named; both SDK channels in ONE file under ONE arrival
|
|
4
|
+
* counter, each line saying which channel it came from; the file named by the
|
|
5
|
+
* execution; a cyclic payload recorded as a marker rather than failing the
|
|
6
|
+
* flush. The native recorder's `v3-event-recorder.test.ts` is the sibling.
|
|
7
|
+
*
|
|
8
|
+
* The ordering arm is the reason the recorder exists in this shape: a delta
|
|
9
|
+
* that arrives between two stream events must read between them in the file,
|
|
10
|
+
* because "does `tool-call-completed` precede the stream's own completion" is
|
|
11
|
+
* a question only the arrival order can answer.
|
|
12
|
+
*/
|
|
13
|
+
import { describe, it, expect, beforeEach } from "vitest";
|
|
14
|
+
import { mkdtemp, readFile, readdir } from "node:fs/promises";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { tmpdir } from "node:os";
|
|
17
|
+
import type { InteractionUpdate, SDKMessage } from "@cursor/sdk";
|
|
18
|
+
import { createCursorEventRecorder } from "../cursor-event-recorder.js";
|
|
19
|
+
|
|
20
|
+
/** A stream event carrying only what the recorder reads; the rest is payload. */
|
|
21
|
+
function streamEvent(type: string, extra: Record<string, unknown> = {}): SDKMessage {
|
|
22
|
+
return { type, agent_id: "agent-1", run_id: "run-1", ...extra } as unknown as SDKMessage;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function delta(type: string, extra: Record<string, unknown> = {}): InteractionUpdate {
|
|
26
|
+
return { type, ...extra } as unknown as InteractionUpdate;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
interface RecordedLine {
|
|
30
|
+
readonly seq: number;
|
|
31
|
+
readonly capturedAt: string;
|
|
32
|
+
readonly channel: "stream" | "delta";
|
|
33
|
+
readonly type: string;
|
|
34
|
+
readonly agent_id?: string;
|
|
35
|
+
readonly run_id?: string;
|
|
36
|
+
readonly event?: Record<string, unknown>;
|
|
37
|
+
readonly update?: Record<string, unknown>;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async function readLines(dir: string, executionId: string): Promise<RecordedLine[]> {
|
|
41
|
+
const content = await readFile(join(dir, `${executionId}.cursor-events.jsonl`), "utf-8");
|
|
42
|
+
return content
|
|
43
|
+
.split("\n")
|
|
44
|
+
.filter((line) => line.length > 0)
|
|
45
|
+
.map((line) => JSON.parse(line) as RecordedLine);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
describe("createCursorEventRecorder", () => {
|
|
49
|
+
it("returns undefined when no directory is named (recording off)", () => {
|
|
50
|
+
expect(createCursorEventRecorder("exec-1", undefined)).toBeUndefined();
|
|
51
|
+
expect(createCursorEventRecorder("exec-1", "")).toBeUndefined();
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("returns a recorder with both channels and a flush when a directory is named", () => {
|
|
55
|
+
const recorder = createCursorEventRecorder("exec-1", "/tmp/unused");
|
|
56
|
+
expect(recorder).toBeDefined();
|
|
57
|
+
expect(recorder!.record).toBeInstanceOf(Function);
|
|
58
|
+
expect(recorder!.recordDelta).toBeInstanceOf(Function);
|
|
59
|
+
expect(recorder!.flush).toBeInstanceOf(Function);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
describe("CursorEventRecorder", () => {
|
|
64
|
+
let dir: string;
|
|
65
|
+
|
|
66
|
+
beforeEach(async () => {
|
|
67
|
+
dir = await mkdtemp(join(tmpdir(), "cursor-recorder-test-"));
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it("flush writes nothing when nothing was recorded", async () => {
|
|
71
|
+
const recorder = createCursorEventRecorder("exec-empty", dir)!;
|
|
72
|
+
await recorder.flush();
|
|
73
|
+
expect(await readdir(dir)).toHaveLength(0);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("sequences both channels in ONE file in arrival order, each line naming its channel", async () => {
|
|
77
|
+
const recorder = createCursorEventRecorder("exec-order", dir)!;
|
|
78
|
+
|
|
79
|
+
recorder.record(streamEvent("tool_call", { subtype: "started", call_id: "c1" }));
|
|
80
|
+
recorder.recordDelta(delta("shell-output-delta", { event: { chunk: "hook probe\n" } }));
|
|
81
|
+
recorder.recordDelta(delta("tool-call-completed", { toolCall: { id: "c1" } }));
|
|
82
|
+
recorder.record(streamEvent("tool_call", { subtype: "completed", call_id: "c1" }));
|
|
83
|
+
recorder.record(streamEvent("result"));
|
|
84
|
+
|
|
85
|
+
await recorder.flush();
|
|
86
|
+
const lines = await readLines(dir, "exec-order");
|
|
87
|
+
|
|
88
|
+
expect(lines.map((l) => l.seq)).toEqual([0, 1, 2, 3, 4]);
|
|
89
|
+
expect(lines.map((l) => `${l.channel}:${l.type}`)).toEqual([
|
|
90
|
+
"stream:tool_call",
|
|
91
|
+
"delta:shell-output-delta",
|
|
92
|
+
"delta:tool-call-completed",
|
|
93
|
+
"stream:tool_call",
|
|
94
|
+
"stream:result",
|
|
95
|
+
]);
|
|
96
|
+
for (const line of lines) expect(line.capturedAt).toBeTruthy();
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it("a stream line carries the event's agent and run ids and the whole event; a delta line the whole update", async () => {
|
|
100
|
+
const recorder = createCursorEventRecorder("exec-shape", dir)!;
|
|
101
|
+
|
|
102
|
+
recorder.record(streamEvent("assistant", { content: "hi" }));
|
|
103
|
+
recorder.recordDelta(delta("turn-ended", { usage: { inputTokens: 12 } }));
|
|
104
|
+
|
|
105
|
+
await recorder.flush();
|
|
106
|
+
const [stream, deltaLine] = await readLines(dir, "exec-shape");
|
|
107
|
+
|
|
108
|
+
expect(stream!.agent_id).toBe("agent-1");
|
|
109
|
+
expect(stream!.run_id).toBe("run-1");
|
|
110
|
+
expect(stream!.event).toMatchObject({ type: "assistant", content: "hi" });
|
|
111
|
+
expect(stream!.update).toBeUndefined();
|
|
112
|
+
|
|
113
|
+
expect(deltaLine!.update).toEqual({ type: "turn-ended", usage: { inputTokens: 12 } });
|
|
114
|
+
expect(deltaLine!.event).toBeUndefined();
|
|
115
|
+
expect(deltaLine!.agent_id).toBeUndefined();
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it("names the file by execution id and creates the directory if it does not exist", async () => {
|
|
119
|
+
const nested = join(dir, "nested", "deep");
|
|
120
|
+
const recorder = createCursorEventRecorder("exec-mkdir", nested)!;
|
|
121
|
+
|
|
122
|
+
recorder.record(streamEvent("system"));
|
|
123
|
+
await recorder.flush();
|
|
124
|
+
|
|
125
|
+
expect(await readdir(nested)).toEqual(["exec-mkdir.cursor-events.jsonl"]);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it("records a cyclic payload as a serialization marker instead of failing the flush", async () => {
|
|
129
|
+
const recorder = createCursorEventRecorder("exec-cyclic", dir)!;
|
|
130
|
+
|
|
131
|
+
const cyclic: Record<string, unknown> = { type: "custom", a: 1 };
|
|
132
|
+
cyclic.self = cyclic;
|
|
133
|
+
recorder.record(cyclic as unknown as SDKMessage);
|
|
134
|
+
|
|
135
|
+
await recorder.flush();
|
|
136
|
+
const [line] = await readLines(dir, "exec-cyclic");
|
|
137
|
+
|
|
138
|
+
expect(line!.type).toBe("custom");
|
|
139
|
+
expect(line!.event).toMatchObject({ _serializationError: true });
|
|
140
|
+
expect((line!.event as { keys: string[] }).keys).toContain("a");
|
|
141
|
+
});
|
|
142
|
+
});
|
|
@@ -1,11 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Live probe: which of the SDK's calls a `globalThis.fetch` interceptor can
|
|
3
|
+
* see. A fetch wrapper that notes any call to a cursor.sh / cursor.com URL is
|
|
4
|
+
* installed, then `Agent.create()` runs (local mode, no model named).
|
|
3
5
|
*
|
|
4
|
-
*
|
|
5
|
-
* to
|
|
6
|
+
* What the one arm proves: `Agent.create()` completes WITHOUT a global-fetch
|
|
7
|
+
* call to a Cursor URL — its transport is connect-node over Node's HTTP/2, so
|
|
8
|
+
* a fetch-level interceptor alone cannot rewrite it. That is why the adapter
|
|
9
|
+
* installs BOTH interceptors in proxy mode (`fetch-interceptor.ts` and
|
|
10
|
+
* `http2-interceptor.ts`). Measured true at SDK 1.0.31 on 2026-09-16 (#1097's
|
|
11
|
+
* live run, 1/1).
|
|
6
12
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
13
|
+
* What it does NOT prove: that the fetch interceptor is useless. A reading of
|
|
14
|
+
* the 1.0.31 bundle the same day found the SDK's cloud-api client and its
|
|
15
|
+
* token exchange on global `fetch`, on paths this arm never exercises; the
|
|
16
|
+
* fetch interceptor exists for those.
|
|
17
|
+
*
|
|
18
|
+
* Skipped without `CURSOR_API_KEY`; the suite never runs it. Run it by hand:
|
|
19
|
+
* CURSOR_API_KEY=<key> npx vitest run src/activities/execute-cursor/__tests__/cursor-fetch-interceptor-bypass.test.ts
|
|
9
20
|
*/
|
|
10
21
|
|
|
11
22
|
import { describe, it, expect, beforeAll, afterAll } from "vitest";
|
|
@@ -39,26 +50,27 @@ describeWithCursorKey("Fetch Interceptor vs Connect-Node Transport", () => {
|
|
|
39
50
|
globalThis.fetch = originalFetch;
|
|
40
51
|
});
|
|
41
52
|
|
|
42
|
-
it("Agent.create()
|
|
53
|
+
it("Agent.create() completes without a globalThis.fetch call to a Cursor URL", async () => {
|
|
43
54
|
const { Agent } = await import("@cursor/sdk");
|
|
55
|
+
const { SqliteLocalAgentStore } = await import("@cursor/sdk/sqlite");
|
|
44
56
|
|
|
45
57
|
const stateRoot = join(tmpdir(), `cursor-intercept-test-${Date.now()}`);
|
|
46
58
|
mkdirSync(stateRoot, { recursive: true });
|
|
47
59
|
|
|
48
60
|
const agent = await Agent.create({
|
|
49
61
|
apiKey: CURSOR_API_KEY,
|
|
50
|
-
local: {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
stateRoot,
|
|
62
|
+
local: {
|
|
63
|
+
cwd: stateRoot,
|
|
64
|
+
// 1.0.31: the store is caller-owned (`session-store.ts` in production).
|
|
65
|
+
store: await SqliteLocalAgentStore.open({ workspaceRef: `intercept-test-${Date.now()}`, stateRoot }),
|
|
54
66
|
},
|
|
55
67
|
});
|
|
56
68
|
|
|
57
69
|
expect(agent.agentId).toBeTruthy();
|
|
58
70
|
console.log(`Agent created: ${agent.agentId}, interceptCalled=${interceptCalled}`);
|
|
59
71
|
|
|
60
|
-
//
|
|
61
|
-
//
|
|
72
|
+
// The create path is connect-node over Node's HTTP/2, not globalThis.fetch;
|
|
73
|
+
// see the header for what this does and does not say about proxy mode.
|
|
62
74
|
expect(interceptCalled).toBe(false);
|
|
63
75
|
}, 30_000);
|
|
64
76
|
});
|
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
*/
|
|
36
36
|
|
|
37
37
|
import { describe, it, expect } from "vitest";
|
|
38
|
+
import { SqliteLocalAgentStore } from "@cursor/sdk/sqlite";
|
|
38
39
|
import { mkdtempSync, mkdirSync, writeFileSync, readFileSync, existsSync, chmodSync, readdirSync } from "node:fs";
|
|
39
40
|
import { tmpdir } from "node:os";
|
|
40
41
|
import { join } from "node:path";
|
|
@@ -87,8 +88,12 @@ describeWithCursorKey("generateImage live ground truth (issue #965)", () => {
|
|
|
87
88
|
const agent = await Agent.create({
|
|
88
89
|
apiKey: CURSOR_API_KEY,
|
|
89
90
|
model: { id: "composer-2.5" },
|
|
90
|
-
local: {
|
|
91
|
-
|
|
91
|
+
local: {
|
|
92
|
+
cwd: workspaceRoot,
|
|
93
|
+
settingSources: ["project"],
|
|
94
|
+
// 1.0.31: the store is caller-owned (`session-store.ts` in production).
|
|
95
|
+
store: await SqliteLocalAgentStore.open({ workspaceRef: `genimage-spike-${Date.now()}`, stateRoot }),
|
|
96
|
+
},
|
|
92
97
|
});
|
|
93
98
|
|
|
94
99
|
// The runner's exact consumption shape (index.ts / turn-stream.ts):
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Live ground truth for the hook protocol the approval gate rides on — the
|
|
3
|
+
* standing instrument an `@cursor/sdk` bump runs before it is trusted
|
|
4
|
+
* (stigmer/stigmer#1053, the first bump; every later one inherits this).
|
|
5
|
+
*
|
|
6
|
+
* WHY THIS EXISTS. The Stigmer HITL gate on the Cursor harness is a
|
|
7
|
+
* `.cursor/hooks.json` `preToolUse` hook (`hook-script.ts`) that reads the
|
|
8
|
+
* SDK's stdin payload and answers `{"permission": "allow" | "deny"}`. Three
|
|
9
|
+
* facts about that payload are load-bearing and none is a TypeScript type:
|
|
10
|
+
*
|
|
11
|
+
* 1. `tool_name` is the HOOK taxonomy, PascalCase (`Write`, `Shell`, `Delete`;
|
|
12
|
+
* the stream taxonomy is lowercase `edit`, `shell`, `delete`) — the gated
|
|
13
|
+
* set `BUILT_IN_GATED` (`approval-policy.ts`) is spelled in it.
|
|
14
|
+
* 2. `tool_input` is an OBJECT for built-in tools (a JSON STRING for MCP
|
|
15
|
+
* tools under `beforeMCPExecution`) — the hook's identity token and the
|
|
16
|
+
* denial ledger's captured args are computed from it.
|
|
17
|
+
* 3. `hook_event_name` discriminates `preToolUse` from `beforeMCPExecution`.
|
|
18
|
+
*
|
|
19
|
+
* The hermetic tests prove the runner's handling of the shapes CAPTURED at
|
|
20
|
+
* 1.0.13 (`cursor-hook-harness.ts` `hookWrite`, `hookShell`, ...). They cannot
|
|
21
|
+
* see the SDK move. This test runs one real turn that edits a file and runs a
|
|
22
|
+
* shell command under an allow-everything observation hook, then asserts the
|
|
23
|
+
* three facts on what the real SDK sent. A `tool_name` outside the gated set
|
|
24
|
+
* for a write-, shell- or delete-class action is the one outcome that must
|
|
25
|
+
* stop a bump: the gate would let it through.
|
|
26
|
+
*
|
|
27
|
+
* Skipped without CURSOR_API_KEY (the cursor-sdk-auth-smoke.test.ts
|
|
28
|
+
* convention) — it spends real credits for one short turn. Findings are
|
|
29
|
+
* PRINTED as well as asserted, so a bump's PR can quote the shapes seen.
|
|
30
|
+
*
|
|
31
|
+
* Run with: CURSOR_API_KEY=<key> npx vitest run cursor-hook-protocol-live
|
|
32
|
+
*/
|
|
33
|
+
import { describe, it, expect } from "vitest";
|
|
34
|
+
import { chmodSync, existsSync, mkdirSync, mkdtempSync, readFileSync, writeFileSync } from "node:fs";
|
|
35
|
+
import { tmpdir } from "node:os";
|
|
36
|
+
import { join } from "node:path";
|
|
37
|
+
import { approvalCategory } from "../approval-policy.js";
|
|
38
|
+
|
|
39
|
+
const CURSOR_API_KEY = process.env.CURSOR_API_KEY ?? "";
|
|
40
|
+
const describeWithCursorKey = CURSOR_API_KEY ? describe : describe.skip;
|
|
41
|
+
|
|
42
|
+
/** One hook invocation as the SDK wrote it to the hook's stdin. */
|
|
43
|
+
interface HookInvocation {
|
|
44
|
+
readonly hook_event_name?: unknown;
|
|
45
|
+
readonly tool_name?: unknown;
|
|
46
|
+
readonly tool_input?: unknown;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* An observation-only preToolUse/beforeMCPExecution hook: appends every
|
|
51
|
+
* invocation's stdin JSON to a log file and ALLOWS everything, so the turn
|
|
52
|
+
* runs to completion and every gated action is seen exactly as the gate would
|
|
53
|
+
* see it.
|
|
54
|
+
*/
|
|
55
|
+
function installObservationHook(workspaceRoot: string, logPath: string): void {
|
|
56
|
+
const hooksDir = join(workspaceRoot, ".cursor");
|
|
57
|
+
mkdirSync(hooksDir, { recursive: true });
|
|
58
|
+
const scriptPath = join(hooksDir, "observe-hook.sh");
|
|
59
|
+
writeFileSync(
|
|
60
|
+
scriptPath,
|
|
61
|
+
`#!/bin/bash\nINPUT=$(cat)\nprintf '%s\\n' "$INPUT" >> "${logPath}" 2>/dev/null || true\necho '{"permission":"allow"}'\n`,
|
|
62
|
+
"utf-8",
|
|
63
|
+
);
|
|
64
|
+
chmodSync(scriptPath, 0o755);
|
|
65
|
+
writeFileSync(
|
|
66
|
+
join(hooksDir, "hooks.json"),
|
|
67
|
+
JSON.stringify({
|
|
68
|
+
version: 1,
|
|
69
|
+
hooks: {
|
|
70
|
+
preToolUse: [{ command: scriptPath }],
|
|
71
|
+
beforeMCPExecution: [{ command: scriptPath }],
|
|
72
|
+
},
|
|
73
|
+
}),
|
|
74
|
+
"utf-8",
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function readInvocations(logPath: string): HookInvocation[] {
|
|
79
|
+
if (!existsSync(logPath)) return [];
|
|
80
|
+
const invocations: HookInvocation[] = [];
|
|
81
|
+
for (const line of readFileSync(logPath, "utf-8").split("\n")) {
|
|
82
|
+
if (!line.trim()) continue;
|
|
83
|
+
try {
|
|
84
|
+
invocations.push(JSON.parse(line) as HookInvocation);
|
|
85
|
+
} catch {
|
|
86
|
+
/* a partial line from a hook the SDK cut off; nothing to read */
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return invocations;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
describeWithCursorKey("Cursor SDK hook protocol (live ground truth)", () => {
|
|
93
|
+
it("delivers PascalCase tool_name, an object tool_input and hook_event_name for a file edit and a shell command", async () => {
|
|
94
|
+
const { Agent } = await import("@cursor/sdk");
|
|
95
|
+
const { SqliteLocalAgentStore } = await import("@cursor/sdk/sqlite");
|
|
96
|
+
|
|
97
|
+
const workspaceRoot = mkdtempSync(join(tmpdir(), "stigmer-hook-protocol-"));
|
|
98
|
+
const stateRoot = join(workspaceRoot, ".sdk-state");
|
|
99
|
+
mkdirSync(stateRoot, { recursive: true });
|
|
100
|
+
const hookLog = join(workspaceRoot, "hook-invocations.jsonl");
|
|
101
|
+
installObservationHook(workspaceRoot, hookLog);
|
|
102
|
+
|
|
103
|
+
// Mirror the runner's arrangement (session-lifecycle.ts): local cwd, the
|
|
104
|
+
// "project" setting source that loads .cursor/hooks.json, the session's
|
|
105
|
+
// own store, the SDK's retries off.
|
|
106
|
+
const agent = await Agent.create({
|
|
107
|
+
apiKey: CURSOR_API_KEY,
|
|
108
|
+
model: { id: "composer-2.5" },
|
|
109
|
+
local: {
|
|
110
|
+
cwd: workspaceRoot,
|
|
111
|
+
settingSources: ["project"],
|
|
112
|
+
store: await SqliteLocalAgentStore.open({ workspaceRef: `hook-protocol-${Date.now()}`, stateRoot }),
|
|
113
|
+
enableAgentRetries: false,
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
const run = await agent.send(
|
|
118
|
+
"Do exactly two things, in order, without asking questions: " +
|
|
119
|
+
"(1) create a file named probe.txt in the workspace containing the single line 'hook probe'; " +
|
|
120
|
+
"(2) run the shell command `cat probe.txt`. Then reply with the word done.",
|
|
121
|
+
);
|
|
122
|
+
for await (const _event of run.stream()) {
|
|
123
|
+
/* drain: the hook log is the evidence, not the stream */
|
|
124
|
+
}
|
|
125
|
+
const result = await run.wait();
|
|
126
|
+
agent.close();
|
|
127
|
+
|
|
128
|
+
const invocations = readInvocations(hookLog);
|
|
129
|
+
|
|
130
|
+
// ---- Findings dump (what a bump's PR quotes) ----
|
|
131
|
+
console.log(`[hook-protocol] run status: ${result.status}`);
|
|
132
|
+
for (const inv of invocations) {
|
|
133
|
+
console.log(
|
|
134
|
+
`[hook-protocol] ${String(inv.hook_event_name)}:${String(inv.tool_name)} ` +
|
|
135
|
+
`tool_input=${typeof inv.tool_input} ${JSON.stringify(inv.tool_input).slice(0, 200)}`,
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// The SDK boundary must not hang, and the turn must have reached the hook.
|
|
140
|
+
expect(["finished", "error", "cancelled"]).toContain(result.status);
|
|
141
|
+
expect(invocations.length, "the observation hook saw no tool call — hooks.json was not loaded").toBeGreaterThan(0);
|
|
142
|
+
|
|
143
|
+
const builtIns = invocations.filter((inv) => inv.hook_event_name === "preToolUse");
|
|
144
|
+
expect(builtIns.length, "no preToolUse invocation: the built-in tools did not reach the hook").toBeGreaterThan(0);
|
|
145
|
+
for (const inv of builtIns) {
|
|
146
|
+
// Fact 3: the discriminator is present and spelled as the script branches on it.
|
|
147
|
+
expect(inv.hook_event_name).toBe("preToolUse");
|
|
148
|
+
// Fact 1: the hook taxonomy is PascalCase.
|
|
149
|
+
expect(typeof inv.tool_name).toBe("string");
|
|
150
|
+
expect(inv.tool_name as string).toMatch(/^[A-Z]/);
|
|
151
|
+
// Fact 2: built-in tool_input is an object, not a JSON string.
|
|
152
|
+
expect(typeof inv.tool_input).toBe("object");
|
|
153
|
+
expect(inv.tool_input).not.toBeNull();
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// The gate's reach: the write and the shell the prompt forced must have
|
|
157
|
+
// arrived under names the gate classifies. A write- or shell-class action
|
|
158
|
+
// under an unclassified name is the outcome that stops a bump.
|
|
159
|
+
const categories = builtIns.map((inv) => approvalCategory(inv.tool_name as string));
|
|
160
|
+
expect(categories, "the file write reached the hook under a name the gate classifies as write").toContain("write");
|
|
161
|
+
expect(categories, "the shell command reached the hook under a name the gate classifies as shell").toContain("shell");
|
|
162
|
+
}, 300_000);
|
|
163
|
+
});
|
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Live smoke: the Cursor SDK authenticates and completes a round trip on a
|
|
3
|
+
* real member key. Three arms, each isolating one fact:
|
|
4
|
+
* 1. `Agent.create()` with a model named succeeds — the key is valid;
|
|
5
|
+
* 2. `agent.send()` runs to a completed result — the agent executes and the
|
|
6
|
+
* transport completes the round trip;
|
|
7
|
+
* 3. `Agent.create()` with no model named succeeds — the catalog default
|
|
8
|
+
* resolves.
|
|
3
9
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* 3. The connect-node transport works end-to-end
|
|
8
|
-
*
|
|
9
|
-
* Run with: CURSOR_API_KEY=<key> npx tsx --test this-file.ts
|
|
10
|
-
* Or via the test script: npm run test:cursor-auth
|
|
10
|
+
* Skipped without `CURSOR_API_KEY`; the suite never runs it. Run it by hand:
|
|
11
|
+
* CURSOR_API_KEY=<key> npx vitest run src/activities/execute-cursor/__tests__/cursor-sdk-auth-smoke.test.ts
|
|
12
|
+
* Last run green 3/3 on 2026-09-16 at SDK 1.0.31 (#1097's live run).
|
|
11
13
|
*/
|
|
12
14
|
|
|
13
15
|
import { describe, it, expect } from "vitest";
|
|
14
16
|
import { Agent } from "@cursor/sdk";
|
|
17
|
+
import { SqliteLocalAgentStore } from "@cursor/sdk/sqlite";
|
|
15
18
|
import { mkdirSync } from "node:fs";
|
|
16
19
|
import { join } from "node:path";
|
|
17
20
|
import { tmpdir } from "node:os";
|
|
@@ -31,10 +34,10 @@ describeWithCursorKey("Cursor SDK Authentication Smoke Test", () => {
|
|
|
31
34
|
const agent = await Agent.create({
|
|
32
35
|
apiKey: CURSOR_API_KEY,
|
|
33
36
|
model: { id: "claude-sonnet-4" },
|
|
34
|
-
local: {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
stateRoot,
|
|
37
|
+
local: {
|
|
38
|
+
cwd: stateRoot,
|
|
39
|
+
// 1.0.31: the store is caller-owned (`session-store.ts` in production).
|
|
40
|
+
store: await SqliteLocalAgentStore.open({ workspaceRef: `auth-test-${Date.now()}`, stateRoot }),
|
|
38
41
|
},
|
|
39
42
|
});
|
|
40
43
|
|
|
@@ -50,10 +53,10 @@ describeWithCursorKey("Cursor SDK Authentication Smoke Test", () => {
|
|
|
50
53
|
const agent = await Agent.create({
|
|
51
54
|
apiKey: CURSOR_API_KEY,
|
|
52
55
|
model: { id: "claude-sonnet-4" },
|
|
53
|
-
local: {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
stateRoot,
|
|
56
|
+
local: {
|
|
57
|
+
cwd: stateRoot,
|
|
58
|
+
// 1.0.31: the store is caller-owned (`session-store.ts` in production).
|
|
59
|
+
store: await SqliteLocalAgentStore.open({ workspaceRef: `send-test-${Date.now()}`, stateRoot }),
|
|
57
60
|
},
|
|
58
61
|
});
|
|
59
62
|
|
|
@@ -76,10 +79,10 @@ describeWithCursorKey("Cursor SDK Authentication Smoke Test", () => {
|
|
|
76
79
|
|
|
77
80
|
const agent = await Agent.create({
|
|
78
81
|
apiKey: CURSOR_API_KEY,
|
|
79
|
-
local: {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
stateRoot,
|
|
82
|
+
local: {
|
|
83
|
+
cwd: stateRoot,
|
|
84
|
+
// 1.0.31: the store is caller-owned (`session-store.ts` in production).
|
|
85
|
+
store: await SqliteLocalAgentStore.open({ workspaceRef: `default-model-test-${Date.now()}`, stateRoot }),
|
|
83
86
|
},
|
|
84
87
|
});
|
|
85
88
|
|