@stigmer/runner 3.14.1 → 3.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.build-fingerprint +1 -1
- package/dist/__test-utils__/execution-record-fixture.d.ts +47 -0
- package/dist/__test-utils__/execution-record-fixture.js +68 -0
- package/dist/__test-utils__/execution-record-fixture.js.map +1 -0
- package/dist/__test-utils__/harness-contract/types.d.ts +166 -0
- package/dist/__test-utils__/harness-contract/types.js +49 -0
- package/dist/__test-utils__/harness-contract/types.js.map +1 -0
- package/dist/__test-utils__/hermetic-activity.d.ts +28 -5
- package/dist/__test-utils__/hermetic-activity.js +23 -7
- package/dist/__test-utils__/hermetic-activity.js.map +1 -1
- package/dist/__test-utils__/mock-workspace.d.ts +15 -0
- package/dist/__test-utils__/mock-workspace.js +21 -0
- package/dist/__test-utils__/mock-workspace.js.map +1 -0
- package/dist/__test-utils__/model-registry-fixture.d.ts +56 -0
- package/dist/__test-utils__/model-registry-fixture.js +66 -0
- package/dist/__test-utils__/model-registry-fixture.js.map +1 -0
- package/dist/__test-utils__/turn-input-fixture.d.ts +60 -0
- package/dist/__test-utils__/turn-input-fixture.js +118 -0
- package/dist/__test-utils__/turn-input-fixture.js.map +1 -0
- package/dist/activities/execute-cursor/__test-utils__/contract-subject.d.ts +107 -0
- package/dist/activities/execute-cursor/__test-utils__/contract-subject.js +344 -0
- package/dist/activities/execute-cursor/__test-utils__/contract-subject.js.map +1 -0
- package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.d.ts +20 -0
- package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.js +58 -0
- package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.js +2 -32
- package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.d.ts +38 -62
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js +47 -121
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/scripted-agent.d.ts +17 -1
- package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js +27 -4
- package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.d.ts +52 -11
- package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.js +66 -7
- package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.js.map +1 -1
- package/dist/activities/execute-cursor/adapter.d.ts +55 -0
- package/dist/activities/execute-cursor/adapter.js +119 -0
- package/dist/activities/execute-cursor/adapter.js.map +1 -0
- package/dist/activities/execute-cursor/approval-state.d.ts +2 -2
- package/dist/activities/execute-cursor/approval-state.js.map +1 -1
- package/dist/activities/execute-cursor/capture-flow.d.ts +15 -30
- package/dist/activities/execute-cursor/capture-flow.js +17 -26
- package/dist/activities/execute-cursor/capture-flow.js.map +1 -1
- package/dist/activities/execute-cursor/cursor-capabilities.d.ts +23 -0
- package/dist/activities/execute-cursor/cursor-capabilities.js +33 -0
- package/dist/activities/execute-cursor/cursor-capabilities.js.map +1 -0
- package/dist/activities/execute-cursor/cursor-mcp-config.d.ts +2 -2
- package/dist/activities/execute-cursor/cursor-mcp-config.js.map +1 -1
- package/dist/activities/execute-cursor/fetch-interceptor.d.ts +15 -25
- package/dist/activities/execute-cursor/fetch-interceptor.js +39 -33
- package/dist/activities/execute-cursor/fetch-interceptor.js.map +1 -1
- package/dist/activities/execute-cursor/http2-interceptor.d.ts +21 -17
- package/dist/activities/execute-cursor/http2-interceptor.js +38 -31
- package/dist/activities/execute-cursor/http2-interceptor.js.map +1 -1
- package/dist/activities/execute-cursor/message-translator.d.ts +28 -19
- package/dist/activities/execute-cursor/message-translator.js +76 -27
- package/dist/activities/execute-cursor/message-translator.js.map +1 -1
- package/dist/activities/execute-cursor/prompt-builder.d.ts +180 -11
- package/dist/activities/execute-cursor/prompt-builder.js +171 -0
- package/dist/activities/execute-cursor/prompt-builder.js.map +1 -1
- package/dist/activities/execute-cursor/rejection-capture.d.ts +3 -6
- package/dist/activities/execute-cursor/rejection-capture.js +5 -7
- package/dist/activities/execute-cursor/rejection-capture.js.map +1 -1
- package/dist/activities/execute-cursor/session-lifecycle.d.ts +1 -4
- package/dist/activities/execute-cursor/session-lifecycle.js.map +1 -1
- package/dist/activities/execute-cursor/turn-boundary.d.ts +1 -1
- package/dist/activities/execute-cursor/turn-settle.d.ts +49 -0
- package/dist/activities/execute-cursor/turn-settle.js +507 -0
- package/dist/activities/execute-cursor/turn-settle.js.map +1 -0
- package/dist/activities/execute-cursor/turn-setup.d.ts +173 -0
- package/dist/activities/execute-cursor/turn-setup.js +496 -0
- package/dist/activities/execute-cursor/turn-setup.js.map +1 -0
- package/dist/activities/execute-cursor/turn-stream.d.ts +41 -71
- package/dist/activities/execute-cursor/turn-stream.js +70 -135
- package/dist/activities/execute-cursor/turn-stream.js.map +1 -1
- package/dist/activities/execute-cursor/turn.d.ts +43 -0
- package/dist/activities/execute-cursor/turn.js +222 -0
- package/dist/activities/execute-cursor/turn.js.map +1 -0
- package/dist/activities/execute-cursor/usage-pricing.d.ts +38 -0
- package/dist/activities/execute-cursor/usage-pricing.js +50 -0
- package/dist/activities/execute-cursor/usage-pricing.js.map +1 -0
- package/dist/activities/execute-deep-agent/approval-file-change.d.ts +1 -1
- package/dist/activities/execute-deep-agent/approval-file-change.js +1 -1
- package/dist/activities/execute-deep-agent/environment.js +1 -1
- package/dist/activities/execute-deep-agent/environment.js.map +1 -1
- package/dist/activities/execute-deep-agent/setup.js +3 -2
- package/dist/activities/execute-deep-agent/setup.js.map +1 -1
- package/dist/activities/hydrate-workflow-execution.js +1 -1
- package/dist/activities/hydrate-workflow-execution.js.map +1 -1
- package/dist/config.d.ts +15 -0
- package/dist/config.js.map +1 -1
- package/dist/harness/capabilities.d.ts +16 -0
- package/dist/harness/capabilities.js +1 -0
- package/dist/harness/capabilities.js.map +1 -1
- package/dist/harness/persist-chokepoint.d.ts +74 -0
- package/dist/harness/persist-chokepoint.js +88 -0
- package/dist/harness/persist-chokepoint.js.map +1 -0
- package/dist/harness/registry.d.ts +44 -5
- package/dist/harness/registry.js +61 -5
- package/dist/harness/registry.js.map +1 -1
- package/dist/harness/run-turn.d.ts +53 -0
- package/dist/harness/run-turn.js +528 -0
- package/dist/harness/run-turn.js.map +1 -0
- package/dist/harness/stop-controller.d.ts +50 -0
- package/dist/harness/stop-controller.js +62 -0
- package/dist/harness/stop-controller.js.map +1 -0
- package/dist/harness/terminal-table.d.ts +141 -0
- package/dist/harness/terminal-table.js +239 -0
- package/dist/harness/terminal-table.js.map +1 -0
- package/dist/harness/turn-context.d.ts +523 -0
- package/dist/harness/turn-context.js +739 -0
- package/dist/harness/turn-context.js.map +1 -0
- package/dist/harness/types.d.ts +232 -52
- package/dist/harness/types.js +17 -8
- package/dist/harness/types.js.map +1 -1
- package/dist/harness/usage-accumulator.d.ts +68 -0
- package/dist/harness/usage-accumulator.js +101 -0
- package/dist/harness/usage-accumulator.js.map +1 -0
- package/dist/harness-adapters.d.ts +27 -0
- package/dist/harness-adapters.js +28 -0
- package/dist/harness-adapters.js.map +1 -0
- package/dist/main.js.map +1 -1
- package/dist/runner-manager.js +64 -48
- package/dist/runner-manager.js.map +1 -1
- package/dist/runner.d.ts +5 -4
- package/dist/runner.js +65 -64
- package/dist/runner.js.map +1 -1
- package/dist/shared/approval-policy.d.ts +1 -1
- package/dist/shared/approval-policy.js.map +1 -1
- package/dist/{activities/execute-cursor → shared}/attachment-resolver.d.ts +2 -2
- package/dist/{activities/execute-cursor → shared}/attachment-resolver.js +5 -5
- package/dist/shared/attachment-resolver.js.map +1 -0
- package/dist/{activities/execute-cursor → shared}/blueprint-resolver.d.ts +7 -5
- package/dist/{activities/execute-cursor → shared}/blueprint-resolver.js +3 -63
- package/dist/shared/blueprint-resolver.js.map +1 -0
- package/dist/shared/channel-attachment.d.ts +1 -1
- package/dist/shared/channel-attachment.js.map +1 -1
- package/dist/{activities/execute-cursor → shared}/cost-guard.d.ts +5 -1
- package/dist/{activities/execute-cursor → shared}/cost-guard.js +5 -1
- package/dist/shared/cost-guard.js.map +1 -0
- package/dist/{activities/execute-cursor → shared}/env-resolver.d.ts +1 -1
- package/dist/shared/env-resolver.js.map +1 -0
- package/dist/{activities/execute-cursor → shared}/exact-apply.d.ts +1 -1
- package/dist/{activities/execute-cursor → shared}/exact-apply.js +6 -6
- package/dist/shared/exact-apply.js.map +1 -0
- package/dist/shared/execution-context.d.ts +35 -0
- package/dist/shared/execution-context.js +38 -0
- package/dist/shared/execution-context.js.map +1 -0
- package/dist/{activities/execute-cursor → shared}/extract-structured-output.d.ts +5 -2
- package/dist/{activities/execute-cursor → shared}/extract-structured-output.js +9 -6
- package/dist/shared/extract-structured-output.js.map +1 -0
- package/dist/shared/filereview/capture.d.ts +1 -1
- package/dist/shared/filereview/capture.js +1 -1
- package/dist/shared/heartbeat.d.ts +13 -11
- package/dist/shared/heartbeat.js +14 -29
- package/dist/shared/heartbeat.js.map +1 -1
- package/dist/{activities/execute-cursor → shared}/persist-decision.d.ts +5 -2
- package/dist/{activities/execute-cursor → shared}/persist-decision.js +4 -1
- package/dist/shared/persist-decision.js.map +1 -0
- package/dist/{activities/execute-cursor → shared}/skill-resolver.d.ts +16 -3
- package/dist/{activities/execute-cursor → shared}/skill-resolver.js +12 -4
- package/dist/shared/skill-resolver.js.map +1 -0
- package/dist/shared/subagent-rows.d.ts +21 -0
- package/dist/shared/subagent-rows.js +34 -0
- package/dist/shared/subagent-rows.js.map +1 -0
- package/dist/shared/worker-shutdown.d.ts +43 -16
- package/dist/shared/worker-shutdown.js +28 -13
- package/dist/shared/worker-shutdown.js.map +1 -1
- package/dist/shared/workspace/platform-dir.d.ts +1 -1
- package/dist/shared/workspace/platform-dir.js +1 -1
- package/dist/shared/workspace/session-provision.d.ts +54 -0
- package/dist/{activities/execute-cursor/workspace-provision.js → shared/workspace/session-provision.js} +15 -12
- package/dist/shared/workspace/session-provision.js.map +1 -0
- package/package.json +4 -4
- package/src/__test-utils__/__tests__/harness-contract-self-check.test.ts +110 -14
- package/src/__test-utils__/execution-record-fixture.ts +104 -0
- package/src/__test-utils__/harness-boot-order-child.ts +58 -0
- package/src/__test-utils__/harness-contract/contract.ts +128 -83
- package/src/__test-utils__/harness-contract/recording-sink.ts +15 -4
- package/src/__test-utils__/harness-contract/runtime-contract.ts +666 -0
- package/src/__test-utils__/harness-contract/scripted-adapter.ts +92 -32
- package/src/__test-utils__/harness-contract/types.ts +85 -9
- package/src/__test-utils__/hermetic-activity.ts +33 -8
- package/src/__test-utils__/model-registry-fixture.ts +72 -0
- package/src/__test-utils__/module-specifiers.ts +82 -0
- package/src/__test-utils__/turn-input-fixture.ts +155 -0
- package/src/__tests__/harness-boot-order.test.ts +77 -0
- package/src/__tests__/harness-contract.test.ts +7 -5
- package/src/__tests__/runner-manager.test.ts +18 -0
- package/src/activities/execute-cursor/__test-utils__/__tests__/scripted-double.test.ts +102 -0
- package/src/activities/execute-cursor/__test-utils__/contract-subject.ts +396 -0
- package/src/activities/execute-cursor/__test-utils__/cursor-hook-harness.ts +66 -0
- package/src/activities/execute-cursor/__test-utils__/gateway-substrate.ts +2 -43
- package/src/activities/execute-cursor/__test-utils__/hermetic-cursor.ts +65 -145
- package/src/activities/execute-cursor/__test-utils__/scripted-agent.ts +30 -4
- package/src/activities/execute-cursor/__test-utils__/scripted-sdk.ts +96 -8
- package/src/activities/execute-cursor/__tests__/adapter-is-temporal-free.test.ts +45 -0
- package/src/activities/execute-cursor/__tests__/approval-decisions-agree.test.ts +90 -0
- package/src/activities/execute-cursor/__tests__/build-prompt.test.ts +7 -8
- package/src/activities/execute-cursor/__tests__/capture-flow.test.ts +28 -1
- package/src/activities/execute-cursor/__tests__/deny-gate-exact-apply.test.ts +1 -1
- package/src/activities/execute-cursor/__tests__/fetch-interceptor.test.ts +64 -6
- 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/cost-cap.status.json +53 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/pause.status.json +1 -6
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/platform-stop.status.json +56 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/recovery-transport-timeout.status.json +48 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/resolution-error.status.json +18 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/run-cancelled.status.json +36 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/run-error-non-retryable.status.json +37 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/sdk-error-at-create.status.json +38 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/stall.status.json +59 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/unattributed-hook-block.status.json +79 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/worker-shutdown.status.json +2 -7
- package/src/activities/execute-cursor/__tests__/hermetic/harness-contract.test.ts +170 -0
- package/src/activities/execute-cursor/__tests__/hermetic/pause-vs-shutdown.test.ts +22 -18
- package/src/activities/execute-cursor/__tests__/hermetic/plain-turn.test.ts +1 -1
- package/src/activities/execute-cursor/__tests__/hermetic/recovery-fresh-agent.test.ts +1 -1
- package/src/activities/execute-cursor/__tests__/hermetic/run-wait-arms.test.ts +286 -0
- package/src/activities/execute-cursor/__tests__/hermetic/stream-self-stop-arms.test.ts +332 -0
- package/src/activities/execute-cursor/__tests__/hermetic/thrown-error-arms.test.ts +193 -0
- package/src/activities/execute-cursor/__tests__/hermetic/tool-call.test.ts +1 -1
- package/src/activities/execute-cursor/__tests__/hermetic/unattributed-hook-block.test.ts +185 -0
- package/src/activities/execute-cursor/__tests__/hermetic/workspace-lock-timeout.test.ts +151 -0
- package/src/activities/execute-cursor/__tests__/http2-interceptor.test.ts +65 -35
- package/src/activities/execute-cursor/__tests__/message-translator.test.ts +0 -40
- package/src/activities/execute-cursor/__tests__/same-identity-reproposal.test.ts +171 -0
- package/src/activities/execute-cursor/__tests__/turn-stream.test.ts +118 -243
- package/src/activities/execute-cursor/__tests__/usage-pricing.test.ts +84 -0
- package/src/activities/execute-cursor/adapter.ts +138 -0
- package/src/activities/execute-cursor/approval-state.ts +2 -2
- package/src/activities/execute-cursor/capture-flow.ts +18 -41
- package/src/activities/execute-cursor/cursor-capabilities.ts +35 -0
- package/src/activities/execute-cursor/cursor-mcp-config.ts +2 -2
- package/src/activities/execute-cursor/fetch-interceptor.ts +48 -45
- package/src/activities/execute-cursor/http2-interceptor.ts +47 -34
- package/src/activities/execute-cursor/message-translator.ts +90 -45
- package/src/activities/execute-cursor/prompt-builder.ts +327 -12
- package/src/activities/execute-cursor/rejection-capture.ts +5 -12
- package/src/activities/execute-cursor/session-lifecycle.ts +1 -5
- package/src/activities/execute-cursor/turn-boundary.ts +1 -1
- package/src/activities/execute-cursor/turn-settle.ts +601 -0
- package/src/activities/execute-cursor/turn-setup.ts +645 -0
- package/src/activities/execute-cursor/turn-stream.ts +84 -210
- package/src/activities/execute-cursor/turn.ts +240 -0
- package/src/activities/execute-cursor/usage-pricing.ts +67 -0
- package/src/activities/execute-deep-agent/approval-file-change.ts +1 -1
- package/src/activities/execute-deep-agent/environment.ts +1 -1
- package/src/activities/execute-deep-agent/setup.ts +3 -2
- package/src/activities/hydrate-workflow-execution.ts +1 -1
- package/src/config.ts +13 -0
- package/src/harness/__tests__/import-direction.test.ts +168 -0
- package/src/harness/__tests__/persist-chokepoint.test.ts +146 -0
- package/src/harness/__tests__/registry.test.ts +1 -0
- package/src/harness/__tests__/run-turn.test.ts +165 -0
- package/src/harness/__tests__/stop-controller.test.ts +49 -0
- package/src/harness/__tests__/turn-context.test.ts +178 -0
- package/src/harness/__tests__/usage-accumulator.test.ts +83 -0
- package/src/harness/capabilities.ts +17 -0
- package/src/harness/persist-chokepoint.ts +112 -0
- package/src/harness/registry.ts +79 -5
- package/src/harness/run-turn.ts +618 -0
- package/src/harness/stop-controller.ts +83 -0
- package/src/harness/terminal-table.ts +276 -0
- package/src/harness/turn-context.ts +1028 -0
- package/src/harness/types.ts +248 -53
- package/src/harness/usage-accumulator.ts +122 -0
- package/src/harness-adapters.ts +30 -0
- package/src/main.ts +1 -1
- package/src/runner-manager.ts +68 -61
- package/src/runner.ts +67 -78
- package/src/shared/__tests__/attachment-naming.test.ts +1 -1
- package/src/{activities/execute-cursor → shared}/__tests__/attachment-resolver.test.ts +6 -4
- package/src/{activities/execute-cursor → shared}/__tests__/cost-guard.test.ts +2 -1
- package/src/{activities/execute-cursor → shared}/__tests__/exact-apply.test.ts +3 -3
- package/src/{activities/execute-cursor → shared}/__tests__/extract-structured-output.test.ts +8 -8
- package/src/{activities/execute-cursor → shared}/__tests__/persist-decision.test.ts +4 -2
- package/src/{activities/execute-cursor → shared}/__tests__/skill-resolver.test.ts +1 -1
- package/src/shared/__tests__/subagent-rows.test.ts +34 -0
- package/src/shared/__tests__/worker-shutdown.test.ts +44 -39
- package/src/shared/approval-policy.ts +1 -1
- package/src/{activities/execute-cursor → shared}/attachment-resolver.ts +6 -6
- package/src/{activities/execute-cursor → shared}/blueprint-resolver.ts +7 -78
- package/src/shared/channel-attachment.ts +1 -1
- package/src/{activities/execute-cursor → shared}/cost-guard.ts +5 -1
- package/src/{activities/execute-cursor → shared}/env-resolver.ts +1 -1
- package/src/{activities/execute-cursor → shared}/exact-apply.ts +7 -7
- package/src/shared/execution-context.ts +45 -0
- package/src/{activities/execute-cursor → shared}/extract-structured-output.ts +10 -7
- package/src/shared/filereview/capture.ts +1 -1
- package/src/shared/heartbeat.ts +13 -33
- package/src/{activities/execute-cursor → shared}/persist-decision.ts +5 -2
- package/src/{activities/execute-cursor → shared}/skill-resolver.ts +20 -6
- package/src/shared/subagent-rows.ts +39 -0
- package/src/shared/worker-shutdown.ts +55 -25
- package/src/{activities/execute-cursor/__tests__/workspace-provision.test.ts → shared/workspace/__tests__/session-provision.test.ts} +25 -28
- package/src/shared/workspace/platform-dir.ts +1 -1
- package/src/{activities/execute-cursor/workspace-provision.ts → shared/workspace/session-provision.ts} +29 -16
- package/dist/activities/execute-cursor/attachment-resolver.js.map +0 -1
- package/dist/activities/execute-cursor/blueprint-resolver.js.map +0 -1
- package/dist/activities/execute-cursor/cost-guard.js.map +0 -1
- package/dist/activities/execute-cursor/env-resolver.js.map +0 -1
- package/dist/activities/execute-cursor/exact-apply.js.map +0 -1
- package/dist/activities/execute-cursor/extract-structured-output.js.map +0 -1
- package/dist/activities/execute-cursor/index.d.ts +0 -209
- package/dist/activities/execute-cursor/index.js +0 -2345
- package/dist/activities/execute-cursor/index.js.map +0 -1
- package/dist/activities/execute-cursor/persist-decision.js.map +0 -1
- package/dist/activities/execute-cursor/skill-resolver.js.map +0 -1
- package/dist/activities/execute-cursor/usage-accumulator.d.ts +0 -89
- package/dist/activities/execute-cursor/usage-accumulator.js +0 -121
- package/dist/activities/execute-cursor/usage-accumulator.js.map +0 -1
- package/dist/activities/execute-cursor/workspace-provision.d.ts +0 -42
- package/dist/activities/execute-cursor/workspace-provision.js.map +0 -1
- package/src/activities/execute-cursor/__tests__/usage-accumulator.test.ts +0 -164
- package/src/activities/execute-cursor/index.ts +0 -2876
- package/src/activities/execute-cursor/usage-accumulator.ts +0 -169
- /package/dist/{activities/execute-cursor → shared}/env-resolver.js +0 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Cursor harness's settle — from a consumed stream to a `TurnOutcome`.
|
|
3
|
+
*
|
|
4
|
+
* In order: the post-stream finalize (transcript, enrichments, sub-agents,
|
|
5
|
+
* the usage snapshot's carrier, the recorder flush, one persist so the UI
|
|
6
|
+
* sees settled rows); the runtime's stop, if it fired, settled as
|
|
7
|
+
* `interrupted` with nothing further; the turn boundary (`turn-boundary.ts`,
|
|
8
|
+
* whole, Q-S2-1) that authors this turn's change set and overlays the hook's
|
|
9
|
+
* denials as WAITING rows, ending `awaiting_approval` when it says so or
|
|
10
|
+
* failing on an unattributed hook block (#205); `run.wait()` and the
|
|
11
|
+
* classifier; the two recovery spines (a poisoned resumed handle, a
|
|
12
|
+
* transport timeout on a created agent), each running the IDENTICAL stream,
|
|
13
|
+
* finalize and boundary against a fresh agent at most once; the collapse of
|
|
14
|
+
* redundant same-identity tool-call twins; and the outcome.
|
|
15
|
+
*
|
|
16
|
+
* What this module never does: write a phase, a terminal copy or
|
|
17
|
+
* `completedAt` — those are the runtime's (`harness/run-turn.ts`,
|
|
18
|
+
* `terminal-table.ts`); the outcome carries what the runtime cannot read
|
|
19
|
+
* from the status (`failed`'s message and surface, `cancelled`). It does
|
|
20
|
+
* mutate `sink.status`'s transcript rows, which are this harness's to write.
|
|
21
|
+
*
|
|
22
|
+
* Moved from `index.ts` `executeCursorInner` phases 11 to 13 at S2 M3b; the
|
|
23
|
+
* bodies are the orchestrator's, with the runtime's arms taken out.
|
|
24
|
+
*/
|
|
25
|
+
import type { TurnInput, TurnOutcome, TurnSink } from "../../harness/types.js";
|
|
26
|
+
import { type TurnStreamState } from "./turn-stream.js";
|
|
27
|
+
import type { AdjudicatedRows, CursorEngine, CursorGate, CursorPrompt, CursorAdapterConfig } from "./turn-setup.js";
|
|
28
|
+
/** Everything the settle reads that setup produced. */
|
|
29
|
+
export interface CursorTurnFrame {
|
|
30
|
+
readonly input: TurnInput;
|
|
31
|
+
readonly sink: TurnSink;
|
|
32
|
+
readonly config: CursorAdapterConfig;
|
|
33
|
+
readonly engine: CursorEngine;
|
|
34
|
+
readonly gate: CursorGate;
|
|
35
|
+
readonly prompt: CursorPrompt;
|
|
36
|
+
readonly rows: AdjudicatedRows;
|
|
37
|
+
readonly streamState: TurnStreamState;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Send the primary prompt, consume the stream, and settle. The one entry the
|
|
41
|
+
* adapter calls after setup; every collaborator the stream loop needs is
|
|
42
|
+
* built here, once, and shared with both recovery spines.
|
|
43
|
+
*/
|
|
44
|
+
export declare function streamAndSettle(frame: CursorTurnFrame): Promise<TurnOutcome>;
|
|
45
|
+
/** The `streaming_usage` carrier the OTel span end reads; the runtime keeps it current on every write. */
|
|
46
|
+
export declare function usageSnapshotFor(sink: TurnSink): {
|
|
47
|
+
inputTokens: bigint;
|
|
48
|
+
outputTokens: bigint;
|
|
49
|
+
};
|
|
@@ -0,0 +1,507 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Cursor harness's settle — from a consumed stream to a `TurnOutcome`.
|
|
3
|
+
*
|
|
4
|
+
* In order: the post-stream finalize (transcript, enrichments, sub-agents,
|
|
5
|
+
* the usage snapshot's carrier, the recorder flush, one persist so the UI
|
|
6
|
+
* sees settled rows); the runtime's stop, if it fired, settled as
|
|
7
|
+
* `interrupted` with nothing further; the turn boundary (`turn-boundary.ts`,
|
|
8
|
+
* whole, Q-S2-1) that authors this turn's change set and overlays the hook's
|
|
9
|
+
* denials as WAITING rows, ending `awaiting_approval` when it says so or
|
|
10
|
+
* failing on an unattributed hook block (#205); `run.wait()` and the
|
|
11
|
+
* classifier; the two recovery spines (a poisoned resumed handle, a
|
|
12
|
+
* transport timeout on a created agent), each running the IDENTICAL stream,
|
|
13
|
+
* finalize and boundary against a fresh agent at most once; the collapse of
|
|
14
|
+
* redundant same-identity tool-call twins; and the outcome.
|
|
15
|
+
*
|
|
16
|
+
* What this module never does: write a phase, a terminal copy or
|
|
17
|
+
* `completedAt` — those are the runtime's (`harness/run-turn.ts`,
|
|
18
|
+
* `terminal-table.ts`); the outcome carries what the runtime cannot read
|
|
19
|
+
* from the status (`failed`'s message and surface, `cancelled`). It does
|
|
20
|
+
* mutate `sink.status`'s transcript rows, which are this harness's to write.
|
|
21
|
+
*
|
|
22
|
+
* Moved from `index.ts` `executeCursorInner` phases 11 to 13 at S2 M3b; the
|
|
23
|
+
* bodies are the orchestrator's, with the runtime's arms taken out.
|
|
24
|
+
*/
|
|
25
|
+
import { create } from "@bufbuild/protobuf";
|
|
26
|
+
import { StreamingUsageSummarySchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/usage_pb";
|
|
27
|
+
import { TimingRecorder, emitTimingLog } from "../../shared/cold-start-timing.js";
|
|
28
|
+
import { StreamingUpdateScheduler, loadStreamingConfig } from "../../shared/streaming-scheduler.js";
|
|
29
|
+
import { createCursorEventRecorder } from "./cursor-event-recorder.js";
|
|
30
|
+
import { DeltaEnricher } from "./delta-enricher.js";
|
|
31
|
+
import { extractRunErrorSources, formatClassifiedError, shouldRetryWithFreshAgent, synthesizeError, } from "./error-classifier.js";
|
|
32
|
+
import { closeProxySessions } from "./http2-interceptor.js";
|
|
33
|
+
import { MessageAccumulator, collapseRedundantToolCallTwins } from "./message-translator.js";
|
|
34
|
+
import { clearCapturedRejection, getCapturedRejection } from "./rejection-capture.js";
|
|
35
|
+
import { TodoTracker } from "./todo-tracker.js";
|
|
36
|
+
import { runTurnBoundary } from "./turn-boundary.js";
|
|
37
|
+
import { consumeCursorTurnStream, makeCursorTurnOnDelta, } from "./turn-stream.js";
|
|
38
|
+
import { createFreshAgent } from "./turn-setup.js";
|
|
39
|
+
/**
|
|
40
|
+
* Send the primary prompt, consume the stream, and settle. The one entry the
|
|
41
|
+
* adapter calls after setup; every collaborator the stream loop needs is
|
|
42
|
+
* built here, once, and shared with both recovery spines.
|
|
43
|
+
*/
|
|
44
|
+
export async function streamAndSettle(frame) {
|
|
45
|
+
const { input, sink, config, engine, gate, prompt, rows, streamState } = frame;
|
|
46
|
+
const { executionId, sessionId, blueprint, workspace, mcp } = input;
|
|
47
|
+
const { status } = sink;
|
|
48
|
+
const deltaEnricher = new DeltaEnricher();
|
|
49
|
+
const todoTracker = new TodoTracker(status.todos);
|
|
50
|
+
const eventRecorder = createCursorEventRecorder(executionId);
|
|
51
|
+
// The two recovery retries (poisoned-handle / transport-timeout) below run at
|
|
52
|
+
// most once per turn; this guard is the latch.
|
|
53
|
+
let alreadyRetriedWithFreshAgent = false;
|
|
54
|
+
// The shared onDelta only needs the sink/pricer/enricher/state subset, and
|
|
55
|
+
// it is wired at SEND time — before the accumulator exists — so it takes the
|
|
56
|
+
// narrow deps. The primary send and both retry sends reuse this object.
|
|
57
|
+
const onDeltaDeps = {
|
|
58
|
+
sink,
|
|
59
|
+
usagePricer: engine.usagePricer,
|
|
60
|
+
deltaEnricher,
|
|
61
|
+
promptEstimatedTokens: prompt.promptEstimatedTokens,
|
|
62
|
+
executionId,
|
|
63
|
+
state: streamState,
|
|
64
|
+
};
|
|
65
|
+
// Issue #209 forensics: the SDK acquires the local executor — the piece
|
|
66
|
+
// that actually spawns stdio MCP servers — inside send(), AFTER the
|
|
67
|
+
// execution_setup timeline has already been emitted. This one-shot
|
|
68
|
+
// timeline makes that previously invisible window measurable:
|
|
69
|
+
// `send_returned` covers the send() call itself, `first_delta` the wait
|
|
70
|
+
// until the SDK's first delta. Primary send only — the recovery retries
|
|
71
|
+
// below rebuild the agent and would skew the user-perceived turn start
|
|
72
|
+
// this measures. No delta (immediate pause/failure) → no line.
|
|
73
|
+
const turnStartTiming = new TimingRecorder();
|
|
74
|
+
let turnFirstEventEmitted = false;
|
|
75
|
+
const primaryOnDelta = makeCursorTurnOnDelta(onDeltaDeps);
|
|
76
|
+
const run = await engine.resolution.agent.send(prompt.toSendMessage(prompt.effectivePrompt, prompt.primarySendImages), {
|
|
77
|
+
onDelta: (event) => {
|
|
78
|
+
if (!turnFirstEventEmitted) {
|
|
79
|
+
turnFirstEventEmitted = true;
|
|
80
|
+
turnStartTiming.mark("first_delta");
|
|
81
|
+
emitTimingLog("turn_first_event", {
|
|
82
|
+
execution_id: executionId,
|
|
83
|
+
session_id: sessionId,
|
|
84
|
+
harness: "cursor",
|
|
85
|
+
agent_resumed: engine.resolution.resumed,
|
|
86
|
+
mcp_server_count: blueprint.mergedMcpServerUsages.length,
|
|
87
|
+
}, turnStartTiming);
|
|
88
|
+
}
|
|
89
|
+
primaryOnDelta(event);
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
sink.recordActivity();
|
|
93
|
+
// Normally send() resolves before any delta arrives, making send_returned
|
|
94
|
+
// the first segment; if a delta beat it, the line is already emitted and
|
|
95
|
+
// adding a mark now would be meaningless.
|
|
96
|
+
if (!turnFirstEventEmitted) {
|
|
97
|
+
turnStartTiming.mark("send_returned");
|
|
98
|
+
}
|
|
99
|
+
// Everything at an index >= this was produced by THIS turn's stream — the
|
|
100
|
+
// positional turn boundary the approved-command provenance (DD-28) scopes
|
|
101
|
+
// its qualification to. Snapshotted before the accumulator can append.
|
|
102
|
+
const turnStartMessageIndex = status.messages.length;
|
|
103
|
+
const accumulator = new MessageAccumulator(status.messages, {
|
|
104
|
+
mergedPolicies: mcp.policies,
|
|
105
|
+
provenance: { globalBypass: mcp.leases.global, leasedCategories: mcp.leases.categories },
|
|
106
|
+
workspaceRoot: workspace.primaryDir,
|
|
107
|
+
seededSubAgents: rows.seededSubAgents,
|
|
108
|
+
});
|
|
109
|
+
// Shared cadence with the native harness: discrete state changes force a
|
|
110
|
+
// flush; high-frequency token deltas ride this scheduler's time cadence
|
|
111
|
+
// (env-tunable via STREAMING_* — see loadStreamingConfig).
|
|
112
|
+
const scheduler = new StreamingUpdateScheduler(loadStreamingConfig());
|
|
113
|
+
// Full deps for the shared stream loop, all keyed off the single stream
|
|
114
|
+
// state. Consumed by the primary stream here and by both recovery retries.
|
|
115
|
+
const streamDeps = {
|
|
116
|
+
...onDeltaDeps,
|
|
117
|
+
accumulator,
|
|
118
|
+
todoTracker,
|
|
119
|
+
eventRecorder,
|
|
120
|
+
scheduler,
|
|
121
|
+
progressSubstrate: gate.progressSubstrate,
|
|
122
|
+
progressState: gate.progressState,
|
|
123
|
+
changeSetId: workspace.changeSetId,
|
|
124
|
+
hitlDir: gate.hitlDir,
|
|
125
|
+
};
|
|
126
|
+
// Post-stream finalize, shared by the primary turn and both recovery retries:
|
|
127
|
+
// finalize the transcript + streaming flags, mark any in-flight sub-agent
|
|
128
|
+
// CANCELLED on a stopped turn, keep the usage summary's carrier current,
|
|
129
|
+
// flush the recorder, and persist so the UI sees the settled rows.
|
|
130
|
+
const finalizeStreamPhase = async () => {
|
|
131
|
+
accumulator.finalize();
|
|
132
|
+
deltaEnricher.finalize(status.messages);
|
|
133
|
+
// A stopped turn (pause, shutdown, stall, cost cap, platform stop) aborts
|
|
134
|
+
// the Cursor SDK run, so any sub-agent the parent had delegated is no
|
|
135
|
+
// longer executing. Mark it CANCELLED rather than leaving a permanent
|
|
136
|
+
// IN_PROGRESS "zombie" in the final snapshot (parity with the native
|
|
137
|
+
// harness's cancelSubAgents()).
|
|
138
|
+
if (sink.stopSignal.aborted) {
|
|
139
|
+
accumulator.cancelInProgressSubAgents();
|
|
140
|
+
}
|
|
141
|
+
status.subAgentExecutions = accumulator.subAgentExecutions;
|
|
142
|
+
await eventRecorder?.flush();
|
|
143
|
+
console.log(`ExecuteCursor stream ended: execution=${executionId}, events=${streamState.eventCount}, messages=${status.messages.length}, subAgents=${status.subAgentExecutions.length}`);
|
|
144
|
+
// Persist immediately after finalize so the UI sees correct tool-call
|
|
145
|
+
// statuses before the boundary / run.wait() / the runtime's epilogue.
|
|
146
|
+
await sink.requestPersist();
|
|
147
|
+
sink.recordActivity();
|
|
148
|
+
};
|
|
149
|
+
// The turn boundary — author this turn's change set to the file_review
|
|
150
|
+
// ledger (CANDIDATE_CAPTURED) and overlay the hook's denials as
|
|
151
|
+
// WAITING_APPROVAL gate rows. The full pipeline and its ordering rationale
|
|
152
|
+
// live in turn-boundary.ts; this closure binds the turn's state so the
|
|
153
|
+
// recovery retries (which re-run the agent AFTER this primary call) can
|
|
154
|
+
// re-enter the IDENTICAL pipeline — a retry's edits must reach the ledger
|
|
155
|
+
// or they silently escape review.
|
|
156
|
+
const runBoundary = (denialSettled) => runTurnBoundary({
|
|
157
|
+
status,
|
|
158
|
+
executionId,
|
|
159
|
+
changeSetId: workspace.changeSetId,
|
|
160
|
+
hitlDir: gate.hitlDir,
|
|
161
|
+
captureMode: workspace.captureMode,
|
|
162
|
+
baselineTree: gate.baselineTree,
|
|
163
|
+
primaryWorkspaceDir: workspace.primaryDir,
|
|
164
|
+
gitWorkspace: workspace.gitWorkspace,
|
|
165
|
+
turnStartMessageIndex,
|
|
166
|
+
approvalGrants: gate.approvalGrants,
|
|
167
|
+
globalBypass: mcp.leases.global,
|
|
168
|
+
seededSubAgents: rows.seededSubAgents,
|
|
169
|
+
artifactStorage: input.artifactStorage,
|
|
170
|
+
mergedPolicies: mcp.policies,
|
|
171
|
+
denialCancelSettled: denialSettled,
|
|
172
|
+
foreignGatingHooks: gate.hitlGate.foreignGatingHooks,
|
|
173
|
+
});
|
|
174
|
+
// The boundary mutated the transcript in place and asked to pause for
|
|
175
|
+
// review: the runtime flips the phase, persists, and returns to the
|
|
176
|
+
// workflow, which waits for the approval/file-review signal and reinvokes.
|
|
177
|
+
const awaitingApproval = (boundary) => {
|
|
178
|
+
console.log(`ExecuteCursor returning WAITING_FOR_APPROVAL: ${boundary.deniedToolCallCount} gated tool(s), ` +
|
|
179
|
+
`${boundary.capturedChangeCount} file card(s) pending`);
|
|
180
|
+
return { kind: "awaiting_approval" };
|
|
181
|
+
};
|
|
182
|
+
// Issue #205: a tool was blocked by a hook Stigmer does not own (the merge
|
|
183
|
+
// preserves the user's own gating hooks, and Cursor runs every one), so no
|
|
184
|
+
// approval can unblock it — an approval grants a token only OUR hook reads,
|
|
185
|
+
// and the foreign hook would deny the re-attempt forever. Completing would
|
|
186
|
+
// be the silent-failure shape the issue describes; instead fail with a
|
|
187
|
+
// diagnosable reason naming the blocked tools and the likely culprit. The
|
|
188
|
+
// user can fix this one: the `actionable` surface.
|
|
189
|
+
const unattributedHookBlock = (boundary) => {
|
|
190
|
+
const blockedTools = [...new Set(boundary.unattributedHookBlocks.map((b) => b.toolName))].join(", ");
|
|
191
|
+
const foreign = gate.hitlGate.foreignGatingHooks;
|
|
192
|
+
const culprit = foreign.length > 0
|
|
193
|
+
? ` The workspace's .cursor/hooks.json registers hook(s) outside Stigmer's control ` +
|
|
194
|
+
`[${foreign.join(", ")}], which most likely denied it.`
|
|
195
|
+
: "";
|
|
196
|
+
const message = `A Cursor hook outside Stigmer's approval gate blocked tool(s): ${blockedTools}.` +
|
|
197
|
+
culprit +
|
|
198
|
+
` Stigmer cannot request approval on a foreign hook's behalf — remove or adjust ` +
|
|
199
|
+
`the hook in .cursor/hooks.json and retry.`;
|
|
200
|
+
console.error(`ExecuteCursor failed (unattributed hook block): execution=${executionId}, ` +
|
|
201
|
+
`tools=[${blockedTools}], foreignHooks=[${foreign.join(", ")}]`);
|
|
202
|
+
return { kind: "failed", surface: "actionable", message };
|
|
203
|
+
};
|
|
204
|
+
// Re-enter the turn boundary for a recovery retry: author the retry's net
|
|
205
|
+
// change set to the file_review ledger and overlay any denials as gates —
|
|
206
|
+
// without this a retry's file edits silently escape review (production case
|
|
207
|
+
// aex_01kws27q1e2esvkqjpvectttxf). Returns undefined for a cancelled retry —
|
|
208
|
+
// there is no review to open. Passes denialCancelSettled so a first denial
|
|
209
|
+
// that stopped the RETRY waits for run.cancel() before the ledger read,
|
|
210
|
+
// exactly like the primary path.
|
|
211
|
+
const settleRetryTurn = async (retryResultStatus) => retryResultStatus === "cancelled"
|
|
212
|
+
? undefined
|
|
213
|
+
: runBoundary(streamState.firstDenialDetected ? streamState.denialCancelSettled : undefined);
|
|
214
|
+
const runRecoveryStream = async (freshAgent, retryPrompt) => {
|
|
215
|
+
// The fresh agent is now the live handle: point the resolution at it so
|
|
216
|
+
// the adapter's disposition parks or closes THIS agent rather than the
|
|
217
|
+
// disposed one it replaced.
|
|
218
|
+
engine.resolution = { ...engine.resolution, agent: freshAgent, agentId: freshAgent.agentId, isNew: true };
|
|
219
|
+
streamState.streamErrorMessage = undefined;
|
|
220
|
+
// The retry always carries the turn's full image payload — never the
|
|
221
|
+
// primary send's HITL-trimmed set: the fresh agent's conversation is
|
|
222
|
+
// empty, so skipping them here would silently lose the user's photo on
|
|
223
|
+
// a recovered turn (issue #366's vision corollary).
|
|
224
|
+
const retryRun = await freshAgent.send(prompt.toSendMessage(retryPrompt, prompt.turnImages), {
|
|
225
|
+
onDelta: makeCursorTurnOnDelta(onDeltaDeps),
|
|
226
|
+
});
|
|
227
|
+
sink.recordActivity();
|
|
228
|
+
const reason = await consumeCursorTurnStream(retryRun, streamDeps);
|
|
229
|
+
await finalizeStreamPhase();
|
|
230
|
+
if (reason === "interrupted")
|
|
231
|
+
return { proceeded: false, outcome: { kind: "interrupted" } };
|
|
232
|
+
const retryResult = await retryRun.wait();
|
|
233
|
+
sink.recordActivity();
|
|
234
|
+
console.log(`ExecuteCursor retry run.wait(): execution=${executionId}, retryResult=${JSON.stringify(retryResult)}`);
|
|
235
|
+
const retryBoundary = await settleRetryTurn(retryResult.status);
|
|
236
|
+
return { proceeded: true, retryRun, retryResult, retryBoundary };
|
|
237
|
+
};
|
|
238
|
+
// ── The primary stream ────────────────────────────────────────────────────
|
|
239
|
+
const reason = await consumeCursorTurnStream(run, streamDeps);
|
|
240
|
+
await finalizeStreamPhase();
|
|
241
|
+
if (reason === "interrupted")
|
|
242
|
+
return { kind: "interrupted" };
|
|
243
|
+
// The denial-settle wait applies only when a first denial stopped THIS run;
|
|
244
|
+
// a normal completion passes no promise.
|
|
245
|
+
const boundary = await runBoundary(streamState.firstDenialDetected ? streamState.denialCancelSettled : undefined);
|
|
246
|
+
sink.recordActivity();
|
|
247
|
+
if (boundary.waiting) {
|
|
248
|
+
// A pausing turn is never silent, so an unattributed block alongside our
|
|
249
|
+
// own gate only warns (logged by the boundary) — the pause wins.
|
|
250
|
+
return awaitingApproval(boundary);
|
|
251
|
+
}
|
|
252
|
+
if (boundary.unattributedHookBlocks.length > 0) {
|
|
253
|
+
return unattributedHookBlock(boundary);
|
|
254
|
+
}
|
|
255
|
+
// ── run.wait() ────────────────────────────────────────────────────────────
|
|
256
|
+
const result = await run.wait();
|
|
257
|
+
sink.recordActivity();
|
|
258
|
+
console.log(`ExecuteCursor run.wait() result: execution=${executionId}, result=${JSON.stringify(result)}`);
|
|
259
|
+
// Echo sanity check only: result.model ECHOES the requested selection —
|
|
260
|
+
// the SDK never reports the variant that actually served the call
|
|
261
|
+
// (verified against the billing ledger, #357). A mismatch here means the
|
|
262
|
+
// SDK rewrote our selection (contract change), not variant drift; the
|
|
263
|
+
// authoritative requested-vs-billed reconciliation is the cloud billing
|
|
264
|
+
// handler's pricing_variant mismatch metric.
|
|
265
|
+
const echoedSelection = result.model;
|
|
266
|
+
if (echoedSelection) {
|
|
267
|
+
const idMatches = echoedSelection.id === engine.validatedModel;
|
|
268
|
+
// Compare id/value pairs explicitly, never serialized objects: the SDK
|
|
269
|
+
// may add fields to ModelParameterValue or reorder keys, and neither
|
|
270
|
+
// is contract drift.
|
|
271
|
+
const echoedParams = [...(echoedSelection.params ?? [])].sort((a, b) => a.id.localeCompare(b.id));
|
|
272
|
+
const paramsMatch = echoedParams.length === engine.modelParams.length &&
|
|
273
|
+
echoedParams.every((p, i) => p.id === engine.modelParams[i].id && p.value === engine.modelParams[i].value);
|
|
274
|
+
if (!idMatches || !paramsMatch) {
|
|
275
|
+
console.warn(`ExecuteCursor model selection echo mismatch (SDK contract drift?): ` +
|
|
276
|
+
`execution=${executionId}, ` +
|
|
277
|
+
`requested=${JSON.stringify({ id: engine.validatedModel, params: engine.modelParams })}, ` +
|
|
278
|
+
`echoed=${JSON.stringify(echoedSelection)}`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
let outcome;
|
|
282
|
+
switch (result.status) {
|
|
283
|
+
case "finished":
|
|
284
|
+
outcome = { kind: "completed" };
|
|
285
|
+
break;
|
|
286
|
+
case "cancelled":
|
|
287
|
+
outcome = { kind: "cancelled" };
|
|
288
|
+
break;
|
|
289
|
+
case "error": {
|
|
290
|
+
// Shape-aware extraction, NOT String(): the result's error fields are
|
|
291
|
+
// structured at runtime often enough that a bare coercion showed users
|
|
292
|
+
// "[object Object]" and shadowed every fallback source below (oss#299).
|
|
293
|
+
const runErrorSources = extractRunErrorSources(result);
|
|
294
|
+
// The SDK frequently resolves run.wait() to a bare { status: "error" }
|
|
295
|
+
// while the real reason (e.g. the original grpc-status 12 routing
|
|
296
|
+
// failure) lives on the failing conversation turn. Capture it here so
|
|
297
|
+
// the classified error is actionable instead of "no detail from SDK".
|
|
298
|
+
const conversationErrorText = await introspectConversation(run, executionId);
|
|
299
|
+
const capturedRejection = getCapturedRejection(executionId);
|
|
300
|
+
if (capturedRejection)
|
|
301
|
+
clearCapturedRejection(executionId);
|
|
302
|
+
const classified = synthesizeError({
|
|
303
|
+
sdkError: runErrorSources.sdkError,
|
|
304
|
+
sdkResultFields: runErrorSources.sdkResultFields,
|
|
305
|
+
streamErrorMessage: streamState.streamErrorMessage,
|
|
306
|
+
capturedRejection,
|
|
307
|
+
conversationErrorText,
|
|
308
|
+
isResumedHandle: engine.resolution.reason === "resumed_successfully",
|
|
309
|
+
fallbackContext: { model: engine.validatedModel, mode: engine.agentMode, agentId: engine.resolution.agentId },
|
|
310
|
+
durationMs: result.durationMs,
|
|
311
|
+
messageCount: status.messages.length,
|
|
312
|
+
proxyMode: !!config.proxyEndpoint,
|
|
313
|
+
});
|
|
314
|
+
console.error(`ExecuteCursor agent error: execution=${executionId}, ` +
|
|
315
|
+
`classified=${JSON.stringify(classified)}, rawResult=${JSON.stringify(result)}`);
|
|
316
|
+
if (shouldRetryWithFreshAgent(classified) && engine.resolution.reason === "resumed_successfully" && !alreadyRetriedWithFreshAgent) {
|
|
317
|
+
alreadyRetriedWithFreshAgent = true;
|
|
318
|
+
console.warn(`ExecuteCursor poisoned-handle recovery: execution=${executionId}, ` +
|
|
319
|
+
`disposing agent ${engine.resolution.agentId} and creating fresh agent`);
|
|
320
|
+
try {
|
|
321
|
+
engine.resolution.agent.close();
|
|
322
|
+
}
|
|
323
|
+
catch { /* best effort */ }
|
|
324
|
+
const freshAgent = await createFreshAgent(engine);
|
|
325
|
+
const freshPrompt = await prompt.buildRecoveryPrompt({
|
|
326
|
+
...engine.resolution,
|
|
327
|
+
agent: freshAgent,
|
|
328
|
+
agentId: freshAgent.agentId,
|
|
329
|
+
isNew: true,
|
|
330
|
+
resumed: false,
|
|
331
|
+
reason: "created_after_resume_failure",
|
|
332
|
+
resumeFailureDetail: `poisoned-handle recovery: ${classified.message}`,
|
|
333
|
+
});
|
|
334
|
+
console.log(`ExecuteCursor retry with fresh agent: execution=${executionId}, newAgentId=${freshAgent.agentId}`);
|
|
335
|
+
await sink.bindHarnessState(freshAgent.agentId);
|
|
336
|
+
const recovery = await runRecoveryStream(freshAgent, freshPrompt);
|
|
337
|
+
if (!recovery.proceeded)
|
|
338
|
+
return recovery.outcome;
|
|
339
|
+
const { retryRun, retryResult, retryBoundary } = recovery;
|
|
340
|
+
if (retryBoundary?.waiting) {
|
|
341
|
+
// The retry's edits/denials armed the gate — pause for review. On a
|
|
342
|
+
// retry error this supersedes the failure, exactly as on the primary
|
|
343
|
+
// path (a captured change pauses the turn before run.wait() is
|
|
344
|
+
// consulted).
|
|
345
|
+
console.log(`ExecuteCursor poisoned-handle recovery paused for review: execution=${executionId}`);
|
|
346
|
+
return awaitingApproval(retryBoundary);
|
|
347
|
+
}
|
|
348
|
+
if (retryBoundary && retryBoundary.unattributedHookBlocks.length > 0) {
|
|
349
|
+
return unattributedHookBlock(retryBoundary);
|
|
350
|
+
}
|
|
351
|
+
if (retryResult.status === "finished") {
|
|
352
|
+
console.log(`ExecuteCursor poisoned-handle recovery SUCCEEDED: execution=${executionId}`);
|
|
353
|
+
outcome = { kind: "completed" };
|
|
354
|
+
break;
|
|
355
|
+
}
|
|
356
|
+
if (retryResult.status === "cancelled") {
|
|
357
|
+
outcome = { kind: "cancelled" };
|
|
358
|
+
break;
|
|
359
|
+
}
|
|
360
|
+
const retryRejection = getCapturedRejection(executionId);
|
|
361
|
+
if (retryRejection)
|
|
362
|
+
clearCapturedRejection(executionId);
|
|
363
|
+
const retryConversationErrorText = await introspectConversation(retryRun, executionId);
|
|
364
|
+
// Same shape-aware extraction as the primary error arm — the retry
|
|
365
|
+
// previously String()-coerced result.result alone, so a structured
|
|
366
|
+
// retry failure both read "[object Object]" and ignored the
|
|
367
|
+
// error/message/reason fields the primary arm consults.
|
|
368
|
+
const retryErrorSources = extractRunErrorSources(retryResult);
|
|
369
|
+
const retryClassified = synthesizeError({
|
|
370
|
+
sdkError: retryErrorSources.sdkError,
|
|
371
|
+
sdkResultFields: retryErrorSources.sdkResultFields,
|
|
372
|
+
streamErrorMessage: streamState.streamErrorMessage,
|
|
373
|
+
capturedRejection: retryRejection,
|
|
374
|
+
conversationErrorText: retryConversationErrorText,
|
|
375
|
+
isResumedHandle: false,
|
|
376
|
+
fallbackContext: { model: engine.validatedModel, mode: engine.agentMode, agentId: freshAgent.agentId },
|
|
377
|
+
proxyMode: !!config.proxyEndpoint,
|
|
378
|
+
});
|
|
379
|
+
const message = formatClassifiedError(retryClassified);
|
|
380
|
+
console.error(`ExecuteCursor poisoned-handle recovery FAILED: execution=${executionId}, retryError=${message}`);
|
|
381
|
+
outcome = { kind: "failed", surface: "engine", message };
|
|
382
|
+
break;
|
|
383
|
+
}
|
|
384
|
+
// Transport-timeout retry: fresh agent got 0 messages (degraded h2 session).
|
|
385
|
+
// Reset proxy sessions and try once with a new connection.
|
|
386
|
+
if (classified.category === "network" && classified.retryable && engine.resolution.reason !== "resumed_successfully" && !alreadyRetriedWithFreshAgent) {
|
|
387
|
+
alreadyRetriedWithFreshAgent = true;
|
|
388
|
+
console.warn(`ExecuteCursor transport-timeout recovery: execution=${executionId}, ` +
|
|
389
|
+
`resetting proxy sessions and retrying with fresh agent`);
|
|
390
|
+
try {
|
|
391
|
+
engine.resolution.agent.close();
|
|
392
|
+
}
|
|
393
|
+
catch { /* best effort */ }
|
|
394
|
+
closeProxySessions();
|
|
395
|
+
const freshAgent = await createFreshAgent(engine);
|
|
396
|
+
await sink.bindHarnessState(freshAgent.agentId);
|
|
397
|
+
const recovery = await runRecoveryStream(freshAgent, prompt.effectivePrompt);
|
|
398
|
+
if (!recovery.proceeded)
|
|
399
|
+
return recovery.outcome;
|
|
400
|
+
const { retryResult, retryBoundary } = recovery;
|
|
401
|
+
if (retryBoundary?.waiting) {
|
|
402
|
+
// The retry's edits/denials armed the gate — pause for review (see
|
|
403
|
+
// the poisoned-handle branch above for the precedence rationale).
|
|
404
|
+
console.log(`ExecuteCursor transport-timeout recovery paused for review: execution=${executionId}`);
|
|
405
|
+
return awaitingApproval(retryBoundary);
|
|
406
|
+
}
|
|
407
|
+
if (retryBoundary && retryBoundary.unattributedHookBlocks.length > 0) {
|
|
408
|
+
return unattributedHookBlock(retryBoundary);
|
|
409
|
+
}
|
|
410
|
+
if (retryResult.status === "finished") {
|
|
411
|
+
outcome = { kind: "completed" };
|
|
412
|
+
break;
|
|
413
|
+
}
|
|
414
|
+
outcome = { kind: "failed", surface: "engine", message: `Transport recovery failed: ${formatClassifiedError(classified)}` };
|
|
415
|
+
break;
|
|
416
|
+
}
|
|
417
|
+
outcome = { kind: "failed", surface: "engine", message: formatClassifiedError(classified) };
|
|
418
|
+
break;
|
|
419
|
+
}
|
|
420
|
+
default:
|
|
421
|
+
outcome = { kind: "completed" };
|
|
422
|
+
}
|
|
423
|
+
// Collapse any redundant same-identity tool-call twin born this turn before
|
|
424
|
+
// the terminal persist. On a resume turn the gated tool is already granted, so
|
|
425
|
+
// there is no denial ledger and reconcileDeniedToolCalls never runs — the
|
|
426
|
+
// extra attempt the model emits beside the approved action (a stuck RUNNING
|
|
427
|
+
// zombie, a denied-reported-as-success COMPLETED, or an all-no-change double)
|
|
428
|
+
// would otherwise persist as a second "No preview available" card. The shared
|
|
429
|
+
// routine keeps the diff/output carrier and blanks the rest to hidden SKIPPED
|
|
430
|
+
// rows in place, preserving each committed id so the finalize stays append-only.
|
|
431
|
+
const collapsedTwins = collapseRedundantToolCallTwins(status.messages);
|
|
432
|
+
if (collapsedTwins > 0) {
|
|
433
|
+
console.log(`ExecuteCursor collapsed ${collapsedTwins} redundant tool-call twin(s) at ` +
|
|
434
|
+
`terminal finalize (kept in place as hidden SKIPPED rows): execution=${executionId}`);
|
|
435
|
+
}
|
|
436
|
+
return outcome;
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Best-effort: read the failing run's conversation to recover the real error
|
|
440
|
+
* reason the SDK swallowed in run.wait(). Logs the (bounded) raw turns for deep
|
|
441
|
+
* diagnostics and returns a concise error string for the classifier.
|
|
442
|
+
*
|
|
443
|
+
* Strictly non-fatal — any failure (unsupported operation, transport error)
|
|
444
|
+
* returns undefined and never propagates into the execution's error path.
|
|
445
|
+
*/
|
|
446
|
+
async function introspectConversation(run, executionId) {
|
|
447
|
+
try {
|
|
448
|
+
if (!run.supports("conversation")) {
|
|
449
|
+
console.log(`ExecuteCursor conversation introspection unsupported: execution=${executionId}, ` +
|
|
450
|
+
`reason=${run.unsupportedReason("conversation") ?? "n/a"}`);
|
|
451
|
+
return undefined;
|
|
452
|
+
}
|
|
453
|
+
const turns = await run.conversation();
|
|
454
|
+
const raw = JSON.stringify(turns);
|
|
455
|
+
const bounded = raw.length > 8000 ? `${raw.slice(0, 8000)}…(truncated ${raw.length} chars)` : raw;
|
|
456
|
+
console.error(`ExecuteCursor conversation introspection: execution=${executionId}, turns=${turns.length}, raw=${bounded}`);
|
|
457
|
+
return extractConversationErrorText(turns);
|
|
458
|
+
}
|
|
459
|
+
catch (introspectErr) {
|
|
460
|
+
console.warn(`ExecuteCursor conversation introspection failed (non-fatal): execution=${executionId}, ` +
|
|
461
|
+
`error=${introspectErr instanceof Error ? introspectErr.message : String(introspectErr)}`);
|
|
462
|
+
return undefined;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* Walk the last conversation turn and collect human-meaningful error text
|
|
467
|
+
* (error-status payloads and `text`/`message`/`reason` strings). Schema-agnostic
|
|
468
|
+
* by design so it tolerates SDK conversation-shape changes. Returns undefined
|
|
469
|
+
* when nothing useful is found.
|
|
470
|
+
*/
|
|
471
|
+
function extractConversationErrorText(turns) {
|
|
472
|
+
if (!turns || turns.length === 0)
|
|
473
|
+
return undefined;
|
|
474
|
+
const collected = [];
|
|
475
|
+
const visit = (node, depth) => {
|
|
476
|
+
if (node == null || depth > 6 || typeof node !== "object")
|
|
477
|
+
return;
|
|
478
|
+
if (Array.isArray(node)) {
|
|
479
|
+
for (const item of node)
|
|
480
|
+
visit(item, depth + 1);
|
|
481
|
+
return;
|
|
482
|
+
}
|
|
483
|
+
const obj = node;
|
|
484
|
+
if (obj.status === "error" && obj.error != null) {
|
|
485
|
+
collected.push(typeof obj.error === "string" ? obj.error : JSON.stringify(obj.error));
|
|
486
|
+
}
|
|
487
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
488
|
+
if ((key === "text" || key === "message" || key === "reason") && typeof value === "string" && value.trim().length > 0) {
|
|
489
|
+
collected.push(value.trim());
|
|
490
|
+
}
|
|
491
|
+
else if (typeof value === "object" && value != null) {
|
|
492
|
+
visit(value, depth + 1);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
};
|
|
496
|
+
visit(turns[turns.length - 1], 0);
|
|
497
|
+
if (collected.length === 0)
|
|
498
|
+
return undefined;
|
|
499
|
+
const joined = [...new Set(collected)].join(" | ");
|
|
500
|
+
return joined.length > 600 ? `${joined.slice(0, 600)}…` : joined;
|
|
501
|
+
}
|
|
502
|
+
/** The `streaming_usage` carrier the OTel span end reads; the runtime keeps it current on every write. */
|
|
503
|
+
export function usageSnapshotFor(sink) {
|
|
504
|
+
const summary = sink.status.streamingUsage ?? create(StreamingUsageSummarySchema, {});
|
|
505
|
+
return { inputTokens: summary.inputTokens, outputTokens: summary.outputTokens };
|
|
506
|
+
}
|
|
507
|
+
//# sourceMappingURL=turn-settle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-settle.js","sourceRoot":"","sources":["../../../src/activities/execute-cursor/turn-settle.ts"],"names":[],"mappings":"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"}
|