@stigmer/runner 3.15.0 → 3.15.2-dev.20260913223433
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 -4
- package/dist/.build-fingerprint +1 -1
- package/dist/__test-utils__/execution-record-fixture.d.ts +14 -0
- package/dist/__test-utils__/execution-record-fixture.js +4 -0
- package/dist/__test-utils__/execution-record-fixture.js.map +1 -1
- package/dist/__test-utils__/file-review-projection.d.ts +40 -0
- package/dist/__test-utils__/file-review-projection.js +136 -0
- package/dist/__test-utils__/file-review-projection.js.map +1 -0
- package/dist/__test-utils__/harness-contract/types.d.ts +23 -1
- package/dist/__test-utils__/harness-contract/types.js +15 -0
- package/dist/__test-utils__/harness-contract/types.js.map +1 -1
- package/dist/__test-utils__/hermetic-activity.d.ts +44 -12
- package/dist/__test-utils__/hermetic-activity.js +52 -14
- package/dist/__test-utils__/hermetic-activity.js.map +1 -1
- package/dist/__test-utils__/model-registry-fixture.d.ts +32 -7
- package/dist/__test-utils__/model-registry-fixture.js +31 -7
- package/dist/__test-utils__/model-registry-fixture.js.map +1 -1
- package/dist/__test-utils__/turn-input-fixture.d.ts +1 -1
- package/dist/__test-utils__/turn-input-fixture.js +1 -1
- package/dist/__test-utils__/turn-input-fixture.js.map +1 -1
- package/dist/activities/call-agent.js +2 -2
- package/dist/activities/call-agent.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/contract-subject.js +45 -3
- package/dist/activities/execute-cursor/__test-utils__/contract-subject.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.d.ts +0 -9
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js +2 -41
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js.map +1 -1
- package/dist/activities/execute-cursor/adapter.d.ts +7 -5
- package/dist/activities/execute-cursor/adapter.js +7 -5
- package/dist/activities/execute-cursor/adapter.js.map +1 -1
- package/dist/activities/execute-cursor/approval-policy.d.ts +5 -2
- package/dist/activities/execute-cursor/approval-policy.js +5 -2
- package/dist/activities/execute-cursor/approval-policy.js.map +1 -1
- package/dist/activities/execute-cursor/approval-state.d.ts +16 -8
- package/dist/activities/execute-cursor/approval-state.js +6 -3
- package/dist/activities/execute-cursor/approval-state.js.map +1 -1
- package/dist/activities/execute-cursor/cas-observations.d.ts +14 -2
- package/dist/activities/execute-cursor/cas-observations.js +19 -2
- package/dist/activities/execute-cursor/cas-observations.js.map +1 -1
- package/dist/activities/execute-cursor/cursor-capabilities.d.ts +8 -4
- package/dist/activities/execute-cursor/cursor-capabilities.js +21 -4
- package/dist/activities/execute-cursor/cursor-capabilities.js.map +1 -1
- package/dist/activities/execute-cursor/message-translator.d.ts +12 -20
- package/dist/activities/execute-cursor/message-translator.js +19 -32
- package/dist/activities/execute-cursor/message-translator.js.map +1 -1
- package/dist/activities/execute-cursor/prompt-builder.d.ts +48 -58
- package/dist/activities/execute-cursor/prompt-builder.js +76 -95
- package/dist/activities/execute-cursor/prompt-builder.js.map +1 -1
- package/dist/activities/execute-cursor/turn-boundary.d.ts +27 -55
- package/dist/activities/execute-cursor/turn-boundary.js +30 -90
- 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 +37 -49
- package/dist/activities/execute-cursor/turn-settle.js.map +1 -1
- package/dist/activities/execute-cursor/turn-setup.d.ts +16 -24
- package/dist/activities/execute-cursor/turn-setup.js +29 -59
- package/dist/activities/execute-cursor/turn-setup.js.map +1 -1
- package/dist/activities/execute-cursor/turn-stream.d.ts +3 -8
- package/dist/activities/execute-cursor/turn-stream.js +9 -22
- package/dist/activities/execute-cursor/turn-stream.js.map +1 -1
- package/dist/activities/execute-cursor/turn.js +5 -1
- package/dist/activities/execute-cursor/turn.js.map +1 -1
- package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.d.ts +93 -0
- package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.js +348 -0
- package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.js.map +1 -0
- package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.d.ts +170 -0
- package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js +225 -0
- package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js.map +1 -0
- package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.d.ts +24 -0
- package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js +41 -0
- package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js.map +1 -0
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.d.ts +54 -0
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js +72 -0
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js.map +1 -0
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.d.ts +187 -23
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js +238 -27
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js.map +1 -1
- package/dist/activities/execute-deep-agent/adapter.d.ts +41 -0
- package/dist/activities/execute-deep-agent/adapter.js +78 -0
- package/dist/activities/execute-deep-agent/adapter.js.map +1 -0
- package/dist/activities/execute-deep-agent/cas-capture-observer.d.ts +8 -0
- package/dist/activities/execute-deep-agent/cas-capture-observer.js +9 -0
- package/dist/activities/execute-deep-agent/cas-capture-observer.js.map +1 -1
- package/dist/activities/execute-deep-agent/deep-agent-capabilities.d.ts +31 -0
- package/dist/activities/execute-deep-agent/deep-agent-capabilities.js +40 -0
- package/dist/activities/execute-deep-agent/deep-agent-capabilities.js.map +1 -0
- package/dist/activities/execute-deep-agent/execution-state.d.ts +4 -11
- package/dist/activities/execute-deep-agent/execution-state.js +4 -12
- package/dist/activities/execute-deep-agent/execution-state.js.map +1 -1
- package/dist/activities/execute-deep-agent/hitl.d.ts +49 -47
- package/dist/activities/execute-deep-agent/hitl.js +77 -103
- package/dist/activities/execute-deep-agent/hitl.js.map +1 -1
- package/dist/activities/execute-deep-agent/prompt-builder.d.ts +51 -23
- package/dist/activities/execute-deep-agent/prompt-builder.js +115 -76
- package/dist/activities/execute-deep-agent/prompt-builder.js.map +1 -1
- package/dist/activities/execute-deep-agent/status-builder-shared.d.ts +18 -32
- package/dist/activities/execute-deep-agent/status-builder-shared.js +10 -65
- package/dist/activities/execute-deep-agent/status-builder-shared.js.map +1 -1
- package/dist/activities/execute-deep-agent/streaming-side-effects.d.ts +10 -8
- package/dist/activities/execute-deep-agent/streaming-side-effects.js +12 -14
- package/dist/activities/execute-deep-agent/streaming-side-effects.js.map +1 -1
- package/dist/activities/execute-deep-agent/subagent-tracker.d.ts +36 -13
- package/dist/activities/execute-deep-agent/subagent-tracker.js +76 -39
- package/dist/activities/execute-deep-agent/subagent-tracker.js.map +1 -1
- package/dist/activities/execute-deep-agent/subagent-transformer.d.ts +25 -28
- package/dist/activities/execute-deep-agent/subagent-transformer.js +29 -82
- package/dist/activities/execute-deep-agent/subagent-transformer.js.map +1 -1
- package/dist/activities/execute-deep-agent/subagent-wiring.d.ts +3 -2
- package/dist/activities/execute-deep-agent/subagent-wiring.js +2 -2
- package/dist/activities/execute-deep-agent/subagent-wiring.js.map +1 -1
- package/dist/activities/execute-deep-agent/turn-settle.d.ts +42 -0
- package/dist/activities/execute-deep-agent/turn-settle.js +146 -0
- package/dist/activities/execute-deep-agent/turn-settle.js.map +1 -0
- package/dist/activities/execute-deep-agent/turn-setup.d.ts +212 -0
- package/dist/activities/execute-deep-agent/turn-setup.js +430 -0
- package/dist/activities/execute-deep-agent/turn-setup.js.map +1 -0
- package/dist/activities/execute-deep-agent/turn-stream.d.ts +97 -0
- package/dist/activities/execute-deep-agent/turn-stream.js +242 -0
- package/dist/activities/execute-deep-agent/turn-stream.js.map +1 -0
- package/dist/activities/execute-deep-agent/turn.d.ts +42 -0
- package/dist/activities/execute-deep-agent/turn.js +116 -0
- package/dist/activities/execute-deep-agent/turn.js.map +1 -0
- package/dist/activities/execute-deep-agent/v3-event-recorder.d.ts +6 -5
- package/dist/activities/execute-deep-agent/v3-event-recorder.js +6 -5
- package/dist/activities/execute-deep-agent/v3-event-recorder.js.map +1 -1
- package/dist/activities/execute-deep-agent/v3-events.d.ts +1 -1
- package/dist/activities/execute-deep-agent/v3-events.js +1 -1
- package/dist/activities/execute-deep-agent/v3-status-builder.d.ts +60 -17
- package/dist/activities/execute-deep-agent/v3-status-builder.js +72 -57
- package/dist/activities/execute-deep-agent/v3-status-builder.js.map +1 -1
- package/dist/harness/approval-decisions.d.ts +61 -0
- package/dist/harness/approval-decisions.js +102 -0
- package/dist/harness/approval-decisions.js.map +1 -0
- package/dist/harness/capabilities.d.ts +16 -5
- package/dist/harness/capabilities.js +9 -0
- package/dist/harness/capabilities.js.map +1 -1
- package/dist/harness/capture.d.ts +144 -0
- package/dist/harness/capture.js +219 -0
- package/dist/harness/capture.js.map +1 -0
- package/dist/harness/persist-chokepoint.d.ts +19 -4
- package/dist/harness/persist-chokepoint.js +17 -4
- package/dist/harness/persist-chokepoint.js.map +1 -1
- package/dist/harness/run-turn.js +115 -29
- package/dist/harness/run-turn.js.map +1 -1
- package/dist/harness/terminal-table.d.ts +40 -11
- package/dist/harness/terminal-table.js +58 -19
- package/dist/harness/terminal-table.js.map +1 -1
- package/dist/harness/turn-context.d.ts +141 -76
- package/dist/harness/turn-context.js +194 -99
- package/dist/harness/turn-context.js.map +1 -1
- package/dist/harness/types.d.ts +65 -12
- package/dist/harness/types.js +8 -2
- package/dist/harness/types.js.map +1 -1
- package/dist/harness-adapters.d.ts +12 -8
- package/dist/harness-adapters.js +17 -9
- package/dist/harness-adapters.js.map +1 -1
- package/dist/middleware/approval-gate.d.ts +1 -1
- package/dist/middleware/approval-gate.js +1 -1
- package/dist/middleware/approval-gate.js.map +1 -1
- package/dist/middleware/cost-advisory.d.ts +39 -0
- package/dist/middleware/{cost-cap.js → cost-advisory.js} +37 -55
- package/dist/middleware/cost-advisory.js.map +1 -0
- package/dist/middleware/index.d.ts +23 -12
- package/dist/middleware/index.js +26 -18
- package/dist/middleware/index.js.map +1 -1
- package/dist/middleware/types.d.ts +3 -2
- package/dist/runner-manager.js +1 -5
- package/dist/runner-manager.js.map +1 -1
- package/dist/runner.js +1 -5
- package/dist/runner.js.map +1 -1
- package/dist/shared/attachment-resolver.d.ts +41 -18
- package/dist/shared/attachment-resolver.js +178 -46
- package/dist/shared/attachment-resolver.js.map +1 -1
- package/dist/shared/attachment-zip.d.ts +85 -0
- package/dist/shared/attachment-zip.js +185 -0
- package/dist/shared/attachment-zip.js.map +1 -0
- package/dist/shared/connect-backfill.js +5 -4
- package/dist/shared/connect-backfill.js.map +1 -1
- package/dist/shared/cost-guard.d.ts +3 -3
- package/dist/shared/cost-guard.js +3 -3
- package/dist/shared/execution-status-writer.d.ts +5 -5
- package/dist/shared/execution-status-writer.js +5 -5
- package/dist/shared/extract-structured-output.d.ts +8 -7
- package/dist/shared/extract-structured-output.js +8 -7
- package/dist/shared/extract-structured-output.js.map +1 -1
- package/dist/shared/filereview/cas-progress.d.ts +1 -18
- package/dist/shared/filereview/cas-progress.js +4 -0
- package/dist/shared/filereview/cas-progress.js.map +1 -1
- package/dist/shared/filereview/cas-touched.d.ts +56 -0
- package/dist/shared/filereview/cas-touched.js +63 -0
- package/dist/shared/filereview/cas-touched.js.map +1 -0
- package/dist/shared/filereview/index.d.ts +2 -1
- package/dist/shared/filereview/index.js +2 -1
- package/dist/shared/filereview/index.js.map +1 -1
- package/dist/shared/mcp-resolver.d.ts +4 -5
- package/dist/shared/mcp-resolver.js +4 -5
- package/dist/shared/mcp-resolver.js.map +1 -1
- package/dist/shared/persist-decision.d.ts +3 -4
- package/dist/shared/persist-decision.js +3 -4
- package/dist/shared/persist-decision.js.map +1 -1
- package/dist/shared/plan-mode-permissions.d.ts +2 -2
- package/dist/shared/plan-mode-permissions.js +2 -2
- package/dist/shared/plan-mode-prompt.d.ts +1 -1
- package/dist/shared/plan-mode-prompt.js +1 -1
- package/dist/shared/prompt-sections.d.ts +163 -0
- package/dist/shared/prompt-sections.js +164 -0
- package/dist/shared/prompt-sections.js.map +1 -0
- package/dist/shared/skill-resolver.d.ts +4 -2
- package/dist/shared/skill-resolver.js +4 -2
- package/dist/shared/skill-resolver.js.map +1 -1
- package/dist/shared/tool-rounds.d.ts +32 -0
- package/dist/shared/tool-rounds.js +43 -0
- package/dist/shared/tool-rounds.js.map +1 -1
- package/dist/shared/tool-row.d.ts +34 -0
- package/dist/shared/tool-row.js +52 -0
- package/dist/shared/tool-row.js.map +1 -1
- package/dist/shared/workspace/session-provision.d.ts +3 -3
- package/dist/shared/workspace/session-provision.js +3 -3
- package/dist/shared/workspace/stigmer-link.d.ts +3 -3
- package/dist/shared/workspace/stigmer-link.js +3 -3
- package/dist/shared/workspace/writeback-coordinator.d.ts +15 -22
- package/dist/shared/workspace/writeback-coordinator.js +16 -53
- package/dist/shared/workspace/writeback-coordinator.js.map +1 -1
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.js +1 -1
- package/package.json +4 -4
- package/src/__test-utils__/__tests__/harness-contract-self-check.test.ts +1 -0
- package/src/__test-utils__/execution-record-fixture.ts +18 -2
- package/src/__test-utils__/file-review-projection.ts +156 -0
- package/src/__test-utils__/git-workspace-fixture.ts +58 -0
- package/src/__test-utils__/harness-boot-order-child.ts +7 -2
- package/src/__test-utils__/harness-contract/contract.ts +33 -20
- package/src/__test-utils__/harness-contract/recording-sink.ts +11 -1
- package/src/__test-utils__/harness-contract/runtime-contract.ts +328 -10
- package/src/__test-utils__/harness-contract/scripted-adapter.ts +38 -6
- package/src/__test-utils__/harness-contract/types.ts +27 -3
- package/src/__test-utils__/hermetic-activity.ts +52 -14
- package/src/__test-utils__/model-registry-fixture.ts +32 -7
- package/src/__test-utils__/module-specifiers.ts +24 -0
- package/src/__test-utils__/turn-input-fixture.ts +2 -2
- package/src/__tests__/harness-boot-order.test.ts +9 -2
- package/src/activities/call-agent.ts +2 -2
- package/src/activities/execute-cursor/__test-utils__/contract-subject.ts +47 -3
- package/src/activities/execute-cursor/__test-utils__/hermetic-cursor.ts +2 -48
- package/src/activities/execute-cursor/__tests__/approval-decisions-agree.test.ts +1 -1
- package/src/activities/execute-cursor/__tests__/approval-gate.test.ts +6 -1
- package/src/activities/execute-cursor/__tests__/build-prompt.test.ts +52 -27
- package/src/activities/execute-cursor/__tests__/cas-observations.test.ts +25 -0
- package/src/activities/execute-cursor/__tests__/goldens/prompt.enhanced.everything.prompt.md +166 -0
- package/src/activities/execute-cursor/__tests__/goldens/prompt.enhanced.plan-mode.prompt.md +186 -0
- package/src/activities/execute-cursor/__tests__/goldens/prompt.hitl.recovery.prompt.md +191 -0
- package/src/activities/execute-cursor/__tests__/goldens/prompt.hitl.reinvocation.prompt.md +13 -0
- package/src/activities/execute-cursor/__tests__/goldens/prompt.resumed.prefixed.prompt.md +32 -0
- package/src/activities/execute-cursor/__tests__/goldens/prompt.resumed.raw.prompt.md +1 -0
- package/src/activities/execute-cursor/__tests__/hermetic/file-review-capture.test.ts +1 -2
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/sdk-error-at-create.status.json +4 -0
- package/src/activities/execute-cursor/__tests__/hermetic/harness-contract.test.ts +24 -4
- package/src/activities/execute-cursor/__tests__/hermetic/stream-self-stop-arms.test.ts +6 -5
- package/src/activities/execute-cursor/__tests__/hermetic/thrown-error-arms.test.ts +9 -0
- package/src/activities/execute-cursor/__tests__/hitl-resume-history.test.ts +11 -8
- package/src/activities/execute-cursor/__tests__/prompt-goldens.test.ts +229 -0
- package/src/activities/execute-cursor/__tests__/same-identity-reproposal.test.ts +3 -3
- package/src/activities/execute-cursor/__tests__/sequential-gate-resume.test.ts +2 -2
- package/src/activities/execute-cursor/__tests__/turn-boundary.test.ts +78 -234
- package/src/activities/execute-cursor/__tests__/turn-stream.test.ts +1 -26
- package/src/activities/execute-cursor/adapter.ts +7 -5
- package/src/activities/execute-cursor/approval-policy.ts +5 -2
- package/src/activities/execute-cursor/approval-state.ts +16 -8
- package/src/activities/execute-cursor/cas-observations.ts +20 -2
- package/src/activities/execute-cursor/cursor-capabilities.ts +24 -5
- package/src/activities/execute-cursor/message-translator.ts +29 -41
- package/src/activities/execute-cursor/prompt-builder.ts +99 -157
- package/src/activities/execute-cursor/turn-boundary.ts +34 -140
- package/src/activities/execute-cursor/turn-settle.ts +37 -51
- package/src/activities/execute-cursor/turn-setup.ts +30 -70
- package/src/activities/execute-cursor/turn-stream.ts +8 -31
- package/src/activities/execute-cursor/turn.ts +5 -1
- package/src/activities/execute-deep-agent/__test-utils__/contract-subject.ts +391 -0
- package/src/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.ts +313 -0
- package/src/activities/execute-deep-agent/__test-utils__/hitl-script.ts +48 -0
- package/src/activities/execute-deep-agent/__test-utils__/scripted-model-module.ts +85 -0
- package/src/activities/execute-deep-agent/__test-utils__/scripted-model.ts +383 -36
- package/src/activities/execute-deep-agent/__tests__/adapter-graph-is-sdk-free.test.ts +76 -0
- package/src/activities/execute-deep-agent/__tests__/adapter-is-temporal-free.test.ts +47 -0
- package/src/activities/execute-deep-agent/__tests__/adapter.test.ts +80 -0
- package/src/activities/execute-deep-agent/__tests__/cas-capture-backend.test.ts +1 -1
- package/src/activities/execute-deep-agent/__tests__/execution-state-extended.test.ts +0 -2
- package/src/activities/execute-deep-agent/__tests__/execution-state.test.ts +0 -3
- package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.build-from-plan.prompt.md +172 -0
- package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.everything.prompt.md +167 -0
- package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.minimal.prompt.md +36 -0
- package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.plan-mode.prompt.md +178 -0
- package/src/activities/execute-deep-agent/__tests__/goldens/system-prompt.skills-below-threshold.prompt.md +158 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/file-review-capture.test.ts +210 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn1.status.json +74 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn2.status.json +104 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve.turn2.status.json +78 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/file-review-capture.status.json +138 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/gate.turn1.status.json +68 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn1.status.json +154 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn2.status.json +116 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.after-tool.status.json +69 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.mid-tool.status.json +67 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/plain-turn.status.json +47 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/platform-stop.status.json +68 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/recursion-limit.persisted.status.json +280 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/reject.turn2.status.json +77 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/resolution-error.status.json +18 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn2.status.json +99 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn3.status.json +109 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/skip.turn2.status.json +76 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/structured-output.text-fallback.status.json +51 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/structured-output.tier2.status.json +51 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/structured-output.tool-strategy.status.json +56 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sub-agent-delegation.status.json +90 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/tool-call.status.json +70 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/worker-shutdown.status.json +71 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/harness-contract.test.ts +144 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-approve-all-lease.test.ts +184 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-round-trips.test.ts +203 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-sequential-gates.test.ts +170 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/inline-artifact-across-gate.test.ts +175 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/pause-vs-shutdown.test.ts +206 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/plain-turn.test.ts +142 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/platform-stop.test.ts +126 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/recursion-limit.test.ts +139 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/resolution-error.test.ts +122 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/structured-output.test.ts +236 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/sub-agent-delegation.test.ts +161 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/tool-call.test.ts +157 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/workspace-lock-timeout.test.ts +152 -0
- package/src/activities/execute-deep-agent/__tests__/hitl.test.ts +50 -122
- package/src/activities/execute-deep-agent/__tests__/inline-publisher.test.ts +8 -6
- package/src/activities/execute-deep-agent/__tests__/plan-mode-path-normalization.test.ts +2 -2
- package/src/activities/execute-deep-agent/__tests__/prompt-builder.test.ts +35 -35
- package/src/activities/execute-deep-agent/__tests__/prompt-goldens.test.ts +247 -0
- package/src/activities/execute-deep-agent/__tests__/scripted-model.test.ts +329 -0
- package/src/activities/execute-deep-agent/__tests__/status-builder-shared.test.ts +1 -20
- package/src/activities/execute-deep-agent/__tests__/streaming-side-effects.test.ts +78 -0
- package/src/activities/execute-deep-agent/__tests__/subagent-gitignored-capture.test.ts +1 -1
- package/src/activities/execute-deep-agent/__tests__/subagent-plan-mode-permissions.test.ts +2 -2
- package/src/activities/execute-deep-agent/__tests__/subagent-tracker.test.ts +57 -31
- package/src/activities/execute-deep-agent/__tests__/subagent-transformer.test.ts +19 -79
- package/src/activities/execute-deep-agent/__tests__/subagent-wiring.test.ts +15 -15
- package/src/activities/execute-deep-agent/__tests__/summarization-verification.test.ts +1 -1
- package/src/activities/execute-deep-agent/__tests__/turn-stream.test.ts +391 -0
- package/src/activities/execute-deep-agent/__tests__/v3-status-builder.test.ts +343 -38
- package/src/activities/execute-deep-agent/__tests__/vision-input.test.ts +5 -5
- package/src/activities/execute-deep-agent/adapter.ts +94 -0
- package/src/activities/execute-deep-agent/cas-capture-observer.ts +11 -0
- package/src/activities/execute-deep-agent/deep-agent-capabilities.ts +43 -0
- package/src/activities/execute-deep-agent/execution-state.ts +4 -13
- package/src/activities/execute-deep-agent/hitl.ts +100 -123
- package/src/activities/execute-deep-agent/prompt-builder.ts +141 -115
- package/src/activities/execute-deep-agent/status-builder-shared.ts +21 -84
- package/src/activities/execute-deep-agent/streaming-side-effects.ts +13 -19
- package/src/activities/execute-deep-agent/subagent-tracker.ts +77 -42
- package/src/activities/execute-deep-agent/subagent-transformer.ts +46 -105
- package/src/activities/execute-deep-agent/subagent-wiring.ts +5 -4
- package/src/activities/execute-deep-agent/turn-settle.ts +164 -0
- package/src/activities/execute-deep-agent/turn-setup.ts +541 -0
- package/src/activities/execute-deep-agent/turn-stream.ts +313 -0
- package/src/activities/execute-deep-agent/turn.ts +131 -0
- package/src/activities/execute-deep-agent/v3-event-recorder.ts +6 -5
- package/src/activities/execute-deep-agent/v3-events.ts +1 -1
- package/src/activities/execute-deep-agent/v3-status-builder.ts +84 -63
- package/src/harness/__tests__/approval-decisions.test.ts +116 -0
- package/src/harness/__tests__/capture.test.ts +268 -0
- package/src/harness/__tests__/mount-skills.test.ts +169 -0
- package/src/harness/__tests__/persist-chokepoint.test.ts +38 -2
- package/src/harness/__tests__/run-turn-deterministic.test.ts +94 -0
- package/src/harness/__tests__/run-turn.test.ts +39 -23
- package/src/harness/__tests__/turn-attachments-vision.test.ts +80 -0
- package/src/harness/__tests__/turn-context.test.ts +73 -26
- package/src/harness/approval-decisions.ts +104 -0
- package/src/harness/capabilities.ts +16 -5
- package/src/harness/capture.ts +301 -0
- package/src/harness/persist-chokepoint.ts +24 -4
- package/src/harness/run-turn.ts +120 -29
- package/src/harness/terminal-table.ts +61 -20
- package/src/harness/turn-context.ts +208 -111
- package/src/harness/types.ts +66 -12
- package/src/harness-adapters.ts +17 -9
- package/src/middleware/__tests__/approval-gate.test.ts +1 -1
- package/src/middleware/__tests__/cost-advisory.test.ts +113 -0
- package/src/middleware/approval-gate.ts +2 -2
- package/src/middleware/{cost-cap.ts → cost-advisory.ts} +40 -70
- package/src/middleware/index.ts +29 -29
- package/src/middleware/types.ts +3 -2
- package/src/runner-manager.ts +0 -8
- package/src/runner.ts +0 -8
- package/src/shared/__tests__/attachment-naming.test.ts +6 -19
- package/src/shared/__tests__/attachment-resolver.test.ts +158 -8
- package/src/shared/__tests__/attachment-zip.test.ts +236 -0
- package/src/shared/__tests__/bedrock-adapter.test.ts +1 -1
- package/src/shared/__tests__/blueprint-resolver.test.ts +43 -0
- package/src/shared/__tests__/cost-guard.test.ts +3 -3
- package/src/shared/__tests__/prompt-sections.test.ts +167 -0
- package/src/shared/__tests__/secret-leak-scan.test.ts +2 -2
- package/src/{activities/execute-deep-agent → shared}/__tests__/stamp-flowed-rows.test.ts +33 -10
- package/src/shared/__tests__/vertex-adapter.test.ts +1 -1
- package/src/shared/attachment-resolver.ts +218 -55
- package/src/shared/attachment-zip.ts +281 -0
- package/src/shared/connect-backfill.ts +9 -11
- package/src/shared/cost-guard.ts +3 -3
- package/src/shared/execution-status-writer.ts +5 -5
- package/src/shared/extract-structured-output.ts +8 -7
- package/src/shared/filereview/__tests__/capture.test.ts +86 -4
- package/src/shared/filereview/__tests__/cas-progress.test.ts +2 -1
- package/src/shared/filereview/cas-progress.ts +5 -19
- package/src/shared/filereview/cas-touched.ts +89 -0
- package/src/shared/filereview/index.ts +4 -2
- package/src/shared/mcp-resolver.ts +4 -5
- package/src/shared/persist-decision.ts +3 -4
- package/src/shared/plan-mode-permissions.ts +2 -2
- package/src/shared/plan-mode-prompt.ts +1 -1
- package/src/shared/prompt-sections.ts +256 -0
- package/src/shared/skill-resolver.ts +4 -2
- package/src/shared/tool-rounds.ts +48 -0
- package/src/shared/tool-row.ts +61 -0
- package/src/shared/workspace/__tests__/stigmer-link.test.ts +7 -22
- package/src/shared/workspace/__tests__/writeback-coordinator.test.ts +20 -61
- package/src/shared/workspace/session-provision.ts +3 -3
- package/src/shared/workspace/stigmer-link.ts +3 -3
- package/src/shared/workspace/writeback-coordinator.ts +16 -64
- package/src/tools/index.ts +1 -1
- package/dist/activities/execute-cursor/capture-flow.d.ts +0 -142
- package/dist/activities/execute-cursor/capture-flow.js +0 -285
- package/dist/activities/execute-cursor/capture-flow.js.map +0 -1
- package/dist/activities/execute-cursor/command-provenance.d.ts +0 -48
- package/dist/activities/execute-cursor/command-provenance.js +0 -38
- package/dist/activities/execute-cursor/command-provenance.js.map +0 -1
- package/dist/activities/execute-deep-agent/attachment-injector.d.ts +0 -134
- package/dist/activities/execute-deep-agent/attachment-injector.js +0 -386
- package/dist/activities/execute-deep-agent/attachment-injector.js.map +0 -1
- package/dist/activities/execute-deep-agent/command-provenance.d.ts +0 -61
- package/dist/activities/execute-deep-agent/command-provenance.js +0 -72
- package/dist/activities/execute-deep-agent/command-provenance.js.map +0 -1
- package/dist/activities/execute-deep-agent/environment.d.ts +0 -24
- package/dist/activities/execute-deep-agent/environment.js +0 -58
- package/dist/activities/execute-deep-agent/environment.js.map +0 -1
- package/dist/activities/execute-deep-agent/event-recorder.d.ts +0 -21
- package/dist/activities/execute-deep-agent/event-recorder.js +0 -67
- package/dist/activities/execute-deep-agent/event-recorder.js.map +0 -1
- package/dist/activities/execute-deep-agent/index.d.ts +0 -15
- package/dist/activities/execute-deep-agent/index.js +0 -918
- package/dist/activities/execute-deep-agent/index.js.map +0 -1
- package/dist/activities/execute-deep-agent/mcp-gate.d.ts +0 -28
- package/dist/activities/execute-deep-agent/mcp-gate.js +0 -22
- package/dist/activities/execute-deep-agent/mcp-gate.js.map +0 -1
- package/dist/activities/execute-deep-agent/post-stream.d.ts +0 -23
- package/dist/activities/execute-deep-agent/post-stream.js +0 -71
- package/dist/activities/execute-deep-agent/post-stream.js.map +0 -1
- package/dist/activities/execute-deep-agent/setup.d.ts +0 -136
- package/dist/activities/execute-deep-agent/setup.js +0 -767
- package/dist/activities/execute-deep-agent/setup.js.map +0 -1
- package/dist/activities/execute-deep-agent/stamp-flowed-rows.d.ts +0 -36
- package/dist/activities/execute-deep-agent/stamp-flowed-rows.js +0 -56
- package/dist/activities/execute-deep-agent/stamp-flowed-rows.js.map +0 -1
- package/dist/activities/execute-deep-agent/status-builder.d.ts +0 -93
- package/dist/activities/execute-deep-agent/status-builder.js +0 -365
- package/dist/activities/execute-deep-agent/status-builder.js.map +0 -1
- package/dist/activities/execute-deep-agent/streaming-terminal.d.ts +0 -21
- package/dist/activities/execute-deep-agent/streaming-terminal.js +0 -80
- package/dist/activities/execute-deep-agent/streaming-terminal.js.map +0 -1
- package/dist/activities/execute-deep-agent/streaming-v3.d.ts +0 -13
- package/dist/activities/execute-deep-agent/streaming-v3.js +0 -174
- package/dist/activities/execute-deep-agent/streaming-v3.js.map +0 -1
- package/dist/activities/execute-deep-agent/streaming.d.ts +0 -81
- package/dist/activities/execute-deep-agent/streaming.js +0 -160
- package/dist/activities/execute-deep-agent/streaming.js.map +0 -1
- package/dist/middleware/cost-cap.d.ts +0 -22
- package/dist/middleware/cost-cap.js.map +0 -1
- package/dist/middleware/graceful-stop.d.ts +0 -17
- package/dist/middleware/graceful-stop.js +0 -63
- package/dist/middleware/graceful-stop.js.map +0 -1
- package/dist/shared/skill-writer.d.ts +0 -75
- package/dist/shared/skill-writer.js +0 -207
- package/dist/shared/skill-writer.js.map +0 -1
- package/src/activities/execute-cursor/__tests__/capture-flow.test.ts +0 -1032
- package/src/activities/execute-cursor/__tests__/command-provenance.test.ts +0 -240
- package/src/activities/execute-cursor/__tests__/progress-substrate.test.ts +0 -169
- package/src/activities/execute-cursor/capture-flow.ts +0 -379
- package/src/activities/execute-cursor/command-provenance.ts +0 -73
- package/src/activities/execute-deep-agent/__tests__/attachment-injector.test.ts +0 -1161
- package/src/activities/execute-deep-agent/__tests__/command-provenance.test.ts +0 -252
- package/src/activities/execute-deep-agent/__tests__/environment.test.ts +0 -108
- package/src/activities/execute-deep-agent/__tests__/event-recorder.test.ts +0 -150
- package/src/activities/execute-deep-agent/__tests__/hitl-integration.test.ts +0 -226
- package/src/activities/execute-deep-agent/__tests__/hitl-reject.test.ts +0 -318
- package/src/activities/execute-deep-agent/__tests__/hitl-resume-approve-all.test.ts +0 -351
- package/src/activities/execute-deep-agent/__tests__/hitl-resume-history.test.ts +0 -293
- package/src/activities/execute-deep-agent/__tests__/index.test.ts +0 -99
- package/src/activities/execute-deep-agent/__tests__/mcp-gate.test.ts +0 -44
- package/src/activities/execute-deep-agent/__tests__/post-stream.test.ts +0 -112
- package/src/activities/execute-deep-agent/__tests__/sequential-gate-resume.test.ts +0 -358
- package/src/activities/execute-deep-agent/__tests__/status-builder.test.ts +0 -1933
- package/src/activities/execute-deep-agent/__tests__/streaming-terminal.test.ts +0 -40
- package/src/activities/execute-deep-agent/__tests__/streaming-v3.test.ts +0 -597
- package/src/activities/execute-deep-agent/__tests__/streaming.test.ts +0 -508
- package/src/activities/execute-deep-agent/attachment-injector.ts +0 -627
- package/src/activities/execute-deep-agent/command-provenance.ts +0 -102
- package/src/activities/execute-deep-agent/environment.ts +0 -76
- package/src/activities/execute-deep-agent/event-recorder.ts +0 -95
- package/src/activities/execute-deep-agent/index.ts +0 -1072
- package/src/activities/execute-deep-agent/mcp-gate.ts +0 -37
- package/src/activities/execute-deep-agent/post-stream.ts +0 -109
- package/src/activities/execute-deep-agent/setup.ts +0 -1081
- package/src/activities/execute-deep-agent/stamp-flowed-rows.ts +0 -64
- package/src/activities/execute-deep-agent/status-builder.ts +0 -481
- package/src/activities/execute-deep-agent/streaming-terminal.ts +0 -106
- package/src/activities/execute-deep-agent/streaming-v3.ts +0 -277
- package/src/activities/execute-deep-agent/streaming.ts +0 -313
- package/src/middleware/__tests__/cost-cap.test.ts +0 -192
- package/src/middleware/__tests__/graceful-stop.test.ts +0 -105
- package/src/middleware/graceful-stop.ts +0 -86
- package/src/shared/__tests__/skill-writer.test.ts +0 -372
- package/src/shared/skill-writer.ts +0 -266
|
@@ -1,35 +1,37 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The Cursor harness's turn boundary — the
|
|
3
|
-
*
|
|
2
|
+
* The Cursor harness's turn boundary — the post-run pipeline that turns the
|
|
3
|
+
* deny-and-retry primitive's evidence into the runtime's review surfaces:
|
|
4
4
|
*
|
|
5
5
|
* 1. read the denial ledger the preToolUse hook appended this turn (ALL
|
|
6
6
|
* kinds — every entry means "this action did not execute"; only the
|
|
7
7
|
* approval-kind subset may pause, see approval-state.ts);
|
|
8
|
-
* 2.
|
|
9
|
-
* 3. capture the turn's net file change set to the file_review ledger
|
|
10
|
-
* (CANDIDATE_CAPTURED) and stamp the flowed edit rows;
|
|
11
|
-
* 4. reconcile denied (approval-kind) tool calls to WAITING_APPROVAL gate rows
|
|
8
|
+
* 2. reconcile denied (approval-kind) tool calls to WAITING_APPROVAL gate rows
|
|
12
9
|
* and redact the model's provisional post-denial narration;
|
|
13
|
-
*
|
|
10
|
+
* 3. settle unattended-mode denials as SKIPPED (DD-014);
|
|
11
|
+
* 4. detect UNATTRIBUTED hook blocks (issue #205) — a tool blocked by a hook
|
|
14
12
|
* with no ledger entry of any kind was denied by a FOREIGN hook the merge
|
|
15
13
|
* preserved, and the caller fails the run rather than completing silently;
|
|
16
|
-
*
|
|
14
|
+
* 5. settle UNRESOLVED tool calls (issue #965) — a this-turn row still
|
|
17
15
|
* non-terminal on a completing turn with no ledger attribution hung inside
|
|
18
16
|
* the harness and can never complete; it is settled to an honest
|
|
19
17
|
* TOOL_CALL_INTERRUPTED and disclosed on the transcript instead of being
|
|
20
18
|
* silently stamped by the server's terminal settle after the fact.
|
|
21
19
|
*
|
|
20
|
+
* `waiting` means "a denial pauses": a gated tool call the user must decide.
|
|
21
|
+
* The turn's FILE CHANGES are not this boundary's since S3 M4 — the runtime
|
|
22
|
+
* captures them once, over whatever the whole turn left on the tree, after
|
|
23
|
+
* `runTurn` returns (`harness/capture.ts`), and decides the review pause
|
|
24
|
+
* itself. Two consequences the boundary used to suppress when it could see
|
|
25
|
+
* the capture: steps 4 and 5 now run on a turn whose only pause would have
|
|
26
|
+
* been a file review, so a hung row is disclosed and a foreign-hook block is
|
|
27
|
+
* failed BEFORE the review rather than after it (F-M4-P9, F-M4-P10, Q-M4-11).
|
|
28
|
+
*
|
|
22
29
|
* Extracted from the activity entry point (index.ts Phase 12) so it is directly
|
|
23
30
|
* unit-testable AND re-enterable: the poisoned-handle / transport-timeout
|
|
24
31
|
* recoveries re-run the agent with a fresh handle AFTER the primary boundary
|
|
25
|
-
* already ran, so their
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* Re-entry is safe by construction: a retry is only reachable when the primary
|
|
30
|
-
* boundary captured nothing (a captured change pauses the turn before
|
|
31
|
-
* run.wait() is ever consulted), `stampFlowedFileEditRows` skips already-stamped
|
|
32
|
-
* rows, and the denial ledger is per-turn append-only.
|
|
32
|
+
* already ran, so their denials must flow through this exact pipeline again.
|
|
33
|
+
* Re-entry is safe by construction: the denial ledger is per-turn append-only
|
|
34
|
+
* and the reconcile is idempotent over it.
|
|
33
35
|
*
|
|
34
36
|
* The caller owns everything around the boundary: the stream epilogue
|
|
35
37
|
* (accumulator/enricher finalize), the WAITING_FOR_APPROVAL phase flip +
|
|
@@ -37,21 +39,14 @@
|
|
|
37
39
|
*/
|
|
38
40
|
|
|
39
41
|
import type { AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
40
|
-
import type { SubAgentExecution } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/subagent_pb";
|
|
41
|
-
import { collectSubAgentToolCallIds } from "../../shared/tool-row.js";
|
|
42
42
|
import { LocalWorkspaceBackend } from "../../shared/workspace/local-backend.js";
|
|
43
|
-
import type { ArtifactStorage } from "../../shared/artifact-storage.js";
|
|
44
43
|
import type { MergedToolPolicy } from "../../shared/approval-policy.js";
|
|
45
44
|
import {
|
|
46
45
|
approvalDenials,
|
|
47
46
|
denialKindOf,
|
|
48
|
-
primaryToken,
|
|
49
47
|
readDenialLedger,
|
|
50
48
|
unattendedDenials,
|
|
51
|
-
type ApprovalGrant,
|
|
52
49
|
} from "./approval-state.js";
|
|
53
|
-
import { deriveTurnCommandProvenance } from "./command-provenance.js";
|
|
54
|
-
import { captureTurnToLedger } from "./capture-flow.js";
|
|
55
50
|
import {
|
|
56
51
|
clearProvisionalPostDenialNarration,
|
|
57
52
|
detectUnattributedHookBlocks,
|
|
@@ -66,48 +61,25 @@ import { AgentMessageSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexec
|
|
|
66
61
|
import { MessageType } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
67
62
|
|
|
68
63
|
// How long the boundary waits for the first-denial-stop's run.cancel() to
|
|
69
|
-
// settle before reading the final denial ledger
|
|
70
|
-
//
|
|
71
|
-
//
|
|
64
|
+
// settle before reading the final denial ledger. Long enough for the SDK's
|
|
65
|
+
// normal teardown, short enough that a wedged cancel cannot noticeably delay
|
|
66
|
+
// the approval pause the user is already waiting on. (The runtime's capture
|
|
67
|
+
// runs after the adapter's whole turn, its gate already torn down, so a late
|
|
68
|
+
// tool can no longer mutate the tree mid-capture.)
|
|
72
69
|
const FIRST_DENIAL_CANCEL_TIMEOUT_MS = 5_000;
|
|
73
70
|
|
|
74
71
|
export interface TurnBoundaryOptions {
|
|
75
|
-
/** Mutated in place: gate rows overlaid,
|
|
72
|
+
/** Mutated in place: gate rows overlaid, narration redacted. */
|
|
76
73
|
readonly status: AgentExecutionStatus;
|
|
77
74
|
readonly executionId: string;
|
|
78
|
-
/**
|
|
79
|
-
readonly changeSetId: string;
|
|
80
|
-
/** Session HITL dir holding the denial ledger + CAS sidecar; undefined → no gate installed. */
|
|
75
|
+
/** Session HITL dir holding the denial ledger; undefined → no gate installed. */
|
|
81
76
|
readonly hitlDir: string | undefined;
|
|
82
|
-
/** Whether this turn runs apply-then-review capture (vs. the deny-gate fallback). */
|
|
83
|
-
readonly captureMode: boolean;
|
|
84
|
-
/**
|
|
85
|
-
* The baseline authored at turn start — the git tree sha for a git workspace,
|
|
86
|
-
* or "" (empty, but authored) for a non-git one. `undefined` means no baseline
|
|
87
|
-
* was authored this turn, which skips capture entirely; a plain truthiness
|
|
88
|
-
* check would wrongly skip the non-git capture.
|
|
89
|
-
*/
|
|
90
|
-
readonly baselineTree: string | undefined;
|
|
91
77
|
readonly primaryWorkspaceDir: string;
|
|
92
|
-
/** True for a git work tree; false for a CAS-only non-git workspace. */
|
|
93
|
-
readonly gitWorkspace: boolean;
|
|
94
78
|
/**
|
|
95
79
|
* Index of the first message produced by THIS turn's stream — the positional
|
|
96
|
-
*
|
|
80
|
+
* scope the #205 attribution and the #965 settle read.
|
|
97
81
|
*/
|
|
98
82
|
readonly turnStartMessageIndex: number;
|
|
99
|
-
/** Reinvocation grants; their tokens map back to the consent rows for DD-28. */
|
|
100
|
-
readonly approvalGrants: ApprovalGrant[] | undefined;
|
|
101
|
-
/** spec.auto_approve_all — qualifies every command as consented for DD-28. */
|
|
102
|
-
readonly globalBypass: boolean;
|
|
103
|
-
/**
|
|
104
|
-
* Sub-agent executions that existed BEFORE this turn's stream (cloned in on
|
|
105
|
-
* resume); their rows are skipped when stamping so a resume never re-stamps a
|
|
106
|
-
* prior turn's sub-agent rows.
|
|
107
|
-
*/
|
|
108
|
-
readonly seededSubAgents: readonly SubAgentExecution[];
|
|
109
|
-
/** CAS blob store for gitignored/non-git captures; undefined → git-only capture. */
|
|
110
|
-
readonly artifactStorage: ArtifactStorage | undefined;
|
|
111
83
|
/** Merged approval policies, threaded to the denied-call reconcile for gate provenance. */
|
|
112
84
|
readonly mergedPolicies: ReadonlyMap<string, MergedToolPolicy>;
|
|
113
85
|
/**
|
|
@@ -132,13 +104,11 @@ export interface TurnBoundaryOptions {
|
|
|
132
104
|
|
|
133
105
|
export interface TurnBoundaryResult {
|
|
134
106
|
/**
|
|
135
|
-
* True when
|
|
136
|
-
*
|
|
137
|
-
*
|
|
107
|
+
* True when a denial pauses the turn — at least one gated tool call the
|
|
108
|
+
* user must decide. The caller ends the turn `awaiting_approval` without
|
|
109
|
+
* consulting run.wait().
|
|
138
110
|
*/
|
|
139
111
|
readonly waiting: boolean;
|
|
140
|
-
/** File changes authored to the file_review ledger this call (0 = no candidate). */
|
|
141
|
-
readonly capturedChangeCount: number;
|
|
142
112
|
/** Denied tool calls reconciled to WAITING_APPROVAL gate rows this call. */
|
|
143
113
|
readonly deniedToolCallCount: number;
|
|
144
114
|
/**
|
|
@@ -163,9 +133,9 @@ export interface TurnBoundaryResult {
|
|
|
163
133
|
}
|
|
164
134
|
|
|
165
135
|
/**
|
|
166
|
-
* Run the turn boundary:
|
|
167
|
-
*
|
|
168
|
-
*
|
|
136
|
+
* Run the turn boundary: overlay the hook's denials as approval gates and
|
|
137
|
+
* settle what the ledger accounts for. Mutates `opts.status` in place and
|
|
138
|
+
* reports whether a denial pauses the turn.
|
|
169
139
|
*
|
|
170
140
|
* The hook records each denial to the ledger; we mark the corresponding tool
|
|
171
141
|
* calls WAITING_APPROVAL. The backend projects pending_approvals from that
|
|
@@ -178,17 +148,9 @@ export async function runTurnBoundary(opts: TurnBoundaryOptions): Promise<TurnBo
|
|
|
178
148
|
const {
|
|
179
149
|
status,
|
|
180
150
|
executionId,
|
|
181
|
-
changeSetId,
|
|
182
151
|
hitlDir,
|
|
183
|
-
captureMode,
|
|
184
|
-
baselineTree,
|
|
185
152
|
primaryWorkspaceDir,
|
|
186
|
-
gitWorkspace,
|
|
187
153
|
turnStartMessageIndex,
|
|
188
|
-
approvalGrants,
|
|
189
|
-
globalBypass,
|
|
190
|
-
seededSubAgents,
|
|
191
|
-
artifactStorage,
|
|
192
154
|
mergedPolicies,
|
|
193
155
|
denialCancelSettled,
|
|
194
156
|
foreignGatingHooks,
|
|
@@ -207,79 +169,12 @@ export async function runTurnBoundary(opts: TurnBoundaryOptions): Promise<TurnBo
|
|
|
207
169
|
}
|
|
208
170
|
// The FULL ledger (all kinds) vs its APPROVAL subset — the kind split:
|
|
209
171
|
// every ledger entry means "this action did NOT execute", so the full set
|
|
210
|
-
// feeds
|
|
172
|
+
// feeds the unattended settle and the foreign-hook attribution;
|
|
211
173
|
// only approval-kind entries may become WAITING_APPROVAL gates (a secret
|
|
212
174
|
// hard-block or fail-closed deny is attributable but never pausable).
|
|
213
175
|
const deniedLedger = await readDenialLedger(hitlDir ?? "");
|
|
214
176
|
const approvalLedger = approvalDenials(deniedLedger);
|
|
215
177
|
|
|
216
|
-
// Capture mode: author the net change set to the file_review ledger as the
|
|
217
|
-
// CANDIDATE_CAPTURED event (projected server-side to a file_change_set
|
|
218
|
-
// AWAITING_REVIEW — the single review surface). The runner-owned gate files
|
|
219
|
-
// are excluded from the capture. The agent's edits are LEFT applied on the
|
|
220
|
-
// working tree (Cursor parity — the user reviews the real change; nothing is
|
|
221
|
-
// committed and the next turn is blocked until approval, and a reject snaps
|
|
222
|
-
// each file back on resume). Runs BEFORE the denial reconcile so a denied
|
|
223
|
-
// (gitignored) write stays on the deny-gate path while every flowed edit is
|
|
224
|
-
// captured to the ledger.
|
|
225
|
-
let capturedChangeCount = 0;
|
|
226
|
-
if (captureMode && baselineTree !== undefined && primaryWorkspaceDir) {
|
|
227
|
-
const deniedTokens = new Set(deniedLedger.map((e) => e.token));
|
|
228
|
-
// Approved-command turn facts (DD-28): when every mutation-capable call
|
|
229
|
-
// this turn was a consented shell command, attach the provenance so the
|
|
230
|
-
// backend can verify the cited consent rows and auto-keep the set instead
|
|
231
|
-
// of arming a second gate. Fail-closed: any non-qualifying turn attaches
|
|
232
|
-
// nothing and reviews manually exactly as before.
|
|
233
|
-
const commandProvenance = deriveTurnCommandProvenance({
|
|
234
|
-
messages: status.messages,
|
|
235
|
-
turnStartIndex: turnStartMessageIndex,
|
|
236
|
-
deniedTokens,
|
|
237
|
-
grantTokenToConsentId: new Map(
|
|
238
|
-
(approvalGrants ?? []).map((g) => [
|
|
239
|
-
primaryToken(g.key, g.salient, g.contentDigest),
|
|
240
|
-
g.sourceToolCallId,
|
|
241
|
-
]),
|
|
242
|
-
),
|
|
243
|
-
globalBypass,
|
|
244
|
-
});
|
|
245
|
-
if (commandProvenance) {
|
|
246
|
-
console.log(
|
|
247
|
-
`ExecuteCursor capture: turn qualifies for approved-command auto-keep ` +
|
|
248
|
-
`(consent rows: ${commandProvenance.consentToolCallIds.join(",") || "(auto_approve_all)"}); ` +
|
|
249
|
-
`attaching provenance to candidate (execution=${executionId})`,
|
|
250
|
-
);
|
|
251
|
-
}
|
|
252
|
-
const captured = await captureTurnToLedger({
|
|
253
|
-
status,
|
|
254
|
-
gitRoot: primaryWorkspaceDir,
|
|
255
|
-
executionId,
|
|
256
|
-
changeSetId,
|
|
257
|
-
baselineTree,
|
|
258
|
-
messages: status.messages,
|
|
259
|
-
deniedTokens,
|
|
260
|
-
commandProvenance,
|
|
261
|
-
// Scope sub-agent row stamping to this turn: the seeded prior sub-agents
|
|
262
|
-
// (cloned in on resume) are the "before this turn" rows to skip.
|
|
263
|
-
priorSubAgentToolCallIds: collectSubAgentToolCallIds(seededSubAgents),
|
|
264
|
-
// The CAS half: read the sidecar the hook staged this turn and compose it
|
|
265
|
-
// into the change set. hitlDir + storage are present when captureIgnored
|
|
266
|
-
// was on (a git tree's gitignored writes, or ALL writes in a non-git
|
|
267
|
-
// workspace). In a git tree this composes with the git diff (HYBRID); in a
|
|
268
|
-
// non-git workspace it IS the whole change set (CAS-only).
|
|
269
|
-
hitlDir,
|
|
270
|
-
storage: artifactStorage,
|
|
271
|
-
gitWorkspace,
|
|
272
|
-
});
|
|
273
|
-
capturedChangeCount = captured.length;
|
|
274
|
-
if (capturedChangeCount > 0) {
|
|
275
|
-
console.log(
|
|
276
|
-
`ExecuteCursor capture: ${capturedChangeCount} file change(s) authored to the ` +
|
|
277
|
-
`file_review ledger (change_set=${changeSetId}), working tree left applied ` +
|
|
278
|
-
`for review (execution=${executionId})`,
|
|
279
|
-
);
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
|
|
283
178
|
// The gate reads each denied file's pre-edit `before` from the workspace the
|
|
284
179
|
// runner is co-located with (local FS for OSS; the sandbox in cloud), so a
|
|
285
180
|
// whole-file rewrite gate renders a true before/after diff. The tool was
|
|
@@ -357,7 +252,7 @@ export async function runTurnBoundary(opts: TurnBoundaryOptions): Promise<TurnBo
|
|
|
357
252
|
deniedLedger,
|
|
358
253
|
primaryWorkspaceDir,
|
|
359
254
|
);
|
|
360
|
-
const waiting = deniedToolCalls.length > 0
|
|
255
|
+
const waiting = deniedToolCalls.length > 0;
|
|
361
256
|
|
|
362
257
|
// Issue #965 invariant: an unresolved tool must never silently complete.
|
|
363
258
|
// On a COMPLETING (non-pausing) turn, any this-turn row still PENDING /
|
|
@@ -426,7 +321,6 @@ export async function runTurnBoundary(opts: TurnBoundaryOptions): Promise<TurnBo
|
|
|
426
321
|
|
|
427
322
|
return {
|
|
428
323
|
waiting,
|
|
429
|
-
capturedChangeCount,
|
|
430
324
|
deniedToolCallCount: deniedToolCalls.length,
|
|
431
325
|
unattributedHookBlocks,
|
|
432
326
|
settledUnresolvedCount: settledUnresolved.length,
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
* In order: the post-stream finalize (transcript, enrichments, sub-agents,
|
|
5
5
|
* the usage snapshot's carrier, the recorder flush, one persist so the UI
|
|
6
6
|
* sees settled rows); the runtime's stop, if it fired, settled as
|
|
7
|
-
* `interrupted` with nothing further; the turn boundary (`turn-boundary.ts
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
7
|
+
* `interrupted` with nothing further; the turn boundary (`turn-boundary.ts`)
|
|
8
|
+
* that overlays the hook's denials as WAITING rows, ending `awaiting_approval`
|
|
9
|
+
* when a denial pauses or failing on an unattributed hook block (#205);
|
|
10
|
+
* `run.wait()` and the
|
|
11
11
|
* classifier; the two recovery spines (a poisoned resumed handle, a
|
|
12
12
|
* transport timeout on a created agent), each running the IDENTICAL stream,
|
|
13
13
|
* finalize and boundary against a fresh agent at most once; the collapse of
|
|
@@ -15,9 +15,13 @@
|
|
|
15
15
|
*
|
|
16
16
|
* What this module never does: write a phase, a terminal copy or
|
|
17
17
|
* `completedAt` — those are the runtime's (`harness/run-turn.ts`,
|
|
18
|
-
* `terminal-table.ts`); the
|
|
19
|
-
*
|
|
20
|
-
*
|
|
18
|
+
* `terminal-table.ts`); capture the turn's file changes or decide whether a
|
|
19
|
+
* review is pending — the runtime's too (`harness/capture.ts`, once over the
|
|
20
|
+
* whole turn after this settle returns, so a recovery's edits reach review
|
|
21
|
+
* without the boundary being re-entered for them; S3 M4). The outcome carries
|
|
22
|
+
* what the runtime cannot read from the status (`failed`'s message and
|
|
23
|
+
* surface, `cancelled`). It does mutate `sink.status`'s transcript rows,
|
|
24
|
+
* which are this harness's to write.
|
|
21
25
|
*
|
|
22
26
|
* Moved from `index.ts` `executeCursorInner` phases 11 to 13 at S2 M3b; the
|
|
23
27
|
* bodies are the orchestrator's, with the runtime's arms taken out.
|
|
@@ -133,15 +137,15 @@ export async function streamAndSettle(frame: CursorTurnFrame): Promise<TurnOutco
|
|
|
133
137
|
}
|
|
134
138
|
|
|
135
139
|
// Everything at an index >= this was produced by THIS turn's stream — the
|
|
136
|
-
// positional
|
|
137
|
-
//
|
|
140
|
+
// positional scope the boundary's #205 attribution and #965 settle read.
|
|
141
|
+
// Snapshotted before the accumulator can append.
|
|
138
142
|
const turnStartMessageIndex = status.messages.length;
|
|
139
143
|
|
|
140
144
|
const accumulator = new MessageAccumulator(status.messages, {
|
|
141
145
|
mergedPolicies: mcp.policies,
|
|
142
146
|
provenance: { globalBypass: mcp.leases.global, leasedCategories: mcp.leases.categories },
|
|
143
147
|
workspaceRoot: workspace.primaryDir,
|
|
144
|
-
|
|
148
|
+
subAgentExecutions: status.subAgentExecutions,
|
|
145
149
|
});
|
|
146
150
|
// Shared cadence with the native harness: discrete state changes force a
|
|
147
151
|
// flush; high-frequency token deltas ride this scheduler's time cadence
|
|
@@ -156,9 +160,6 @@ export async function streamAndSettle(frame: CursorTurnFrame): Promise<TurnOutco
|
|
|
156
160
|
todoTracker,
|
|
157
161
|
eventRecorder,
|
|
158
162
|
scheduler,
|
|
159
|
-
progressSubstrate: gate.progressSubstrate,
|
|
160
|
-
progressState: gate.progressState,
|
|
161
|
-
changeSetId: workspace.changeSetId,
|
|
162
163
|
hitlDir: gate.hitlDir,
|
|
163
164
|
};
|
|
164
165
|
|
|
@@ -177,7 +178,6 @@ export async function streamAndSettle(frame: CursorTurnFrame): Promise<TurnOutco
|
|
|
177
178
|
if (sink.stopSignal.aborted) {
|
|
178
179
|
accumulator.cancelInProgressSubAgents();
|
|
179
180
|
}
|
|
180
|
-
status.subAgentExecutions = accumulator.subAgentExecutions;
|
|
181
181
|
await eventRecorder?.flush();
|
|
182
182
|
console.log(
|
|
183
183
|
`ExecuteCursor stream ended: execution=${executionId}, events=${streamState.eventCount}, messages=${status.messages.length}, subAgents=${status.subAgentExecutions.length}`,
|
|
@@ -188,41 +188,28 @@ export async function streamAndSettle(frame: CursorTurnFrame): Promise<TurnOutco
|
|
|
188
188
|
sink.recordActivity();
|
|
189
189
|
};
|
|
190
190
|
|
|
191
|
-
// The turn boundary —
|
|
192
|
-
//
|
|
193
|
-
//
|
|
194
|
-
//
|
|
195
|
-
//
|
|
196
|
-
// re-enter the IDENTICAL pipeline — a retry's edits must reach the ledger
|
|
197
|
-
// or they silently escape review.
|
|
191
|
+
// The turn boundary — overlay the hook's denials as WAITING_APPROVAL gate
|
|
192
|
+
// rows and settle what the ledger accounts for. The pipeline and its
|
|
193
|
+
// ordering rationale live in turn-boundary.ts; this closure binds the
|
|
194
|
+
// turn's state so the recovery retries (which re-run the agent AFTER this
|
|
195
|
+
// primary call) re-enter the IDENTICAL pipeline for their denials.
|
|
198
196
|
const runBoundary = (denialSettled?: Promise<void>): Promise<TurnBoundaryResult> =>
|
|
199
197
|
runTurnBoundary({
|
|
200
198
|
status,
|
|
201
199
|
executionId,
|
|
202
|
-
changeSetId: workspace.changeSetId,
|
|
203
200
|
hitlDir: gate.hitlDir,
|
|
204
|
-
captureMode: workspace.captureMode,
|
|
205
|
-
baselineTree: gate.baselineTree,
|
|
206
201
|
primaryWorkspaceDir: workspace.primaryDir,
|
|
207
|
-
gitWorkspace: workspace.gitWorkspace,
|
|
208
202
|
turnStartMessageIndex,
|
|
209
|
-
approvalGrants: gate.approvalGrants,
|
|
210
|
-
globalBypass: mcp.leases.global,
|
|
211
|
-
seededSubAgents: rows.seededSubAgents,
|
|
212
|
-
artifactStorage: input.artifactStorage,
|
|
213
203
|
mergedPolicies: mcp.policies,
|
|
214
204
|
denialCancelSettled: denialSettled,
|
|
215
205
|
foreignGatingHooks: gate.hitlGate.foreignGatingHooks,
|
|
216
206
|
});
|
|
217
207
|
|
|
218
|
-
// The boundary mutated the transcript in place and
|
|
219
|
-
//
|
|
220
|
-
// workflow, which waits for the approval
|
|
208
|
+
// The boundary mutated the transcript in place and a denial pauses the
|
|
209
|
+
// turn: the runtime flips the phase, persists, and returns to the
|
|
210
|
+
// workflow, which waits for the approval signal and reinvokes.
|
|
221
211
|
const awaitingApproval = (boundary: TurnBoundaryResult): TurnOutcome => {
|
|
222
|
-
console.log(
|
|
223
|
-
`ExecuteCursor returning WAITING_FOR_APPROVAL: ${boundary.deniedToolCallCount} gated tool(s), ` +
|
|
224
|
-
`${boundary.capturedChangeCount} file card(s) pending`,
|
|
225
|
-
);
|
|
212
|
+
console.log(`ExecuteCursor returning WAITING_FOR_APPROVAL: ${boundary.deniedToolCallCount} gated tool(s)`);
|
|
226
213
|
return { kind: "awaiting_approval" };
|
|
227
214
|
};
|
|
228
215
|
|
|
@@ -252,13 +239,13 @@ export async function streamAndSettle(frame: CursorTurnFrame): Promise<TurnOutco
|
|
|
252
239
|
return { kind: "failed", surface: "actionable", message };
|
|
253
240
|
};
|
|
254
241
|
|
|
255
|
-
// Re-enter the turn boundary for a recovery retry:
|
|
256
|
-
//
|
|
257
|
-
//
|
|
258
|
-
// aex_01kws27q1e2esvkqjpvectttxf
|
|
259
|
-
// there is no
|
|
260
|
-
//
|
|
261
|
-
// exactly like the primary path.
|
|
242
|
+
// Re-enter the turn boundary for a recovery retry: overlay the retry's
|
|
243
|
+
// denials as gates. (Its file edits need no re-entry: the runtime captures
|
|
244
|
+
// the whole turn's tree once after `runTurn` returns — the shape production
|
|
245
|
+
// case aex_01kws27q1e2esvkqjpvectttxf asked for, now by construction.)
|
|
246
|
+
// Returns undefined for a cancelled retry — there is no gate to open.
|
|
247
|
+
// Passes denialCancelSettled so a first denial that stopped the RETRY waits
|
|
248
|
+
// for run.cancel() before the ledger read, exactly like the primary path.
|
|
262
249
|
const settleRetryTurn = async (retryResultStatus: string): Promise<TurnBoundaryResult | undefined> =>
|
|
263
250
|
retryResultStatus === "cancelled"
|
|
264
251
|
? undefined
|
|
@@ -419,11 +406,10 @@ export async function streamAndSettle(frame: CursorTurnFrame): Promise<TurnOutco
|
|
|
419
406
|
|
|
420
407
|
const { retryRun, retryResult, retryBoundary } = recovery;
|
|
421
408
|
if (retryBoundary?.waiting) {
|
|
422
|
-
// The retry's
|
|
423
|
-
// retry error this supersedes the failure, exactly as on the
|
|
424
|
-
// path
|
|
425
|
-
|
|
426
|
-
console.log(`ExecuteCursor poisoned-handle recovery paused for review: execution=${executionId}`);
|
|
409
|
+
// The retry's denials armed the gate — pause for approval. On a
|
|
410
|
+
// retry error this supersedes the failure, exactly as on the
|
|
411
|
+
// primary path.
|
|
412
|
+
console.log(`ExecuteCursor poisoned-handle recovery paused for approval: execution=${executionId}`);
|
|
427
413
|
return awaitingApproval(retryBoundary);
|
|
428
414
|
}
|
|
429
415
|
if (retryBoundary && retryBoundary.unattributedHookBlocks.length > 0) {
|
|
@@ -484,9 +470,9 @@ export async function streamAndSettle(frame: CursorTurnFrame): Promise<TurnOutco
|
|
|
484
470
|
|
|
485
471
|
const { retryResult, retryBoundary } = recovery;
|
|
486
472
|
if (retryBoundary?.waiting) {
|
|
487
|
-
// The retry's
|
|
488
|
-
//
|
|
489
|
-
console.log(`ExecuteCursor transport-timeout recovery paused for
|
|
473
|
+
// The retry's denials armed the gate — pause for approval (see the
|
|
474
|
+
// poisoned-handle branch above for the precedence rationale).
|
|
475
|
+
console.log(`ExecuteCursor transport-timeout recovery paused for approval: execution=${executionId}`);
|
|
490
476
|
return awaitingApproval(retryBoundary);
|
|
491
477
|
}
|
|
492
478
|
if (retryBoundary && retryBoundary.unattributedHookBlocks.length > 0) {
|