@stigmer/runner 3.15.3-dev.20260914121148 → 3.16.0
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 +2 -1
- 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 +2 -2
- 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 +47 -12
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js +41 -10
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/scripted-agent.d.ts +15 -6
- package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js +17 -4
- package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js.map +1 -1
- package/dist/activities/execute-cursor/adapter.d.ts +4 -4
- package/dist/activities/execute-cursor/adapter.js +4 -4
- 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/service-tier.js +1 -2
- package/dist/activities/execute-cursor/service-tier.js.map +1 -1
- 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/activities/generate-session-subject.d.ts +25 -4
- package/dist/activities/generate-session-subject.js +17 -7
- package/dist/activities/generate-session-subject.js.map +1 -1
- package/dist/client/stigmer-client.d.ts +17 -6
- package/dist/client/stigmer-client.js +47 -14
- package/dist/client/stigmer-client.js.map +1 -1
- package/dist/config.d.ts +6 -3
- package/dist/config.js +4 -1
- package/dist/config.js.map +1 -1
- 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/interceptors/run-credential-activity.d.ts +28 -0
- package/dist/interceptors/run-credential-activity.js +56 -0
- package/dist/interceptors/run-credential-activity.js.map +1 -0
- 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 +10 -4
- package/dist/runner-manager.js.map +1 -1
- package/dist/shared/activity-input.d.ts +9 -0
- package/dist/shared/activity-input.js +17 -0
- package/dist/shared/activity-input.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-zip.d.ts +2 -2
- package/dist/shared/attachment-zip.js +2 -2
- package/dist/shared/channel-attachment.d.ts +8 -5
- package/dist/shared/channel-attachment.js +10 -6
- package/dist/shared/channel-attachment.js.map +1 -1
- 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/filereview/progress.d.ts +13 -0
- package/dist/shared/filereview/progress.js +13 -0
- package/dist/shared/filereview/progress.js.map +1 -1
- 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/memory-attachment.d.ts +16 -9
- package/dist/shared/memory-attachment.js +18 -10
- package/dist/shared/memory-attachment.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/run-credential-store.d.ts +32 -0
- package/dist/shared/run-credential-store.js +39 -0
- package/dist/shared/run-credential-store.js.map +1 -0
- package/dist/shared/run-credential.d.ts +61 -0
- package/dist/shared/run-credential.js +68 -0
- package/dist/shared/run-credential.js.map +1 -0
- 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/synthesized-attachment.d.ts +30 -3
- package/dist/shared/synthesized-attachment.js +26 -0
- package/dist/shared/synthesized-attachment.js.map +1 -1
- 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/dist/worker.js +10 -3
- package/dist/worker.js.map +1 -1
- package/dist/workflow-source.d.ts +10 -0
- package/dist/workflow-source.js +12 -0
- package/dist/workflow-source.js.map +1 -1
- package/dist/workflows/execute-from-execution.d.ts +15 -0
- package/dist/workflows/execute-from-execution.js +11 -0
- package/dist/workflows/execute-from-execution.js.map +1 -1
- package/dist/workflows/index.d.ts +5 -3
- package/dist/workflows/index.js +5 -3
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/interceptors/run-credential.d.ts +34 -0
- package/dist/workflows/interceptors/run-credential.js +71 -0
- package/dist/workflows/interceptors/run-credential.js.map +1 -0
- package/package.json +4 -4
- 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__/run-credential-e2e.test.ts +233 -0
- package/src/__tests__/run-credential-registration.test.ts +80 -0
- package/src/__tests__/runner-manager.test.ts +1 -1
- package/src/activities/__tests__/generate-session-subject-wire.test.ts +119 -0
- package/src/activities/execute-cursor/__test-utils__/__tests__/scripted-double.test.ts +1 -1
- package/src/activities/execute-cursor/__test-utils__/contract-subject.ts +2 -2
- 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 +67 -17
- package/src/activities/execute-cursor/__test-utils__/scripted-agent.ts +19 -5
- 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-event-recorder.test.ts +142 -0
- package/src/activities/execute-cursor/__tests__/cursor-fetch-interceptor-bypass.test.ts +19 -8
- package/src/activities/execute-cursor/__tests__/cursor-sdk-auth-smoke.test.ts +10 -8
- 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 +1 -1
- package/src/activities/execute-cursor/__tests__/hermetic/file-review-capture.test.ts +1 -1
- 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 +7 -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 +5 -5
- package/src/activities/execute-cursor/__tests__/hermetic/plain-turn.test.ts +2 -1
- package/src/activities/execute-cursor/__tests__/hermetic/run-wait-arms.test.ts +2 -1
- 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 +8 -8
- 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 +1 -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 +3 -3
- 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 +13 -1
- package/src/activities/execute-cursor/__tests__/hermetic/workspace-lock-timeout.test.ts +2 -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__/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 +4 -4
- 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/service-tier.ts +1 -2
- 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/activities/generate-session-subject.ts +29 -4
- package/src/client/__tests__/stigmer-client.test.ts +92 -0
- package/src/client/stigmer-client.ts +48 -14
- package/src/config.ts +6 -3
- 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/interceptors/__tests__/run-credential-activity.test.ts +133 -0
- package/src/interceptors/run-credential-activity.ts +67 -0
- 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 +14 -4
- 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__/channel-attachment.test.ts +12 -0
- package/src/shared/__tests__/cost-guard.test.ts +1 -1
- package/src/shared/__tests__/exact-apply.test.ts +2 -1
- package/src/shared/__tests__/memory-attachment.test.ts +17 -0
- package/src/shared/__tests__/persist-decision.test.ts +19 -33
- package/src/shared/__tests__/prompt-sections.test.ts +1 -1
- package/src/shared/__tests__/run-credential.test.ts +111 -0
- 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/activity-input.ts +21 -0
- 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-zip.ts +2 -2
- package/src/shared/channel-attachment.ts +14 -6
- 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/filereview/progress.ts +13 -0
- package/src/shared/heartbeat.ts +1 -1
- package/src/shared/llm-backend.ts +0 -4
- package/src/shared/memory-attachment.ts +22 -10
- 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/run-credential-store.ts +45 -0
- package/src/shared/run-credential.ts +70 -0
- 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/synthesized-attachment.ts +38 -3
- 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/src/worker.ts +15 -3
- package/src/workflow-source.ts +15 -0
- package/src/workflows/__tests__/run-credential-interceptor.test.ts +178 -0
- package/src/workflows/execute-from-execution.ts +17 -0
- package/src/workflows/index.ts +5 -3
- package/src/workflows/interceptors/run-credential.ts +101 -0
- 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
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The Cursor harness's settle — from a consumed stream to a `TurnOutcome`.
|
|
3
3
|
*
|
|
4
|
-
* In order: the post-stream finalize (
|
|
5
|
-
*
|
|
6
|
-
* sees settled rows); the runtime's
|
|
4
|
+
* In order: the post-stream finalize (the last queued deltas drained, the
|
|
5
|
+
* transcript's streaming flags closed, a stopped turn's sub-agents cancelled,
|
|
6
|
+
* the recorder flush, one persist so the UI sees settled rows); the runtime's
|
|
7
|
+
* stop, if it fired, settled as
|
|
7
8
|
* `interrupted` with nothing further; the turn boundary (`turn-boundary.ts`)
|
|
8
9
|
* that overlays the hook's denials as WAITING rows, ending `awaiting_approval`
|
|
9
10
|
* when a denial pauses or failing on an unattributed hook block (#205);
|
|
@@ -18,12 +19,15 @@
|
|
|
18
19
|
* `terminal-table.ts`); capture the turn's file changes or decide whether a
|
|
19
20
|
* review is pending — the runtime's too (`harness/capture.ts`, once over the
|
|
20
21
|
* whole turn after this settle returns, so a recovery's edits reach review
|
|
21
|
-
* without the boundary being re-entered for them;
|
|
22
|
+
* without the boundary being re-entered for them; since #1096). The outcome carries
|
|
22
23
|
* what the runtime cannot read from the status (`failed`'s message and
|
|
23
|
-
* surface, `cancelled`).
|
|
24
|
-
*
|
|
24
|
+
* surface, `cancelled`). The transcript's rows are CREATED through the shared
|
|
25
|
+
* `TranscriptBuilder` (#1097: this harness's translator emits, the builder
|
|
26
|
+
* folds; until then the accumulator, the enricher and the todo tracker wrote
|
|
27
|
+
* them here); the boundary AMENDS rows it owns by identity and proposes its
|
|
28
|
+
* gate through the same builder.
|
|
25
29
|
*
|
|
26
|
-
* Moved from `index.ts` `executeCursorInner` phases 11 to 13
|
|
30
|
+
* Moved from `index.ts` `executeCursorInner` phases 11 to 13 in #1070; the
|
|
27
31
|
* bodies are the orchestrator's, with the runtime's arms taken out.
|
|
28
32
|
*/
|
|
29
33
|
|
|
@@ -35,8 +39,8 @@ import { StreamingUsageSummarySchema } from "@stigmer/protos/ai/stigmer/agentic/
|
|
|
35
39
|
import type { TurnInput, TurnOutcome, TurnSink } from "../../harness/types.js";
|
|
36
40
|
import { TimingRecorder, emitTimingLog } from "../../shared/cold-start-timing.js";
|
|
37
41
|
import { StreamingUpdateScheduler, loadStreamingConfig } from "../../shared/streaming-scheduler.js";
|
|
42
|
+
import { cancelInProgressSubAgentProtos } from "../../shared/subagent-rows.js";
|
|
38
43
|
import { createCursorEventRecorder } from "./cursor-event-recorder.js";
|
|
39
|
-
import { DeltaEnricher } from "./delta-enricher.js";
|
|
40
44
|
import {
|
|
41
45
|
extractRunErrorSources,
|
|
42
46
|
formatClassifiedError,
|
|
@@ -44,9 +48,9 @@ import {
|
|
|
44
48
|
synthesizeError,
|
|
45
49
|
} from "./error-classifier.js";
|
|
46
50
|
import { closeProxySessions } from "./http2-interceptor.js";
|
|
47
|
-
import {
|
|
51
|
+
import { collapseRedundantToolCallTwins } from "./boundary-rows.js";
|
|
48
52
|
import { clearCapturedRejection, getCapturedRejection } from "./rejection-capture.js";
|
|
49
|
-
import {
|
|
53
|
+
import { CursorTranslator } from "./translator.js";
|
|
50
54
|
import { runTurnBoundary, type TurnBoundaryResult } from "./turn-boundary.js";
|
|
51
55
|
import {
|
|
52
56
|
consumeCursorTurnStream,
|
|
@@ -80,21 +84,32 @@ export async function streamAndSettle(frame: CursorTurnFrame): Promise<TurnOutco
|
|
|
80
84
|
const { executionId, sessionId, blueprint, workspace, mcp } = input;
|
|
81
85
|
const { status } = sink;
|
|
82
86
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
87
|
+
// The runtime's one transcript builder over the turn's status, and this
|
|
88
|
+
// harness's translator over the run's approval posture and the seeded
|
|
89
|
+
// transcript (a resumed agent's re-issued call is matched onto its seeded
|
|
90
|
+
// WAITING row by identity). Both live for the whole turn — the
|
|
91
|
+
// primary stream and both recovery retries fold into them.
|
|
92
|
+
const transcript = sink.transcript;
|
|
93
|
+
const translator = new CursorTranslator({
|
|
94
|
+
policies: mcp.policies,
|
|
95
|
+
leases: { global: mcp.leases.global, categories: mcp.leases.categories },
|
|
96
|
+
seeded: status.messages,
|
|
97
|
+
});
|
|
98
|
+
// The raw recording of both SDK channels, on only when the env names a dir
|
|
99
|
+
// (the recorder reads no process state itself, so its tests need no env).
|
|
100
|
+
const eventRecorder = createCursorEventRecorder(executionId, process.env.CURSOR_EVENT_RECORD_DIR);
|
|
86
101
|
|
|
87
102
|
// The two recovery retries (poisoned-handle / transport-timeout) below run at
|
|
88
103
|
// most once per turn; this guard is the latch.
|
|
89
104
|
let alreadyRetriedWithFreshAgent = false;
|
|
90
105
|
|
|
91
|
-
// The shared onDelta
|
|
92
|
-
//
|
|
93
|
-
// narrow deps. The primary send and both retry sends reuse this object.
|
|
106
|
+
// The shared onDelta needs the sink/pricer/translator/recorder/state subset
|
|
107
|
+
// and is wired at SEND time. The primary send and both retry sends reuse this object.
|
|
94
108
|
const onDeltaDeps: TurnOnDeltaDeps = {
|
|
95
109
|
sink,
|
|
96
110
|
usagePricer: engine.usagePricer,
|
|
97
|
-
|
|
111
|
+
translator,
|
|
112
|
+
eventRecorder,
|
|
98
113
|
promptEstimatedTokens: prompt.promptEstimatedTokens,
|
|
99
114
|
executionId,
|
|
100
115
|
state: streamState,
|
|
@@ -138,15 +153,9 @@ export async function streamAndSettle(frame: CursorTurnFrame): Promise<TurnOutco
|
|
|
138
153
|
|
|
139
154
|
// Everything at an index >= this was produced by THIS turn's stream — the
|
|
140
155
|
// positional scope the boundary's #205 attribution and #965 settle read.
|
|
141
|
-
// Snapshotted before the
|
|
156
|
+
// Snapshotted before the builder can append.
|
|
142
157
|
const turnStartMessageIndex = status.messages.length;
|
|
143
158
|
|
|
144
|
-
const accumulator = new MessageAccumulator(status.messages, {
|
|
145
|
-
mergedPolicies: mcp.policies,
|
|
146
|
-
provenance: { globalBypass: mcp.leases.global, leasedCategories: mcp.leases.categories },
|
|
147
|
-
workspaceRoot: workspace.primaryDir,
|
|
148
|
-
subAgentExecutions: status.subAgentExecutions,
|
|
149
|
-
});
|
|
150
159
|
// Shared cadence with the native harness: discrete state changes force a
|
|
151
160
|
// flush; high-frequency token deltas ride this scheduler's time cadence
|
|
152
161
|
// (env-tunable via STREAMING_* — see loadStreamingConfig).
|
|
@@ -156,27 +165,29 @@ export async function streamAndSettle(frame: CursorTurnFrame): Promise<TurnOutco
|
|
|
156
165
|
// state. Consumed by the primary stream here and by both recovery retries.
|
|
157
166
|
const streamDeps: CursorTurnStreamDeps = {
|
|
158
167
|
...onDeltaDeps,
|
|
159
|
-
accumulator,
|
|
160
|
-
todoTracker,
|
|
161
|
-
eventRecorder,
|
|
162
168
|
scheduler,
|
|
163
169
|
hitlDir: gate.hitlDir,
|
|
164
170
|
};
|
|
165
171
|
|
|
166
172
|
// Post-stream finalize, shared by the primary turn and both recovery retries:
|
|
167
|
-
//
|
|
168
|
-
//
|
|
173
|
+
// fold the deltas that arrived after the last stream event (a completion
|
|
174
|
+
// the delta channel reported last was lost before #1097), close every
|
|
175
|
+
// streaming flag, mark any in-flight sub-agent CANCELLED on a stopped turn,
|
|
169
176
|
// flush the recorder, and persist so the UI sees the settled rows.
|
|
170
177
|
const finalizeStreamPhase = async (): Promise<void> => {
|
|
171
|
-
|
|
172
|
-
|
|
178
|
+
for (const fact of translator.drainDeltas()) transcript.apply(fact);
|
|
179
|
+
// The runtime finalizes once `runTurn` returns, on every path; this
|
|
180
|
+
// harness finalizes EARLIER too because it persists on the settled rows
|
|
181
|
+
// right below, before `run.wait()` and the boundary, and the console's
|
|
182
|
+
// spinner must stop before that wait. Idempotent.
|
|
183
|
+
transcript.finalize();
|
|
173
184
|
// A stopped turn (pause, shutdown, stall, cost cap, platform stop) aborts
|
|
174
185
|
// the Cursor SDK run, so any sub-agent the parent had delegated is no
|
|
175
186
|
// longer executing. Mark it CANCELLED rather than leaving a permanent
|
|
176
|
-
// IN_PROGRESS "zombie" in the final snapshot
|
|
177
|
-
//
|
|
187
|
+
// IN_PROGRESS "zombie" in the final snapshot, through the one shared act
|
|
188
|
+
// (parity with the native settle).
|
|
178
189
|
if (sink.stopSignal.aborted) {
|
|
179
|
-
|
|
190
|
+
cancelInProgressSubAgentProtos(status.subAgentExecutions);
|
|
180
191
|
}
|
|
181
192
|
await eventRecorder?.flush();
|
|
182
193
|
console.log(
|
|
@@ -196,6 +207,7 @@ export async function streamAndSettle(frame: CursorTurnFrame): Promise<TurnOutco
|
|
|
196
207
|
const runBoundary = (denialSettled?: Promise<void>): Promise<TurnBoundaryResult> =>
|
|
197
208
|
runTurnBoundary({
|
|
198
209
|
status,
|
|
210
|
+
transcript,
|
|
199
211
|
executionId,
|
|
200
212
|
hitlDir: gate.hitlDir,
|
|
201
213
|
primaryWorkspaceDir: workspace.primaryDir,
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
* resolved, over the runtime's timeline (`sink.setupTiming`), so the one
|
|
23
23
|
* timeline reads end to end.
|
|
24
24
|
*
|
|
25
|
-
* Moved from `index.ts` `executeCursorInner` phases 4c to 10c
|
|
25
|
+
* Moved from `index.ts` `executeCursorInner` phases 4c to 10c in #1070; the
|
|
26
26
|
* step bodies are the orchestrator's, verbatim where nothing changed.
|
|
27
27
|
*/
|
|
28
28
|
|
|
@@ -286,7 +286,7 @@ export async function installGate(input: TurnInput, sink: TurnSink, rows: Adjudi
|
|
|
286
286
|
/**
|
|
287
287
|
* Resolve the Cursor agent (parked, created, resumed, or created after a
|
|
288
288
|
* resume failure), emit the cold-start line, and bind a NEW agent's id
|
|
289
|
-
* through the sink before anything else runs (
|
|
289
|
+
* through the sink before anything else runs (a rejected bind ends
|
|
290
290
|
* the turn `failed`; the sink rejects and the caller's catch names it).
|
|
291
291
|
*
|
|
292
292
|
* The requested name and the effective tier and thinking mode are the
|
|
@@ -446,7 +446,7 @@ export async function resolveEngine(input: TurnInput, sink: TurnSink, config: Cu
|
|
|
446
446
|
// A NEW agent's id is bound at once, before anything else runs, so a crash
|
|
447
447
|
// mid-turn still resumes on the next invocation. The mode is this
|
|
448
448
|
// harness's field on the session record, set before the runtime writes it
|
|
449
|
-
// (one writer per field
|
|
449
|
+
// (one writer per field); the runtime sets harness_state_id and
|
|
450
450
|
// clears the slug.
|
|
451
451
|
if (resolution.isNew && resolution.agentId) {
|
|
452
452
|
if (blueprint.sessionSpec.cursorMode === CursorMode.UNSPECIFIED) {
|
|
@@ -459,8 +459,8 @@ export async function resolveEngine(input: TurnInput, sink: TurnSink, config: Cu
|
|
|
459
459
|
// receives the engine only when this returns) and its id was never
|
|
460
460
|
// saved, so no later turn can resume it: close it here, or its executor
|
|
461
461
|
// lease and MCP subprocesses outlive the failed turn with nothing to
|
|
462
|
-
// release them (
|
|
463
|
-
// `failed
|
|
462
|
+
// release them (found by the contract kit in #1070). Then let the
|
|
463
|
+
// rejection settle the turn `failed`, as the contract states.
|
|
464
464
|
try {
|
|
465
465
|
resolution.agent.close();
|
|
466
466
|
} catch {
|
|
@@ -10,20 +10,29 @@
|
|
|
10
10
|
* retry froze the UI and mis-handled a mid-retry pause. One loop removes that
|
|
11
11
|
* drift by construction.
|
|
12
12
|
*
|
|
13
|
+
* The transcript (since #1097): every stream event goes through the harness's
|
|
14
|
+
* translator (`translator.ts`) into the shared `TranscriptBuilder`
|
|
15
|
+
* (`harness/transcript/builder.ts`), and the delta channel's facts, which the
|
|
16
|
+
* translator QUEUES as they arrive in `onDelta`, are drained into the builder
|
|
17
|
+
* after each stream event — never during an awaited persist, where a row
|
|
18
|
+
* write would land on a row the offload is replacing.
|
|
19
|
+
* Until #1097 this loop fed three writers of its own (the message accumulator,
|
|
20
|
+
* the delta enricher, the todo tracker), the Cursor copy of the folding rule.
|
|
21
|
+
*
|
|
13
22
|
* What the loop asks of the runtime, through the sink (`harness/types.ts`):
|
|
14
23
|
* `recordActivity()` per event (with the tool name) and per delta, so the
|
|
15
24
|
* runtime's stall watchdog measures the engine; `reportUsage()` per
|
|
16
25
|
* `turn-ended` delta, priced here at the requested variant's rates
|
|
17
26
|
* (`usage-pricing.ts`), so the runtime accounts and enforces the cost cap;
|
|
18
27
|
* `requestPersist()` where a discrete change or the streaming cadence says
|
|
19
|
-
* so (`shared/persist-decision.ts` over
|
|
28
|
+
* so (`shared/persist-decision.ts` over the builder's dirty flag), AWAITED,
|
|
20
29
|
* so a platform STOP the runtime reads from that write aborts the signal
|
|
21
30
|
* before the next event is pulled; and `stopSignal`, checked at every event
|
|
22
31
|
* boundary and listened to inside the pull, where an abort cancels the SDK
|
|
23
32
|
* run — the one way a wedged stream is unblocked, and the same act for every
|
|
24
33
|
* cause of stopping (the runtime knows why; this loop never does).
|
|
25
34
|
*
|
|
26
|
-
* Until
|
|
35
|
+
* Until #1070 this loop armed its own stall watchdog, enforced the cost cap,
|
|
27
36
|
* read STOP from its own persist, and told a pause from the activity's
|
|
28
37
|
* cancellation signal; every one of those is the runtime's now, and the loop
|
|
29
38
|
* reports only `completed`, `first-denial` or `interrupted`.
|
|
@@ -33,9 +42,7 @@ import type { SDKMessage, InteractionUpdate } from "@cursor/sdk";
|
|
|
33
42
|
import type { TurnSink } from "../../harness/types.js";
|
|
34
43
|
import { shouldPersistStreamingStatus } from "../../shared/persist-decision.js";
|
|
35
44
|
import { approvalDenials, readDenialLedger } from "./approval-state.js";
|
|
36
|
-
import type {
|
|
37
|
-
import type { DeltaEnricher } from "./delta-enricher.js";
|
|
38
|
-
import type { TodoTracker } from "./todo-tracker.js";
|
|
45
|
+
import type { CursorTranslator } from "./translator.js";
|
|
39
46
|
import type { StreamingUpdateScheduler } from "../../shared/streaming-scheduler.js";
|
|
40
47
|
import type { CursorUsagePricer } from "./usage-pricing.js";
|
|
41
48
|
import type { createCursorEventRecorder } from "./cursor-event-recorder.js";
|
|
@@ -74,7 +81,7 @@ export interface TurnStreamState {
|
|
|
74
81
|
denialCancelSettled: Promise<void> | undefined;
|
|
75
82
|
/** Written by: the loop (a stream ERROR status event) + the retry setup (reset). Read by: error classification. */
|
|
76
83
|
streamErrorMessage: string | undefined;
|
|
77
|
-
/** Written by: the loop. Read by: the
|
|
84
|
+
/** Written by: the loop. Read by: the persist cadence and logs. */
|
|
78
85
|
eventCount: number;
|
|
79
86
|
/** Written + read by: onDelta (log the first turn's context attribution exactly once). */
|
|
80
87
|
firstTurnAttributionLogged: boolean;
|
|
@@ -92,24 +99,25 @@ export function newTurnStreamState(): TurnStreamState {
|
|
|
92
99
|
}
|
|
93
100
|
|
|
94
101
|
/**
|
|
95
|
-
* The subset of collaborators the shared onDelta needs
|
|
96
|
-
*
|
|
97
|
-
*
|
|
102
|
+
* The subset of collaborators the shared onDelta needs — the sink, the
|
|
103
|
+
* pricer, the translator (which queues the delta's transcript facts), the
|
|
104
|
+
* recorder (which sequences the delta with the stream events around it) and
|
|
105
|
+
* the state. Broken out from CursorTurnStreamDeps so the send that wires
|
|
106
|
+
* onDelta needs nothing of the stream loop.
|
|
98
107
|
*/
|
|
99
108
|
export interface TurnOnDeltaDeps {
|
|
100
109
|
readonly sink: TurnSink;
|
|
101
110
|
/** This harness's pricing of a `turn-ended` delta at the requested variant's rates. */
|
|
102
111
|
readonly usagePricer: CursorUsagePricer;
|
|
103
|
-
readonly
|
|
112
|
+
readonly translator: CursorTranslator;
|
|
113
|
+
/** The raw recording of both channels (`cursor-event-recorder.ts`); undefined when recording is off. */
|
|
114
|
+
readonly eventRecorder: CursorTurnEventRecorder | undefined;
|
|
104
115
|
readonly promptEstimatedTokens: number;
|
|
105
116
|
readonly executionId: string;
|
|
106
117
|
readonly state: TurnStreamState;
|
|
107
118
|
}
|
|
108
119
|
|
|
109
120
|
export interface CursorTurnStreamDeps extends TurnOnDeltaDeps {
|
|
110
|
-
readonly accumulator: MessageAccumulator;
|
|
111
|
-
readonly todoTracker: TodoTracker;
|
|
112
|
-
readonly eventRecorder: CursorTurnEventRecorder | undefined;
|
|
113
121
|
readonly scheduler: StreamingUpdateScheduler;
|
|
114
122
|
/** Session HITL dir holding the denial ledger; undefined → no gate installed → no first-denial stop. */
|
|
115
123
|
readonly hitlDir: string | undefined;
|
|
@@ -119,17 +127,21 @@ export interface CursorTurnStreamDeps extends TurnOnDeltaDeps {
|
|
|
119
127
|
* Build the shared onDelta callback. The Cursor SDK's fine-grained delta channel
|
|
120
128
|
* carries token usage, live shell output, and precise tool-call timings; it also
|
|
121
129
|
* fires far more often than discrete stream events, so it is where the runtime's
|
|
122
|
-
* stall timer is reset during a long model generation.
|
|
130
|
+
* stall timer is reset during a long model generation. Usage is priced here
|
|
131
|
+
* (a loop concern); the transcript facts are the translator's to queue.
|
|
123
132
|
*/
|
|
124
133
|
export function makeCursorTurnOnDelta(
|
|
125
134
|
deps: TurnOnDeltaDeps,
|
|
126
135
|
): (event: { update: InteractionUpdate }) => void {
|
|
127
|
-
const { sink, usagePricer,
|
|
136
|
+
const { sink, usagePricer, translator, eventRecorder, promptEstimatedTokens, executionId, state } = deps;
|
|
128
137
|
return ({ update }) => {
|
|
129
138
|
// Progress on the delta channel too: a long model generation emits token
|
|
130
139
|
// deltas but few discrete stream events, and resetting only in the stream
|
|
131
140
|
// loop would false-positive a stall.
|
|
132
141
|
sink.recordActivity();
|
|
142
|
+
// Recorded on arrival, before anything reads it, so the file's order is
|
|
143
|
+
// the SDK's order across both channels.
|
|
144
|
+
eventRecorder?.recordDelta(update);
|
|
133
145
|
if (update.type === "turn-ended" && update.usage) {
|
|
134
146
|
// The running estimate advances only here; the runtime enforces the cap
|
|
135
147
|
// and aborts the signal, which the loop reads at the next boundary.
|
|
@@ -146,7 +158,7 @@ export function makeCursorTurnOnDelta(
|
|
|
146
158
|
);
|
|
147
159
|
}
|
|
148
160
|
}
|
|
149
|
-
|
|
161
|
+
translator.observeDelta(update);
|
|
150
162
|
};
|
|
151
163
|
}
|
|
152
164
|
|
|
@@ -164,16 +176,14 @@ export async function consumeCursorTurnStream(
|
|
|
164
176
|
): Promise<TurnStreamReason> {
|
|
165
177
|
const {
|
|
166
178
|
sink,
|
|
167
|
-
|
|
168
|
-
todoTracker,
|
|
169
|
-
deltaEnricher,
|
|
179
|
+
translator,
|
|
170
180
|
eventRecorder,
|
|
171
181
|
scheduler,
|
|
172
182
|
hitlDir,
|
|
173
183
|
executionId,
|
|
174
184
|
state,
|
|
175
185
|
} = deps;
|
|
176
|
-
const {
|
|
186
|
+
const { stopSignal, transcript } = sink;
|
|
177
187
|
|
|
178
188
|
// The runtime's stop, whatever its cause, ends the run through the SDK's
|
|
179
189
|
// own cancel: that is what unblocks a wedged `for await` (a stall), and it
|
|
@@ -205,14 +215,13 @@ export async function consumeCursorTurnStream(
|
|
|
205
215
|
// naming the tool so a stall's copy can say `last tool: shell`.
|
|
206
216
|
sink.recordActivity(event.type === "tool_call" && typeof event.name === "string" ? event.name : undefined);
|
|
207
217
|
|
|
208
|
-
eventRecorder?.record(event
|
|
218
|
+
eventRecorder?.record(event);
|
|
209
219
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
}
|
|
220
|
+
// The stream event, then the deltas that arrived since the last one —
|
|
221
|
+
// the enricher's order, kept so a completion the delta channel reported
|
|
222
|
+
// in the same window as the stream's own defers to the stream's instant.
|
|
223
|
+
for (const fact of translator.translate(event)) transcript.apply(fact);
|
|
224
|
+
for (const fact of translator.drainDeltas()) transcript.apply(fact);
|
|
216
225
|
|
|
217
226
|
// First-denial stop (HITL clean pause). In CAPTURE mode this fires only for
|
|
218
227
|
// an IRREVERSIBLE tool the hook still gates (shell, MCP, or a gitignored
|
|
@@ -228,7 +237,7 @@ export async function consumeCursorTurnStream(
|
|
|
228
237
|
// post-denial reaction (thinking, narration, a workaround shell) stream and
|
|
229
238
|
// persist live (production case aex_01kwj07f7g23c3wp9sn8496z5g). The
|
|
230
239
|
// tool_call-event read stays as the backstop for platforms where fs.watch
|
|
231
|
-
// is unreliable; the current event was already
|
|
240
|
+
// is unreliable; the current event was already folded above, so the
|
|
232
241
|
// anchor's own row is always present for the turn-boundary gate overlay.
|
|
233
242
|
if (!state.firstDenialDetected && hitlDir && (state.denialLedgerDirty || event.type === "tool_call")) {
|
|
234
243
|
state.denialLedgerDirty = false;
|
|
@@ -262,7 +271,6 @@ export async function consumeCursorTurnStream(
|
|
|
262
271
|
}
|
|
263
272
|
}
|
|
264
273
|
|
|
265
|
-
deltaEnricher.applyEnrichments(status.messages);
|
|
266
274
|
state.eventCount++;
|
|
267
275
|
|
|
268
276
|
if (event.type === "status") {
|
|
@@ -278,27 +286,22 @@ export async function consumeCursorTurnStream(
|
|
|
278
286
|
}
|
|
279
287
|
}
|
|
280
288
|
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
todosDirty: todoTracker.isDirty,
|
|
285
|
-
contentDirty: accumulator.isDirty,
|
|
286
|
-
},
|
|
287
|
-
scheduler,
|
|
288
|
-
state.eventCount,
|
|
289
|
-
);
|
|
289
|
+
// The builder's one flag is the discrete signal, as on native
|
|
290
|
+
// (`shared/persist-decision.ts`).
|
|
291
|
+
const shouldPersist = shouldPersistStreamingStatus(transcript.dirty, scheduler, state.eventCount);
|
|
290
292
|
if (shouldPersist) {
|
|
291
|
-
//
|
|
292
|
-
//
|
|
293
|
-
//
|
|
294
|
-
|
|
295
|
-
//
|
|
293
|
+
// Cleared as the write is requested, not after it lands (the same
|
|
294
|
+
// order as the native loop): a change that folds while the write is
|
|
295
|
+
// in flight must dirty the next one.
|
|
296
|
+
transcript.markPersisted();
|
|
297
|
+
// The builder upserts sub-agent rows into `status.subAgentExecutions`
|
|
298
|
+
// in place (the status's own array), so every persist already carries
|
|
299
|
+
// delegation, IN_PROGRESS included. The runtime attaches the mid-run
|
|
300
|
+
// file-change progress on this write (the chokepoint's step 2), as it
|
|
301
|
+
// does on every write.
|
|
296
302
|
// Awaited: the runtime reads the control plane's answer to this write,
|
|
297
303
|
// and a STOP must be seen at the next event boundary, not one event late.
|
|
298
304
|
await sink.requestPersist();
|
|
299
|
-
deltaEnricher.markPersisted();
|
|
300
|
-
todoTracker.markPersisted();
|
|
301
|
-
accumulator.markPersisted();
|
|
302
305
|
scheduler.markUpdateSent(state.eventCount);
|
|
303
306
|
}
|
|
304
307
|
}
|
|
@@ -25,17 +25,17 @@
|
|
|
25
25
|
* on why `stopSignal` aborted, never writes a phase or a terminal copy, never
|
|
26
26
|
* imports `@temporalio/*` (`__tests__/adapter-is-temporal-free.test.ts`).
|
|
27
27
|
*
|
|
28
|
-
* Engine disposition, one rule per outcome
|
|
28
|
+
* Engine disposition, one rule per outcome: the agent is PARKED
|
|
29
29
|
* for the session's next turn on every exit but a failure — `completed`,
|
|
30
30
|
* `cancelled`, `awaiting_approval` and `interrupted` alike (a wedged handle
|
|
31
31
|
* after a stall is caught by the poisoned-handle recovery on the next turn;
|
|
32
|
-
* before
|
|
32
|
+
* before #1070 a pause, a shutdown and a stall dropped the handle, leaking the
|
|
33
33
|
* executor lease). A `failed` turn keeps the orchestrator's three
|
|
34
34
|
* dispositions: an engine-reported failure parks (a bad key is not a bad
|
|
35
35
|
* handle), a user-actionable failure closes, an internal failure drops.
|
|
36
36
|
*
|
|
37
|
-
* Extracted from `index.ts` `executeCursorInner`
|
|
38
|
-
* `adapter.ts`
|
|
37
|
+
* Extracted from `index.ts` `executeCursorInner` and moved out of
|
|
38
|
+
* `adapter.ts` in #1070; the seventeen hermetic goldens under `__tests__/hermetic/`
|
|
39
39
|
* pin the result byte for byte.
|
|
40
40
|
*/
|
|
41
41
|
|
|
@@ -67,7 +67,7 @@ export async function runCursorTurn(input: TurnInput, sink: TurnSink, config: Cu
|
|
|
67
67
|
closeProxySessions();
|
|
68
68
|
// The module-level fallback the interceptors read when no execution
|
|
69
69
|
// context is entered (the runtime enters one around the whole activity;
|
|
70
|
-
// the SDK warm-up in main.ts has none). Deprecated;
|
|
70
|
+
// the SDK warm-up in main.ts has none). Deprecated; its removal is #1132.
|
|
71
71
|
setInterceptorExecutionId(executionId);
|
|
72
72
|
|
|
73
73
|
if (sink.stopSignal.aborted) return { kind: "interrupted" };
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
* basis on the priced delta the runtime accumulates.
|
|
5
5
|
*
|
|
6
6
|
* The runtime cannot price without the vendor's table and variant semantics,
|
|
7
|
-
* and it must not import them
|
|
7
|
+
* and it must not import them, so the adapter hands
|
|
8
8
|
* `TurnSink.reportUsage` a delta that already carries `estimatedCostUsd`
|
|
9
9
|
* and the basis (`model`, the catalog-validated id; `requestedModelParams`,
|
|
10
10
|
* the JSON of the params sent with every create/resume) the runtime writes
|
|
11
|
-
* into `streaming_usage`. Split out of the accumulator
|
|
11
|
+
* into `streaming_usage`. Split out of the accumulator in #1070
|
|
12
12
|
* (`harness/usage-accumulator.ts` keeps the sums); the arithmetic and the
|
|
13
13
|
* rounding are unchanged, so the estimate is byte-for-byte the old one.
|
|
14
14
|
*
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* module owns the ENGINE — what the model will do on its next call — and
|
|
11
11
|
* reports what really happened. The adapter under test is the production
|
|
12
12
|
* one, untouched; the model client is the one module doubled
|
|
13
|
-
* (`scripted-model-module.ts
|
|
13
|
+
* (`scripted-model-module.ts`), and the tools the model
|
|
14
14
|
* calls are deepagents' real built-ins over the real gate.
|
|
15
15
|
*
|
|
16
16
|
* ── The engine is per execution, and its memory is the conversation ────────
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
* checkpoint IS the engine's memory, which is why the same plan is right on
|
|
29
29
|
* a `Command(resume)` (the tool result is in the transcript before the model
|
|
30
30
|
* is asked) and on a later turn of the same thread (an approved-and-run call
|
|
31
|
-
* is not proposed again — Cursor's "obedient model"
|
|
31
|
+
* is not proposed again — Cursor's subject's "obedient model", derived
|
|
32
32
|
* instead of stored).
|
|
33
33
|
*
|
|
34
34
|
* ── The translation, one rule per word ──────────────────────────────────────
|
|
@@ -41,25 +41,30 @@
|
|
|
41
41
|
* network. A scenario picks one; the HITL arms record both.
|
|
42
42
|
*
|
|
43
43
|
* The ONE knowledge of production this driver holds is `activityFactory`: how
|
|
44
|
-
* to obtain the `ExecuteDeepAgent` function from a `Config`. Since
|
|
44
|
+
* to obtain the `ExecuteDeepAgent` function from a `Config`. Since #1096 it
|
|
45
45
|
* is the harness registry's: the native adapter booted and bound to its
|
|
46
46
|
* byte-pinned activity name through `createHarnessActivities`, exactly the
|
|
47
|
-
* way the composition roots bind it since
|
|
47
|
+
* way the composition roots bind it since #1096 through `harness-adapters.ts`
|
|
48
48
|
* (and the way the Cursor driver binds its own, `hermetic-cursor.ts`). The
|
|
49
|
-
* orchestrator this adapter replaced (`index.ts`, `setup.ts`) was deleted
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
* none
|
|
49
|
+
* orchestrator this adapter replaced (`index.ts`, `setup.ts`) was deleted in
|
|
50
|
+
* #1096; the goldens moved once, with the flip onto the runtime, each hunk
|
|
51
|
+
* quoted with its reason in its test's header, and the switch of the roots
|
|
52
|
+
* moved none.
|
|
53
53
|
*
|
|
54
54
|
* `boot` registers the deepagents harness profiles as production does
|
|
55
|
-
* (
|
|
56
|
-
* auto-injected its ungated `general-purpose` sub-agent into every
|
|
55
|
+
* (found in #1096: the orchestrator-driven runs never did, so deepagents
|
|
56
|
+
* auto-injected its ungated `general-purpose` sub-agent into every earlier
|
|
57
57
|
* scenario; the scripted model never delegated to it).
|
|
58
58
|
*
|
|
59
|
-
* Determinism beyond
|
|
59
|
+
* Determinism beyond the Cursor driver's (#1048): the clock ticks once per model turn (the scripted
|
|
60
60
|
* model's `onTurn`), so status timestamps and the persist cadence land on the
|
|
61
61
|
* same instants every run; a scenario's interruption (pause, worker shutdown)
|
|
62
|
-
* is scheduled on a model turn through the same hook, never on a timer.
|
|
62
|
+
* is scheduled on a model turn through the same hook, never on a timer. And
|
|
63
|
+
* a turn does not begin — the clock does not tick — until the loop has
|
|
64
|
+
* persisted the previous turn's tool results settled
|
|
65
|
+
* (`ExecutionRecord.whenToolCallsSettled`): the ground a real model's latency
|
|
66
|
+
* gives for free, without which the producer runs ahead of a consumer that is
|
|
67
|
+
* awaiting a slow persist and the stamps of one turn straddle the next tick.
|
|
63
68
|
*/
|
|
64
69
|
|
|
65
70
|
import { rmSync } from "node:fs";
|
|
@@ -174,7 +179,7 @@ export function sessionWorkspaceDir(env: HermeticEnvironment): string {
|
|
|
174
179
|
/** The `ExecuteDeepAgent` function as the runner serves it: the typed object OR the legacy positional pair. */
|
|
175
180
|
export type ExecuteDeepAgentFn = (arg0: ExecuteActivityInput | string, arg1?: string) => Promise<unknown>;
|
|
176
181
|
|
|
177
|
-
/** How the driver obtains the activity from a `Config` — the one seam
|
|
182
|
+
/** How the driver obtains the activity from a `Config` — the one seam the move onto the runtime flipped. */
|
|
178
183
|
export type ActivityFactory = (config: Config) => Promise<ExecuteDeepAgentFn>;
|
|
179
184
|
|
|
180
185
|
/**
|
|
@@ -225,6 +230,13 @@ export class DeepAgentScenario {
|
|
|
225
230
|
) {
|
|
226
231
|
this.model = new ScriptedModel(script, [], {
|
|
227
232
|
onTurn: async (info) => {
|
|
233
|
+
// A real model answers long after the loop has folded and persisted
|
|
234
|
+
// the tool results it is answering; a scripted one answers at once and
|
|
235
|
+
// lets the producer run a turn ahead of the consumer. Wait for that
|
|
236
|
+
// ground before ticking, so every stamp of the previous turn precedes
|
|
237
|
+
// this turn's instant, whatever the persist's I/O took (the barrier's
|
|
238
|
+
// own header on `ExecutionRecord` carries the whole reason).
|
|
239
|
+
await this.record.whenToolCallsSettled(info.priorToolCallIds);
|
|
228
240
|
this.clock.tick();
|
|
229
241
|
if (onTurn && this.controls) await onTurn(info, this.controls);
|
|
230
242
|
},
|
|
@@ -29,7 +29,7 @@ export const EXECUTE_CALL_B: ScriptedToolCall = {
|
|
|
29
29
|
|
|
30
30
|
/** The gate's copy for a SHELL built-in (`CATEGORY_APPROVAL_MESSAGE.shell` over the args). */
|
|
31
31
|
export function executeApprovalMessage(call: ScriptedToolCall): string {
|
|
32
|
-
return `
|
|
32
|
+
return `Run command: ${String(call.args.command)}`;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
/** Round 0 of every gated arm: one text block and the gated `execute` A. */
|
|
@@ -9,8 +9,7 @@
|
|
|
9
9
|
* (`shared/extract-structured-output.ts`). None of them takes a model as an
|
|
10
10
|
* argument, so the one seam a hermetic run has is this module — the native analog of the Cursor
|
|
11
11
|
* driver's `vi.mock("@cursor/sdk")`: the vendor engine doubled where the
|
|
12
|
-
* runner imports it, and nothing else
|
|
13
|
-
* Q-S3-11).
|
|
12
|
+
* runner imports it, and nothing else.
|
|
14
13
|
*
|
|
15
14
|
* `vi.mock` is hoisted and must live in the test file; the factory can
|
|
16
15
|
* `await import()` this module:
|
|
@@ -33,7 +32,7 @@
|
|
|
33
32
|
* header), so a test that runs several executions at once — the harness
|
|
34
33
|
* contract kit's concurrency invariant — routes each build to that
|
|
35
34
|
* execution's own engine through the id production already sends, and
|
|
36
|
-
* through nothing added for the test
|
|
35
|
+
* through nothing added for the test.
|
|
37
36
|
*/
|
|
38
37
|
|
|
39
38
|
import type { BuildChatModelOptions, BuiltChatModel } from "../../../shared/model-client.js";
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
* indexing left to the caller — for a consumer whose plan is not "turn k on
|
|
29
29
|
* round k" but "the first step the conversation does not yet show" (the
|
|
30
30
|
* harness contract kit's native subject, whose one execution spans many
|
|
31
|
-
* kit turns on one sqlite thread
|
|
31
|
+
* kit turns on one sqlite thread).
|
|
32
32
|
*
|
|
33
33
|
* A turn may END the model call instead of finishing the message
|
|
34
34
|
* ({@link TurnEnding}): `fail` throws after its chunks (a provider error
|
|
@@ -46,8 +46,8 @@
|
|
|
46
46
|
* and otherwise falls back to a synthesized final-message event sequence
|
|
47
47
|
* (`@langchain/langgraph` `pregel/messages-v2.js` `emitFinalMessage`). The
|
|
48
48
|
* fallback spreads a `tool_call` block's `args` OBJECT into the
|
|
49
|
-
* `tool_call_chunk` fields the runner's
|
|
50
|
-
* (`
|
|
49
|
+
* `tool_call_chunk` fields the runner's translator reads as a JSON STRING
|
|
50
|
+
* (`translator.ts` `argsChunk`), which no real provider does.
|
|
51
51
|
* Streaming keeps the double on the production event path: `@langchain/core`
|
|
52
52
|
* `language_models/compat.js` `convertChunksToEvents` turns the chunks below
|
|
53
53
|
* into `message-start`, per-block `content-block-start` / `-delta` /
|
|
@@ -181,6 +181,13 @@ export type ScriptSelector = (boundToolNames: string[], context: ScriptRoleConte
|
|
|
181
181
|
export interface ScriptedTurnInfo {
|
|
182
182
|
readonly boundToolNames: readonly string[];
|
|
183
183
|
readonly round: number;
|
|
184
|
+
/**
|
|
185
|
+
* The ids of the tool calls the transcript's last AI message made — the
|
|
186
|
+
* calls whose results this turn answers. Empty on a role's first turn and
|
|
187
|
+
* after a text-only turn. Read from the transcript the engine hands the
|
|
188
|
+
* model, never from the script, so it is what the engine actually ran.
|
|
189
|
+
*/
|
|
190
|
+
readonly priorToolCallIds: readonly string[];
|
|
184
191
|
}
|
|
185
192
|
|
|
186
193
|
export interface ScriptedModelOptions {
|
|
@@ -240,7 +247,11 @@ export class ScriptedModel extends BaseChatModel {
|
|
|
240
247
|
/** The turn for this transcript, after the driver hook has run. */
|
|
241
248
|
private async turnFor(messages: BaseMessage[]): Promise<ScriptedTurn> {
|
|
242
249
|
const round = completedToolRounds(messages);
|
|
243
|
-
await this.options.onTurn?.({
|
|
250
|
+
await this.options.onTurn?.({
|
|
251
|
+
boundToolNames: this.toolNames,
|
|
252
|
+
round,
|
|
253
|
+
priorToolCallIds: priorToolCallIds(messages),
|
|
254
|
+
});
|
|
244
255
|
const context: ScriptRoleContext = { systemPrompt: systemPromptOf(messages) };
|
|
245
256
|
return resolveTurn(this.select(this.toolNames, context), { round, transcript: messages, toolNames: this.toolNames });
|
|
246
257
|
}
|
|
@@ -347,6 +358,16 @@ export function completedToolRounds(messages: readonly BaseMessage[]): number {
|
|
|
347
358
|
return rounds;
|
|
348
359
|
}
|
|
349
360
|
|
|
361
|
+
/** The tool-call ids on the transcript's last AI message; `[]` when there is none or it made no calls. */
|
|
362
|
+
export function priorToolCallIds(messages: readonly BaseMessage[]): string[] {
|
|
363
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
364
|
+
const m = messages[i];
|
|
365
|
+
if (!isAIMessage(m)) continue;
|
|
366
|
+
return (m.tool_calls ?? []).flatMap((call) => (call.id ? [call.id] : []));
|
|
367
|
+
}
|
|
368
|
+
return [];
|
|
369
|
+
}
|
|
370
|
+
|
|
350
371
|
/** What one model call knows when it picks its turn. */
|
|
351
372
|
interface TurnRequest {
|
|
352
373
|
readonly round: number;
|