@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
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drive Cursor SDK events through the REAL pair the harness runs in production
|
|
3
|
+
* — `CursorTranslator` into `TranscriptBuilder` over an `AgentExecutionStatus`
|
|
4
|
+
* — and hand back what they built. The unit-test seam that replaced
|
|
5
|
+
* `new <accumulator>(messages, options)` in #1097 (the accumulator folded
|
|
6
|
+
* rows itself; now the translator emits events and the shared builder folds
|
|
7
|
+
* them), so the arms that read a row's shape after a sequence of SDK events
|
|
8
|
+
* keep their shape while the module under them changed.
|
|
9
|
+
*
|
|
10
|
+
* The same shape as the native translator's local `feedAll` in
|
|
11
|
+
* `execute-deep-agent/__tests__/translator-through-builder.test.ts`, shared
|
|
12
|
+
* here because seven Cursor test files read through it.
|
|
13
|
+
*
|
|
14
|
+
* Deltas follow the loop's discipline (`turn-stream.ts`): `observeDelta`
|
|
15
|
+
* queues, and the queue is drained into the builder after the NEXT stream
|
|
16
|
+
* event — or at {@link CursorFold.drain} for a caller that wants them applied
|
|
17
|
+
* now, the settle's own last drain before `finalize()`.
|
|
18
|
+
*/
|
|
19
|
+
import type { InteractionUpdate, SDKMessage } from "@cursor/sdk";
|
|
20
|
+
import { type AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
21
|
+
import type { AgentMessage, ToolCall } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
22
|
+
import { TranscriptBuilder } from "../../../harness/transcript/builder.js";
|
|
23
|
+
import { CursorTranslator, type CursorTranslatorOptions } from "../translator.js";
|
|
24
|
+
export interface CursorFoldOptions {
|
|
25
|
+
/** The status to build into; a fresh empty one when omitted. Its `messages` are the translator's seed. */
|
|
26
|
+
readonly status?: AgentExecutionStatus;
|
|
27
|
+
/**
|
|
28
|
+
* An existing `messages` array to build into BY REFERENCE (a test that
|
|
29
|
+
* hand-built its seeded rows and keeps asserting on the same objects). Wins
|
|
30
|
+
* over `status`'s own array.
|
|
31
|
+
*/
|
|
32
|
+
readonly messages?: AgentMessage[];
|
|
33
|
+
readonly policies?: CursorTranslatorOptions["policies"];
|
|
34
|
+
readonly leases?: CursorTranslatorOptions["leases"];
|
|
35
|
+
}
|
|
36
|
+
export declare class CursorFold {
|
|
37
|
+
readonly status: AgentExecutionStatus;
|
|
38
|
+
readonly translator: CursorTranslator;
|
|
39
|
+
readonly builder: TranscriptBuilder;
|
|
40
|
+
constructor(options?: CursorFoldOptions);
|
|
41
|
+
/** One stream event, translated and folded, then the deltas queued so far — the loop's order. */
|
|
42
|
+
event(event: SDKMessage): this;
|
|
43
|
+
events(...events: SDKMessage[]): this;
|
|
44
|
+
/** One delta, queued — applied at the next {@link event} or {@link drain}. */
|
|
45
|
+
delta(update: InteractionUpdate): this;
|
|
46
|
+
drain(): this;
|
|
47
|
+
finalize(): this;
|
|
48
|
+
get messages(): AgentMessage[];
|
|
49
|
+
/** Every root row, in transcript order. */
|
|
50
|
+
rows(): ToolCall[];
|
|
51
|
+
row(callId: string): ToolCall;
|
|
52
|
+
}
|
|
53
|
+
/** Fold a sequence of stream events into a fresh transcript; the common one-liner. */
|
|
54
|
+
export declare function foldCursorEvents(events: readonly SDKMessage[], options?: CursorFoldOptions): CursorFold;
|
|
55
|
+
/**
|
|
56
|
+
* A builder over an existing `messages` array, kept BY REFERENCE (the status
|
|
57
|
+
* is given the array itself, never a copy), so a boundary test that built its
|
|
58
|
+
* rows by hand can hand them to `reconcileDeniedToolCalls` and keep asserting
|
|
59
|
+
* on the same objects.
|
|
60
|
+
*/
|
|
61
|
+
export declare function builderOver(messages: AgentMessage[], executionId?: string): TranscriptBuilder;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drive Cursor SDK events through the REAL pair the harness runs in production
|
|
3
|
+
* — `CursorTranslator` into `TranscriptBuilder` over an `AgentExecutionStatus`
|
|
4
|
+
* — and hand back what they built. The unit-test seam that replaced
|
|
5
|
+
* `new <accumulator>(messages, options)` in #1097 (the accumulator folded
|
|
6
|
+
* rows itself; now the translator emits events and the shared builder folds
|
|
7
|
+
* them), so the arms that read a row's shape after a sequence of SDK events
|
|
8
|
+
* keep their shape while the module under them changed.
|
|
9
|
+
*
|
|
10
|
+
* The same shape as the native translator's local `feedAll` in
|
|
11
|
+
* `execute-deep-agent/__tests__/translator-through-builder.test.ts`, shared
|
|
12
|
+
* here because seven Cursor test files read through it.
|
|
13
|
+
*
|
|
14
|
+
* Deltas follow the loop's discipline (`turn-stream.ts`): `observeDelta`
|
|
15
|
+
* queues, and the queue is drained into the builder after the NEXT stream
|
|
16
|
+
* event — or at {@link CursorFold.drain} for a caller that wants them applied
|
|
17
|
+
* now, the settle's own last drain before `finalize()`.
|
|
18
|
+
*/
|
|
19
|
+
import { create } from "@bufbuild/protobuf";
|
|
20
|
+
import { AgentExecutionStatusSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
21
|
+
import { TranscriptBuilder } from "../../../harness/transcript/builder.js";
|
|
22
|
+
import { CursorTranslator } from "../translator.js";
|
|
23
|
+
export class CursorFold {
|
|
24
|
+
status;
|
|
25
|
+
translator;
|
|
26
|
+
builder;
|
|
27
|
+
constructor(options = {}) {
|
|
28
|
+
this.status = options.status ?? create(AgentExecutionStatusSchema, {});
|
|
29
|
+
if (options.messages)
|
|
30
|
+
this.status.messages = options.messages;
|
|
31
|
+
this.translator = new CursorTranslator({
|
|
32
|
+
policies: options.policies ?? new Map(),
|
|
33
|
+
leases: options.leases ?? { global: false, categories: new Set() },
|
|
34
|
+
seeded: this.status.messages,
|
|
35
|
+
});
|
|
36
|
+
this.builder = new TranscriptBuilder("exec-fold", this.status);
|
|
37
|
+
}
|
|
38
|
+
/** One stream event, translated and folded, then the deltas queued so far — the loop's order. */
|
|
39
|
+
event(event) {
|
|
40
|
+
for (const e of this.translator.translate(event))
|
|
41
|
+
this.builder.apply(e);
|
|
42
|
+
this.drain();
|
|
43
|
+
return this;
|
|
44
|
+
}
|
|
45
|
+
events(...events) {
|
|
46
|
+
for (const e of events)
|
|
47
|
+
this.event(e);
|
|
48
|
+
return this;
|
|
49
|
+
}
|
|
50
|
+
/** One delta, queued — applied at the next {@link event} or {@link drain}. */
|
|
51
|
+
delta(update) {
|
|
52
|
+
this.translator.observeDelta(update);
|
|
53
|
+
return this;
|
|
54
|
+
}
|
|
55
|
+
drain() {
|
|
56
|
+
for (const e of this.translator.drainDeltas())
|
|
57
|
+
this.builder.apply(e);
|
|
58
|
+
return this;
|
|
59
|
+
}
|
|
60
|
+
finalize() {
|
|
61
|
+
this.drain();
|
|
62
|
+
this.builder.finalize();
|
|
63
|
+
return this;
|
|
64
|
+
}
|
|
65
|
+
get messages() {
|
|
66
|
+
return this.status.messages;
|
|
67
|
+
}
|
|
68
|
+
/** Every root row, in transcript order. */
|
|
69
|
+
rows() {
|
|
70
|
+
return this.status.messages.flatMap((m) => m.toolCalls);
|
|
71
|
+
}
|
|
72
|
+
row(callId) {
|
|
73
|
+
const found = this.rows().find((tc) => tc.id === callId);
|
|
74
|
+
if (!found)
|
|
75
|
+
throw new Error(`CursorFold: no row ${callId}`);
|
|
76
|
+
return found;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/** Fold a sequence of stream events into a fresh transcript; the common one-liner. */
|
|
80
|
+
export function foldCursorEvents(events, options = {}) {
|
|
81
|
+
return new CursorFold(options).events(...events);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* A builder over an existing `messages` array, kept BY REFERENCE (the status
|
|
85
|
+
* is given the array itself, never a copy), so a boundary test that built its
|
|
86
|
+
* rows by hand can hand them to `reconcileDeniedToolCalls` and keep asserting
|
|
87
|
+
* on the same objects.
|
|
88
|
+
*/
|
|
89
|
+
export function builderOver(messages, executionId = "exec-boundary") {
|
|
90
|
+
const status = create(AgentExecutionStatusSchema, {});
|
|
91
|
+
status.messages = messages;
|
|
92
|
+
return new TranscriptBuilder(executionId, status);
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=fold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fold.js","sourceRoot":"","sources":["../../../../src/activities/execute-cursor/__test-utils__/fold.ts"],"names":[],"mappings":"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"}
|
|
@@ -68,7 +68,7 @@ export function createCursorSubstrate() {
|
|
|
68
68
|
enforcesExactContent: true,
|
|
69
69
|
appliesRunLifetimeLease: true,
|
|
70
70
|
// The Cursor hook's deny decision does not carry approval_policy_source;
|
|
71
|
-
// provenance is projected at
|
|
71
|
+
// provenance is projected at translation time (the Cursor translator)
|
|
72
72
|
// and asserted by the corpus + resolveApprovalProvenance suites instead.
|
|
73
73
|
surfacesGatePolicySource: false,
|
|
74
74
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway-substrate.js","sourceRoot":"","sources":["../../../../src/activities/execute-cursor/__test-utils__/gateway-substrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACrH,OAAO,EAAE,YAAY,EAAsB,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAS9D;;;;GAIG;AACH,SAAS,QAAQ,CAAC,MAAsB;IACtC,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,aAAa,MAAM,CAAC,IAAI,0CAA0C,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IACpD,OAAO;QACL,QAAQ,EAAE,UAAU;QACpB,aAAa,EAAE,EAAE;QACjB,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,8EAA8E;QAC9E,uEAAuE;QACvE,aAAa,EAAE,aAAa,CAAC,IAAI,CAAC;QAClC,gBAAgB,EAAE,WAAW,MAAM,CAAC,IAAI,EAAE;KAC3C,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,MAAuB,EAAE,MAAsB;IACnE,8EAA8E;IAC9E,8EAA8E;IAC9E,MAAM,OAAO,GAAG,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACnD,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,UAAU,KAAK,OAAO,CAAC;IACxC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC;AACxC,CAAC;AAED,kFAAkF;AAClF,8DAA8D;AAC9D,SAAS,eAAe,CAAC,MAAsB;IAC7C,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,oBAAoB,MAAM,CAAC,IAAI,mCAAmC,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,OAAO;QAClB,YAAY,EAAE;YACZ,iBAAiB,EAAE,KAAK;YACxB,qBAAqB,EAAE,IAAI;YAC3B,0EAA0E;YAC1E,iDAAiD;YACjD,oBAAoB,EAAE,IAAI;YAC1B,uBAAuB,EAAE,IAAI;YAC7B,yEAAyE;YACzE,
|
|
1
|
+
{"version":3,"file":"gateway-substrate.js","sourceRoot":"","sources":["../../../../src/activities/execute-cursor/__test-utils__/gateway-substrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,12 +11,15 @@
|
|
|
11
11
|
* registry the harness reads at setup, the Cursor `Config` slice, and the
|
|
12
12
|
* per-scenario reset of the harness's module-level caches.
|
|
13
13
|
*
|
|
14
|
-
* What the
|
|
15
|
-
* hoisted by vitest and so cannot live here
|
|
14
|
+
* What the three `vi.mock` calls a scenario file must carry look like — they
|
|
15
|
+
* are hoisted by vitest and so cannot live here (the SDK's sqlite entry is a
|
|
16
|
+
* separate module id, so it is doubled separately; `scripted-sdk.ts`):
|
|
16
17
|
*
|
|
17
18
|
* ```ts
|
|
18
19
|
* vi.mock("@cursor/sdk", async () =>
|
|
19
20
|
* (await import("../../__test-utils__/scripted-sdk.js")).scriptedCursorSdkModule());
|
|
21
|
+
* vi.mock("@cursor/sdk/sqlite", async () =>
|
|
22
|
+
* (await import("../../__test-utils__/scripted-sdk.js")).scriptedCursorSqliteModule());
|
|
20
23
|
* vi.mock("../../../../client/stigmer-client.js", async () =>
|
|
21
24
|
* (await import("../../../../__test-utils__/hermetic-activity.js")).hermeticStigmerClientModule());
|
|
22
25
|
* ```
|
|
@@ -39,6 +42,18 @@
|
|
|
39
42
|
* the SDK double (`ScriptedSdkOptions`); an SDK-side cancel or a mid-stream
|
|
40
43
|
* wedge as an `effect` step on the run. Nothing here is a switch in production
|
|
41
44
|
* code — every knob is a value the production path already reads.
|
|
45
|
+
*
|
|
46
|
+
* Two postures, two entries, one turn runner. `beginCursorScenario` is the
|
|
47
|
+
* hermetic posture: the SDK doubled by the scenario file's `vi.mock`, the
|
|
48
|
+
* clock scripted, goldens byte-stable. `beginLiveCursorScenario` is the live
|
|
49
|
+
* posture (#1097's live-run gate): the scenario file mocks ONLY the
|
|
50
|
+
* client, the real `@cursor/sdk` runs under the real activity on the real
|
|
51
|
+
* clock with a real member key, and what the activity persists is read back
|
|
52
|
+
* from the same record. A live scenario therefore has no `sdk` and no `clock`
|
|
53
|
+
* — the type says which posture a file is in — and `runCursorTurn` reads only
|
|
54
|
+
* what both have. The registry fixture's `live` pass-through and the
|
|
55
|
+
* environment's `eventRecordingDir` are the live posture's two other
|
|
56
|
+
* seams, each on the module that owns the concern.
|
|
42
57
|
*/
|
|
43
58
|
import type { ModelListItem } from "@cursor/sdk";
|
|
44
59
|
import type { StigmerClient } from "../../../client/stigmer-client.js";
|
|
@@ -94,19 +109,24 @@ export declare function runWorkspaceHook(workspaceRoot: string, hookInput: objec
|
|
|
94
109
|
* as it does in a live worker.
|
|
95
110
|
*/
|
|
96
111
|
export declare function resetCursorModuleState(): void;
|
|
97
|
-
|
|
112
|
+
/** What both postures share: the environment, the record the activity persists into, the runner's `Config`. */
|
|
113
|
+
export interface CursorScenarioBase {
|
|
98
114
|
readonly env: HermeticEnvironment;
|
|
99
|
-
readonly clock: ScriptedClock;
|
|
100
115
|
readonly record: ExecutionRecord;
|
|
101
|
-
readonly sdk: ScriptedCursorSdk;
|
|
102
116
|
/** The runner this scenario runs on: the OSS posture plus the scenario's knobs. */
|
|
103
117
|
readonly config: Config;
|
|
104
118
|
}
|
|
105
|
-
|
|
106
|
-
|
|
119
|
+
/** The hermetic posture: the SDK double and the scripted clock beside the shared three. */
|
|
120
|
+
export interface CursorScenario extends CursorScenarioBase {
|
|
107
121
|
readonly clock: ScriptedClock;
|
|
122
|
+
readonly sdk: ScriptedCursorSdk;
|
|
123
|
+
}
|
|
124
|
+
/** The live posture (header): the shared three and nothing doubled but the client. */
|
|
125
|
+
export type LiveCursorScenario = CursorScenarioBase;
|
|
126
|
+
/** The options both postures take. */
|
|
127
|
+
interface CursorScenarioBaseOptions {
|
|
128
|
+
readonly env: HermeticEnvironment;
|
|
108
129
|
readonly record: ExecutionRecord;
|
|
109
|
-
readonly sdk: ScriptedSdkOptions;
|
|
110
130
|
/**
|
|
111
131
|
* Control-plane facets the scenario opts INTO, or faults it injects, over
|
|
112
132
|
* the record's everyday answers (`ExecutionRecord.client`): a rejecting
|
|
@@ -121,8 +141,23 @@ export interface CursorScenarioOptions {
|
|
|
121
141
|
*/
|
|
122
142
|
readonly config?: Partial<Config>;
|
|
123
143
|
}
|
|
124
|
-
|
|
144
|
+
export interface CursorScenarioOptions extends CursorScenarioBaseOptions {
|
|
145
|
+
readonly clock: ScriptedClock;
|
|
146
|
+
readonly sdk: ScriptedSdkOptions;
|
|
147
|
+
}
|
|
148
|
+
export interface LiveCursorScenarioOptions extends CursorScenarioBaseOptions {
|
|
149
|
+
/** The real member key the real SDK authenticates with; becomes `config.cursorApiKey`. */
|
|
150
|
+
readonly apiKey: string;
|
|
151
|
+
}
|
|
152
|
+
/** Bind the record and the SDK double for a hermetic scenario; resets the harness caches first. */
|
|
125
153
|
export declare function beginCursorScenario(options: CursorScenarioOptions): CursorScenario;
|
|
154
|
+
/**
|
|
155
|
+
* Bind the record for a live scenario; resets the harness caches first. No
|
|
156
|
+
* SDK double is built or bound — the scenario file must NOT mock `@cursor/sdk`
|
|
157
|
+
* — and no clock is installed. The key lands on the `Config` exactly where
|
|
158
|
+
* the OSS runner's direct mode reads it (`turn-setup.ts`, `config.cursorApiKey`).
|
|
159
|
+
*/
|
|
160
|
+
export declare function beginLiveCursorScenario(options: LiveCursorScenarioOptions): LiveCursorScenario;
|
|
126
161
|
export interface CursorTurnOptions {
|
|
127
162
|
/** Empty for a first invocation; the agent id for a HITL reinvocation. */
|
|
128
163
|
readonly threadId?: string;
|
|
@@ -131,9 +166,12 @@ export interface CursorTurnOptions {
|
|
|
131
166
|
readonly onControls?: (controls: InvocationControls) => void;
|
|
132
167
|
}
|
|
133
168
|
/**
|
|
134
|
-
* Run ONE `ExecuteCursor` invocation for the scenario: the
|
|
135
|
-
* adapter under the real turn runtime, as the composition roots
|
|
136
|
-
* Built per invocation (the registry constructs its client, which
|
|
137
|
-
* bound at `
|
|
169
|
+
* Run ONE `ExecuteCursor` invocation for the scenario — either posture: the
|
|
170
|
+
* real Cursor adapter under the real turn runtime, as the composition roots
|
|
171
|
+
* wire them. Built per invocation (the registry constructs its client, which
|
|
172
|
+
* is the one bound at `begin*CursorScenario`; the adapter boots on the
|
|
173
|
+
* scenario's config). Reads only the record and the config, which both
|
|
174
|
+
* postures have.
|
|
138
175
|
*/
|
|
139
|
-
export declare function runCursorTurn(scenario:
|
|
176
|
+
export declare function runCursorTurn(scenario: CursorScenarioBase, options?: CursorTurnOptions): Promise<ActivityInvocation>;
|
|
177
|
+
export {};
|
|
@@ -11,12 +11,15 @@
|
|
|
11
11
|
* registry the harness reads at setup, the Cursor `Config` slice, and the
|
|
12
12
|
* per-scenario reset of the harness's module-level caches.
|
|
13
13
|
*
|
|
14
|
-
* What the
|
|
15
|
-
* hoisted by vitest and so cannot live here
|
|
14
|
+
* What the three `vi.mock` calls a scenario file must carry look like — they
|
|
15
|
+
* are hoisted by vitest and so cannot live here (the SDK's sqlite entry is a
|
|
16
|
+
* separate module id, so it is doubled separately; `scripted-sdk.ts`):
|
|
16
17
|
*
|
|
17
18
|
* ```ts
|
|
18
19
|
* vi.mock("@cursor/sdk", async () =>
|
|
19
20
|
* (await import("../../__test-utils__/scripted-sdk.js")).scriptedCursorSdkModule());
|
|
21
|
+
* vi.mock("@cursor/sdk/sqlite", async () =>
|
|
22
|
+
* (await import("../../__test-utils__/scripted-sdk.js")).scriptedCursorSqliteModule());
|
|
20
23
|
* vi.mock("../../../../client/stigmer-client.js", async () =>
|
|
21
24
|
* (await import("../../../../__test-utils__/hermetic-activity.js")).hermeticStigmerClientModule());
|
|
22
25
|
* ```
|
|
@@ -39,6 +42,18 @@
|
|
|
39
42
|
* the SDK double (`ScriptedSdkOptions`); an SDK-side cancel or a mid-stream
|
|
40
43
|
* wedge as an `effect` step on the run. Nothing here is a switch in production
|
|
41
44
|
* code — every knob is a value the production path already reads.
|
|
45
|
+
*
|
|
46
|
+
* Two postures, two entries, one turn runner. `beginCursorScenario` is the
|
|
47
|
+
* hermetic posture: the SDK doubled by the scenario file's `vi.mock`, the
|
|
48
|
+
* clock scripted, goldens byte-stable. `beginLiveCursorScenario` is the live
|
|
49
|
+
* posture (#1097's live-run gate): the scenario file mocks ONLY the
|
|
50
|
+
* client, the real `@cursor/sdk` runs under the real activity on the real
|
|
51
|
+
* clock with a real member key, and what the activity persists is read back
|
|
52
|
+
* from the same record. A live scenario therefore has no `sdk` and no `clock`
|
|
53
|
+
* — the type says which posture a file is in — and `runCursorTurn` reads only
|
|
54
|
+
* what both have. The registry fixture's `live` pass-through and the
|
|
55
|
+
* environment's `eventRecordingDir` are the live posture's two other
|
|
56
|
+
* seams, each on the module that owns the concern.
|
|
42
57
|
*/
|
|
43
58
|
import { execFileSync } from "node:child_process";
|
|
44
59
|
import { readFileSync } from "node:fs";
|
|
@@ -175,25 +190,44 @@ export function resetCursorModuleState() {
|
|
|
175
190
|
_resetPricingCache();
|
|
176
191
|
_resetRegistryCache();
|
|
177
192
|
}
|
|
178
|
-
/**
|
|
179
|
-
|
|
193
|
+
/**
|
|
194
|
+
* What every scenario begins with: the harness caches dropped, the record
|
|
195
|
+
* bound as the control plane the activity will talk to, the OSS `Config`
|
|
196
|
+
* over the environment with the scenario's knobs laid on top.
|
|
197
|
+
*/
|
|
198
|
+
function beginScenarioBase(options) {
|
|
180
199
|
resetCursorModuleState();
|
|
181
|
-
const sdk = new ScriptedCursorSdk(options.sdk);
|
|
182
|
-
bindScriptedSdk(sdk);
|
|
183
200
|
bindHermeticClient(options.record.client(options.clientOverrides));
|
|
184
201
|
return {
|
|
185
202
|
env: options.env,
|
|
186
|
-
clock: options.clock,
|
|
187
203
|
record: options.record,
|
|
188
|
-
sdk,
|
|
189
204
|
config: { ...hermeticCursorConfig(options.env), ...options.config },
|
|
190
205
|
};
|
|
191
206
|
}
|
|
207
|
+
/** Bind the record and the SDK double for a hermetic scenario; resets the harness caches first. */
|
|
208
|
+
export function beginCursorScenario(options) {
|
|
209
|
+
const base = beginScenarioBase(options);
|
|
210
|
+
const sdk = new ScriptedCursorSdk(options.sdk);
|
|
211
|
+
bindScriptedSdk(sdk);
|
|
212
|
+
return { ...base, clock: options.clock, sdk };
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Bind the record for a live scenario; resets the harness caches first. No
|
|
216
|
+
* SDK double is built or bound — the scenario file must NOT mock `@cursor/sdk`
|
|
217
|
+
* — and no clock is installed. The key lands on the `Config` exactly where
|
|
218
|
+
* the OSS runner's direct mode reads it (`turn-setup.ts`, `config.cursorApiKey`).
|
|
219
|
+
*/
|
|
220
|
+
export function beginLiveCursorScenario(options) {
|
|
221
|
+
const base = beginScenarioBase(options);
|
|
222
|
+
return { ...base, config: { ...base.config, cursorApiKey: options.apiKey } };
|
|
223
|
+
}
|
|
192
224
|
/**
|
|
193
|
-
* Run ONE `ExecuteCursor` invocation for the scenario: the
|
|
194
|
-
* adapter under the real turn runtime, as the composition roots
|
|
195
|
-
* Built per invocation (the registry constructs its client, which
|
|
196
|
-
* bound at `
|
|
225
|
+
* Run ONE `ExecuteCursor` invocation for the scenario — either posture: the
|
|
226
|
+
* real Cursor adapter under the real turn runtime, as the composition roots
|
|
227
|
+
* wire them. Built per invocation (the registry constructs its client, which
|
|
228
|
+
* is the one bound at `begin*CursorScenario`; the adapter boots on the
|
|
229
|
+
* scenario's config). Reads only the record and the config, which both
|
|
230
|
+
* postures have.
|
|
197
231
|
*/
|
|
198
232
|
export async function runCursorTurn(scenario, options = {}) {
|
|
199
233
|
// Imported lazily so the scenario file's `vi.mock` declarations are in
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hermetic-cursor.js","sourceRoot":"","sources":["../../../../src/activities/execute-cursor/__test-utils__/hermetic-cursor.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"hermetic-cursor.js","sourceRoot":"","sources":["../../../../src/activities/execute-cursor/__test-utils__/hermetic-cursor.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,7 +15,12 @@
|
|
|
15
15
|
* So a turn is a SCRIPT of ordered steps, one of four kinds:
|
|
16
16
|
*
|
|
17
17
|
* - `event(SDKMessage)` — yielded from `stream()`
|
|
18
|
-
* - `delta(update)` — fired through `onDelta
|
|
18
|
+
* - `delta(update)` — fired through `onDelta`: any `InteractionUpdate`
|
|
19
|
+
* (the `turn-ended` usage the loop prices; the
|
|
20
|
+
* tool-call timings, shell output and completion
|
|
21
|
+
* status the transcript folds — #1097 widened
|
|
22
|
+
* the step from `turn-ended` alone so the delta
|
|
23
|
+
* channel has an end-to-end net)
|
|
19
24
|
* - `effect(fn)` — the side effect the SDK would have performed
|
|
20
25
|
* (run the real hook, write a workspace file,
|
|
21
26
|
* cancel the activity from the outside)
|
|
@@ -24,16 +29,12 @@
|
|
|
24
29
|
* The same shape as the native harness's `__test-utils__/scripted-model.ts`
|
|
25
30
|
* (`ScriptStep`, driven in order), applied to the SDK's event surface.
|
|
26
31
|
*
|
|
27
|
-
* Typing: `SDKMessage`, `Run`, `RunResult
|
|
28
|
-
* types (`@cursor/sdk` 1.0.
|
|
29
|
-
* `
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
* code too (`turn-stream.ts`, `delta-enricher.ts` read it untyped). The one
|
|
34
|
-
* delta this double emits, the `turn-ended` usage, is therefore typed HERE
|
|
35
|
-
* ({@link TurnEndedUsageDelta}) against what `turn-stream.ts` reads from it,
|
|
36
|
-
* and that gap is recorded in the entry's findings rather than papered over.
|
|
32
|
+
* Typing: `SDKMessage`, `Run`, `RunResult`, `SDKAgent` and the delta channel's
|
|
33
|
+
* `InteractionUpdate` are the SDK's own types (`@cursor/sdk` 1.0.31, concrete
|
|
34
|
+
* in `messages.d.ts` / `run.d.ts` / `agent.d.ts` / the vendored `delta-types`),
|
|
35
|
+
* so a script that drifts from the real event shape fails `tsc`. (At 1.0.13
|
|
36
|
+
* the delta types resolved to `any` and the one delta this double emitted was
|
|
37
|
+
* typed locally; stigmer/stigmer#1053 closed that gap.)
|
|
37
38
|
*
|
|
38
39
|
* Cancellation: `run.cancel()` is how the harness stops a turn (first denial,
|
|
39
40
|
* cost cap, stall). The double honours it the way the SDK does — the stream
|
|
@@ -48,22 +49,8 @@
|
|
|
48
49
|
* {@link ScriptedCursorAgent.arrangeNextTurn}, which REPLACES the slot the
|
|
49
50
|
* next `send()` will consume.
|
|
50
51
|
*/
|
|
51
|
-
import type { ModelSelection, Run, RunOperation, RunResult, RunStatus, SDKAgent, SDKMessage, SDKUserMessage, SendOptions } from "@cursor/sdk";
|
|
52
|
+
import type { AgentUsage, GetUsageOptions, InteractionUpdate, ModelSelection, Run, RunOperation, RunResult, RunStatus, SDKAgent, SDKMessage, SDKUserMessage, SendOptions, TurnEndedUpdate } from "@cursor/sdk";
|
|
52
53
|
import type { ConversationTurn } from "@cursor/sdk";
|
|
53
|
-
/**
|
|
54
|
-
* The `turn-ended` delta as `turn-stream.ts` reads it (`update.type ===
|
|
55
|
-
* "turn-ended" && update.usage` -> `usageAccumulator.addTurn(update.usage)`).
|
|
56
|
-
* See the module header for why this is typed locally.
|
|
57
|
-
*/
|
|
58
|
-
export interface TurnEndedUsageDelta {
|
|
59
|
-
readonly type: "turn-ended";
|
|
60
|
-
readonly usage: {
|
|
61
|
-
readonly inputTokens?: number;
|
|
62
|
-
readonly outputTokens?: number;
|
|
63
|
-
readonly cacheWriteTokens?: number;
|
|
64
|
-
readonly cacheReadTokens?: number;
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
54
|
/** What an `effect` step can reach: the run it is part of. */
|
|
68
55
|
export interface EffectContext {
|
|
69
56
|
readonly run: ScriptedRun;
|
|
@@ -74,7 +61,7 @@ export type ScriptStep = {
|
|
|
74
61
|
readonly event: SDKMessage;
|
|
75
62
|
} | {
|
|
76
63
|
readonly kind: "delta";
|
|
77
|
-
readonly update:
|
|
64
|
+
readonly update: InteractionUpdate;
|
|
78
65
|
} | {
|
|
79
66
|
readonly kind: "effect";
|
|
80
67
|
readonly label: string;
|
|
@@ -88,7 +75,10 @@ export type TurnScript = readonly ScriptStep[];
|
|
|
88
75
|
/** Step builders — the vocabulary a scenario file reads as. */
|
|
89
76
|
export declare const step: {
|
|
90
77
|
readonly event: (event: SDKMessage) => ScriptStep;
|
|
91
|
-
|
|
78
|
+
/** Any delta the SDK fires through `onDelta` between stream events: tool-call timings, shell output, a completion's status. */
|
|
79
|
+
readonly delta: (update: InteractionUpdate) => ScriptStep;
|
|
80
|
+
/** The `turn-ended` delta `turn-stream.ts` prices; the SDK's shape, all four counts stated. */
|
|
81
|
+
readonly turnEnded: (usage: NonNullable<TurnEndedUpdate["usage"]>) => ScriptStep;
|
|
92
82
|
readonly effect: (label: string, run: (ctx: EffectContext) => void | Promise<void>) => ScriptStep;
|
|
93
83
|
readonly finished: (result?: Partial<Omit<RunResult, "id" | "status">>) => ScriptStep;
|
|
94
84
|
readonly errored: (result?: Partial<Omit<RunResult, "id" | "status">>) => ScriptStep;
|
|
@@ -105,6 +95,8 @@ export declare function sdkEvents(agentId: string, runId: string): {
|
|
|
105
95
|
thinking(text: string): SDKMessage;
|
|
106
96
|
toolCall(callId: string, name: string, status: "running" | "completed" | "error", args?: unknown, result?: unknown): SDKMessage;
|
|
107
97
|
status(status: "CREATING" | "RUNNING" | "FINISHED" | "ERROR" | "CANCELLED" | "EXPIRED", message?: string): SDKMessage;
|
|
98
|
+
/** The SDK's `task` event: a status line about the run in the agent's own voice, which the transcript shows as a SYSTEM message. */
|
|
99
|
+
task(text: string, status?: string): SDKMessage;
|
|
108
100
|
};
|
|
109
101
|
/** Called once per step so the driver's clock can tick. */
|
|
110
102
|
export type StepObserver = (step: ScriptStep, index: number) => void;
|
|
@@ -180,4 +172,5 @@ export declare class ScriptedCursorAgent implements SDKAgent {
|
|
|
180
172
|
[Symbol.asyncDispose](): Promise<void>;
|
|
181
173
|
listArtifacts(): Promise<never[]>;
|
|
182
174
|
downloadArtifact(_path: string): Promise<Buffer>;
|
|
175
|
+
getUsage(_options?: GetUsageOptions): Promise<AgentUsage>;
|
|
183
176
|
}
|
|
@@ -15,7 +15,12 @@
|
|
|
15
15
|
* So a turn is a SCRIPT of ordered steps, one of four kinds:
|
|
16
16
|
*
|
|
17
17
|
* - `event(SDKMessage)` — yielded from `stream()`
|
|
18
|
-
* - `delta(update)` — fired through `onDelta
|
|
18
|
+
* - `delta(update)` — fired through `onDelta`: any `InteractionUpdate`
|
|
19
|
+
* (the `turn-ended` usage the loop prices; the
|
|
20
|
+
* tool-call timings, shell output and completion
|
|
21
|
+
* status the transcript folds — #1097 widened
|
|
22
|
+
* the step from `turn-ended` alone so the delta
|
|
23
|
+
* channel has an end-to-end net)
|
|
19
24
|
* - `effect(fn)` — the side effect the SDK would have performed
|
|
20
25
|
* (run the real hook, write a workspace file,
|
|
21
26
|
* cancel the activity from the outside)
|
|
@@ -24,16 +29,12 @@
|
|
|
24
29
|
* The same shape as the native harness's `__test-utils__/scripted-model.ts`
|
|
25
30
|
* (`ScriptStep`, driven in order), applied to the SDK's event surface.
|
|
26
31
|
*
|
|
27
|
-
* Typing: `SDKMessage`, `Run`, `RunResult
|
|
28
|
-
* types (`@cursor/sdk` 1.0.
|
|
29
|
-
* `
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
* code too (`turn-stream.ts`, `delta-enricher.ts` read it untyped). The one
|
|
34
|
-
* delta this double emits, the `turn-ended` usage, is therefore typed HERE
|
|
35
|
-
* ({@link TurnEndedUsageDelta}) against what `turn-stream.ts` reads from it,
|
|
36
|
-
* and that gap is recorded in the entry's findings rather than papered over.
|
|
32
|
+
* Typing: `SDKMessage`, `Run`, `RunResult`, `SDKAgent` and the delta channel's
|
|
33
|
+
* `InteractionUpdate` are the SDK's own types (`@cursor/sdk` 1.0.31, concrete
|
|
34
|
+
* in `messages.d.ts` / `run.d.ts` / `agent.d.ts` / the vendored `delta-types`),
|
|
35
|
+
* so a script that drifts from the real event shape fails `tsc`. (At 1.0.13
|
|
36
|
+
* the delta types resolved to `any` and the one delta this double emitted was
|
|
37
|
+
* typed locally; stigmer/stigmer#1053 closed that gap.)
|
|
37
38
|
*
|
|
38
39
|
* Cancellation: `run.cancel()` is how the harness stops a turn (first denial,
|
|
39
40
|
* cost cap, stall). The double honours it the way the SDK does — the stream
|
|
@@ -53,6 +54,11 @@ export const step = {
|
|
|
53
54
|
event(event) {
|
|
54
55
|
return { kind: "event", event };
|
|
55
56
|
},
|
|
57
|
+
/** Any delta the SDK fires through `onDelta` between stream events: tool-call timings, shell output, a completion's status. */
|
|
58
|
+
delta(update) {
|
|
59
|
+
return { kind: "delta", update };
|
|
60
|
+
},
|
|
61
|
+
/** The `turn-ended` delta `turn-stream.ts` prices; the SDK's shape, all four counts stated. */
|
|
56
62
|
turnEnded(usage) {
|
|
57
63
|
return { kind: "delta", update: { type: "turn-ended", usage } };
|
|
58
64
|
},
|
|
@@ -90,6 +96,10 @@ export function sdkEvents(agentId, runId) {
|
|
|
90
96
|
status(status, message) {
|
|
91
97
|
return { type: "status", ...base, status, message };
|
|
92
98
|
},
|
|
99
|
+
/** The SDK's `task` event: a status line about the run in the agent's own voice, which the transcript shows as a SYSTEM message. */
|
|
100
|
+
task(text, status) {
|
|
101
|
+
return { type: "task", ...base, text, status };
|
|
102
|
+
},
|
|
93
103
|
};
|
|
94
104
|
}
|
|
95
105
|
export class ScriptedRun {
|
|
@@ -258,5 +268,11 @@ export class ScriptedCursorAgent {
|
|
|
258
268
|
async downloadArtifact(_path) {
|
|
259
269
|
throw new Error("ScriptedCursorAgent: artifacts are not part of the scripted surface");
|
|
260
270
|
}
|
|
271
|
+
async getUsage(_options) {
|
|
272
|
+
// The harness prices the `turn-ended` delta itself (`usage-pricing.ts`) and
|
|
273
|
+
// never asks the SDK for billed usage; a call here is a test bug, like a
|
|
274
|
+
// `send()` with no script.
|
|
275
|
+
throw new Error("ScriptedCursorAgent: getUsage() is not part of the scripted surface");
|
|
276
|
+
}
|
|
261
277
|
}
|
|
262
278
|
//# sourceMappingURL=scripted-agent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripted-agent.js","sourceRoot":"","sources":["../../../../src/activities/execute-cursor/__test-utils__/scripted-agent.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"scripted-agent.js","sourceRoot":"","sources":["../../../../src/activities/execute-cursor/__test-utils__/scripted-agent.ts"],"names":[],"mappings":"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"}
|