@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
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
* sequences them, and the adapter runs its own harness-specific steps after
|
|
17
17
|
* the whole record exists.
|
|
18
18
|
*
|
|
19
|
-
* Shape, chosen against `
|
|
20
|
-
* from small functions (the `SetupResult` mold),
|
|
21
|
-
* `performSetup`. The record is the adapter contract's `TurnInput`
|
|
19
|
+
* Shape, chosen against the native orchestrator's `setup.ts` (deleted at S3
|
|
20
|
+
* M2b): a typed record built from small functions (the `SetupResult` mold),
|
|
21
|
+
* never one 775-line `performSetup`. The record is the adapter contract's `TurnInput`
|
|
22
22
|
* (`types.ts`): every phase returns a named slice of it, and
|
|
23
23
|
* {@link resolveTurnContext} composes the whole. There is no wider
|
|
24
24
|
* "runtime-private" record beside it — the lock release and the write-back
|
|
@@ -66,15 +66,15 @@
|
|
|
66
66
|
|
|
67
67
|
import { CancelledFailure } from "@temporalio/activity";
|
|
68
68
|
import { clone } from "@bufbuild/protobuf";
|
|
69
|
-
import type
|
|
69
|
+
import { AgentExecutionStatusSchema, type AgentExecution, type AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
70
70
|
import type { AgentExecutionSpec } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/spec_pb";
|
|
71
|
-
import {
|
|
72
|
-
import { ApprovalAction, FileChangeSetStatus, ToolCallStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
71
|
+
import { ApprovalAction, FileChangeSetStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
73
72
|
import type { Session } from "@stigmer/protos/ai/stigmer/agentic/session/v1/api_pb";
|
|
74
73
|
|
|
75
74
|
import type { Config } from "../config.js";
|
|
76
75
|
import type { StigmerClient } from "../client/stigmer-client.js";
|
|
77
76
|
import type { NormalizedActivityInput } from "../shared/activity-input.js";
|
|
77
|
+
import { approvalDecisionsOf } from "./approval-decisions.js";
|
|
78
78
|
import type { ArtifactStorage } from "../shared/artifact-storage.js";
|
|
79
79
|
import type { TimingRecorder } from "../shared/cold-start-timing.js";
|
|
80
80
|
import { resolveBlueprint, type ResolvedBlueprint } from "../shared/blueprint-resolver.js";
|
|
@@ -104,7 +104,7 @@ import { deriveActiveLeases, mergeApprovalPolicies } from "../shared/approval-po
|
|
|
104
104
|
import { resolveAttachments } from "../shared/attachment-resolver.js";
|
|
105
105
|
import { resolveSkills, type SkillMetadata } from "../shared/skill-resolver.js";
|
|
106
106
|
import { VisionBudget, type NotViewableEntry, type VisionProfile } from "../shared/attachment-vision.js";
|
|
107
|
-
import { getModelVisionCapability } from "../shared/model-registry.js";
|
|
107
|
+
import { getDefaultModel, getModelVisionCapability } from "../shared/model-registry.js";
|
|
108
108
|
import { applyApprovedWholeFileWrites } from "../shared/exact-apply.js";
|
|
109
109
|
import { resolveEffectiveServiceTier } from "../shared/service-tier.js";
|
|
110
110
|
import { resolveEffectiveThinkingMode } from "../shared/thinking-mode.js";
|
|
@@ -115,13 +115,14 @@ import { readDeclaredPreferences } from "../shared/declared-preferences.js";
|
|
|
115
115
|
import { readConversationCatchup } from "../shared/conversation-catchup.js";
|
|
116
116
|
import { selectRecalledFacts } from "../shared/memory-retrieval.js";
|
|
117
117
|
import type { RecalledMemoriesContent } from "../shared/recalled-memories.js";
|
|
118
|
-
import type { FileReviewIdentity, HarnessCapabilities, StateIdSource } from "./capabilities.js";
|
|
118
|
+
import type { FileReviewIdentity, HarnessCapabilities, PausePrimitive, StateIdSource } from "./capabilities.js";
|
|
119
119
|
import type {
|
|
120
120
|
TurnAttachments,
|
|
121
121
|
TurnEnvironment,
|
|
122
122
|
TurnInput,
|
|
123
123
|
TurnMcp,
|
|
124
124
|
TurnModelPreferences,
|
|
125
|
+
TurnSkills,
|
|
125
126
|
TurnStandingContext,
|
|
126
127
|
TurnWorkspace,
|
|
127
128
|
} from "./types.js";
|
|
@@ -180,9 +181,8 @@ export interface ResolutionDeps {
|
|
|
180
181
|
* `TurnInput`: `isReinvocation` is the adapter's own derivation from
|
|
181
182
|
* `threadId` (the contract carries no flag by design, `types.ts` header) and
|
|
182
183
|
* the runtime reads it only inside {@link resolveTurnContext}; the decisions
|
|
183
|
-
* ARE on the input. The seeded
|
|
184
|
-
*
|
|
185
|
-
* overwrites it on every flush), so they ride nothing here.
|
|
184
|
+
* ARE on the input. The seeded rows of every kind are on `sink.status`
|
|
185
|
+
* ({@link seedFromPersistedStatus}); an adapter wraps them by reference.
|
|
186
186
|
*/
|
|
187
187
|
export interface TurnReinvocation {
|
|
188
188
|
/** The engine already holds state for this execution (derived per {@link isReinvocation}). */
|
|
@@ -204,16 +204,16 @@ export interface TurnReinvocation {
|
|
|
204
204
|
* - `workspace-lock-timeout`: another turn held the primary tree past
|
|
205
205
|
* `Config.workspaceLockTimeoutMs`. FAILED, returned (a Temporal retry
|
|
206
206
|
* would queue behind the same holder).
|
|
207
|
-
* - `rejected-by-user`: an adjudicated irreversible action (shell / MCP)
|
|
208
|
-
* was REJECTed. FAILED, returned.
|
|
209
207
|
* - `file-review-resolved`: a pure file-review resume; the agent already
|
|
210
208
|
* finished its turn during capture and the reconcile is the whole act.
|
|
211
209
|
* COMPLETED, returned, with the write-back finalized first when the
|
|
212
210
|
* reconcile held.
|
|
211
|
+
*
|
|
212
|
+
* A REJECTed tool is not a settlement: the run continues without it
|
|
213
|
+
* (`approval-decisions.ts`).
|
|
213
214
|
*/
|
|
214
215
|
export type TurnSettlement =
|
|
215
216
|
| { readonly kind: "workspace-lock-timeout"; readonly error: WorkspaceLockTimeoutError }
|
|
216
|
-
| { readonly kind: "rejected-by-user" }
|
|
217
217
|
| {
|
|
218
218
|
readonly kind: "file-review-resolved";
|
|
219
219
|
readonly failed: boolean;
|
|
@@ -246,18 +246,32 @@ export type ReinvocationOutcome =
|
|
|
246
246
|
* and the legacy positional wire shape yields 0, so `turnSeq` cannot be
|
|
247
247
|
* the signal (`index.ts` L402-407).
|
|
248
248
|
* - `deterministic` (native: the runtime-minted thread id): the id exists
|
|
249
|
-
* on the FIRST turn too, so the evidence is the persisted transcript
|
|
250
|
-
*
|
|
251
|
-
*
|
|
249
|
+
* on the FIRST turn too, so the evidence is the persisted transcript.
|
|
250
|
+
* Whether the execution already has committed history is the ONE signal
|
|
251
|
+
* that behaves identically across the engine's checkpointer backends:
|
|
252
|
+
* a durable saver (sqlite locally, http in cloud) keeps the checkpoint
|
|
253
|
+
* and resumes from it, while the test-only memory saver recreates it
|
|
254
|
+
* empty and replays from scratch — so the live checkpoint cannot be the
|
|
255
|
+
* signal (native's `shouldSeedFromPersistedTranscript`, retired with its
|
|
256
|
+
* orchestrator). A first run has no persisted messages and starts from
|
|
257
|
+
* empty, as it always did.
|
|
258
|
+
*
|
|
259
|
+
* This is the runtime's own reading, for its phases (the seed, the reconcile,
|
|
260
|
+
* the exact-apply). An adapter that needs create-vs-resume for its ENGINE
|
|
261
|
+
* reads `input.threadId` itself — for an engine-minted harness that is the
|
|
262
|
+
* same bit, for a deterministic one the engine's checkpoint is the adapter's
|
|
263
|
+
* to consult — so the contract carries no flag with two meanings (Q-M1-7).
|
|
252
264
|
*/
|
|
253
|
-
export function isReinvocation(
|
|
265
|
+
export function isReinvocation(
|
|
266
|
+
stateIdSource: StateIdSource,
|
|
267
|
+
input: NormalizedActivityInput,
|
|
268
|
+
execution: AgentExecution,
|
|
269
|
+
): boolean {
|
|
254
270
|
switch (stateIdSource) {
|
|
255
271
|
case "engine-minted":
|
|
256
272
|
return input.threadId !== "";
|
|
257
273
|
case "deterministic":
|
|
258
|
-
|
|
259
|
-
"isReinvocation: the deterministic arm lands with the native adapter (S3); no S2 harness mints its state id deterministically",
|
|
260
|
-
);
|
|
274
|
+
return (execution.status?.messages.length ?? 0) > 0;
|
|
261
275
|
default: {
|
|
262
276
|
const exhaustive: never = stateIdSource;
|
|
263
277
|
throw new Error(`isReinvocation: unknown state id source ${String(exhaustive)}`);
|
|
@@ -265,27 +279,6 @@ export function isReinvocation(stateIdSource: StateIdSource, input: NormalizedAc
|
|
|
265
279
|
}
|
|
266
280
|
}
|
|
267
281
|
|
|
268
|
-
/**
|
|
269
|
-
* The runtime's one reader of approval decisions: every top-level tool-call
|
|
270
|
-
* row still WAITING_APPROVAL whose `approvalAction` the server has set,
|
|
271
|
-
* keyed by tool-call id. Derived from the status on every invocation, never
|
|
272
|
-
* stored, so it cannot drift from the rows. The same rows, in the same
|
|
273
|
-
* order, that the Cursor adapter's `reconstructAdjudicatedApprovals` reads
|
|
274
|
-
* for its own facts (the pending-approval protos and content digests); a
|
|
275
|
-
* test pins the two readers' agreement.
|
|
276
|
-
*/
|
|
277
|
-
export function approvalDecisionsOf(status: AgentExecutionStatus): ReadonlyMap<string, ApprovalAction> {
|
|
278
|
-
const decisions = new Map<string, ApprovalAction>();
|
|
279
|
-
for (const message of status.messages) {
|
|
280
|
-
for (const row of message.toolCalls) {
|
|
281
|
-
if (row.status !== ToolCallStatus.TOOL_CALL_WAITING_APPROVAL) continue;
|
|
282
|
-
if (row.approvalAction === ApprovalAction.UNSPECIFIED) continue;
|
|
283
|
-
decisions.set(row.id, row.approvalAction);
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
return decisions;
|
|
287
|
-
}
|
|
288
|
-
|
|
289
282
|
/** The facts the reinvocation decision reads; produced by {@link reconcileReinvocation}, exposed for the decision's own tests. */
|
|
290
283
|
export interface ReinvocationFacts {
|
|
291
284
|
readonly approvalDecisions: ReadonlyMap<string, ApprovalAction>;
|
|
@@ -298,21 +291,23 @@ export interface ReinvocationFacts {
|
|
|
298
291
|
}
|
|
299
292
|
|
|
300
293
|
/**
|
|
301
|
-
* How a reinvocation proceeds, decided once from the facts
|
|
302
|
-
*
|
|
303
|
-
*
|
|
304
|
-
*
|
|
305
|
-
*
|
|
306
|
-
*
|
|
307
|
-
* agent".
|
|
294
|
+
* How a reinvocation proceeds, decided once from the facts: any adjudicated
|
|
295
|
+
* decision runs the agent — an approved shell/MCP proceeds and may produce
|
|
296
|
+
* further edits; a SKIP or REJECT denies its tool and the run continues
|
|
297
|
+
* without it (the row is settled SKIPPED after the turn,
|
|
298
|
+
* `approval-decisions.ts`); a resume that reconciled file review and decided
|
|
299
|
+
* nothing else is complete, because keeping or discarding a file never
|
|
300
|
+
* re-prompts the agent (Cursor-like). `undefined` means "run the agent".
|
|
301
|
+
*
|
|
302
|
+
* Until S3 M1 a REJECT failed the turn here with its own FAILED arm, Cursor's
|
|
303
|
+
* legacy; the proto (`APPROVAL_ACTION_REJECT`: "does NOT fail the run"), the
|
|
304
|
+
* conformance suite and the native harness said otherwise since stigmer#197,
|
|
305
|
+
* and the runtime now agrees (S2 M4 finding F1; Q-S3-2).
|
|
308
306
|
*/
|
|
309
307
|
export function decideReinvocation(
|
|
310
308
|
facts: ReinvocationFacts,
|
|
311
309
|
): Exclude<TurnSettlement, { kind: "workspace-lock-timeout" }> | undefined {
|
|
312
|
-
if (facts.approvalDecisions.size > 0)
|
|
313
|
-
const hasReject = [...facts.approvalDecisions.values()].some((a) => a === ApprovalAction.REJECT);
|
|
314
|
-
return hasReject ? { kind: "rejected-by-user" } : undefined;
|
|
315
|
-
}
|
|
310
|
+
if (facts.approvalDecisions.size > 0) return undefined;
|
|
316
311
|
if (facts.reconciledFileReview) {
|
|
317
312
|
return {
|
|
318
313
|
kind: "file-review-resolved",
|
|
@@ -325,41 +320,66 @@ export function decideReinvocation(
|
|
|
325
320
|
}
|
|
326
321
|
|
|
327
322
|
/**
|
|
328
|
-
* Seed an in-progress status from the persisted execution on a
|
|
329
|
-
*
|
|
330
|
-
*
|
|
323
|
+
* Seed an in-progress status from the persisted execution on a resume (HITL
|
|
324
|
+
* approval, pause/resume, transient recovery) so the upcoming turn APPENDS
|
|
325
|
+
* onto prior history instead of replacing it.
|
|
326
|
+
*
|
|
327
|
+
* Why the transcript must be seeded: a resumed engine re-issues the
|
|
328
|
+
* previously gated tool calls with brand-new call ids. Without seeding, the
|
|
329
|
+
* harness's accumulator would rebuild the transcript from empty and emit a
|
|
330
|
+
* status that drops the already-committed tool-call ids. The backend's
|
|
331
|
+
* append-only-at-identity guard rejects any non-terminal update that drops a
|
|
332
|
+
* committed tool-call id, so the resumed progress would never persist: the
|
|
333
|
+
* run stalls in WAITING_FOR_APPROVAL with no pending approvals and the
|
|
334
|
+
* workflow watchdog fails it. Seeding makes the resume status a strict
|
|
335
|
+
* superset; the re-runs are then reconciled in place onto these seeded calls
|
|
336
|
+
* by canonical identity inside the accumulator.
|
|
331
337
|
*
|
|
332
|
-
* Why
|
|
333
|
-
*
|
|
334
|
-
*
|
|
335
|
-
*
|
|
336
|
-
*
|
|
337
|
-
*
|
|
338
|
-
*
|
|
339
|
-
*
|
|
340
|
-
*
|
|
341
|
-
*
|
|
338
|
+
* Why the OTHER collections must be seeded too — the server's merge rule
|
|
339
|
+
* (`stigmer-server/src/domain/agentexecution/update-status.ts`): every list
|
|
340
|
+
* and singleton the runner owns is PRESENCE-GUARDED and then REPLACED
|
|
341
|
+
* wholesale — `subAgentExecutions`, `todos`, `artifacts`,
|
|
342
|
+
* `workspaceWriteBacks` when non-empty (L327-345); `streamingUsage`,
|
|
343
|
+
* `recalledMemoriesReport`, `structuredOutput` when defined (L492-526). So
|
|
344
|
+
* the loss an unseeded resume suffers is not "empty replaces full" (the
|
|
345
|
+
* guard covers that) but "PARTIAL replaces full": a resumed turn that
|
|
346
|
+
* publishes one artifact, delegates one sub-agent, or touches one to-do
|
|
347
|
+
* sends a list holding only that, and the server replaces the prior turn's
|
|
348
|
+
* whole list with it. Seeding every one makes each write a superset again.
|
|
342
349
|
*
|
|
343
|
-
*
|
|
344
|
-
*
|
|
345
|
-
*
|
|
346
|
-
*
|
|
347
|
-
* and
|
|
348
|
-
* `
|
|
350
|
+
* What is NOT seeded, and why: `fileChangeSets` and `pendingApprovals` are
|
|
351
|
+
* DERIVED by the server from its own ledgers on every write;
|
|
352
|
+
* `fileReviewEventStream` and `approvalEventStream` are server-owned ledgers
|
|
353
|
+
* the runner only APPENDS its own events to; `fileChangeProgress`,
|
|
354
|
+
* `setupProgress` and `contextInfo` are one turn's own or the server's; and
|
|
355
|
+
* `phase`, `startedAt`, `completedAt`, `error` are this turn's fresh
|
|
356
|
+
* terminal, written by the runtime.
|
|
357
|
+
*
|
|
358
|
+
* Every collection is mutated IN PLACE (pushed into, assigned into), never
|
|
359
|
+
* reassigned: the write-back coordinator already wraps this status through
|
|
360
|
+
* `statusProtoWriter`, and the harness's accumulator wraps `messages` and
|
|
361
|
+
* `subAgentExecutions` by reference after this runs, so a reassigned array
|
|
362
|
+
* would leave a wrapper holding the old one. The persisted protos are
|
|
363
|
+
* cloned so the input execution stays immutable.
|
|
349
364
|
*
|
|
350
365
|
* Moved from `execute-cursor/index.ts` `seedCursorTranscriptFromExecution`
|
|
351
|
-
* (
|
|
352
|
-
* `
|
|
366
|
+
* (messages only) and widened at S3 M1 to what native's whole-status clone
|
|
367
|
+
* (`execute-deep-agent/index.ts` `seedStatusFromExecution`, retired with its
|
|
368
|
+
* orchestrator) always carried, minus the fields above that it carried by
|
|
369
|
+
* accident (Q-S3-16).
|
|
353
370
|
*/
|
|
354
|
-
export function
|
|
355
|
-
status: AgentExecutionStatus,
|
|
356
|
-
execution: AgentExecution,
|
|
357
|
-
): void {
|
|
371
|
+
export function seedFromPersistedStatus(status: AgentExecutionStatus, execution: AgentExecution): void {
|
|
358
372
|
const persisted = execution.status;
|
|
359
373
|
if (!persisted || persisted.messages.length === 0) return;
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
374
|
+
const seed = clone(AgentExecutionStatusSchema, persisted);
|
|
375
|
+
status.messages.push(...seed.messages);
|
|
376
|
+
status.subAgentExecutions.push(...seed.subAgentExecutions);
|
|
377
|
+
status.artifacts.push(...seed.artifacts);
|
|
378
|
+
status.workspaceWriteBacks.push(...seed.workspaceWriteBacks);
|
|
379
|
+
for (const [id, todo] of Object.entries(seed.todos)) status.todos[id] = todo;
|
|
380
|
+
if (seed.streamingUsage !== undefined) status.streamingUsage = seed.streamingUsage;
|
|
381
|
+
if (seed.recalledMemoriesReport !== undefined) status.recalledMemoriesReport = seed.recalledMemoriesReport;
|
|
382
|
+
if (seed.structuredOutput !== undefined) status.structuredOutput = seed.structuredOutput;
|
|
363
383
|
}
|
|
364
384
|
|
|
365
385
|
// ---------------------------------------------------------------------------
|
|
@@ -529,7 +549,7 @@ export async function bindTelemetryBaggage(
|
|
|
529
549
|
* whether this one runs the agent at all.
|
|
530
550
|
*
|
|
531
551
|
* On a reinvocation, first seed the in-progress status from the persisted
|
|
532
|
-
* execution ({@link
|
|
552
|
+
* execution ({@link seedFromPersistedStatus}), BEFORE the harness's
|
|
533
553
|
* accumulator wraps `status.messages`. Then the file-review reconcile (the
|
|
534
554
|
* dual-source half): every change set the server projected as DECIDED is
|
|
535
555
|
* reconciled from the ledger decisions and the pinned git refs (approved
|
|
@@ -555,7 +575,7 @@ export async function reconcileReinvocation(
|
|
|
555
575
|
},
|
|
556
576
|
): Promise<ReinvocationOutcome> {
|
|
557
577
|
deps.enterPhase("reconcile_reinvocation");
|
|
558
|
-
const reinvoked = isReinvocation(args.stateIdSource, deps.input);
|
|
578
|
+
const reinvoked = isReinvocation(args.stateIdSource, deps.input, args.execution);
|
|
559
579
|
let reconciledFileReview = false;
|
|
560
580
|
let fileReviewFailed = false;
|
|
561
581
|
let fileReviewFailureDetail = "";
|
|
@@ -563,7 +583,7 @@ export async function reconcileReinvocation(
|
|
|
563
583
|
|
|
564
584
|
if (reinvoked) {
|
|
565
585
|
const existingStatus = args.execution.status;
|
|
566
|
-
|
|
586
|
+
seedFromPersistedStatus(deps.status, args.execution);
|
|
567
587
|
|
|
568
588
|
if (args.workspace.captureMode && args.workspace.primaryDir) {
|
|
569
589
|
const decidedSets = (existingStatus?.fileChangeSets ?? []).filter(
|
|
@@ -743,26 +763,52 @@ export async function resolveMcpServersAndPolicies(
|
|
|
743
763
|
|
|
744
764
|
/**
|
|
745
765
|
* Phase 5 (`index.ts` L493-501, the orchestrator's position between the
|
|
746
|
-
* tool surface and the attachments): mount the
|
|
747
|
-
*
|
|
748
|
-
*
|
|
749
|
-
*
|
|
750
|
-
*
|
|
751
|
-
*
|
|
752
|
-
*
|
|
766
|
+
* tool surface and the attachments): mount the skills under the session's
|
|
767
|
+
* platform dir, reachable from the workspace through its `.stigmer` link,
|
|
768
|
+
* and return what a prompt renders, per owner (`shared/skill-resolver.ts`).
|
|
769
|
+
* Reads the control plane, which is why it is the runtime's and not a
|
|
770
|
+
* harness's; each harness places the returned metadata in its own prompt
|
|
771
|
+
* shapes — the root's in its system prompt, a sub-agent's in that
|
|
772
|
+
* sub-agent's, client-free.
|
|
773
|
+
*
|
|
774
|
+
* The root's refs are the blueprint's merged set (agent plus session); a
|
|
775
|
+
* sub-agent's are its own `skillRefs`. Each ref resolves through the same
|
|
776
|
+
* resolver, so a skill the root and a sub-agent share is fetched per owner
|
|
777
|
+
* but MOUNTED once (the hash-keyed mount marker turns the second write into
|
|
778
|
+
* a no-op), and a ref that fails resolves to nothing for that owner alone,
|
|
779
|
+
* warned and never thrown, as the root's always did. Sub-agent refs are
|
|
780
|
+
* resolved only for a harness whose `capabilities.subAgents` is true: the
|
|
781
|
+
* blueprint's sub-agents are that harness's to compile, so their skills are
|
|
782
|
+
* its to render. One progress label for the whole phase, as before.
|
|
783
|
+
*
|
|
784
|
+
* The `.stigmer` link this and the attachment phase create is removed in
|
|
785
|
+
* the runtime's finally, after the harness's own teardown. Until S3 M1 the
|
|
786
|
+
* native orchestrator fetched and mounted sub-agent skills itself
|
|
787
|
+
* (`subagent-transformer.ts` with a client); this phase is where that read
|
|
788
|
+
* lives now (Q-S3-5).
|
|
753
789
|
*/
|
|
754
790
|
export async function mountSkills(
|
|
755
791
|
deps: ResolutionDeps,
|
|
756
|
-
args: {
|
|
757
|
-
|
|
792
|
+
args: {
|
|
793
|
+
readonly blueprint: ResolvedBlueprint;
|
|
794
|
+
readonly sessionId: string;
|
|
795
|
+
readonly primaryDir: string;
|
|
796
|
+
readonly subAgents: boolean;
|
|
797
|
+
},
|
|
798
|
+
): Promise<TurnSkills> {
|
|
758
799
|
deps.enterPhase("resolve_skills");
|
|
759
800
|
await deps.reportProgress("Resolving skills");
|
|
760
|
-
const
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
801
|
+
const options = { sessionId: args.sessionId, primaryWorkspaceDir: args.primaryDir };
|
|
802
|
+
const root = await resolveSkills(deps.client, args.blueprint.mergedSkillRefs, options);
|
|
803
|
+
const bySubAgent = new Map<string, readonly SkillMetadata[]>();
|
|
804
|
+
if (args.subAgents) {
|
|
805
|
+
for (const subAgent of args.blueprint.subAgents) {
|
|
806
|
+
if (subAgent.skillRefs.length === 0) continue;
|
|
807
|
+
bySubAgent.set(subAgent.name, await resolveSkills(deps.client, subAgent.skillRefs, options));
|
|
808
|
+
}
|
|
809
|
+
}
|
|
764
810
|
deps.timing.mark("resolve_skills");
|
|
765
|
-
return
|
|
811
|
+
return { root, bySubAgent };
|
|
766
812
|
}
|
|
767
813
|
|
|
768
814
|
/**
|
|
@@ -771,12 +817,17 @@ export async function mountSkills(
|
|
|
771
817
|
* Downloads by storage key through the same artifact storage resolved for
|
|
772
818
|
* status offload. The vision budget rides along so image attachments are
|
|
773
819
|
* selected for inline delivery while their bytes are already in hand
|
|
774
|
-
* (`shared/attachment-vision.ts` owns all policy); it carries the
|
|
775
|
-
* model
|
|
776
|
-
*
|
|
777
|
-
*
|
|
778
|
-
*
|
|
779
|
-
*
|
|
820
|
+
* (`shared/attachment-vision.ts` owns all policy); it carries the vision
|
|
821
|
+
* capability of the model the turn will run on: the one the execution named,
|
|
822
|
+
* or the registry's default when it named none — the model the native
|
|
823
|
+
* harness builds in that case, so the budget asks about the model that will
|
|
824
|
+
* actually see the image. Full model validation is not needed for this. The
|
|
825
|
+
* Cursor harness with no model named builds its own catalog default instead
|
|
826
|
+
* (`resolveModelId("default")`), so for it this is an approximation: today
|
|
827
|
+
* both answers read as sighted, and the exact per-harness default is S4's
|
|
828
|
+
* to declare (S3 M1 finding F-M1-4). The vision profile is the harness's
|
|
829
|
+
* (each engine accepts different image shapes), so it arrives as an
|
|
830
|
+
* argument.
|
|
780
831
|
*/
|
|
781
832
|
export async function resolveTurnAttachments(
|
|
782
833
|
deps: ResolutionDeps,
|
|
@@ -788,8 +839,9 @@ export async function resolveTurnAttachments(
|
|
|
788
839
|
},
|
|
789
840
|
): Promise<TurnAttachments> {
|
|
790
841
|
deps.enterPhase("resolve_attachments");
|
|
842
|
+
const modelName = args.spec.executionConfig?.modelName || (await getDefaultModel());
|
|
791
843
|
const visionBudget = new VisionBudget(args.visionProfile, {
|
|
792
|
-
modelVision: await getModelVisionCapability(
|
|
844
|
+
modelVision: await getModelVisionCapability(modelName),
|
|
793
845
|
});
|
|
794
846
|
const results = await resolveAttachments(args.spec.attachments, {
|
|
795
847
|
sessionId: args.sessionId,
|
|
@@ -816,6 +868,35 @@ export async function resolveTurnAttachments(
|
|
|
816
868
|
return { results, visionImages, visionNotViewable };
|
|
817
869
|
}
|
|
818
870
|
|
|
871
|
+
/**
|
|
872
|
+
* Whether a harness performs an approved call by RE-RUNNING the model, so
|
|
873
|
+
* the bytes an approved whole-file write lands can differ from the bytes the
|
|
874
|
+
* user approved unless the runner pins them itself
|
|
875
|
+
* ({@link applyApprovedWrites}). Keyed on the pause primitive
|
|
876
|
+
* (`capabilities.ts`): `deny-and-retry` denies the call and re-prompts the
|
|
877
|
+
* model with grants; `callback` answers "deny, stop" and the resumed session
|
|
878
|
+
* re-attempts the call — both regenerate. An `interrupt` engine checkpoints
|
|
879
|
+
* AT the call and applies its exact args on `approve`, so a runner-side
|
|
880
|
+
* write would land the same bytes twice and pre-empt a row the engine is
|
|
881
|
+
* about to execute; `none` gates nothing. Until S3 M2a the phase ran for
|
|
882
|
+
* every harness — a deny-and-retry mechanism the native harness would have
|
|
883
|
+
* met on its first deny-gated file approval (F-M2a-2, Q-M2a-3).
|
|
884
|
+
*/
|
|
885
|
+
export function regeneratesApprovedWrites(pausePrimitive: PausePrimitive): boolean {
|
|
886
|
+
switch (pausePrimitive) {
|
|
887
|
+
case "deny-and-retry":
|
|
888
|
+
case "callback":
|
|
889
|
+
return true;
|
|
890
|
+
case "interrupt":
|
|
891
|
+
case "none":
|
|
892
|
+
return false;
|
|
893
|
+
default: {
|
|
894
|
+
const exhaustive: never = pausePrimitive;
|
|
895
|
+
throw new Error(`regeneratesApprovedWrites: unknown pause primitive ${String(exhaustive)}`);
|
|
896
|
+
}
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
|
|
819
900
|
/**
|
|
820
901
|
* Phase 5b3 (`index.ts` L849-867): exact-apply approved whole-file writes
|
|
821
902
|
* (HITL "what you approve is what gets applied"). A deny-only harness
|
|
@@ -828,8 +909,9 @@ export async function resolveTurnAttachments(
|
|
|
828
909
|
* uncertain case degrades to that path, so this can never corrupt a file
|
|
829
910
|
* (see `shared/exact-apply.ts`).
|
|
830
911
|
*
|
|
831
|
-
* Scoped
|
|
832
|
-
*
|
|
912
|
+
* Scoped to the harnesses that regenerate ({@link regeneratesApprovedWrites})
|
|
913
|
+
* and OUT of capture mode, which does not reinvoke the model for file edits:
|
|
914
|
+
* it applies the exact captured bytes itself in the reconcile.
|
|
833
915
|
*
|
|
834
916
|
* The caller persists when the returned set is non-empty (the applied state
|
|
835
917
|
* must be durable before the continuation runs, and the UI reflects it at
|
|
@@ -838,12 +920,18 @@ export async function resolveTurnAttachments(
|
|
|
838
920
|
export async function applyApprovedWrites(
|
|
839
921
|
deps: ResolutionDeps,
|
|
840
922
|
args: {
|
|
923
|
+
readonly pausePrimitive: PausePrimitive;
|
|
841
924
|
readonly workspace: TurnWorkspace;
|
|
842
925
|
readonly reinvocation: TurnReinvocation;
|
|
843
926
|
},
|
|
844
927
|
): Promise<ReadonlySet<string>> {
|
|
845
|
-
const { workspace, reinvocation } = args;
|
|
846
|
-
if (
|
|
928
|
+
const { pausePrimitive, workspace, reinvocation } = args;
|
|
929
|
+
if (
|
|
930
|
+
!regeneratesApprovedWrites(pausePrimitive) ||
|
|
931
|
+
workspace.captureMode ||
|
|
932
|
+
!reinvocation.isReinvocation ||
|
|
933
|
+
reinvocation.approvalDecisions.size === 0
|
|
934
|
+
) {
|
|
847
935
|
return new Set();
|
|
848
936
|
}
|
|
849
937
|
deps.enterPhase("apply_approved_writes");
|
|
@@ -987,14 +1075,23 @@ export async function resolveTurnContext(
|
|
|
987
1075
|
if (reinvoked.kind === "settled") return { kind: "settled", settlement: reinvoked.settlement };
|
|
988
1076
|
|
|
989
1077
|
const mcp = await resolveMcpServersAndPolicies(deps, { execution, session, sessionId, blueprint, environment });
|
|
990
|
-
const skills = await mountSkills(deps, {
|
|
1078
|
+
const skills = await mountSkills(deps, {
|
|
1079
|
+
blueprint,
|
|
1080
|
+
sessionId,
|
|
1081
|
+
primaryDir: workspace.primaryDir,
|
|
1082
|
+
subAgents: capabilities.subAgents,
|
|
1083
|
+
});
|
|
991
1084
|
const attachments = await resolveTurnAttachments(deps, {
|
|
992
1085
|
spec,
|
|
993
1086
|
sessionId,
|
|
994
1087
|
primaryDir: workspace.primaryDir,
|
|
995
1088
|
visionProfile: capabilities.visionProfile,
|
|
996
1089
|
});
|
|
997
|
-
const appliedToolCallIds = await applyApprovedWrites(deps, {
|
|
1090
|
+
const appliedToolCallIds = await applyApprovedWrites(deps, {
|
|
1091
|
+
pausePrimitive: capabilities.pausePrimitive,
|
|
1092
|
+
workspace,
|
|
1093
|
+
reinvocation: reinvoked.reinvocation,
|
|
1094
|
+
});
|
|
998
1095
|
if (appliedToolCallIds.size > 0) {
|
|
999
1096
|
// Persist the applied writes (tool calls now COMPLETED with the approved
|
|
1000
1097
|
// diff) before reinvocation, so the applied state is durable even if the
|