@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
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A Cursor sub-agent's transcript, from the `task` tool's completed result to
|
|
3
|
+
* the canonical events that fold it (`harness/transcript/events.ts`), scoped
|
|
4
|
+
* to the sub-agent's own `subAgentId`.
|
|
5
|
+
*
|
|
6
|
+
* WHY THE TRANSCRIPT ARRIVES AS A BLOB. The Cursor SDK returns sub-agent work
|
|
7
|
+
* inside the `task` tool's completed event, not as streaming events with a
|
|
8
|
+
* distinct agent id. Re-verified 2026-08-23 on the pinned SDK (1.0.13) AND the
|
|
9
|
+
* latest (1.0.28), including the write side (stigmer/stigmer#839): an injected
|
|
10
|
+
* platform.eventStore/eventNotifier receives parent events only on 1.0.13 and
|
|
11
|
+
* is bypassed entirely on 1.0.28 (persistence moved into the executor daemon's
|
|
12
|
+
* own state dir); zero events reach the parent's run.stream() mid-task; the
|
|
13
|
+
* agentId in the task args is not a platform-store agent id at all, so it can
|
|
14
|
+
* never be addressable via Agent.listRuns / Agent.getRun (this is WHY the
|
|
15
|
+
* 2026-07-02 read-side polls all returned not-found). On 1.0.28 the child
|
|
16
|
+
* transcript lands at a deterministic path knowable at spawn
|
|
17
|
+
* (~/.cursor/projects/<slug>/agent-transcripts/<parentId>/subagents/<argsAgentId>.jsonl)
|
|
18
|
+
* but is flushed only at completion — verified with 200ms sampling across a
|
|
19
|
+
* full sub-agent run. Live nested visibility is therefore still an upstream
|
|
20
|
+
* SDK limitation — do not try to fake it here; the UI shows an elapsed-time
|
|
21
|
+
* affordance instead (SubAgentSection). This is Cursor's timing — the
|
|
22
|
+
* sub-agent's rows exist only at completion — and it stays Cursor's.
|
|
23
|
+
*
|
|
24
|
+
* THE SHAPE. The result is `{ status: "success", value: { conversationSteps } }`
|
|
25
|
+
* (or a bare `{ conversationSteps }`), where each ConversationStep is a
|
|
26
|
+
* protobuf-oneof object keyed DIRECTLY by its kind — there is NO
|
|
27
|
+
* `{ type, message }` envelope in production blobs, though the legacy `type`
|
|
28
|
+
* form is still read:
|
|
29
|
+
* - { thinkingMessage: { text, thinkingDurationMs? } }
|
|
30
|
+
* - { assistantMessage: { text } }
|
|
31
|
+
* - { toolCall: { toolCallId, <kind>ToolCall: { args, result } } }
|
|
32
|
+
* The tool family is the lone `<kind>ToolCall` sibling of `toolCallId`
|
|
33
|
+
* (`readToolCall`, `globToolCall`, `grepToolCall`, `shellToolCall`, …); the bare
|
|
34
|
+
* tool name is the suffix-stripped key, which feeds the shared `classifyTool`
|
|
35
|
+
* exactly like a top-level call. `result` is itself a oneof
|
|
36
|
+
* `{ success | error | permissionDenied | rejected }`. This is deliberately
|
|
37
|
+
* key-driven rather than an enumerated switch, so a new tool family the SDK
|
|
38
|
+
* adds surfaces automatically instead of being dropped. History: an earlier
|
|
39
|
+
* revision parsed a `{ type: "toolCall", message: { type, args, result } }`
|
|
40
|
+
* envelope that never appears in the real blob, so every sub-agent tool call
|
|
41
|
+
* was silently discarded and the UI showed a sub-agent that "did nothing".
|
|
42
|
+
*
|
|
43
|
+
* WHAT THIS MODULE EMITS, AND WHY EVENTS. Until #1097 this parser built
|
|
44
|
+
* `AgentMessage` protos itself (the conversation-steps extractor in the accumulator)
|
|
45
|
+
* — a third copy of the folding rule, whose message boundary drifted from the
|
|
46
|
+
* root's until then. Now each step becomes the events any harness's translator
|
|
47
|
+
* would emit for the same thing, and the shared `TranscriptBuilder` folds them
|
|
48
|
+
* with the root's own rules: an `assistantMessage` step is its own message
|
|
49
|
+
* (`runId` `<subAgentId>:step:<i>`, so two consecutive steps never merge); a
|
|
50
|
+
* `thinkingMessage` step a THINKING row under the same key; a `toolCall` step
|
|
51
|
+
* a `tool_started` then a `tool_finished`/`tool_error`, which the builder
|
|
52
|
+
* attaches to the transcript's current AI message (the assistant step that
|
|
53
|
+
* proposed it) or an empty one when there is none. Unknown step
|
|
54
|
+
* kinds and empty texts are skipped for forward compatibility. The rows carry
|
|
55
|
+
* no attribution or provenance (#1133).
|
|
56
|
+
*
|
|
57
|
+
* The `task` row's own `tool_finished` and the sub-agent's `sub_agent_finished`
|
|
58
|
+
* are the translator's (`translator.ts`); this module answers only "what
|
|
59
|
+
* happened inside".
|
|
60
|
+
*/
|
|
61
|
+
import { canonicalizeImageResult } from "./tool-result.js";
|
|
62
|
+
/**
|
|
63
|
+
* The failure branches of a sub-agent tool call's `result` oneof. A completion
|
|
64
|
+
* is `{ success: ... }`; every other branch is a non-completion the UI must show
|
|
65
|
+
* as failed — an errored read/glob/grep (`error`), or a shell the approval gate
|
|
66
|
+
* stopped (`permissionDenied` / `rejected`).
|
|
67
|
+
*/
|
|
68
|
+
const SUBAGENT_TOOL_RESULT_FAILURE_KEYS = new Set([
|
|
69
|
+
"error",
|
|
70
|
+
"permissionDenied",
|
|
71
|
+
"rejected",
|
|
72
|
+
]);
|
|
73
|
+
/** The canonical events for one sub-agent's completed `conversationSteps`, all scoped to `subAgentId`. */
|
|
74
|
+
export function subAgentStepEvents(result, subAgentId) {
|
|
75
|
+
const steps = conversationStepsOf(result);
|
|
76
|
+
const out = [];
|
|
77
|
+
for (const [index, step] of steps.entries()) {
|
|
78
|
+
if (step == null || typeof step !== "object")
|
|
79
|
+
continue;
|
|
80
|
+
const s = step;
|
|
81
|
+
const type = s.type;
|
|
82
|
+
const runId = `${subAgentId}:step:${index}`;
|
|
83
|
+
if (type === "thinkingMessage" || s.thinkingMessage != null) {
|
|
84
|
+
const text = stepText(type === "thinkingMessage" ? s.message : s.thinkingMessage);
|
|
85
|
+
if (text) {
|
|
86
|
+
out.push({ kind: "message_start", runId, subAgentId });
|
|
87
|
+
out.push({ kind: "reasoning_delta", runId, text, subAgentId });
|
|
88
|
+
out.push({ kind: "message_finish", runId, subAgentId });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else if (type === "assistantMessage" || s.assistantMessage != null) {
|
|
92
|
+
const text = stepText(type === "assistantMessage" ? s.message : s.assistantMessage);
|
|
93
|
+
if (text) {
|
|
94
|
+
out.push({ kind: "message_start", runId, subAgentId });
|
|
95
|
+
out.push({ kind: "text_delta", runId, text, subAgentId });
|
|
96
|
+
out.push({ kind: "message_finish", runId, subAgentId });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else if (s.toolCall != null) {
|
|
100
|
+
out.push(...subAgentToolCallEvents(s.toolCall, index, subAgentId));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return out;
|
|
104
|
+
}
|
|
105
|
+
/** The `conversationSteps` array from the task result's envelope, or none. */
|
|
106
|
+
function conversationStepsOf(result) {
|
|
107
|
+
if (result == null || typeof result !== "object")
|
|
108
|
+
return [];
|
|
109
|
+
const r = result;
|
|
110
|
+
const value = r.value ?? r;
|
|
111
|
+
if (value == null || typeof value !== "object")
|
|
112
|
+
return [];
|
|
113
|
+
const steps = value.conversationSteps;
|
|
114
|
+
return Array.isArray(steps) ? steps : [];
|
|
115
|
+
}
|
|
116
|
+
function stepText(message) {
|
|
117
|
+
if (message == null || typeof message !== "object")
|
|
118
|
+
return "";
|
|
119
|
+
const text = message.text;
|
|
120
|
+
return typeof text === "string" ? text : "";
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* One `toolCall` step as a started row and its outcome. The SDK's real call id
|
|
124
|
+
* keeps the row stable across resumes and distinct from its siblings; a
|
|
125
|
+
* synthetic `sub-<name>-<stepIndex>` stands in only when the SDK omits one.
|
|
126
|
+
* A step with no `<kind>ToolCall` key (malformed or forward-incompatible) emits
|
|
127
|
+
* nothing rather than a blank, nameless row.
|
|
128
|
+
*/
|
|
129
|
+
function subAgentToolCallEvents(toolCall, stepIndex, subAgentId) {
|
|
130
|
+
if (toolCall == null || typeof toolCall !== "object")
|
|
131
|
+
return [];
|
|
132
|
+
const obj = toolCall;
|
|
133
|
+
const kindKey = Object.keys(obj).find((k) => k !== "toolCallId" && k.endsWith("ToolCall"));
|
|
134
|
+
if (!kindKey)
|
|
135
|
+
return [];
|
|
136
|
+
const name = kindKey.slice(0, -"ToolCall".length);
|
|
137
|
+
const inner = obj[kindKey] != null && typeof obj[kindKey] === "object"
|
|
138
|
+
? obj[kindKey]
|
|
139
|
+
: {};
|
|
140
|
+
const callId = typeof obj.toolCallId === "string" && obj.toolCallId
|
|
141
|
+
? obj.toolCallId
|
|
142
|
+
: `sub-${name}-${stepIndex}`;
|
|
143
|
+
const input = inner.args != null && typeof inner.args === "object"
|
|
144
|
+
? inner.args
|
|
145
|
+
: {};
|
|
146
|
+
const outcome = interpretSubAgentToolResult(inner.result);
|
|
147
|
+
return [
|
|
148
|
+
{ kind: "tool_started", callId, name, input, mcpServerSlug: "", subAgentId },
|
|
149
|
+
outcome.status === "completed"
|
|
150
|
+
? { kind: "tool_finished", callId, result: outcome.result, subAgentId }
|
|
151
|
+
: { kind: "tool_error", callId, message: outcome.error, subAgentId },
|
|
152
|
+
];
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* A sub-agent tool call's `result` oneof as an outcome: `success` → completed
|
|
156
|
+
* with the serialized payload (a screenshot is canonicalized the same way as a
|
|
157
|
+
* top-level result); any failure branch → failed with the serialized detail
|
|
158
|
+
* (`error` alone — never a duplicate in `result`). An absent result is
|
|
159
|
+
* a completed call with no output — the SDK omits `result` for a call that
|
|
160
|
+
* reports nothing; an unknown oneof branch is surfaced as a completed result
|
|
161
|
+
* rather than dropped.
|
|
162
|
+
*/
|
|
163
|
+
export function interpretSubAgentToolResult(result) {
|
|
164
|
+
if (result == null || typeof result !== "object") {
|
|
165
|
+
return { status: "completed", result: "" };
|
|
166
|
+
}
|
|
167
|
+
const r = result;
|
|
168
|
+
if ("success" in r) {
|
|
169
|
+
const val = r.success;
|
|
170
|
+
const str = canonicalizeImageResult(val) ?? (typeof val === "string" ? val : JSON.stringify(val));
|
|
171
|
+
return { status: "completed", result: str };
|
|
172
|
+
}
|
|
173
|
+
const failKey = Object.keys(r).find((k) => SUBAGENT_TOOL_RESULT_FAILURE_KEYS.has(k));
|
|
174
|
+
if (failKey) {
|
|
175
|
+
const val = r[failKey];
|
|
176
|
+
return { status: "failed", error: typeof val === "string" ? val : JSON.stringify(val) };
|
|
177
|
+
}
|
|
178
|
+
return { status: "completed", result: JSON.stringify(r) };
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=sub-agent-steps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sub-agent-steps.js","sourceRoot":"","sources":["../../../src/activities/execute-cursor/sub-agent-steps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Cursor harness's rendering of a tool result into the one string a
|
|
3
|
+
* transcript row carries — the translator's half of `tool_finished.result`
|
|
4
|
+
* (`harness/transcript/events.ts`): the engine's output envelope is the
|
|
5
|
+
* harness's to unwrap, the builder stores what it is handed, and the persist
|
|
6
|
+
* chokepoint bounds it. Native's twin is
|
|
7
|
+
* `extractToolResult` in `execute-deep-agent/translator.ts` (the LangChain
|
|
8
|
+
* ToolMessage envelope and the LangGraph Command).
|
|
9
|
+
*
|
|
10
|
+
* Its own module because two readers need it — the translator for a root
|
|
11
|
+
* row's result, `sub-agent-steps.ts` for a sub-agent's — and the second would
|
|
12
|
+
* otherwise import the first, which imports the second. Moved from
|
|
13
|
+
* `message-translator.ts` verbatim.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Normalize a tool_call event result into a string for the ToolCall proto.
|
|
17
|
+
* Returns "" for an absent result so callers can treat "no result yet" and
|
|
18
|
+
* "empty result" uniformly (e.g. to avoid clobbering a captured result).
|
|
19
|
+
*
|
|
20
|
+
* The one non-passthrough case is a multimodal MCP result (e.g. a computer-use
|
|
21
|
+
* screenshot): see {@link canonicalizeImageResult}. Everything else is the
|
|
22
|
+
* string as-is, or a whole-value JSON.stringify — byte-identical to before.
|
|
23
|
+
*/
|
|
24
|
+
export declare function toResultString(result: unknown): string;
|
|
25
|
+
/**
|
|
26
|
+
* Re-emit a Cursor MCP result that carries an image block as the canonical
|
|
27
|
+
* top-level content-block array the persist-time offload understands.
|
|
28
|
+
*
|
|
29
|
+
* The Cursor SDK wraps an MCP tool result as `{ status, value: { content: [...] } }`
|
|
30
|
+
* (or a bare `{ content: [...] }`), where an image block is
|
|
31
|
+
* `{ image: { data, mimeType } }` and `data` is a Node Buffer-JSON
|
|
32
|
+
* (`{ type:"Buffer", data:number[] }`). Persisting that envelope verbatim buries
|
|
33
|
+
* the image where `detectImagePayload`/`contentBlocks` (shared/status-offload.ts)
|
|
34
|
+
* cannot see it, so the screenshot lands as `text/plain` instead of a renderable
|
|
35
|
+
* `ToolCallOutputRef`.
|
|
36
|
+
*
|
|
37
|
+
* This mirrors `serializeToolContent` in the deep-agent path
|
|
38
|
+
* (harness/transcript/tool-result.ts): the harness adapter normalizes
|
|
39
|
+
* its own wire shape into the canonical array
|
|
40
|
+
* `[{ type:"text", text }, { type:"image", data:<base64>, mimeType }]`
|
|
41
|
+
* so the shared offload stays harness-agnostic (its envelope handling is
|
|
42
|
+
* documented there as insurance, not the primary path). Buffer-JSON is decoded
|
|
43
|
+
* to base64 here so the bloated byte-array never propagates into the status.
|
|
44
|
+
*
|
|
45
|
+
* Returns undefined when there is no content array or no image block, so the
|
|
46
|
+
* caller falls back to its existing serialization (no change for text/error
|
|
47
|
+
* results).
|
|
48
|
+
*/
|
|
49
|
+
export declare function canonicalizeImageResult(result: unknown): string | undefined;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Cursor harness's rendering of a tool result into the one string a
|
|
3
|
+
* transcript row carries — the translator's half of `tool_finished.result`
|
|
4
|
+
* (`harness/transcript/events.ts`): the engine's output envelope is the
|
|
5
|
+
* harness's to unwrap, the builder stores what it is handed, and the persist
|
|
6
|
+
* chokepoint bounds it. Native's twin is
|
|
7
|
+
* `extractToolResult` in `execute-deep-agent/translator.ts` (the LangChain
|
|
8
|
+
* ToolMessage envelope and the LangGraph Command).
|
|
9
|
+
*
|
|
10
|
+
* Its own module because two readers need it — the translator for a root
|
|
11
|
+
* row's result, `sub-agent-steps.ts` for a sub-agent's — and the second would
|
|
12
|
+
* otherwise import the first, which imports the second. Moved from
|
|
13
|
+
* `message-translator.ts` verbatim.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Normalize a tool_call event result into a string for the ToolCall proto.
|
|
17
|
+
* Returns "" for an absent result so callers can treat "no result yet" and
|
|
18
|
+
* "empty result" uniformly (e.g. to avoid clobbering a captured result).
|
|
19
|
+
*
|
|
20
|
+
* The one non-passthrough case is a multimodal MCP result (e.g. a computer-use
|
|
21
|
+
* screenshot): see {@link canonicalizeImageResult}. Everything else is the
|
|
22
|
+
* string as-is, or a whole-value JSON.stringify — byte-identical to before.
|
|
23
|
+
*/
|
|
24
|
+
export function toResultString(result) {
|
|
25
|
+
if (result == null)
|
|
26
|
+
return "";
|
|
27
|
+
if (typeof result === "string")
|
|
28
|
+
return result;
|
|
29
|
+
const canonical = canonicalizeImageResult(result);
|
|
30
|
+
if (canonical !== undefined)
|
|
31
|
+
return canonical;
|
|
32
|
+
return JSON.stringify(result);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Re-emit a Cursor MCP result that carries an image block as the canonical
|
|
36
|
+
* top-level content-block array the persist-time offload understands.
|
|
37
|
+
*
|
|
38
|
+
* The Cursor SDK wraps an MCP tool result as `{ status, value: { content: [...] } }`
|
|
39
|
+
* (or a bare `{ content: [...] }`), where an image block is
|
|
40
|
+
* `{ image: { data, mimeType } }` and `data` is a Node Buffer-JSON
|
|
41
|
+
* (`{ type:"Buffer", data:number[] }`). Persisting that envelope verbatim buries
|
|
42
|
+
* the image where `detectImagePayload`/`contentBlocks` (shared/status-offload.ts)
|
|
43
|
+
* cannot see it, so the screenshot lands as `text/plain` instead of a renderable
|
|
44
|
+
* `ToolCallOutputRef`.
|
|
45
|
+
*
|
|
46
|
+
* This mirrors `serializeToolContent` in the deep-agent path
|
|
47
|
+
* (harness/transcript/tool-result.ts): the harness adapter normalizes
|
|
48
|
+
* its own wire shape into the canonical array
|
|
49
|
+
* `[{ type:"text", text }, { type:"image", data:<base64>, mimeType }]`
|
|
50
|
+
* so the shared offload stays harness-agnostic (its envelope handling is
|
|
51
|
+
* documented there as insurance, not the primary path). Buffer-JSON is decoded
|
|
52
|
+
* to base64 here so the bloated byte-array never propagates into the status.
|
|
53
|
+
*
|
|
54
|
+
* Returns undefined when there is no content array or no image block, so the
|
|
55
|
+
* caller falls back to its existing serialization (no change for text/error
|
|
56
|
+
* results).
|
|
57
|
+
*/
|
|
58
|
+
export function canonicalizeImageResult(result) {
|
|
59
|
+
if (result == null || typeof result !== "object")
|
|
60
|
+
return undefined;
|
|
61
|
+
const blocks = resultContentBlocks(result);
|
|
62
|
+
if (!blocks)
|
|
63
|
+
return undefined;
|
|
64
|
+
const canonical = [];
|
|
65
|
+
let sawImage = false;
|
|
66
|
+
for (const block of blocks) {
|
|
67
|
+
if (!block || typeof block !== "object")
|
|
68
|
+
continue;
|
|
69
|
+
const b = block;
|
|
70
|
+
if (b.image && typeof b.image === "object") {
|
|
71
|
+
const img = b.image;
|
|
72
|
+
const base64 = imageDataToBase64(img.data);
|
|
73
|
+
if (base64) {
|
|
74
|
+
const mimeType = typeof img.mimeType === "string" ? img.mimeType : "image/png";
|
|
75
|
+
canonical.push({ type: "image", data: base64, mimeType });
|
|
76
|
+
sawImage = true;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const text = blockText(b);
|
|
81
|
+
if (text !== undefined)
|
|
82
|
+
canonical.push({ type: "text", text });
|
|
83
|
+
}
|
|
84
|
+
return sawImage ? JSON.stringify(canonical) : undefined;
|
|
85
|
+
}
|
|
86
|
+
/** Extract the content-block array from a Cursor result envelope or a bare one. */
|
|
87
|
+
function resultContentBlocks(obj) {
|
|
88
|
+
const value = obj.value;
|
|
89
|
+
if (value && typeof value === "object" && Array.isArray(value.content)) {
|
|
90
|
+
return value.content;
|
|
91
|
+
}
|
|
92
|
+
if (Array.isArray(obj.content))
|
|
93
|
+
return obj.content;
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Decode an image block's `data` to plain base64. Accepts a Node Buffer-JSON
|
|
98
|
+
* (`{ type:"Buffer", data:number[] }`, how the Cursor SDK serializes bytes), a
|
|
99
|
+
* `data:` URL, or an already-base64 string. Returns undefined for anything else.
|
|
100
|
+
*/
|
|
101
|
+
function imageDataToBase64(data) {
|
|
102
|
+
if (data && typeof data === "object") {
|
|
103
|
+
const d = data;
|
|
104
|
+
if (d.type === "Buffer" && Array.isArray(d.data)) {
|
|
105
|
+
try {
|
|
106
|
+
return Buffer.from(d.data).toString("base64");
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
if (typeof data === "string" && data) {
|
|
115
|
+
const dataUrl = data.match(/^data:image\/[a-zA-Z0-9.+-]+;base64,([\s\S]+)$/);
|
|
116
|
+
return (dataUrl ? dataUrl[1] : data).replace(/\s+/g, "");
|
|
117
|
+
}
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
/** Extract the text from a Cursor content block: `{ text:{text} }` or `{ text }`. */
|
|
121
|
+
function blockText(b) {
|
|
122
|
+
const t = b.text;
|
|
123
|
+
if (typeof t === "string")
|
|
124
|
+
return t;
|
|
125
|
+
if (t && typeof t === "object" && typeof t.text === "string") {
|
|
126
|
+
return t.text;
|
|
127
|
+
}
|
|
128
|
+
return undefined;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=tool-result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-result.js","sourceRoot":"","sources":["../../../src/activities/execute-cursor/tool-result.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CursorTranslator — the Cursor harness's translator: the `@cursor/sdk`'s two
|
|
3
|
+
* event channels in, the canonical `TranscriptEvent` union out
|
|
4
|
+
* (`harness/transcript/events.ts`).
|
|
5
|
+
*
|
|
6
|
+
* The one module that knows the SDK's wire shape:
|
|
7
|
+
* the shared `TranscriptBuilder` folds what comes out of here and nothing of
|
|
8
|
+
* the engine reaches it otherwise. Until #1097 the Cursor harness folded its
|
|
9
|
+
* own transcript — the message accumulator (the second copy of the folding
|
|
10
|
+
* rule the memo counted), the delta enricher (row writes from the delta
|
|
11
|
+
* channel) and the todo tracker (a third writer of `status.todos`) — and
|
|
12
|
+
* every rule they held
|
|
13
|
+
* is either the builder's now or answered here. The same word, the same
|
|
14
|
+
* `translate(raw)` signature and the same seat in its adapter as
|
|
15
|
+
* `execute-deep-agent/translator.ts`, so a third harness's author finds one
|
|
16
|
+
* shape in both.
|
|
17
|
+
*
|
|
18
|
+
* TWO CHANNELS, ONE DISCIPLINE. The SDK streams `SDKMessage`s from
|
|
19
|
+
* `run.stream()` (the source of truth for messages and rows) and fires
|
|
20
|
+
* `InteractionUpdate`s through `onDelta` between them (tool-call timings, live
|
|
21
|
+
* shell output, a completion's status — facts the stream delivers later or
|
|
22
|
+
* never). A delta lands while the loop may be awaiting a persist, and a row
|
|
23
|
+
* write mid-persist would land on a row the offload is replacing, so this
|
|
24
|
+
* translator never hands a delta's events to anyone
|
|
25
|
+
* directly: {@link observeDelta} QUEUES them and the loop applies
|
|
26
|
+
* {@link drainDeltas} after each stream event, and once more before
|
|
27
|
+
* `finalize()`. A delta for a call the stream has not announced yet (the
|
|
28
|
+
* output that beats the `running` event) is HELD and replayed right after the
|
|
29
|
+
* `tool_started` that announces it. Because the fold is later than
|
|
30
|
+
* the observation, a completion learned from a delta carries `observedAt` —
|
|
31
|
+
* the instant the tool actually finished — and the builder stamps that, not
|
|
32
|
+
* the fold's moment. Rows are CREATED by the stream alone: the
|
|
33
|
+
* delta channel amends (output, completion), never announces.
|
|
34
|
+
*
|
|
35
|
+
* WHAT THIS TRANSLATOR ANSWERS, per event:
|
|
36
|
+
*
|
|
37
|
+
* - The MESSAGE BOUNDARY. Cursor has one `run_id` per `send()`,
|
|
38
|
+
* and its message boundary is a tool call: text after a tool call is a new
|
|
39
|
+
* message. So `runId` here is a minted SEGMENT id, `<run_id>:<n>`, advanced
|
|
40
|
+
* on the first text or thinking after a tool call; a tool call emits
|
|
41
|
+
* `message_finish` for the open segment (closing its text and thinking).
|
|
42
|
+
* - The row's IDENTITY. An MCP call arrives as `name: "mcp"` with the real
|
|
43
|
+
* tool packed in `args` (`{ providerIdentifier, toolName, args }`); the row
|
|
44
|
+
* is the inner tool. A resumed agent re-runs an approved tool under a
|
|
45
|
+
* BRAND-NEW call id; the seeded WAITING row it belongs to is found by the
|
|
46
|
+
* identity token the hook and the grants already share, the
|
|
47
|
+
* `tool_started` is emitted with the SEEDED id so the builder's by-id flip
|
|
48
|
+
* does the rest, and every later event for the new id is aliased onto it.
|
|
49
|
+
* The seeded rows that can match exist only in the seed (nothing created
|
|
50
|
+
* mid-stream is WAITING until the boundary runs), so they are indexed once
|
|
51
|
+
* at construction and consumed on match (a declined row is a
|
|
52
|
+
* closed gate and never matched).
|
|
53
|
+
* - The GATE and the PROVENANCE. `gate` is the POLICY's word —
|
|
54
|
+
* this MCP tool's merged policy, or this built-in's category, requires
|
|
55
|
+
* approval — resolved exactly as the accumulator did, lease- and
|
|
56
|
+
* bypass-blind; it is NOT the hook's verdict (the hook has arms this side
|
|
57
|
+
* cannot evaluate: capture mode, grants, bypass, secret blocks — the
|
|
58
|
+
* lesson behind dropping a parked-at-creation arm that had no producer).
|
|
59
|
+
* A gated call that STARTED runs until the boundary parks
|
|
60
|
+
* it through `approval_proposed`. Provenance is the shared read-side
|
|
61
|
+
* `resolveApprovalProvenance` over the same policies and the run's leases.
|
|
62
|
+
* - The RESULT string (`tool-result.ts`): a failure's text is its `error`
|
|
63
|
+
* alone.
|
|
64
|
+
* - The SUB-AGENT: a `task` tool call opens a sub-agent keyed by
|
|
65
|
+
* the call id (`sub_agent_started` before the row's own `tool_started`);
|
|
66
|
+
* its completion emits the row's `tool_finished`, the child's transcript
|
|
67
|
+
* as scoped events (`sub-agent-steps.ts` — Cursor delivers it whole, at
|
|
68
|
+
* completion), then `sub_agent_finished` with the same output string; an
|
|
69
|
+
* error, `tool_error` then `sub_agent_failed`.
|
|
70
|
+
* - The `task` SDK event → `system_note`; a todo write is an
|
|
71
|
+
* ordinary tool call the builder keys on `ToolKind.TODO` and projects;
|
|
72
|
+
* `system`, `status`, `user`, `request` and `usage` carry no
|
|
73
|
+
* transcript fact (usage is the loop's, priced from the `turn-ended`
|
|
74
|
+
* delta in `turn-stream.ts` — the same division as native's `usageOf`).
|
|
75
|
+
*
|
|
76
|
+
* Stateful, one per turn, shared by the primary stream and the recovery
|
|
77
|
+
* retries exactly as the accumulator was (the segment map is keyed by
|
|
78
|
+
* `run_id`, and a retry's send has its own).
|
|
79
|
+
*/
|
|
80
|
+
import type { InteractionUpdate, SDKMessage } from "@cursor/sdk";
|
|
81
|
+
import type { AgentMessage } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
82
|
+
import type { TranscriptEvent } from "../../harness/transcript/events.js";
|
|
83
|
+
import { type MergedToolPolicy } from "../../shared/approval-policy.js";
|
|
84
|
+
import type { ToolApprovalCategory } from "../../shared/tool-kind.js";
|
|
85
|
+
type ToolCallEvent = Extract<SDKMessage, {
|
|
86
|
+
type: "tool_call";
|
|
87
|
+
}>;
|
|
88
|
+
/** The run's approval posture the translator answers `gate` and `provenance` from. */
|
|
89
|
+
export interface CursorTranslatorOptions {
|
|
90
|
+
/** The merged four-level MCP policy map (`mergeApprovalPolicies`). */
|
|
91
|
+
readonly policies: ReadonlyMap<string, MergedToolPolicy>;
|
|
92
|
+
/** The run-lifetime leases: the pre-armed global bypass and the built-in categories approved for the run. */
|
|
93
|
+
readonly leases: {
|
|
94
|
+
readonly global: boolean;
|
|
95
|
+
readonly categories: ReadonlySet<ToolApprovalCategory>;
|
|
96
|
+
};
|
|
97
|
+
/** The transcript as seeded at turn start (`status.messages`): the WAITING rows a resumed agent's re-issued call may belong to. */
|
|
98
|
+
readonly seeded: readonly AgentMessage[];
|
|
99
|
+
}
|
|
100
|
+
export declare class CursorTranslator {
|
|
101
|
+
private readonly options;
|
|
102
|
+
private readonly segments;
|
|
103
|
+
/** Row ids the stream has announced (a `tool_started` was emitted for them). */
|
|
104
|
+
private readonly announced;
|
|
105
|
+
/** A resumed agent's fresh call id → the seeded row it re-runs. */
|
|
106
|
+
private readonly aliases;
|
|
107
|
+
/** Identity token → the seeded WAITING rows with it, in transcript order; consumed on match. */
|
|
108
|
+
private readonly resumable;
|
|
109
|
+
/** The `task` rows whose completion closes a sub-agent. */
|
|
110
|
+
private readonly taskCalls;
|
|
111
|
+
/** Delta-derived events for announced rows, awaiting the loop's drain. */
|
|
112
|
+
private queue;
|
|
113
|
+
/**
|
|
114
|
+
* Delta-derived events for calls the stream has not announced yet, keyed by
|
|
115
|
+
* the delta's own call id and kept as makers: the row they belong to is
|
|
116
|
+
* known only when the stream announces the call (a resumed agent's re-run
|
|
117
|
+
* is aliased onto a seeded row then), so each is materialized at replay.
|
|
118
|
+
*/
|
|
119
|
+
private readonly held;
|
|
120
|
+
/** The most recent shell call the delta channel started — the home of an output delta that names no call. */
|
|
121
|
+
private lastShellCallId;
|
|
122
|
+
constructor(options: CursorTranslatorOptions);
|
|
123
|
+
/** One stream event to its canonical events — `translate(raw)` is the one signature every harness's translator shares. */
|
|
124
|
+
translate(event: SDKMessage): TranscriptEvent[];
|
|
125
|
+
/**
|
|
126
|
+
* One delta, queued — never applied here (see the header). The loop drains
|
|
127
|
+
* the queue after the stream event it is processing.
|
|
128
|
+
*/
|
|
129
|
+
observeDelta(update: InteractionUpdate): void;
|
|
130
|
+
/** The delta-derived events ready to apply, in arrival order; empties the queue. */
|
|
131
|
+
drainDeltas(): TranscriptEvent[];
|
|
132
|
+
/** The segment id text or thinking streams into now, and the `message_start` that opens it if none is open. */
|
|
133
|
+
private openSegment;
|
|
134
|
+
/** A tool call ends the open segment: its text and thinking are finished, and the next text starts a new message. */
|
|
135
|
+
private closeSegment;
|
|
136
|
+
private segmentOf;
|
|
137
|
+
private translateToolCall;
|
|
138
|
+
/**
|
|
139
|
+
* The row a call's events fold into: the id the stream gave it, unless the
|
|
140
|
+
* call is a resumed agent's re-run of a seeded WAITING row (the same
|
|
141
|
+
* identity token), in which case the seeded id — aliased for every
|
|
142
|
+
* later event of this call.
|
|
143
|
+
*/
|
|
144
|
+
private resolveRowId;
|
|
145
|
+
private toolStarted;
|
|
146
|
+
/**
|
|
147
|
+
* The policy's word that this call requires approval, and the card's
|
|
148
|
+
* message — or nothing for an ungated call. An MCP call (the `mcp` envelope,
|
|
149
|
+
* whatever its provider field says) is governed by the merged policy map
|
|
150
|
+
* alone; a built-in by its category.
|
|
151
|
+
*/
|
|
152
|
+
private gateOf;
|
|
153
|
+
private rowIdOf;
|
|
154
|
+
private enqueue;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Details extracted from an MCP tool call event's args.
|
|
158
|
+
*
|
|
159
|
+
* When Cursor invokes an MCP tool, the SDK stream reports event.name as
|
|
160
|
+
* "mcp" and packs the real tool identity into event.args:
|
|
161
|
+
* { providerIdentifier: "planton", toolName: "search_services", args: {...} }
|
|
162
|
+
*/
|
|
163
|
+
export interface McpToolDetails {
|
|
164
|
+
providerIdentifier: string;
|
|
165
|
+
toolName: string;
|
|
166
|
+
innerArgs: Record<string, unknown>;
|
|
167
|
+
}
|
|
168
|
+
/** The MCP tool a `tool_call` event names, or undefined for a built-in. */
|
|
169
|
+
export declare function extractMcpToolDetails(event: ToolCallEvent): McpToolDetails | undefined;
|
|
170
|
+
/**
|
|
171
|
+
* The sub-agent's name from the task tool's args, in both the legacy string
|
|
172
|
+
* form (`"generalPurpose"`) and the SDK's object form
|
|
173
|
+
* (`{ kind: "generalPurpose", name?: "..." }`); `description` (always set by
|
|
174
|
+
* the SDK) before the generic `"task"`. The `kind` value `"unspecified"` is
|
|
175
|
+
* treated as absent — the SDK's default when the blueprint names no type.
|
|
176
|
+
*/
|
|
177
|
+
export declare function extractSubagentName(args: unknown): string;
|
|
178
|
+
export {};
|