@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
|
@@ -28,9 +28,14 @@ export interface SynthesizedAttachmentOptions {
|
|
|
28
28
|
*/
|
|
29
29
|
bridgeEndpoint: string | null;
|
|
30
30
|
/**
|
|
31
|
-
* The
|
|
32
|
-
*
|
|
33
|
-
* token
|
|
31
|
+
* The credential of the RUN this attachment serves — the run's own
|
|
32
|
+
* credential the server minted at dispatch (the OSS shape), or the
|
|
33
|
+
* session-scoped sandbox token a cloud runner holds. Both connection
|
|
34
|
+
* shapes present it: as the Bearer on the bridge's per-request path,
|
|
35
|
+
* and as the stdio child's startup credential (`stdioCredentialEnv`),
|
|
36
|
+
* so what the child writes on the person's behalf is stamped as that
|
|
37
|
+
* person and not refused as nobody's on a server that signs people in.
|
|
38
|
+
* Null presents nothing (a run whose dispatch carried no credential).
|
|
34
39
|
*/
|
|
35
40
|
credential: string | null;
|
|
36
41
|
/**
|
|
@@ -40,6 +45,36 @@ export interface SynthesizedAttachmentOptions {
|
|
|
40
45
|
backendEndpoint: string;
|
|
41
46
|
}
|
|
42
47
|
|
|
48
|
+
/**
|
|
49
|
+
* The mcp-server's startup-credential variable — the ONE name the stdio
|
|
50
|
+
* child reads its bearer from (mcp-server/src/config.ts `STIGMER_API_KEY`;
|
|
51
|
+
* the value is any bearer the server honours, an `stk_` key for an IDE
|
|
52
|
+
* client, the run's credential here). Cross-repo string, pinned on both
|
|
53
|
+
* sides (the TOOL_CALL_LIMIT precedent).
|
|
54
|
+
*/
|
|
55
|
+
export const STDIO_CREDENTIAL_ENV = "STIGMER_API_KEY";
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* The stdio child's startup-credential entry: `{ STIGMER_API_KEY }` when the
|
|
59
|
+
* attachment holds a credential, nothing when it holds none — so a
|
|
60
|
+
* credential-less run's child environment is byte-for-byte today's, and
|
|
61
|
+
* the two stdio shapes cannot disagree on the carrier.
|
|
62
|
+
*
|
|
63
|
+
* The exposure, stated once: the credential sits in a first-party child's
|
|
64
|
+
* process environment on the runner host, readable by the same OS user.
|
|
65
|
+
* That is the runner's own trust boundary (the runner process holds the
|
|
66
|
+
* same credential), and the child is `stigmer mcp-server`, never a
|
|
67
|
+
* third-party server — those receive only their declared env (oss#256,
|
|
68
|
+
* mcp-manager.ts). The alternative was the operator's API key.
|
|
69
|
+
*/
|
|
70
|
+
export function stdioCredentialEnv(
|
|
71
|
+
credential: string | null,
|
|
72
|
+
): Record<string, string> {
|
|
73
|
+
return credential !== null && credential !== ""
|
|
74
|
+
? { [STDIO_CREDENTIAL_ENV]: credential }
|
|
75
|
+
: {};
|
|
76
|
+
}
|
|
77
|
+
|
|
43
78
|
/**
|
|
44
79
|
* Inject a synthesized attachment into a resolved server list — AFTER
|
|
45
80
|
* resolve + backfill (see the module header). A user server shadowing
|
package/src/shared/todos.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Todo-list projection
|
|
2
|
+
* Todo-list projection the one transcript builder applies for every harness.
|
|
3
3
|
*
|
|
4
4
|
* All harnesses expose an agent to-do tool — the Cursor SDK emits `TodoWrite`
|
|
5
5
|
* (legacy) / `updateTodos` (current), the native deepagents harness emits
|
|
6
6
|
* `write_todos` — and each writes the SAME `AgentExecutionStatus.todos` proto
|
|
7
7
|
* map that the clients (React `TodoCard`, CLI) render. This module is the single
|
|
8
|
-
* place that maps a raw tool payload into that map, so the
|
|
9
|
-
*
|
|
8
|
+
* place that maps a raw tool payload into that map, so the one transcript builder
|
|
9
|
+
* (`harness/transcript/builder.ts`, both harnesses since #1097) has one mapping.
|
|
10
10
|
*
|
|
11
11
|
* The mapping is a superset of what any one harness emits: the Cursor SDK sends
|
|
12
12
|
* per-item `id`/`created_at` and can send a `merge` flag and camelCase statuses;
|
package/src/shared/tool-row.ts
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* shape of legacy (pre-stamping) sessions whose flowed edit rows were hidden.
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
|
-
import { ToolCallStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
20
|
+
import { ApprovalAction, ToolCallStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
21
21
|
import type { AgentMessage, ToolCall } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
22
22
|
import type { SubAgentExecution } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/subagent_pb";
|
|
23
23
|
import { extractFilePath } from "./file-tools.js";
|
|
@@ -80,7 +80,7 @@ export function stampFileEditRow(tc: ToolCall, changeSetId: string): void {
|
|
|
80
80
|
* (the Cursor deny-gate's ledger tokens; a status rule). Omit to stamp
|
|
81
81
|
* every write/delete row, the deep-agent posture where every such row flowed.
|
|
82
82
|
*
|
|
83
|
-
* One pass for every harness (
|
|
83
|
+
* One pass for every harness (since #1096; until then each adapter carried a copy
|
|
84
84
|
* differing only in the `flowed` predicate).
|
|
85
85
|
*/
|
|
86
86
|
export function stampFlowedFileEditRows(
|
|
@@ -294,3 +294,39 @@ export function collectSettledToolCallIds(
|
|
|
294
294
|
}
|
|
295
295
|
return ids;
|
|
296
296
|
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Whether the server has already adjudicated this row — the user decided its
|
|
300
|
+
* gate (`approval_action`, the server's field; the runner never writes it).
|
|
301
|
+
*
|
|
302
|
+
* Such a row belongs to a gate that is CLOSED: approved and executed, or
|
|
303
|
+
* declined, in an earlier invocation of this execution. No reconciliation of
|
|
304
|
+
* the CURRENT turn may rewrite it — not the denial overlay (a new denial of the
|
|
305
|
+
* same identity is a NEW act and gets its own row), not the twin collapse (the
|
|
306
|
+
* executed row is the transcript's record). Before this rule the overlay matched
|
|
307
|
+
* a denial to the FIRST same-identity row in the whole transcript, flipped a
|
|
308
|
+
* completed, approved row back to WAITING_APPROVAL with its APPROVE still on
|
|
309
|
+
* it, and the next invocation read that as the decision for the new, undecided
|
|
310
|
+
* proposal — an approval bleeding to a later identical act (found by the
|
|
311
|
+
* harness contract kit's invariant 3 against this adapter, #1070).
|
|
312
|
+
*/
|
|
313
|
+
export function isAdjudicatedRow(tc: ToolCall): boolean {
|
|
314
|
+
return tc.approvalAction !== ApprovalAction.UNSPECIFIED;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/** Adjudicated with a decision that does NOT execute: the user declined this gate. */
|
|
318
|
+
export function isDeclinedRow(tc: ToolCall): boolean {
|
|
319
|
+
switch (tc.approvalAction) {
|
|
320
|
+
case ApprovalAction.SKIP:
|
|
321
|
+
case ApprovalAction.REJECT:
|
|
322
|
+
return true;
|
|
323
|
+
case ApprovalAction.UNSPECIFIED:
|
|
324
|
+
case ApprovalAction.APPROVE:
|
|
325
|
+
case ApprovalAction.APPROVE_ALL:
|
|
326
|
+
return false;
|
|
327
|
+
default: {
|
|
328
|
+
const exhaustive: never = tc.approvalAction;
|
|
329
|
+
throw new Error(`isDeclinedRow: unknown approval action ${String(exhaustive)}`);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
@@ -107,7 +107,7 @@ export type TurnInterruption = "worker-shutdown" | "pause" | "infrastructure" |
|
|
|
107
107
|
* already aborted and nothing actually interrupted. Shutdown requires a
|
|
108
108
|
* delivered cancellation alongside the signal.
|
|
109
109
|
*
|
|
110
|
-
* Until
|
|
110
|
+
* Until #1070 the evidence also carried two flags from the periodic
|
|
111
111
|
* heartbeat ("it threw `CancelledFailure`"), and a delivered cancellation
|
|
112
112
|
* without them read as "none". `Context.heartbeat()` never throws in the
|
|
113
113
|
* Temporal TypeScript SDK (it enqueues to the worker's heartbeat subject;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
2
|
import { mockWorkspaceBackend } from "../../../__test-utils__/mock-workspace.js";
|
|
3
3
|
import { provisionGit } from "../sources/git.js";
|
|
4
|
-
import {
|
|
4
|
+
import { WorkspaceProvisionError } from "../types.js";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Command-routing mock for `backend.execute`.
|
|
@@ -55,7 +55,7 @@ describe("provisionGit", () => {
|
|
|
55
55
|
|
|
56
56
|
it("returns GIT_REPO source type", async () => {
|
|
57
57
|
const result = await provisionGit(makeOptions());
|
|
58
|
-
expect(result.sourceType).toBe(
|
|
58
|
+
expect(result.sourceType).toBe("git_repo");
|
|
59
59
|
});
|
|
60
60
|
|
|
61
61
|
it("clones in place (init/remote/fetch/checkout) instead of git clone", async () => {
|
|
@@ -119,7 +119,7 @@ describe("provisionGit", () => {
|
|
|
119
119
|
});
|
|
120
120
|
|
|
121
121
|
const result = await provisionGit(makeOptions({ backend }));
|
|
122
|
-
expect(result.sourceType).toBe(
|
|
122
|
+
expect(result.sourceType).toBe("git_repo");
|
|
123
123
|
expect(result.workspaceDescription).toContain("existing repo detected");
|
|
124
124
|
|
|
125
125
|
expect(calls(backend).some((c) => c.includes("git init"))).toBe(false);
|
|
@@ -3,7 +3,7 @@ import { mkdtempSync, mkdirSync, writeFileSync, existsSync, readlinkSync } from
|
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { tmpdir } from "node:os";
|
|
5
5
|
import { WorkspaceProvisioner } from "../provisioner.js";
|
|
6
|
-
import {
|
|
6
|
+
import { WorkspaceProvisionError } from "../types.js";
|
|
7
7
|
import { LocalWorkspaceBackend } from "../local-backend.js";
|
|
8
8
|
|
|
9
9
|
function makeTempDir(): string {
|
|
@@ -22,7 +22,7 @@ describe("WorkspaceProvisioner", () => {
|
|
|
22
22
|
const root = makeTempDir();
|
|
23
23
|
const backend = new LocalWorkspaceBackend(root);
|
|
24
24
|
const result = await provisioner.provision(undefined, backend, {}, true);
|
|
25
|
-
expect(result.sourceType).toBe(
|
|
25
|
+
expect(result.sourceType).toBe("empty");
|
|
26
26
|
expect(result.rootDir).toBe(root);
|
|
27
27
|
expect(result.consumedKeys).toEqual([]);
|
|
28
28
|
});
|
|
@@ -34,7 +34,7 @@ describe("WorkspaceProvisioner", () => {
|
|
|
34
34
|
{ source: { case: undefined, value: undefined } },
|
|
35
35
|
backend, {}, true,
|
|
36
36
|
);
|
|
37
|
-
expect(result.sourceType).toBe(
|
|
37
|
+
expect(result.sourceType).toBe("empty");
|
|
38
38
|
});
|
|
39
39
|
});
|
|
40
40
|
|
|
@@ -47,7 +47,7 @@ describe("WorkspaceProvisioner", () => {
|
|
|
47
47
|
{ source: { case: "localPath", value: { path: projectDir } } },
|
|
48
48
|
backend, {}, true,
|
|
49
49
|
);
|
|
50
|
-
expect(result.sourceType).toBe(
|
|
50
|
+
expect(result.sourceType).toBe("local_path");
|
|
51
51
|
expect(result.rootDir).toBe(projectDir);
|
|
52
52
|
});
|
|
53
53
|
|
|
@@ -102,7 +102,7 @@ describe("WorkspaceProvisioner", () => {
|
|
|
102
102
|
);
|
|
103
103
|
expect(results).toHaveLength(1);
|
|
104
104
|
expect(results[0].entryName).toBe("app");
|
|
105
|
-
expect(results[0].sourceType).toBe(
|
|
105
|
+
expect(results[0].sourceType).toBe("empty");
|
|
106
106
|
});
|
|
107
107
|
});
|
|
108
108
|
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Pins session workspace provisioning: git-repo workspace entries are cloned
|
|
3
3
|
* locally (never delegated to a cloud agent), local-path entries are
|
|
4
4
|
* mounted, and a session with no entries gets its own empty per-session root.
|
|
5
|
-
* Harness-agnostic; the Cursor activity
|
|
6
|
-
* runtime
|
|
5
|
+
* Harness-agnostic; the Cursor activity was its only caller until the turn
|
|
6
|
+
* runtime took it over in #1070.
|
|
7
7
|
*
|
|
8
8
|
* Uses a real, hermetic local git repository (no network, no harness API) so
|
|
9
9
|
* the clone is deterministic.
|
|
@@ -20,9 +20,8 @@ import { WorkspaceWriteBackPhase } from "@stigmer/protos/ai/stigmer/agentic/agen
|
|
|
20
20
|
import { GitWriteBackMode } from "@stigmer/protos/ai/stigmer/agentic/session/v1/enum_pb";
|
|
21
21
|
import { WriteBackCoordinator } from "../writeback-coordinator.js";
|
|
22
22
|
import { LocalWorkspaceBackend } from "../local-backend.js";
|
|
23
|
-
import {
|
|
23
|
+
import { TranscriptBuilder } from "../../../harness/transcript/builder.js";
|
|
24
24
|
import type { ProvisionResult } from "../types.js";
|
|
25
|
-
import { SourceType } from "../types.js";
|
|
26
25
|
import { AGENT_GIT_AUTHOR_EMAIL } from "../git-identity.js";
|
|
27
26
|
|
|
28
27
|
const SESSION_ID = "ses-int-01";
|
|
@@ -52,11 +51,11 @@ function git(cwd: string, args: string[]): string {
|
|
|
52
51
|
|
|
53
52
|
function makeCoordinator(
|
|
54
53
|
executionId: string,
|
|
55
|
-
|
|
54
|
+
writeBacks: TranscriptBuilder,
|
|
56
55
|
): WriteBackCoordinator {
|
|
57
56
|
const provisionResult: ProvisionResult = {
|
|
58
57
|
rootDir: workDir,
|
|
59
|
-
sourceType:
|
|
58
|
+
sourceType: "git_repo",
|
|
60
59
|
consumedKeys: [],
|
|
61
60
|
workspaceDescription: "integration",
|
|
62
61
|
entryName: "repo",
|
|
@@ -68,7 +67,7 @@ function makeCoordinator(
|
|
|
68
67
|
},
|
|
69
68
|
};
|
|
70
69
|
return new WriteBackCoordinator({
|
|
71
|
-
|
|
70
|
+
writeBacks,
|
|
72
71
|
executionId,
|
|
73
72
|
sessionId: SESSION_ID,
|
|
74
73
|
githubToken: "ghp_test",
|
|
@@ -139,7 +138,7 @@ describe("WriteBackCoordinator against real git", () => {
|
|
|
139
138
|
// ── Turn 1: the agent created a file; the review kept it. ──
|
|
140
139
|
writeFileSync(join(workDir, "notes.md"), "approved content\n");
|
|
141
140
|
const status1 = create(AgentExecutionStatusSchema, {});
|
|
142
|
-
const coord1 = makeCoordinator("exec-turn-1",
|
|
141
|
+
const coord1 = makeCoordinator("exec-turn-1", new TranscriptBuilder("exec-int", status1));
|
|
143
142
|
await coord1.finalize();
|
|
144
143
|
|
|
145
144
|
const wb1 = status1.workspaceWriteBacks[0];
|
|
@@ -163,7 +162,7 @@ describe("WriteBackCoordinator against real git", () => {
|
|
|
163
162
|
rmSync(join(workDir, "rejected.md")); // the reconcile's snap-back
|
|
164
163
|
|
|
165
164
|
const status2 = create(AgentExecutionStatusSchema, {});
|
|
166
|
-
const coord2 = makeCoordinator("exec-turn-2",
|
|
165
|
+
const coord2 = makeCoordinator("exec-turn-2", new TranscriptBuilder("exec-int", status2));
|
|
167
166
|
await coord2.finalize();
|
|
168
167
|
|
|
169
168
|
const wb2 = status2.workspaceWriteBacks[0];
|
|
@@ -200,7 +199,7 @@ describe("WriteBackCoordinator against real git", () => {
|
|
|
200
199
|
writeFileSync(join(workDir, "notes.md"), "turn one\n");
|
|
201
200
|
const coord1 = makeCoordinator(
|
|
202
201
|
"exec-a",
|
|
203
|
-
|
|
202
|
+
new TranscriptBuilder("exec-int", create(AgentExecutionStatusSchema, {})),
|
|
204
203
|
);
|
|
205
204
|
await coord1.finalize();
|
|
206
205
|
|
|
@@ -214,7 +213,7 @@ describe("WriteBackCoordinator against real git", () => {
|
|
|
214
213
|
// new one from main (which would orphan turn 1's commit).
|
|
215
214
|
writeFileSync(join(workDir, "more.md"), "turn two\n");
|
|
216
215
|
const status2 = create(AgentExecutionStatusSchema, {});
|
|
217
|
-
const coord2 = makeCoordinator("exec-b",
|
|
216
|
+
const coord2 = makeCoordinator("exec-b", new TranscriptBuilder("exec-int", status2));
|
|
218
217
|
await coord2.finalize();
|
|
219
218
|
|
|
220
219
|
expect(status2.workspaceWriteBacks[0].branchName).toBe(SESSION_BRANCH);
|
|
@@ -1,18 +1,14 @@
|
|
|
1
1
|
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
2
2
|
import { create } from "@bufbuild/protobuf";
|
|
3
|
-
import { AgentExecutionStatusSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
3
|
+
import { type AgentExecutionStatus, AgentExecutionStatusSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
4
4
|
import { WorkspaceWriteBackPhase } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/writeback_pb";
|
|
5
5
|
import { GitWriteBackMode } from "@stigmer/protos/ai/stigmer/agentic/session/v1/enum_pb";
|
|
6
|
-
import {
|
|
7
|
-
statusProtoWriter,
|
|
8
|
-
type ExecutionStatusWriter,
|
|
9
|
-
} from "../../execution-status-writer.js";
|
|
6
|
+
import { TranscriptBuilder } from "../../../harness/transcript/builder.js";
|
|
10
7
|
import {
|
|
11
8
|
WriteBackCoordinator,
|
|
12
9
|
parseGithubRepo,
|
|
13
10
|
} from "../writeback-coordinator.js";
|
|
14
11
|
import type { WorkspaceBackend, ProvisionResult } from "../types.js";
|
|
15
|
-
import { SourceType } from "../types.js";
|
|
16
12
|
import {
|
|
17
13
|
AGENT_GIT_AUTHOR_NAME,
|
|
18
14
|
AGENT_GIT_AUTHOR_EMAIL,
|
|
@@ -21,16 +17,19 @@ import {
|
|
|
21
17
|
const SESSION_ID = "ses-01test";
|
|
22
18
|
const SESSION_BRANCH = `stigmer/${SESSION_ID}`;
|
|
23
19
|
|
|
24
|
-
// The
|
|
25
|
-
//
|
|
26
|
-
|
|
27
|
-
|
|
20
|
+
// The writer production wires in: the turn's transcript builder, whose
|
|
21
|
+
// `addWriteBack` owns the upsert-by-entry rule these arms read the result of
|
|
22
|
+
// (the coordinator itself only registers records through `WriteBackSink`).
|
|
23
|
+
/** A builder and the status it builds into: the test writes through `sb` and reads `status`, as production reads `TurnSink.status`. */
|
|
24
|
+
function makeStatusBuilder(): { sb: TranscriptBuilder; status: AgentExecutionStatus } {
|
|
25
|
+
const status = create(AgentExecutionStatusSchema, {});
|
|
26
|
+
return { sb: new TranscriptBuilder("exec-test", status), status };
|
|
28
27
|
}
|
|
29
28
|
|
|
30
29
|
function makeProvisionResult(overrides: Partial<ProvisionResult> = {}): ProvisionResult {
|
|
31
30
|
return {
|
|
32
31
|
rootDir: "/workspace/my-app",
|
|
33
|
-
sourceType:
|
|
32
|
+
sourceType: "git_repo",
|
|
34
33
|
consumedKeys: [],
|
|
35
34
|
workspaceDescription: "test",
|
|
36
35
|
entryName: "my-app",
|
|
@@ -92,7 +91,7 @@ function mockWorkspaceBackend(responses: Record<string, string> = {}): Workspace
|
|
|
92
91
|
}
|
|
93
92
|
|
|
94
93
|
function makeCoordinator(opts: {
|
|
95
|
-
sb:
|
|
94
|
+
sb: TranscriptBuilder;
|
|
96
95
|
backend?: WorkspaceBackend;
|
|
97
96
|
executionId?: string;
|
|
98
97
|
sessionId?: string;
|
|
@@ -101,7 +100,7 @@ function makeCoordinator(opts: {
|
|
|
101
100
|
workspaceEntries?: any[];
|
|
102
101
|
}): WriteBackCoordinator {
|
|
103
102
|
return new WriteBackCoordinator({
|
|
104
|
-
|
|
103
|
+
writeBacks: opts.sb,
|
|
105
104
|
executionId: opts.executionId ?? "exec-12345678rest",
|
|
106
105
|
sessionId: opts.sessionId ?? SESSION_ID,
|
|
107
106
|
githubToken: opts.githubToken ?? "ghp_plumbed_token",
|
|
@@ -139,10 +138,11 @@ function mockGithubApi(opts: {
|
|
|
139
138
|
const originalFetch = globalThis.fetch;
|
|
140
139
|
|
|
141
140
|
describe("WriteBackCoordinator", () => {
|
|
142
|
-
let sb:
|
|
141
|
+
let sb: TranscriptBuilder;
|
|
142
|
+
let status: AgentExecutionStatus;
|
|
143
143
|
|
|
144
144
|
beforeEach(() => {
|
|
145
|
-
sb = makeStatusBuilder();
|
|
145
|
+
({ sb, status } = makeStatusBuilder());
|
|
146
146
|
mockGithubApi();
|
|
147
147
|
});
|
|
148
148
|
|
|
@@ -155,7 +155,7 @@ describe("WriteBackCoordinator", () => {
|
|
|
155
155
|
it("filters out non-git workspace entries", () => {
|
|
156
156
|
const coord = makeCoordinator({
|
|
157
157
|
sb,
|
|
158
|
-
provisionResults: [makeProvisionResult({ sourceType:
|
|
158
|
+
provisionResults: [makeProvisionResult({ sourceType: "local_path" })],
|
|
159
159
|
});
|
|
160
160
|
expect(coord.hasEligibleEntries).toBe(false);
|
|
161
161
|
});
|
|
@@ -186,7 +186,7 @@ describe("WriteBackCoordinator", () => {
|
|
|
186
186
|
// ── Full cycle ──────────────────────────────────────────────────────
|
|
187
187
|
|
|
188
188
|
// Every cycle below runs through `finalize()`, the coordinator's one entry
|
|
189
|
-
// point since
|
|
189
|
+
// point since #1096 (the per-file `onFileModified` went with the
|
|
190
190
|
// native stream loop that called it). The mechanics it pins are the same.
|
|
191
191
|
it("performs full cycle on the SESSION branch: branch -> commit -> push -> PR", async () => {
|
|
192
192
|
const backend = mockWorkspaceBackend();
|
|
@@ -194,7 +194,7 @@ describe("WriteBackCoordinator", () => {
|
|
|
194
194
|
|
|
195
195
|
await coord.finalize();
|
|
196
196
|
|
|
197
|
-
const wbs =
|
|
197
|
+
const wbs = status.workspaceWriteBacks;
|
|
198
198
|
expect(wbs).toHaveLength(1);
|
|
199
199
|
expect(wbs[0].branchName).toBe(SESSION_BRANCH);
|
|
200
200
|
expect(wbs[0].baseBranch).toBe("main");
|
|
@@ -238,7 +238,7 @@ describe("WriteBackCoordinator", () => {
|
|
|
238
238
|
|
|
239
239
|
await coord.finalize();
|
|
240
240
|
|
|
241
|
-
expect(
|
|
241
|
+
expect(status.workspaceWriteBacks).toHaveLength(0);
|
|
242
242
|
});
|
|
243
243
|
|
|
244
244
|
// ── Session-branch idempotency ──────────────────────────────────────
|
|
@@ -317,7 +317,7 @@ describe("WriteBackCoordinator", () => {
|
|
|
317
317
|
|
|
318
318
|
await coord.finalize();
|
|
319
319
|
|
|
320
|
-
const wbs =
|
|
320
|
+
const wbs = status.workspaceWriteBacks;
|
|
321
321
|
expect(wbs[0].pullRequestNumber).toBe(7);
|
|
322
322
|
expect(wbs[0].pullRequestUrl).toBe("https://github.com/acme/my-app/pull/7");
|
|
323
323
|
expect(wbs[0].phase).toBe(WorkspaceWriteBackPhase.WORKSPACE_WRITE_BACK_PR_CREATED);
|
|
@@ -355,7 +355,7 @@ describe("WriteBackCoordinator", () => {
|
|
|
355
355
|
|
|
356
356
|
await coord.finalize();
|
|
357
357
|
|
|
358
|
-
const wbs =
|
|
358
|
+
const wbs = status.workspaceWriteBacks;
|
|
359
359
|
expect(wbs).toHaveLength(1);
|
|
360
360
|
expect(wbs[0].phase).toBe(WorkspaceWriteBackPhase.WORKSPACE_WRITE_BACK_FAILED);
|
|
361
361
|
expect(wbs[0].error).toContain("commit failed");
|
|
@@ -369,7 +369,7 @@ describe("WriteBackCoordinator", () => {
|
|
|
369
369
|
|
|
370
370
|
await coord.finalize();
|
|
371
371
|
|
|
372
|
-
const wbs =
|
|
372
|
+
const wbs = status.workspaceWriteBacks;
|
|
373
373
|
expect(wbs).toHaveLength(1);
|
|
374
374
|
expect(wbs[0].phase,
|
|
375
375
|
"a pushed branch must never be reported FAILED for a PR-step error",
|
|
@@ -386,7 +386,7 @@ describe("WriteBackCoordinator", () => {
|
|
|
386
386
|
|
|
387
387
|
await coord.finalize();
|
|
388
388
|
|
|
389
|
-
const wbs =
|
|
389
|
+
const wbs = status.workspaceWriteBacks;
|
|
390
390
|
expect(wbs).toHaveLength(1);
|
|
391
391
|
expect(wbs[0].phase).toBe(WorkspaceWriteBackPhase.WORKSPACE_WRITE_BACK_PUSHED);
|
|
392
392
|
expect(wbs[0].error).toContain("No GitHub token");
|
|
@@ -401,8 +401,8 @@ describe("WriteBackCoordinator", () => {
|
|
|
401
401
|
|
|
402
402
|
await coord.finalize();
|
|
403
403
|
|
|
404
|
-
expect(
|
|
405
|
-
expect(
|
|
404
|
+
expect(status.workspaceWriteBacks).toHaveLength(1);
|
|
405
|
+
expect(status.workspaceWriteBacks[0].phase).toBe(
|
|
406
406
|
WorkspaceWriteBackPhase.WORKSPACE_WRITE_BACK_PR_CREATED,
|
|
407
407
|
);
|
|
408
408
|
});
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import type { ProvisionResult, WorkspaceBackend } from "./types.js";
|
|
18
|
-
import {
|
|
18
|
+
import { WorkspaceProvisionError } from "./types.js";
|
|
19
19
|
import { provisionEmpty } from "./sources/empty.js";
|
|
20
20
|
import { provisionLocalPath } from "./sources/local-path.js";
|
|
21
21
|
import { provisionGit } from "./sources/git.js";
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Harness-agnostic: the turn runtime's workspace phase, serving both
|
|
5
5
|
* adapters (the native orchestrator's twin, `provisionWorkspace`, retired
|
|
6
|
-
* with it
|
|
6
|
+
* with it in #1096, which also carried its one difference). Agents run LOCAL
|
|
7
7
|
* (cloud is disabled — see execute-cursor/cursor-mode.ts), so the runner
|
|
8
8
|
* must clone git-repo workspace entries itself and mount local-path entries
|
|
9
9
|
* before the agent runs. Cloud agents previously cloned git repos
|
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
* This handler simply records the fact and returns the existing root.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import {
|
|
8
|
+
import type { ProvisionResult, WorkspaceBackend } from "../types.js";
|
|
9
9
|
|
|
10
10
|
export function provisionEmpty(backend: WorkspaceBackend): ProvisionResult {
|
|
11
11
|
return {
|
|
12
12
|
rootDir: backend.rootDir,
|
|
13
|
-
sourceType:
|
|
13
|
+
sourceType: "empty",
|
|
14
14
|
consumedKeys: [],
|
|
15
15
|
workspaceDescription:
|
|
16
16
|
"Your workspace is empty. " +
|
|
@@ -12,7 +12,6 @@
|
|
|
12
12
|
|
|
13
13
|
import { join } from "node:path";
|
|
14
14
|
import {
|
|
15
|
-
SourceType,
|
|
16
15
|
WorkspaceProvisionError,
|
|
17
16
|
type ProvisionResult,
|
|
18
17
|
type GitMetadata,
|
|
@@ -63,7 +62,7 @@ export async function provisionGit(options: GitProvisionOptions): Promise<Provis
|
|
|
63
62
|
? message.replaceAll(githubToken, "***")
|
|
64
63
|
: message;
|
|
65
64
|
throw new WorkspaceProvisionError(
|
|
66
|
-
|
|
65
|
+
"git_repo",
|
|
67
66
|
`Git clone failed: ${sanitized}`,
|
|
68
67
|
{ cause: err instanceof Error ? err : undefined, transient: true },
|
|
69
68
|
);
|
|
@@ -82,7 +81,7 @@ export async function provisionGit(options: GitProvisionOptions): Promise<Provis
|
|
|
82
81
|
|
|
83
82
|
return {
|
|
84
83
|
rootDir: cloneDir,
|
|
85
|
-
sourceType:
|
|
84
|
+
sourceType: "git_repo",
|
|
86
85
|
consumedKeys,
|
|
87
86
|
workspaceDescription:
|
|
88
87
|
`Your workspace is a git clone of ${url}` +
|
|
@@ -113,7 +112,7 @@ async function reuseExistingRepo(
|
|
|
113
112
|
|
|
114
113
|
return {
|
|
115
114
|
rootDir: cloneDir,
|
|
116
|
-
sourceType:
|
|
115
|
+
sourceType: "git_repo",
|
|
117
116
|
consumedKeys: [],
|
|
118
117
|
workspaceDescription:
|
|
119
118
|
`Your workspace is a git clone of ${url}` +
|
|
@@ -12,7 +12,6 @@ import { existsSync, statSync, symlinkSync, readlinkSync, unlinkSync, mkdirSync
|
|
|
12
12
|
import { join, isAbsolute } from "node:path";
|
|
13
13
|
import { realpathSync } from "node:fs";
|
|
14
14
|
import {
|
|
15
|
-
SourceType,
|
|
16
15
|
WorkspaceProvisionError,
|
|
17
16
|
type ProvisionResult,
|
|
18
17
|
} from "../types.js";
|
|
@@ -29,7 +28,7 @@ export function provisionLocalPath(options: LocalPathProvisionOptions): Provisio
|
|
|
29
28
|
|
|
30
29
|
if (!isLocalMode) {
|
|
31
30
|
throw new WorkspaceProvisionError(
|
|
32
|
-
|
|
31
|
+
"local_path",
|
|
33
32
|
"LocalPathSource is only supported in local mode. " +
|
|
34
33
|
"Use git_repo for cloud deployments.",
|
|
35
34
|
);
|
|
@@ -37,21 +36,21 @@ export function provisionLocalPath(options: LocalPathProvisionOptions): Provisio
|
|
|
37
36
|
|
|
38
37
|
if (!isAbsolute(path)) {
|
|
39
38
|
throw new WorkspaceProvisionError(
|
|
40
|
-
|
|
39
|
+
"local_path",
|
|
41
40
|
`Path must be absolute, got relative path: '${path}'`,
|
|
42
41
|
);
|
|
43
42
|
}
|
|
44
43
|
|
|
45
44
|
if (!existsSync(path)) {
|
|
46
45
|
throw new WorkspaceProvisionError(
|
|
47
|
-
|
|
46
|
+
"local_path",
|
|
48
47
|
`Path does not exist: '${path}'`,
|
|
49
48
|
);
|
|
50
49
|
}
|
|
51
50
|
|
|
52
51
|
if (!statSync(path).isDirectory()) {
|
|
53
52
|
throw new WorkspaceProvisionError(
|
|
54
|
-
|
|
53
|
+
"local_path",
|
|
55
54
|
`Path is not a directory: '${path}'`,
|
|
56
55
|
);
|
|
57
56
|
}
|
|
@@ -62,7 +61,7 @@ export function provisionLocalPath(options: LocalPathProvisionOptions): Provisio
|
|
|
62
61
|
|
|
63
62
|
return {
|
|
64
63
|
rootDir: path,
|
|
65
|
-
sourceType:
|
|
64
|
+
sourceType: "local_path",
|
|
66
65
|
consumedKeys: [],
|
|
67
66
|
workspaceDescription:
|
|
68
67
|
`Your workspace is the user's project directory: ${path}\n` +
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* working-tree mutation, and re-pointing it while another session's turn is
|
|
18
18
|
* running on a shared tree would redirect that turn's reads mid-flight.
|
|
19
19
|
* the turn runtime creates it in its skill and attachment phases (which
|
|
20
|
-
* run after lock acquisition), for both harnesses; until
|
|
20
|
+
* run after lock acquisition), for both harnesses; until #1096 the native
|
|
21
21
|
* orchestrator created it unconditionally right after the lock.
|
|
22
22
|
* - Removed at turn end ({@link removeStigmerSymlink} in the activity's
|
|
23
23
|
* cleanup), so a real repo is left untouched once the turn ends; a
|
|
@@ -5,11 +5,8 @@
|
|
|
5
5
|
* harness-agnostic and used by both ExecuteCursor and ExecuteDeepAgent.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
LOCAL_PATH = "local_path",
|
|
11
|
-
EMPTY = "empty",
|
|
12
|
-
}
|
|
8
|
+
/** Where a provisioned workspace came from; the same strings the error prefix and the prompt builder read. */
|
|
9
|
+
export type SourceType = "git_repo" | "local_path" | "empty";
|
|
13
10
|
|
|
14
11
|
export interface GitMetadata {
|
|
15
12
|
readonly repoUrl: string;
|