@stigmer/runner 3.15.3-dev.20260914100347 → 3.15.3-dev.20260916211208
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/.build-fingerprint +1 -1
- package/dist/__test-utils__/approval-contract/types.d.ts +1 -1
- package/dist/__test-utils__/hermetic-activity.d.ts +61 -7
- package/dist/__test-utils__/hermetic-activity.js +100 -9
- package/dist/__test-utils__/hermetic-activity.js.map +1 -1
- package/dist/__test-utils__/model-registry-fixture.d.ts +22 -3
- package/dist/__test-utils__/model-registry-fixture.js +22 -7
- package/dist/__test-utils__/model-registry-fixture.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/contract-subject.d.ts +2 -2
- package/dist/activities/execute-cursor/__test-utils__/contract-subject.js +14 -11
- package/dist/activities/execute-cursor/__test-utils__/contract-subject.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/fold.d.ts +61 -0
- package/dist/activities/execute-cursor/__test-utils__/fold.js +94 -0
- package/dist/activities/execute-cursor/__test-utils__/fold.js.map +1 -0
- package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.js +1 -1
- package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.d.ts +52 -14
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js +46 -12
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/scripted-agent.d.ts +21 -28
- package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js +27 -11
- package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.d.ts +70 -26
- package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.js +82 -32
- package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.js.map +1 -1
- package/dist/activities/execute-cursor/adapter.d.ts +8 -7
- package/dist/activities/execute-cursor/adapter.js +13 -9
- package/dist/activities/execute-cursor/adapter.js.map +1 -1
- package/dist/activities/execute-cursor/approval-policy.d.ts +10 -10
- package/dist/activities/execute-cursor/approval-policy.js +12 -23
- package/dist/activities/execute-cursor/approval-policy.js.map +1 -1
- package/dist/activities/execute-cursor/approval-state.d.ts +35 -1
- package/dist/activities/execute-cursor/approval-state.js +65 -0
- package/dist/activities/execute-cursor/approval-state.js.map +1 -1
- package/dist/activities/execute-cursor/{message-translator.d.ts → boundary-rows.d.ts} +45 -341
- package/dist/activities/execute-cursor/boundary-rows.js +1018 -0
- package/dist/activities/execute-cursor/boundary-rows.js.map +1 -0
- package/dist/activities/execute-cursor/cursor-capabilities.d.ts +1 -1
- package/dist/activities/execute-cursor/cursor-capabilities.js +1 -1
- package/dist/activities/execute-cursor/cursor-event-recorder.d.ts +33 -14
- package/dist/activities/execute-cursor/cursor-event-recorder.js +43 -21
- package/dist/activities/execute-cursor/cursor-event-recorder.js.map +1 -1
- package/dist/activities/execute-cursor/prompt-builder.d.ts +3 -3
- package/dist/activities/execute-cursor/prompt-builder.js +4 -4
- package/dist/activities/execute-cursor/prompt-builder.js.map +1 -1
- package/dist/activities/execute-cursor/sdk-warmup.d.ts +15 -6
- package/dist/activities/execute-cursor/sdk-warmup.js +15 -6
- package/dist/activities/execute-cursor/sdk-warmup.js.map +1 -1
- package/dist/activities/execute-cursor/service-tier.js +1 -2
- package/dist/activities/execute-cursor/service-tier.js.map +1 -1
- package/dist/activities/execute-cursor/session-lifecycle.d.ts +38 -59
- package/dist/activities/execute-cursor/session-lifecycle.js +59 -96
- package/dist/activities/execute-cursor/session-lifecycle.js.map +1 -1
- package/dist/activities/execute-cursor/session-store.d.ts +100 -0
- package/dist/activities/execute-cursor/session-store.js +157 -0
- package/dist/activities/execute-cursor/session-store.js.map +1 -0
- package/dist/activities/execute-cursor/sub-agent-steps.d.ts +79 -0
- package/dist/activities/execute-cursor/sub-agent-steps.js +180 -0
- package/dist/activities/execute-cursor/sub-agent-steps.js.map +1 -0
- package/dist/activities/execute-cursor/tool-result.d.ts +49 -0
- package/dist/activities/execute-cursor/tool-result.js +130 -0
- package/dist/activities/execute-cursor/tool-result.js.map +1 -0
- package/dist/activities/execute-cursor/translator.d.ts +178 -0
- package/dist/activities/execute-cursor/translator.js +485 -0
- package/dist/activities/execute-cursor/translator.js.map +1 -0
- package/dist/activities/execute-cursor/turn-boundary.d.ts +15 -5
- package/dist/activities/execute-cursor/turn-boundary.js +10 -14
- package/dist/activities/execute-cursor/turn-boundary.js.map +1 -1
- package/dist/activities/execute-cursor/turn-settle.d.ts +11 -7
- package/dist/activities/execute-cursor/turn-settle.js +47 -34
- package/dist/activities/execute-cursor/turn-settle.js.map +1 -1
- package/dist/activities/execute-cursor/turn-setup.d.ts +2 -2
- package/dist/activities/execute-cursor/turn-setup.js +5 -5
- package/dist/activities/execute-cursor/turn-setup.js.map +1 -1
- package/dist/activities/execute-cursor/turn-stream.d.ts +23 -14
- package/dist/activities/execute-cursor/turn-stream.js +41 -28
- package/dist/activities/execute-cursor/turn-stream.js.map +1 -1
- package/dist/activities/execute-cursor/turn.d.ts +4 -4
- package/dist/activities/execute-cursor/turn.js +5 -5
- package/dist/activities/execute-cursor/usage-pricing.d.ts +2 -2
- package/dist/activities/execute-cursor/usage-pricing.js +2 -2
- package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.d.ts +2 -2
- package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.js +2 -2
- package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.d.ts +16 -11
- package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js +22 -10
- package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js.map +1 -1
- package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js +1 -1
- package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js.map +1 -1
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.d.ts +2 -3
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js +2 -3
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js.map +1 -1
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.d.ts +12 -3
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js +18 -4
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js.map +1 -1
- package/dist/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.d.ts +10 -1
- package/dist/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.js +24 -11
- package/dist/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.js.map +1 -1
- package/dist/activities/execute-deep-agent/adapter.d.ts +1 -1
- package/dist/activities/execute-deep-agent/adapter.js +1 -1
- package/dist/activities/execute-deep-agent/approval-file-change.d.ts +19 -19
- package/dist/activities/execute-deep-agent/approval-file-change.js +16 -15
- package/dist/activities/execute-deep-agent/approval-file-change.js.map +1 -1
- package/dist/activities/execute-deep-agent/deep-agent-capabilities.d.ts +2 -2
- package/dist/activities/execute-deep-agent/deep-agent-capabilities.js +2 -2
- package/dist/activities/execute-deep-agent/hitl.d.ts +2 -2
- package/dist/activities/execute-deep-agent/hitl.js +2 -2
- package/dist/activities/execute-deep-agent/inline-publisher.d.ts +13 -3
- package/dist/activities/execute-deep-agent/inline-publisher.js +3 -3
- package/dist/activities/execute-deep-agent/inline-publisher.js.map +1 -1
- package/dist/activities/execute-deep-agent/prompt-builder.d.ts +3 -3
- package/dist/activities/execute-deep-agent/prompt-builder.js +6 -7
- package/dist/activities/execute-deep-agent/prompt-builder.js.map +1 -1
- package/dist/activities/execute-deep-agent/streaming-side-effects.d.ts +16 -8
- package/dist/activities/execute-deep-agent/streaming-side-effects.js +20 -33
- package/dist/activities/execute-deep-agent/streaming-side-effects.js.map +1 -1
- package/dist/activities/execute-deep-agent/subagent-transformer.d.ts +3 -3
- package/dist/activities/execute-deep-agent/subagent-transformer.js +1 -1
- package/dist/activities/execute-deep-agent/translator.d.ts +134 -0
- package/dist/activities/execute-deep-agent/translator.js +418 -0
- package/dist/activities/execute-deep-agent/translator.js.map +1 -0
- package/dist/activities/execute-deep-agent/turn-settle.d.ts +13 -7
- package/dist/activities/execute-deep-agent/turn-settle.js +34 -45
- package/dist/activities/execute-deep-agent/turn-settle.js.map +1 -1
- package/dist/activities/execute-deep-agent/turn-setup.d.ts +8 -8
- package/dist/activities/execute-deep-agent/turn-setup.js +7 -7
- package/dist/activities/execute-deep-agent/turn-stream.d.ts +13 -10
- package/dist/activities/execute-deep-agent/turn-stream.js +44 -41
- package/dist/activities/execute-deep-agent/turn-stream.js.map +1 -1
- package/dist/activities/execute-deep-agent/turn.d.ts +3 -3
- package/dist/activities/execute-deep-agent/turn.js +3 -3
- package/dist/config.d.ts +2 -2
- package/dist/harness/approval-decisions.d.ts +1 -1
- package/dist/harness/approval-decisions.js +1 -1
- package/dist/harness/capabilities.d.ts +21 -11
- package/dist/harness/capabilities.js +2 -2
- package/dist/harness/capture.d.ts +4 -4
- package/dist/harness/capture.js +4 -4
- package/dist/harness/persist-chokepoint.d.ts +3 -3
- package/dist/harness/persist-chokepoint.js +3 -3
- package/dist/harness/registry.d.ts +2 -2
- package/dist/harness/registry.js +2 -2
- package/dist/harness/run-turn.d.ts +6 -4
- package/dist/harness/run-turn.js +31 -9
- package/dist/harness/run-turn.js.map +1 -1
- package/dist/harness/stop-controller.d.ts +1 -1
- package/dist/harness/stop-controller.js +1 -1
- package/dist/harness/terminal-table.d.ts +7 -7
- package/dist/harness/terminal-table.js +7 -7
- package/dist/harness/transcript/builder.d.ts +182 -0
- package/dist/harness/transcript/builder.js +693 -0
- package/dist/harness/transcript/builder.js.map +1 -0
- package/dist/harness/transcript/events.d.ts +218 -0
- package/dist/harness/transcript/events.js +50 -0
- package/dist/harness/transcript/events.js.map +1 -0
- package/dist/harness/transcript/state.d.ts +110 -0
- package/dist/harness/transcript/state.js +148 -0
- package/dist/harness/transcript/state.js.map +1 -0
- package/dist/harness/turn-context.d.ts +54 -38
- package/dist/harness/turn-context.js +42 -43
- package/dist/harness/turn-context.js.map +1 -1
- package/dist/harness/types.d.ts +63 -22
- package/dist/harness/types.js +12 -11
- package/dist/harness/types.js.map +1 -1
- package/dist/harness/usage-accumulator.d.ts +2 -2
- package/dist/harness/usage-accumulator.js +2 -2
- package/dist/harness-adapters.d.ts +5 -4
- package/dist/harness-adapters.js +5 -4
- package/dist/harness-adapters.js.map +1 -1
- package/dist/middleware/approval-gate.d.ts +6 -0
- package/dist/middleware/approval-gate.js +7 -57
- package/dist/middleware/approval-gate.js.map +1 -1
- package/dist/middleware/cost-advisory.d.ts +3 -3
- package/dist/middleware/cost-advisory.js +3 -3
- package/dist/middleware/index.d.ts +1 -1
- package/dist/middleware/index.js +1 -1
- package/dist/runner-manager.js +1 -1
- package/dist/runner-manager.js.map +1 -1
- package/dist/shared/approval-policy.d.ts +53 -0
- package/dist/shared/approval-policy.js +76 -0
- package/dist/shared/approval-policy.js.map +1 -1
- package/dist/shared/args-preview.d.ts +45 -22
- package/dist/shared/args-preview.js +51 -41
- package/dist/shared/args-preview.js.map +1 -1
- package/dist/shared/attachment-resolver.d.ts +4 -4
- package/dist/shared/attachment-resolver.js +4 -4
- package/dist/shared/attachment-vision.d.ts +2 -1
- package/dist/shared/attachment-vision.js.map +1 -1
- package/dist/shared/attachment-zip.d.ts +2 -2
- package/dist/shared/attachment-zip.js +2 -2
- package/dist/shared/cost-guard.d.ts +2 -2
- package/dist/shared/cost-guard.js +2 -2
- package/dist/shared/exact-apply.d.ts +1 -1
- package/dist/shared/exact-apply.js +1 -1
- package/dist/shared/execution-context.d.ts +2 -2
- package/dist/shared/execution-context.js +2 -2
- package/dist/shared/extract-structured-output.d.ts +2 -2
- package/dist/shared/extract-structured-output.js +2 -2
- package/dist/shared/filereview/cas-touched.d.ts +2 -2
- package/dist/shared/filereview/cas-touched.js +2 -2
- package/dist/shared/heartbeat.d.ts +1 -1
- package/dist/shared/heartbeat.js +1 -1
- package/dist/shared/llm-backend.d.ts +0 -4
- package/dist/shared/llm-backend.js +0 -4
- package/dist/shared/llm-backend.js.map +1 -1
- package/dist/shared/model-error.d.ts +1 -2
- package/dist/shared/model-error.js +1 -2
- package/dist/shared/model-error.js.map +1 -1
- package/dist/shared/persist-decision.d.ts +18 -24
- package/dist/shared/persist-decision.js +19 -11
- package/dist/shared/persist-decision.js.map +1 -1
- package/dist/shared/prompt-sections.d.ts +4 -4
- package/dist/shared/prompt-sections.js +4 -4
- package/dist/shared/skill-resolver.d.ts +3 -3
- package/dist/shared/skill-resolver.js +3 -3
- package/dist/shared/status-offload.d.ts +1 -1
- package/dist/shared/status-offload.js +2 -2
- package/dist/shared/status-offload.js.map +1 -1
- package/dist/shared/streaming-scheduler.d.ts +2 -7
- package/dist/shared/streaming-scheduler.js +6 -14
- package/dist/shared/streaming-scheduler.js.map +1 -1
- package/dist/shared/subagent-rows.d.ts +2 -2
- package/dist/shared/subagent-rows.js +2 -2
- package/dist/shared/todos.d.ts +3 -3
- package/dist/shared/todos.js +3 -3
- package/dist/shared/tool-row.d.ts +19 -1
- package/dist/shared/tool-row.js +36 -2
- package/dist/shared/tool-row.js.map +1 -1
- package/dist/shared/worker-shutdown.d.ts +1 -1
- package/dist/shared/worker-shutdown.js +1 -1
- package/dist/shared/workspace/session-provision.d.ts +1 -1
- package/dist/shared/workspace/session-provision.js +1 -1
- package/dist/shared/workspace/sources/empty.d.ts +1 -1
- package/dist/shared/workspace/sources/empty.js +1 -2
- package/dist/shared/workspace/sources/empty.js.map +1 -1
- package/dist/shared/workspace/sources/git.js +4 -4
- package/dist/shared/workspace/sources/git.js.map +1 -1
- package/dist/shared/workspace/sources/local-path.js +6 -6
- package/dist/shared/workspace/sources/local-path.js.map +1 -1
- package/dist/shared/workspace/stigmer-link.d.ts +1 -1
- package/dist/shared/workspace/stigmer-link.js +1 -1
- package/dist/shared/workspace/types.d.ts +2 -5
- package/dist/shared/workspace/types.js +0 -6
- package/dist/shared/workspace/types.js.map +1 -1
- package/dist/shared/workspace/writeback-coordinator.d.ts +17 -4
- package/dist/shared/workspace/writeback-coordinator.js +7 -9
- package/dist/shared/workspace/writeback-coordinator.js.map +1 -1
- package/package.json +5 -5
- package/src/__test-utils__/__tests__/execution-record-barrier.test.ts +70 -0
- package/src/__test-utils__/__tests__/harness-contract-self-check.test.ts +35 -1
- package/src/__test-utils__/approval-contract/contract.ts +1 -1
- package/src/__test-utils__/approval-contract/types.ts +1 -1
- package/src/__test-utils__/harness-boot-order-child.ts +1 -1
- package/src/__test-utils__/harness-contract/contract.ts +8 -8
- package/src/__test-utils__/harness-contract/recording-sink.ts +11 -1
- package/src/__test-utils__/harness-contract/runtime-contract.ts +52 -16
- package/src/__test-utils__/harness-contract/scripted-adapter.ts +47 -43
- package/src/__test-utils__/hermetic-activity.ts +113 -9
- package/src/__test-utils__/model-registry-fixture.ts +31 -7
- package/src/__test-utils__/module-specifiers.ts +32 -3
- package/src/__tests__/harness-boot-order.test.ts +1 -1
- package/src/__tests__/harness-contract.test.ts +1 -1
- package/src/__tests__/runner-manager.test.ts +1 -1
- package/src/activities/execute-cursor/__test-utils__/__tests__/scripted-double.test.ts +32 -8
- package/src/activities/execute-cursor/__test-utils__/contract-subject.ts +12 -10
- package/src/activities/execute-cursor/__test-utils__/fold.ts +116 -0
- package/src/activities/execute-cursor/__test-utils__/gateway-substrate.ts +1 -1
- package/src/activities/execute-cursor/__test-utils__/hermetic-cursor.ts +72 -19
- package/src/activities/execute-cursor/__test-utils__/scripted-agent.ts +35 -29
- package/src/activities/execute-cursor/__test-utils__/scripted-sdk.ts +94 -38
- package/src/activities/execute-cursor/__tests__/approval-gate.test.ts +2 -1
- package/src/activities/execute-cursor/__tests__/approval-state.test.ts +14 -21
- package/src/activities/execute-cursor/__tests__/build-prompt.test.ts +3 -3
- package/src/activities/execute-cursor/__tests__/coarse-fingerprint.test.ts +2 -1
- package/src/activities/execute-cursor/__tests__/cursor-baseurl-routing.test.ts +10 -8
- package/src/activities/execute-cursor/__tests__/cursor-event-recorder.test.ts +142 -0
- package/src/activities/execute-cursor/__tests__/cursor-fetch-interceptor-bypass.test.ts +24 -12
- package/src/activities/execute-cursor/__tests__/cursor-generate-image-live.test.ts +7 -2
- package/src/activities/execute-cursor/__tests__/cursor-hook-protocol-live.test.ts +163 -0
- package/src/activities/execute-cursor/__tests__/cursor-sdk-auth-smoke.test.ts +23 -20
- package/src/activities/execute-cursor/__tests__/cursor-transcript-live.test.ts +298 -0
- package/src/activities/execute-cursor/__tests__/deny-gate-exact-apply.test.ts +4 -2
- package/src/activities/execute-cursor/__tests__/fetch-interceptor.test.ts +1 -1
- package/src/activities/execute-cursor/__tests__/hermetic/deny-and-retry.test.ts +5 -2
- package/src/activities/execute-cursor/__tests__/hermetic/file-review-capture.test.ts +5 -2
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/mcp-tool-call.status.json +71 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/sdk-task-note.status.json +73 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/shell-output-delta.error-delta.status.json +78 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/shell-output-delta.output-first.status.json +72 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/shell-output-delta.status.json +72 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/sub-agent-delegation.status.json +109 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/thinking-turn.status.json +78 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/todo-write.status.json +119 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/tool-error.status.json +68 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/tool-only-step.status.json +67 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/unattributed-hook-block.status.json +1 -1
- package/src/activities/execute-cursor/__tests__/hermetic/harness-contract.test.ts +10 -7
- package/src/activities/execute-cursor/__tests__/hermetic/mcp-tool-call.test.ts +146 -0
- package/src/activities/execute-cursor/__tests__/hermetic/pause-vs-shutdown.test.ts +8 -5
- package/src/activities/execute-cursor/__tests__/hermetic/plain-turn.test.ts +6 -2
- package/src/activities/execute-cursor/__tests__/hermetic/recovery-fresh-agent.test.ts +4 -1
- package/src/activities/execute-cursor/__tests__/hermetic/run-wait-arms.test.ts +6 -2
- package/src/activities/execute-cursor/__tests__/hermetic/sdk-task-note.test.ts +122 -0
- package/src/activities/execute-cursor/__tests__/hermetic/shell-output-delta.test.ts +276 -0
- package/src/activities/execute-cursor/__tests__/hermetic/stream-self-stop-arms.test.ts +12 -9
- package/src/activities/execute-cursor/__tests__/hermetic/sub-agent-delegation.test.ts +196 -0
- package/src/activities/execute-cursor/__tests__/hermetic/thinking-turn.test.ts +145 -0
- package/src/activities/execute-cursor/__tests__/hermetic/thrown-error-arms.test.ts +4 -1
- package/src/activities/execute-cursor/__tests__/hermetic/todo-write.test.ts +165 -0
- package/src/activities/execute-cursor/__tests__/hermetic/tool-call.test.ts +7 -4
- package/src/activities/execute-cursor/__tests__/hermetic/tool-error.test.ts +138 -0
- package/src/activities/execute-cursor/__tests__/hermetic/tool-only-step.test.ts +130 -0
- package/src/activities/execute-cursor/__tests__/hermetic/unattributed-hook-block.test.ts +17 -2
- package/src/activities/execute-cursor/__tests__/hermetic/workspace-lock-timeout.test.ts +5 -2
- package/src/activities/execute-cursor/__tests__/hitl-ledger.test.ts +43 -60
- package/src/activities/execute-cursor/__tests__/hitl-resume-history.test.ts +23 -28
- package/src/activities/execute-cursor/__tests__/hook-script.test.ts +2 -1
- package/src/activities/execute-cursor/__tests__/http2-interceptor.test.ts +1 -1
- package/src/activities/execute-cursor/__tests__/prompt-goldens.test.ts +5 -5
- package/src/activities/execute-cursor/__tests__/same-identity-reproposal.test.ts +11 -13
- package/src/activities/execute-cursor/__tests__/sequential-gate-resume.test.ts +8 -11
- package/src/activities/execute-cursor/__tests__/session-lifecycle.test.ts +86 -58
- package/src/activities/execute-cursor/__tests__/session-store.test.ts +220 -0
- package/src/activities/execute-cursor/__tests__/tool-result-image.test.ts +8 -22
- package/src/activities/execute-cursor/__tests__/translator.test.ts +594 -0
- package/src/activities/execute-cursor/__tests__/turn-boundary.test.ts +8 -5
- package/src/activities/execute-cursor/__tests__/turn-stream.test.ts +87 -63
- package/src/activities/execute-cursor/adapter.ts +13 -9
- package/src/activities/execute-cursor/approval-policy.ts +12 -24
- package/src/activities/execute-cursor/approval-state.ts +66 -1
- package/src/activities/execute-cursor/boundary-rows.ts +1132 -0
- package/src/activities/execute-cursor/cursor-capabilities.ts +1 -1
- package/src/activities/execute-cursor/cursor-event-recorder.ts +57 -28
- package/src/activities/execute-cursor/fetch-interceptor.ts +1 -1
- package/src/activities/execute-cursor/http2-interceptor.ts +1 -1
- package/src/activities/execute-cursor/prompt-builder.ts +6 -6
- package/src/activities/execute-cursor/sdk-warmup.ts +15 -6
- package/src/activities/execute-cursor/service-tier.ts +1 -2
- package/src/activities/execute-cursor/session-lifecycle.ts +63 -109
- package/src/activities/execute-cursor/session-store.ts +187 -0
- package/src/activities/execute-cursor/sub-agent-steps.ts +188 -0
- package/src/activities/execute-cursor/tool-result.ts +128 -0
- package/src/activities/execute-cursor/translator.ts +541 -0
- package/src/activities/execute-cursor/turn-boundary.ts +21 -14
- package/src/activities/execute-cursor/turn-settle.ts +46 -34
- package/src/activities/execute-cursor/turn-setup.ts +5 -5
- package/src/activities/execute-cursor/turn-stream.ts +49 -46
- package/src/activities/execute-cursor/turn.ts +5 -5
- package/src/activities/execute-cursor/usage-pricing.ts +2 -2
- package/src/activities/execute-deep-agent/__test-utils__/contract-subject.ts +2 -2
- package/src/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.ts +23 -11
- package/src/activities/execute-deep-agent/__test-utils__/hitl-script.ts +1 -1
- package/src/activities/execute-deep-agent/__test-utils__/scripted-model-module.ts +2 -3
- package/src/activities/execute-deep-agent/__test-utils__/scripted-model.ts +25 -4
- package/src/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.ts +25 -11
- package/src/activities/execute-deep-agent/__tests__/adapter-graph-is-sdk-free.test.ts +1 -1
- package/src/activities/execute-deep-agent/__tests__/adapter-is-temporal-free.test.ts +1 -1
- package/src/activities/execute-deep-agent/__tests__/approval-file-change.test.ts +6 -17
- package/src/activities/execute-deep-agent/__tests__/hermetic/file-review-capture.test.ts +25 -8
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn1.status.json +2 -7
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn2.status.json +4 -14
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve.turn2.status.json +1 -5
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/file-review-capture.status.json +4 -7
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/gate.turn1.status.json +1 -5
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn1.status.json +2 -9
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn2.status.json +2 -9
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.after-tool.status.json +1 -4
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.mid-tool.status.json +1 -4
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/platform-stop.status.json +1 -4
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/recursion-limit.persisted.status.json +109 -76
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/reject.turn2.status.json +1 -5
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn2.status.json +2 -10
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn3.status.json +2 -10
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/skip.turn2.status.json +1 -5
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sub-agent-delegation.status.json +3 -6
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/tool-call.status.json +1 -4
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/worker-shutdown.status.json +1 -4
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/write-todos.status.json +92 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/harness-contract.test.ts +3 -3
- package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-approve-all-lease.test.ts +9 -5
- package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-round-trips.test.ts +3 -3
- package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-sequential-gates.test.ts +3 -3
- package/src/activities/execute-deep-agent/__tests__/hermetic/inline-artifact-across-gate.test.ts +7 -6
- package/src/activities/execute-deep-agent/__tests__/hermetic/pause-vs-shutdown.test.ts +10 -11
- package/src/activities/execute-deep-agent/__tests__/hermetic/plain-turn.test.ts +4 -4
- package/src/activities/execute-deep-agent/__tests__/hermetic/platform-stop.test.ts +9 -8
- package/src/activities/execute-deep-agent/__tests__/hermetic/recursion-limit.test.ts +21 -13
- package/src/activities/execute-deep-agent/__tests__/hermetic/resolution-error.test.ts +2 -2
- package/src/activities/execute-deep-agent/__tests__/hermetic/structured-output.test.ts +7 -7
- package/src/activities/execute-deep-agent/__tests__/hermetic/sub-agent-delegation.test.ts +28 -12
- package/src/activities/execute-deep-agent/__tests__/hermetic/tool-call.test.ts +21 -21
- package/src/activities/execute-deep-agent/__tests__/hermetic/workspace-lock-timeout.test.ts +5 -5
- package/src/activities/execute-deep-agent/__tests__/hermetic/write-todos.test.ts +160 -0
- package/src/activities/execute-deep-agent/__tests__/inline-publisher.test.ts +35 -30
- package/src/activities/execute-deep-agent/__tests__/prompt-builder.test.ts +3 -4
- package/src/activities/execute-deep-agent/__tests__/prompt-goldens.test.ts +12 -10
- package/src/activities/execute-deep-agent/__tests__/scripted-model.test.ts +13 -3
- package/src/activities/execute-deep-agent/__tests__/streaming-side-effects.test.ts +26 -18
- package/src/activities/execute-deep-agent/__tests__/subagent-wiring.test.ts +1 -1
- package/src/activities/execute-deep-agent/__tests__/{subagent-tracker.test.ts → translator-subagents.test.ts} +76 -57
- package/src/activities/execute-deep-agent/__tests__/{v3-status-builder.test.ts → translator-through-builder.test.ts} +213 -299
- package/src/activities/execute-deep-agent/__tests__/translator.test.ts +505 -0
- package/src/activities/execute-deep-agent/__tests__/turn-stream.test.ts +11 -29
- package/src/activities/execute-deep-agent/adapter.ts +1 -1
- package/src/activities/execute-deep-agent/approval-file-change.ts +20 -22
- package/src/activities/execute-deep-agent/deep-agent-capabilities.ts +2 -2
- package/src/activities/execute-deep-agent/hitl.ts +2 -2
- package/src/activities/execute-deep-agent/inline-publisher.ts +16 -5
- package/src/activities/execute-deep-agent/prompt-builder.ts +6 -7
- package/src/activities/execute-deep-agent/streaming-side-effects.ts +22 -31
- package/src/activities/execute-deep-agent/subagent-transformer.ts +3 -3
- package/src/activities/execute-deep-agent/translator.ts +463 -0
- package/src/activities/execute-deep-agent/turn-settle.ts +35 -43
- package/src/activities/execute-deep-agent/turn-setup.ts +8 -8
- package/src/activities/execute-deep-agent/turn-stream.ts +53 -51
- package/src/activities/execute-deep-agent/turn.ts +3 -3
- package/src/config.ts +2 -2
- package/src/harness/README.md +335 -0
- package/src/harness/__tests__/approval-decisions.test.ts +2 -2
- package/src/harness/__tests__/capture.test.ts +3 -3
- package/src/harness/__tests__/import-direction.test.ts +3 -2
- package/src/harness/__tests__/mount-skills.test.ts +4 -1
- package/src/harness/__tests__/readme-index.test.ts +339 -0
- package/src/harness/__tests__/run-turn.test.ts +131 -6
- package/src/harness/__tests__/transcript-is-engine-free.test.ts +83 -0
- package/src/harness/__tests__/transcript-writers.test.ts +191 -0
- package/src/harness/__tests__/turn-attachments-vision.test.ts +5 -2
- package/src/harness/__tests__/turn-context.test.ts +5 -5
- package/src/harness/approval-decisions.ts +1 -1
- package/src/harness/capabilities.ts +21 -11
- package/src/harness/capture.ts +4 -4
- package/src/harness/persist-chokepoint.ts +3 -3
- package/src/harness/registry.ts +2 -2
- package/src/harness/run-turn.ts +33 -9
- package/src/harness/stop-controller.ts +1 -1
- package/src/harness/terminal-table.ts +7 -7
- package/src/harness/transcript/__tests__/builder.test.ts +975 -0
- package/src/harness/transcript/__tests__/state.test.ts +143 -0
- package/src/harness/transcript/builder.ts +755 -0
- package/src/harness/transcript/events.ts +262 -0
- package/src/harness/transcript/state.ts +167 -0
- package/src/harness/turn-context.ts +61 -46
- package/src/harness/types.ts +64 -22
- package/src/harness/usage-accumulator.ts +2 -2
- package/src/harness-adapters.ts +5 -4
- package/src/middleware/__tests__/cost-advisory.test.ts +2 -2
- package/src/middleware/approval-gate.ts +7 -74
- package/src/middleware/cost-advisory.ts +3 -3
- package/src/middleware/index.ts +1 -1
- package/src/runner-manager.ts +1 -1
- package/src/shared/__tests__/approval-policy.test.ts +45 -0
- package/src/shared/__tests__/args-preview.test.ts +40 -20
- package/src/shared/__tests__/attachment-naming.test.ts +1 -1
- package/src/shared/__tests__/attachment-resolver.test.ts +5 -5
- package/src/shared/__tests__/attachment-zip.test.ts +1 -1
- package/src/shared/__tests__/blueprint-resolver.test.ts +1 -1
- package/src/shared/__tests__/cost-guard.test.ts +1 -1
- package/src/shared/__tests__/exact-apply.test.ts +2 -1
- package/src/shared/__tests__/persist-decision.test.ts +19 -33
- package/src/shared/__tests__/prompt-sections.test.ts +1 -1
- package/src/shared/__tests__/stamp-flowed-rows.test.ts +1 -1
- package/src/shared/__tests__/status-offload.test.ts +1 -1
- package/src/shared/__tests__/streaming-scheduler.test.ts +8 -9
- package/src/shared/__tests__/todos.test.ts +1 -1
- package/src/shared/__tests__/tool-row.test.ts +1 -1
- package/src/shared/approval-policy.ts +95 -0
- package/src/shared/args-preview.ts +51 -42
- package/src/shared/attachment-resolver.ts +4 -4
- package/src/shared/attachment-vision.ts +2 -1
- package/src/shared/attachment-zip.ts +2 -2
- package/src/shared/cost-guard.ts +2 -2
- package/src/shared/exact-apply.ts +1 -1
- package/src/shared/execution-context.ts +2 -2
- package/src/shared/extract-structured-output.ts +2 -2
- package/src/shared/filereview/__tests__/capture.test.ts +9 -5
- package/src/shared/filereview/__tests__/git-substrate.test.ts +4 -1
- package/src/shared/filereview/__tests__/proxy-reconcile.test.ts +3 -3
- package/src/shared/filereview/cas-touched.ts +2 -2
- package/src/shared/heartbeat.ts +1 -1
- package/src/shared/llm-backend.ts +0 -4
- package/src/shared/model-error.ts +1 -2
- package/src/shared/persist-decision.ts +19 -28
- package/src/shared/prompt-sections.ts +4 -4
- package/src/shared/skill-resolver.ts +3 -3
- package/src/shared/status-offload.ts +2 -2
- package/src/shared/streaming-scheduler.ts +8 -13
- package/src/shared/subagent-rows.ts +2 -2
- package/src/shared/todos.ts +3 -3
- package/src/shared/tool-row.ts +38 -2
- package/src/shared/worker-shutdown.ts +1 -1
- package/src/shared/workspace/__tests__/git-source.test.ts +3 -3
- package/src/shared/workspace/__tests__/provisioner.test.ts +5 -5
- package/src/shared/workspace/__tests__/session-provision.test.ts +2 -2
- package/src/shared/workspace/__tests__/writeback-coordinator.integration.test.ts +8 -9
- package/src/shared/workspace/__tests__/writeback-coordinator.test.ts +25 -25
- package/src/shared/workspace/provisioner.ts +1 -1
- package/src/shared/workspace/session-provision.ts +1 -1
- package/src/shared/workspace/sources/empty.ts +2 -2
- package/src/shared/workspace/sources/git.ts +3 -4
- package/src/shared/workspace/sources/local-path.ts +5 -6
- package/src/shared/workspace/stigmer-link.ts +1 -1
- package/src/shared/workspace/types.ts +2 -5
- package/src/shared/workspace/writeback-coordinator.ts +23 -12
- package/dist/activities/execute-cursor/delta-enricher.d.ts +0 -87
- package/dist/activities/execute-cursor/delta-enricher.js +0 -265
- package/dist/activities/execute-cursor/delta-enricher.js.map +0 -1
- package/dist/activities/execute-cursor/message-translator.js +0 -2040
- package/dist/activities/execute-cursor/message-translator.js.map +0 -1
- package/dist/activities/execute-cursor/todo-tracker.d.ts +0 -40
- package/dist/activities/execute-cursor/todo-tracker.js +0 -80
- package/dist/activities/execute-cursor/todo-tracker.js.map +0 -1
- package/dist/activities/execute-deep-agent/execution-state.d.ts +0 -54
- package/dist/activities/execute-deep-agent/execution-state.js +0 -68
- package/dist/activities/execute-deep-agent/execution-state.js.map +0 -1
- package/dist/activities/execute-deep-agent/status-builder-shared.d.ts +0 -65
- package/dist/activities/execute-deep-agent/status-builder-shared.js +0 -90
- package/dist/activities/execute-deep-agent/status-builder-shared.js.map +0 -1
- package/dist/activities/execute-deep-agent/subagent-tracker.d.ts +0 -113
- package/dist/activities/execute-deep-agent/subagent-tracker.js +0 -400
- package/dist/activities/execute-deep-agent/subagent-tracker.js.map +0 -1
- package/dist/activities/execute-deep-agent/v3-events.d.ts +0 -102
- package/dist/activities/execute-deep-agent/v3-events.js +0 -35
- package/dist/activities/execute-deep-agent/v3-events.js.map +0 -1
- package/dist/activities/execute-deep-agent/v3-protocol-normalizer.d.ts +0 -15
- package/dist/activities/execute-deep-agent/v3-protocol-normalizer.js +0 -235
- package/dist/activities/execute-deep-agent/v3-protocol-normalizer.js.map +0 -1
- package/dist/activities/execute-deep-agent/v3-status-builder.d.ts +0 -111
- package/dist/activities/execute-deep-agent/v3-status-builder.js +0 -457
- package/dist/activities/execute-deep-agent/v3-status-builder.js.map +0 -1
- package/dist/shared/execution-status-writer.d.ts +0 -31
- package/dist/shared/execution-status-writer.js +0 -43
- package/dist/shared/execution-status-writer.js.map +0 -1
- package/src/activities/execute-cursor/__tests__/delta-enricher.test.ts +0 -310
- package/src/activities/execute-cursor/__tests__/message-translator.test.ts +0 -1033
- package/src/activities/execute-cursor/__tests__/todo-tracker.test.ts +0 -498
- package/src/activities/execute-cursor/delta-enricher.ts +0 -307
- package/src/activities/execute-cursor/message-translator.ts +0 -2319
- package/src/activities/execute-cursor/todo-tracker.ts +0 -91
- package/src/activities/execute-deep-agent/__tests__/execution-state-extended.test.ts +0 -148
- package/src/activities/execute-deep-agent/__tests__/execution-state.test.ts +0 -154
- package/src/activities/execute-deep-agent/__tests__/status-builder-shared.test.ts +0 -47
- package/src/activities/execute-deep-agent/__tests__/v3-protocol-normalizer.test.ts +0 -324
- package/src/activities/execute-deep-agent/execution-state.ts +0 -78
- package/src/activities/execute-deep-agent/status-builder-shared.ts +0 -142
- package/src/activities/execute-deep-agent/subagent-tracker.ts +0 -479
- package/src/activities/execute-deep-agent/v3-events.ts +0 -153
- package/src/activities/execute-deep-agent/v3-protocol-normalizer.ts +0 -264
- package/src/activities/execute-deep-agent/v3-status-builder.ts +0 -565
- package/src/shared/execution-status-writer.ts +0 -56
|
@@ -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;
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* (`harness/run-turn.ts`) — in capture mode on the APPROVED tree after the
|
|
19
19
|
* review decisions reconcile, so speculative mid-turn edits never reach
|
|
20
20
|
* GitHub; on a non-capture git turn on whatever the turn left in the tree.
|
|
21
|
-
* Until
|
|
21
|
+
* Until #1096 an incremental path also existed — `onFileModified`,
|
|
22
22
|
* a commit-and-push per file-modifying tool call on non-capture turns — and
|
|
23
23
|
* was reachable in no supported posture (every git workspace with artifact
|
|
24
24
|
* storage is a capture workspace, `shared/filereview/capture.ts`
|
|
@@ -29,18 +29,29 @@
|
|
|
29
29
|
*/
|
|
30
30
|
|
|
31
31
|
import { create } from "@bufbuild/protobuf";
|
|
32
|
-
import {
|
|
33
|
-
WorkspaceWriteBackSchema,
|
|
34
|
-
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/writeback_pb";
|
|
35
32
|
import {
|
|
36
33
|
WorkspaceWriteBackPhase,
|
|
34
|
+
WorkspaceWriteBackSchema,
|
|
35
|
+
type WorkspaceWriteBack,
|
|
37
36
|
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/writeback_pb";
|
|
38
37
|
import { GitWriteBackMode } from "@stigmer/protos/ai/stigmer/agentic/session/v1/enum_pb";
|
|
39
38
|
import type { WorkspaceEntry } from "@stigmer/protos/ai/stigmer/agentic/session/v1/workspace_pb";
|
|
40
39
|
import type { WorkspaceBackend, ProvisionResult } from "./types.js";
|
|
41
|
-
import { SourceType } from "./types.js";
|
|
42
40
|
import { gitCommitAsAgent } from "./git-identity.js";
|
|
43
|
-
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Where a write-back record is registered: the one member of the turn's
|
|
44
|
+
* transcript builder this coordinator needs (`harness/transcript/builder.ts`
|
|
45
|
+
* `addWriteBack`, which owns the upsert-by-entry rule — each git-backed
|
|
46
|
+
* workspace entry carries at most one record, progressing through phases).
|
|
47
|
+
* Declared here as the narrow view this consumer needs, never the whole
|
|
48
|
+
* builder, so `shared/` keeps importing nothing from `harness/` (the
|
|
49
|
+
* `SessionProvisionConfig` rule: a shared helper is handed a narrowed view,
|
|
50
|
+
* never the other way round).
|
|
51
|
+
*/
|
|
52
|
+
export interface WriteBackSink {
|
|
53
|
+
addWriteBack(wb: WorkspaceWriteBack): void;
|
|
54
|
+
}
|
|
44
55
|
|
|
45
56
|
const WRITE_BACK_ENABLED_MODES = new Set([
|
|
46
57
|
GitWriteBackMode.GIT_WRITE_BACK_MODE_UNSPECIFIED,
|
|
@@ -68,7 +79,7 @@ interface EligibleEntry {
|
|
|
68
79
|
}
|
|
69
80
|
|
|
70
81
|
export class WriteBackCoordinator {
|
|
71
|
-
private readonly
|
|
82
|
+
private readonly writeBacks: WriteBackSink;
|
|
72
83
|
private readonly executionId: string;
|
|
73
84
|
private readonly workspaceBackend: WorkspaceBackend;
|
|
74
85
|
private readonly branchName: string;
|
|
@@ -85,7 +96,7 @@ export class WriteBackCoordinator {
|
|
|
85
96
|
private readonly state = new Map<string, EntryState>();
|
|
86
97
|
|
|
87
98
|
constructor(opts: {
|
|
88
|
-
|
|
99
|
+
writeBacks: WriteBackSink;
|
|
89
100
|
executionId: string;
|
|
90
101
|
/** The owning session's id — the branch/PR are session-scoped. */
|
|
91
102
|
sessionId: string;
|
|
@@ -94,7 +105,7 @@ export class WriteBackCoordinator {
|
|
|
94
105
|
workspaceEntries: readonly WorkspaceEntry[];
|
|
95
106
|
workspaceBackend: WorkspaceBackend;
|
|
96
107
|
}) {
|
|
97
|
-
this.
|
|
108
|
+
this.writeBacks = opts.writeBacks;
|
|
98
109
|
this.executionId = opts.executionId;
|
|
99
110
|
this.workspaceBackend = opts.workspaceBackend;
|
|
100
111
|
this.githubToken = opts.githubToken;
|
|
@@ -143,7 +154,7 @@ export class WriteBackCoordinator {
|
|
|
143
154
|
}
|
|
144
155
|
|
|
145
156
|
for (const pr of provisionResults) {
|
|
146
|
-
if (pr.sourceType !==
|
|
157
|
+
if (pr.sourceType !== "git_repo") continue;
|
|
147
158
|
if (!pr.gitMetadata) continue;
|
|
148
159
|
if (!pr.gitMetadata.gitCredentialsConfigured) continue;
|
|
149
160
|
|
|
@@ -222,7 +233,7 @@ export class WriteBackCoordinator {
|
|
|
222
233
|
wb.pullRequestUrl = entryState.prUrl;
|
|
223
234
|
wb.pullRequestNumber = entryState.prNumber;
|
|
224
235
|
}
|
|
225
|
-
this.
|
|
236
|
+
this.writeBacks.addWriteBack(wb);
|
|
226
237
|
return;
|
|
227
238
|
}
|
|
228
239
|
|
|
@@ -466,7 +477,7 @@ export class WriteBackCoordinator {
|
|
|
466
477
|
error: prError,
|
|
467
478
|
});
|
|
468
479
|
|
|
469
|
-
this.
|
|
480
|
+
this.writeBacks.addWriteBack(wb);
|
|
470
481
|
}
|
|
471
482
|
|
|
472
483
|
}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DeltaEnricher processes Cursor SDK InteractionUpdate events to provide
|
|
3
|
-
* real-time enrichments that the stream channel alone cannot deliver.
|
|
4
|
-
*
|
|
5
|
-
* The Cursor SDK provides two concurrent event channels:
|
|
6
|
-
* - run.stream() (SDKMessage) — coarse-grained, post-hoc events
|
|
7
|
-
* - onDelta (InteractionUpdate) — fine-grained, real-time deltas
|
|
8
|
-
*
|
|
9
|
-
* The stream channel remains the source of truth for message construction.
|
|
10
|
-
* The delta channel provides supplementary real-time signals:
|
|
11
|
-
* - shell-output-delta: live stdout/stderr from running shell commands
|
|
12
|
-
* - tool-call-started/completed: precise lifecycle timestamps
|
|
13
|
-
* - thinking-completed: accurate thinking duration from the SDK
|
|
14
|
-
*
|
|
15
|
-
* Concurrency model: Node.js is single-threaded. The onDelta callback fires
|
|
16
|
-
* between iterations of the for-await stream loop (during event loop yields).
|
|
17
|
-
* The enricher buffers data internally; the stream loop calls
|
|
18
|
-
* applyEnrichments() on each iteration to flush buffered state onto the
|
|
19
|
-
* message array. No locks needed — access is always sequential.
|
|
20
|
-
*
|
|
21
|
-
* Design invariant: The enricher never creates messages or tool calls.
|
|
22
|
-
* It only mutates existing ones that the MessageAccumulator has created.
|
|
23
|
-
* If a delta arrives before its corresponding stream event (e.g.,
|
|
24
|
-
* shell-output-delta before tool_call running), the data is buffered
|
|
25
|
-
* and applied retroactively on the next applyEnrichments() call that
|
|
26
|
-
* finds the matching ToolCall.
|
|
27
|
-
*/
|
|
28
|
-
import type { AgentMessage } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
29
|
-
import type { InteractionUpdate } from "@cursor/sdk";
|
|
30
|
-
export declare class DeltaEnricher {
|
|
31
|
-
private shellOutputByCallId;
|
|
32
|
-
private timingByCallId;
|
|
33
|
-
private thinkingDurationMs;
|
|
34
|
-
private _isDirty;
|
|
35
|
-
private lastPersistTime;
|
|
36
|
-
private lastShellCallId;
|
|
37
|
-
/**
|
|
38
|
-
* Minimum interval between persist-triggering dirty flags (milliseconds).
|
|
39
|
-
* Prevents excessive backend writes during rapid shell output bursts.
|
|
40
|
-
* Matches the Python agent-runner's update_scheduler interval.
|
|
41
|
-
*/
|
|
42
|
-
static readonly PERSIST_DEBOUNCE_MS = 500;
|
|
43
|
-
/**
|
|
44
|
-
* Process a single InteractionUpdate from the onDelta callback.
|
|
45
|
-
* Buffers enrichment data for later application by applyEnrichments().
|
|
46
|
-
*
|
|
47
|
-
* Called from the onDelta callback (between stream loop iterations).
|
|
48
|
-
*/
|
|
49
|
-
processDelta(update: InteractionUpdate): void;
|
|
50
|
-
/**
|
|
51
|
-
* Apply all buffered enrichments to the current message array.
|
|
52
|
-
* Called from the stream loop after each processEvent() iteration.
|
|
53
|
-
*
|
|
54
|
-
* Returns true if any enrichments were applied (messages were mutated).
|
|
55
|
-
*/
|
|
56
|
-
applyEnrichments(messages: AgentMessage[]): boolean;
|
|
57
|
-
/**
|
|
58
|
-
* Whether the enricher has pending data that warrants an immediate persist.
|
|
59
|
-
* Only returns true when meaningful UI-visible data has arrived AND the
|
|
60
|
-
* debounce interval has elapsed since the last persist.
|
|
61
|
-
*/
|
|
62
|
-
get isDirty(): boolean;
|
|
63
|
-
/**
|
|
64
|
-
* Acknowledge that a persist has occurred. Resets the dirty flag and
|
|
65
|
-
* records the persist timestamp for debounce calculations.
|
|
66
|
-
*/
|
|
67
|
-
markPersisted(): void;
|
|
68
|
-
/**
|
|
69
|
-
* Finalize streaming state and reconcile tool call statuses.
|
|
70
|
-
*
|
|
71
|
-
* Called after the stream loop ends (alongside accumulator.finalize()).
|
|
72
|
-
* Two passes:
|
|
73
|
-
* 1. Clear `isStreaming` on all tool calls (existing behavior).
|
|
74
|
-
* 2. Reconciliation sweep: any tool call still RUNNING with evidence
|
|
75
|
-
* of completion (completedAt set or result non-empty) is promoted
|
|
76
|
-
* to COMPLETED. This is the catch-all safety net — when the stream
|
|
77
|
-
* ends, no tool call should remain in a non-terminal status.
|
|
78
|
-
*/
|
|
79
|
-
finalize(messages: AgentMessage[]): void;
|
|
80
|
-
private handleShellOutputDelta;
|
|
81
|
-
private handleToolCallStarted;
|
|
82
|
-
private handleToolCallCompleted;
|
|
83
|
-
private getOrCreateTiming;
|
|
84
|
-
private applyShellOutput;
|
|
85
|
-
private applyTiming;
|
|
86
|
-
private applyThinkingDuration;
|
|
87
|
-
}
|