@stigmer/runner 3.15.1 → 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,351 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Diagnostic regression test (triangulation — RUNNER boundary).
|
|
3
|
-
*
|
|
4
|
-
* Reproduces the user-reported scenario exactly: a gated `getAppState` call
|
|
5
|
-
* (open-computer-use MCP) is approved with APPROVE_ALL, which leases the whole
|
|
6
|
-
* server so the resume runs `getAppState` AND every following computer-use tool
|
|
7
|
-
* to completion in ONE durable-checkpoint resume — no further interrupts.
|
|
8
|
-
*
|
|
9
|
-
* The reported symptom is that the LEADING thinking block and the FIRST tool
|
|
10
|
-
* call (`getAppState`) vanish from the transcript after approve-all, while the
|
|
11
|
-
* later auto-executed tools remain. This test pins what the RUNNER persists at
|
|
12
|
-
* its single gRPC chokepoint (`updateStatus`). If the runner is faithful, the
|
|
13
|
-
* final status it sends must be a SUPERSET of run-1's transcript: the leading
|
|
14
|
-
* thinking block survives, the gated tool call is reconciled in place (exactly
|
|
15
|
-
* one copy, now COMPLETED), and the leased follow-up tool is appended.
|
|
16
|
-
*
|
|
17
|
-
* Models the cloud path deterministically, mirroring hitl-resume-history.test.ts:
|
|
18
|
-
* - the persisted execution already holds the run-1 transcript
|
|
19
|
-
* (THINKING + AI(getAppState WAITING_APPROVAL, approvalAction=APPROVE_ALL));
|
|
20
|
-
* - the durable checkpoint exists (getState reports prior values + a pending
|
|
21
|
-
* interrupt), so streamEvents re-emits ONLY post-interrupt events;
|
|
22
|
-
* - the lease drops open-computer-use from the policy map, so the follow-up
|
|
23
|
-
* `click` is NOT re-gated (its key is absent from approvalPolicies) and the
|
|
24
|
-
* resume reaches a terminal COMPLETED phase.
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
28
|
-
import { makeInMemoryArtifactStorage } from "../../../__test-utils__/fake-artifact-storage.js";
|
|
29
|
-
import { create, clone } from "@bufbuild/protobuf";
|
|
30
|
-
import {
|
|
31
|
-
AgentExecutionStatusSchema,
|
|
32
|
-
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
33
|
-
import type { AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
34
|
-
import {
|
|
35
|
-
AgentMessageSchema,
|
|
36
|
-
ToolCallSchema,
|
|
37
|
-
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
38
|
-
import {
|
|
39
|
-
ApprovalAction,
|
|
40
|
-
ExecutionPhase,
|
|
41
|
-
MessageType,
|
|
42
|
-
ToolCallStatus,
|
|
43
|
-
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
44
|
-
import type { V3ProtocolEvent } from "../v3-event-recorder.js";
|
|
45
|
-
import type { Config } from "../../../config.js";
|
|
46
|
-
import type { SetupResult } from "../setup.js";
|
|
47
|
-
|
|
48
|
-
// The Temporal activity context is unavailable outside a worker.
|
|
49
|
-
vi.mock("@temporalio/activity", () => ({
|
|
50
|
-
Context: {
|
|
51
|
-
current: () => ({
|
|
52
|
-
// A real AbortSignal: the workspace-lock wait registers abort listeners
|
|
53
|
-
// on it, which a bare `{ aborted: false }` stub cannot satisfy.
|
|
54
|
-
cancellationSignal: new AbortController().signal,
|
|
55
|
-
heartbeat: vi.fn(),
|
|
56
|
-
info: { taskQueue: "test-queue" },
|
|
57
|
-
}),
|
|
58
|
-
},
|
|
59
|
-
CancelledFailure: class CancelledFailure extends Error {},
|
|
60
|
-
}));
|
|
61
|
-
|
|
62
|
-
vi.mock("../../../idle-watchdog.js", () => ({
|
|
63
|
-
activityStarted: vi.fn(),
|
|
64
|
-
activityFinished: vi.fn(),
|
|
65
|
-
}));
|
|
66
|
-
|
|
67
|
-
// Capture every persisted status (the gRPC chokepoint) for assertions.
|
|
68
|
-
const { persistedStatuses } = vi.hoisted(() => ({
|
|
69
|
-
persistedStatuses: [] as AgentExecutionStatus[],
|
|
70
|
-
}));
|
|
71
|
-
|
|
72
|
-
vi.mock("../../../client/stigmer-client.js", () => ({
|
|
73
|
-
StigmerClient: vi.fn().mockImplementation(() => ({
|
|
74
|
-
updateStatus: vi.fn(async (_id: string, status: AgentExecutionStatus) => {
|
|
75
|
-
// Snapshot point-in-time: persistStatus mutates the same object in place.
|
|
76
|
-
persistedStatuses.push(clone(AgentExecutionStatusSchema, status));
|
|
77
|
-
return { signal: 0 };
|
|
78
|
-
}),
|
|
79
|
-
getExecution: vi.fn(),
|
|
80
|
-
})),
|
|
81
|
-
}));
|
|
82
|
-
|
|
83
|
-
// performSetup is mocked per-test to return a fake durable-resume SetupResult.
|
|
84
|
-
vi.mock("../setup.js", () => ({ performSetup: vi.fn() }));
|
|
85
|
-
|
|
86
|
-
import { createDeepAgentActivities } from "../index.js";
|
|
87
|
-
import { performSetup } from "../setup.js";
|
|
88
|
-
|
|
89
|
-
const MCP_SLUG = "open-computer-use";
|
|
90
|
-
const GATED_TOOL_CALL_ID = "toolu_getappstate_01";
|
|
91
|
-
const LEASED_TOOL_CALL_ID = "toolu_click_01";
|
|
92
|
-
const THINKING_TEXT = "Let me capture the current app state before clicking anything.";
|
|
93
|
-
const PRE_RESUME_AI_TEXT = "I'll capture the app state first.";
|
|
94
|
-
const POST_RESUME_AI_TEXT = "Captured the app state and clicked the element.";
|
|
95
|
-
|
|
96
|
-
function v3Event(
|
|
97
|
-
seq: number,
|
|
98
|
-
method: string,
|
|
99
|
-
data: unknown,
|
|
100
|
-
namespace: string[] = [],
|
|
101
|
-
): V3ProtocolEvent {
|
|
102
|
-
return {
|
|
103
|
-
type: "event",
|
|
104
|
-
seq,
|
|
105
|
-
method,
|
|
106
|
-
params: { namespace, timestamp: Date.now(), data },
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
function toolMessageOutput(content: string, toolCallId: string): unknown {
|
|
111
|
-
return {
|
|
112
|
-
lc: 1,
|
|
113
|
-
type: "constructor",
|
|
114
|
-
id: ["langchain_core", "messages", "ToolMessage"],
|
|
115
|
-
kwargs: { content, tool_call_id: toolCallId },
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* The events a durable resume re-emits after APPROVE_ALL: the gated tool
|
|
121
|
-
* executes (reconciled in place), then the leased follow-up tool auto-runs,
|
|
122
|
-
* then the assistant produces a final turn. No interrupts — the lease dropped
|
|
123
|
-
* open-computer-use from the policy map.
|
|
124
|
-
*/
|
|
125
|
-
function resumeEvents(): V3ProtocolEvent[] {
|
|
126
|
-
return [
|
|
127
|
-
// 1. Gated getAppState now runs (reconciled to the seeded WAITING call).
|
|
128
|
-
v3Event(0, "tools", {
|
|
129
|
-
event: "tool-started",
|
|
130
|
-
tool_call_id: GATED_TOOL_CALL_ID,
|
|
131
|
-
tool_name: "getAppState",
|
|
132
|
-
input: {},
|
|
133
|
-
}, [`tools:${GATED_TOOL_CALL_ID}`]),
|
|
134
|
-
v3Event(1, "tools", {
|
|
135
|
-
event: "tool-finished",
|
|
136
|
-
tool_call_id: GATED_TOOL_CALL_ID,
|
|
137
|
-
output: toolMessageOutput("app-state-captured: 3 windows", GATED_TOOL_CALL_ID),
|
|
138
|
-
}, [`tools:${GATED_TOOL_CALL_ID}`]),
|
|
139
|
-
// 2. The model decides to click; the leased tool auto-runs (no gate).
|
|
140
|
-
v3Event(2, "messages", { event: "message-start", run_id: "r2" }),
|
|
141
|
-
v3Event(3, "tools", {
|
|
142
|
-
event: "tool-started",
|
|
143
|
-
tool_call_id: LEASED_TOOL_CALL_ID,
|
|
144
|
-
tool_name: "click",
|
|
145
|
-
input: { x: 10, y: 20 },
|
|
146
|
-
}, [`tools:${LEASED_TOOL_CALL_ID}`]),
|
|
147
|
-
v3Event(4, "tools", {
|
|
148
|
-
event: "tool-finished",
|
|
149
|
-
tool_call_id: LEASED_TOOL_CALL_ID,
|
|
150
|
-
output: toolMessageOutput("clicked at (10,20)", LEASED_TOOL_CALL_ID),
|
|
151
|
-
}, [`tools:${LEASED_TOOL_CALL_ID}`]),
|
|
152
|
-
// 3. Final assistant turn.
|
|
153
|
-
v3Event(5, "messages", { event: "message-start", run_id: "r3" }),
|
|
154
|
-
v3Event(6, "messages", {
|
|
155
|
-
event: "content-block-delta",
|
|
156
|
-
index: 0,
|
|
157
|
-
delta: { type: "text-delta", text: POST_RESUME_AI_TEXT },
|
|
158
|
-
run_id: "r3",
|
|
159
|
-
}),
|
|
160
|
-
v3Event(7, "messages", { event: "message-finish", run_id: "r3" }),
|
|
161
|
-
];
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
function mockV3Run(events: V3ProtocolEvent[]) {
|
|
165
|
-
return {
|
|
166
|
-
[Symbol.asyncIterator]: async function* () {
|
|
167
|
-
for (const e of events) yield e;
|
|
168
|
-
},
|
|
169
|
-
output: Promise.resolve({ messages: [] }),
|
|
170
|
-
abort: vi.fn(),
|
|
171
|
-
signal: new AbortController().signal,
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* The run-1 transcript already persisted on the execution: a leading thinking
|
|
177
|
-
* block, then the gated getAppState call the user approved with APPROVE_ALL.
|
|
178
|
-
*/
|
|
179
|
-
function persistedRunOneStatus(): AgentExecutionStatus {
|
|
180
|
-
return create(AgentExecutionStatusSchema, {
|
|
181
|
-
phase: ExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL,
|
|
182
|
-
startedAt: "2026-06-15T00:00:00.000Z",
|
|
183
|
-
messages: [
|
|
184
|
-
create(AgentMessageSchema, {
|
|
185
|
-
type: MessageType.MESSAGE_THINKING,
|
|
186
|
-
content: THINKING_TEXT,
|
|
187
|
-
timestamp: "2026-06-15T00:00:01.000Z",
|
|
188
|
-
}),
|
|
189
|
-
create(AgentMessageSchema, {
|
|
190
|
-
type: MessageType.MESSAGE_AI,
|
|
191
|
-
content: PRE_RESUME_AI_TEXT,
|
|
192
|
-
timestamp: "2026-06-15T00:00:02.000Z",
|
|
193
|
-
toolCalls: [
|
|
194
|
-
create(ToolCallSchema, {
|
|
195
|
-
id: GATED_TOOL_CALL_ID,
|
|
196
|
-
name: "getAppState",
|
|
197
|
-
status: ToolCallStatus.TOOL_CALL_WAITING_APPROVAL,
|
|
198
|
-
requiresApproval: true,
|
|
199
|
-
approvalMessage: "Execute getAppState tool",
|
|
200
|
-
approvalAction: ApprovalAction.APPROVE_ALL,
|
|
201
|
-
mcpServerSlug: MCP_SLUG,
|
|
202
|
-
}),
|
|
203
|
-
],
|
|
204
|
-
}),
|
|
205
|
-
],
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
function fakeDurableResumeSetup(): SetupResult {
|
|
210
|
-
let streamed = false;
|
|
211
|
-
|
|
212
|
-
const pendingInterruptState = {
|
|
213
|
-
values: { messages: [{ role: "assistant", content: PRE_RESUME_AI_TEXT }] },
|
|
214
|
-
tasks: [{
|
|
215
|
-
id: "task-1",
|
|
216
|
-
interrupts: [{
|
|
217
|
-
value: {
|
|
218
|
-
tool_call_id: GATED_TOOL_CALL_ID,
|
|
219
|
-
tool_name: "getAppState",
|
|
220
|
-
mcp_server_slug: MCP_SLUG,
|
|
221
|
-
message: "Execute getAppState tool",
|
|
222
|
-
},
|
|
223
|
-
resumeValue: undefined,
|
|
224
|
-
}],
|
|
225
|
-
}],
|
|
226
|
-
};
|
|
227
|
-
const resolvedState = {
|
|
228
|
-
values: { messages: [{ role: "assistant", content: PRE_RESUME_AI_TEXT }] },
|
|
229
|
-
tasks: [],
|
|
230
|
-
};
|
|
231
|
-
|
|
232
|
-
const agentGraph = {
|
|
233
|
-
// Before the resumed stream: a pending interrupt awaits the decision.
|
|
234
|
-
// After the stream: the interrupt is resolved (no pending approvals).
|
|
235
|
-
getState: vi.fn(async () => (streamed ? resolvedState : pendingInterruptState)),
|
|
236
|
-
streamEvents: vi.fn(async () => {
|
|
237
|
-
streamed = true;
|
|
238
|
-
return mockV3Run(resumeEvents());
|
|
239
|
-
}),
|
|
240
|
-
};
|
|
241
|
-
|
|
242
|
-
// Approve-all leased open-computer-use: the resume's policy map no longer
|
|
243
|
-
// contains the leased server's tools, so the follow-up `click` is NOT gated.
|
|
244
|
-
// Only the originally-gated getAppState policy remains for resume resolution.
|
|
245
|
-
const approvalPolicies = new Map([
|
|
246
|
-
[`${MCP_SLUG}/getAppState`, {
|
|
247
|
-
toolName: "getAppState",
|
|
248
|
-
mcpServerSlug: MCP_SLUG,
|
|
249
|
-
requiresApproval: true,
|
|
250
|
-
approvalMessage: "Execute getAppState tool",
|
|
251
|
-
}],
|
|
252
|
-
]);
|
|
253
|
-
|
|
254
|
-
return {
|
|
255
|
-
agentGraph,
|
|
256
|
-
langgraphConfig: { configurable: { thread_id: "thread-1" } },
|
|
257
|
-
langgraphInput: { messages: [{ role: "user", content: "Self-DM me" }] },
|
|
258
|
-
execution: {
|
|
259
|
-
spec: { message: "Self-DM me to confirm you can." },
|
|
260
|
-
status: persistedRunOneStatus(),
|
|
261
|
-
},
|
|
262
|
-
agent: {},
|
|
263
|
-
session: { spec: { workspaceEntries: [] } },
|
|
264
|
-
// Unique per test file: the workspace turn lock keys on this path, and a
|
|
265
|
-
// path shared across files would serialize parallel test workers for real.
|
|
266
|
-
workspaceBackend: { rootDir: "/tmp/stigmer-test-ws-hitl-approve-all" },
|
|
267
|
-
mcpConnection: null,
|
|
268
|
-
mergedEnvVars: {},
|
|
269
|
-
secretKeys: new Set<string>(),
|
|
270
|
-
modelName: "claude-sonnet",
|
|
271
|
-
gracefulStop: undefined,
|
|
272
|
-
artifactStorage: makeInMemoryArtifactStorage({ urlBase: "https://artifacts.local/" }).storage,
|
|
273
|
-
provisionResults: [],
|
|
274
|
-
approvalPolicies,
|
|
275
|
-
// Both computer-use tools belong to the leased server.
|
|
276
|
-
toolServerMap: new Map([["getAppState", MCP_SLUG], ["click", MCP_SLUG]]),
|
|
277
|
-
autoApproveAll: false,
|
|
278
|
-
hasStructuredOutput: false,
|
|
279
|
-
streamVersion: "v3",
|
|
280
|
-
} as unknown as SetupResult;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
const baseConfig: Config = {
|
|
284
|
-
taskQueue: "test-queue",
|
|
285
|
-
temporalAddress: "localhost:7233",
|
|
286
|
-
temporalNamespace: "default",
|
|
287
|
-
stigmerBackendEndpoint: "http://localhost:7234",
|
|
288
|
-
mcpBridgeEndpoint: null,
|
|
289
|
-
stigmerToken: null,
|
|
290
|
-
cursorApiKey: "",
|
|
291
|
-
workspaceRootDir: "/tmp/test",
|
|
292
|
-
mode: "cloud",
|
|
293
|
-
proxyEndpoint: "http://localhost:7234",
|
|
294
|
-
maxConcurrentActivities: 5,
|
|
295
|
-
idleTimeoutSeconds: null,
|
|
296
|
-
cloudModeEnabled: true,
|
|
297
|
-
checkpointerType: "http",
|
|
298
|
-
checkpointerProxyEndpoint: "http://localhost:7234",
|
|
299
|
-
artifactProxyEndpoint: null,
|
|
300
|
-
primaryModel: "claude-sonnet",
|
|
301
|
-
cursorStreamStallTimeoutMs: 180000,
|
|
302
|
-
agentResolveTimeoutMs: 120000,
|
|
303
|
-
workspaceLockTimeoutMs: 900000,
|
|
304
|
-
};
|
|
305
|
-
|
|
306
|
-
describe("ExecuteDeepAgent — APPROVE_ALL durable resume preserves leading thinking + first tool call", () => {
|
|
307
|
-
beforeEach(() => {
|
|
308
|
-
persistedStatuses.length = 0;
|
|
309
|
-
vi.mocked(performSetup).mockResolvedValue(fakeDurableResumeSetup());
|
|
310
|
-
});
|
|
311
|
-
|
|
312
|
-
it("keeps the leading thinking block and the gated getAppState call, and appends the leased tool", async () => {
|
|
313
|
-
const activities = createDeepAgentActivities(baseConfig);
|
|
314
|
-
await activities.ExecuteDeepAgent("exec-1", "thread-1");
|
|
315
|
-
|
|
316
|
-
expect(persistedStatuses.length).toBeGreaterThan(0);
|
|
317
|
-
const finalStatus = persistedStatuses.at(-1)!;
|
|
318
|
-
|
|
319
|
-
// 1. The LEADING thinking block survives the resume (the reported symptom).
|
|
320
|
-
const thinkingMessages = finalStatus.messages.filter(
|
|
321
|
-
m => m.type === MessageType.MESSAGE_THINKING,
|
|
322
|
-
);
|
|
323
|
-
expect(thinkingMessages).toHaveLength(1);
|
|
324
|
-
expect(thinkingMessages[0].content).toBe(THINKING_TEXT);
|
|
325
|
-
|
|
326
|
-
// 2. The thinking block stays at the FRONT — it is still messages[0], proving
|
|
327
|
-
// the transcript was not front-truncated and rebuilt from a later turn.
|
|
328
|
-
expect(finalStatus.messages[0].type).toBe(MessageType.MESSAGE_THINKING);
|
|
329
|
-
|
|
330
|
-
// 3. The FIRST tool call (getAppState) is reconciled in place: exactly one
|
|
331
|
-
// copy, now COMPLETED with its result — not dropped, not duplicated.
|
|
332
|
-
const getAppStateCalls = finalStatus.messages
|
|
333
|
-
.flatMap(m => m.toolCalls)
|
|
334
|
-
.filter(tc => tc.id === GATED_TOOL_CALL_ID);
|
|
335
|
-
expect(getAppStateCalls).toHaveLength(1);
|
|
336
|
-
expect(getAppStateCalls[0].status).toBe(ToolCallStatus.TOOL_CALL_COMPLETED);
|
|
337
|
-
expect(getAppStateCalls[0].result).toContain("app-state-captured");
|
|
338
|
-
|
|
339
|
-
// 4. The leased follow-up tool is appended.
|
|
340
|
-
const clickCalls = finalStatus.messages
|
|
341
|
-
.flatMap(m => m.toolCalls)
|
|
342
|
-
.filter(tc => tc.id === LEASED_TOOL_CALL_ID);
|
|
343
|
-
expect(clickCalls).toHaveLength(1);
|
|
344
|
-
expect(clickCalls[0].status).toBe(ToolCallStatus.TOOL_CALL_COMPLETED);
|
|
345
|
-
|
|
346
|
-
// 5. The post-resume assistant turn is appended and the run completes.
|
|
347
|
-
const allText = finalStatus.messages.map(m => m.content).join("\n");
|
|
348
|
-
expect(allText).toContain(POST_RESUME_AI_TEXT);
|
|
349
|
-
expect(finalStatus.phase).toBe(ExecutionPhase.EXECUTION_COMPLETED);
|
|
350
|
-
});
|
|
351
|
-
});
|
|
@@ -1,293 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Regression test: resuming an execution from a durable LangGraph checkpoint
|
|
3
|
-
* must NOT wipe the message transcript.
|
|
4
|
-
*
|
|
5
|
-
* This models the cloud path deterministically. On the post-approval
|
|
6
|
-
* re-invocation of ExecuteDeepAgent:
|
|
7
|
-
* - the persisted execution already holds the run-1 transcript (an AI message
|
|
8
|
-
* plus the gated tool call in WAITING_APPROVAL, approved by the user);
|
|
9
|
-
* - the durable checkpoint exists (getState reports prior values + a pending
|
|
10
|
-
* interrupt), so streamEvents re-emits ONLY the post-interrupt events
|
|
11
|
-
* (the resumed tool execution + the following assistant turn).
|
|
12
|
-
*
|
|
13
|
-
* The activity must seed its status from the persisted execution so the
|
|
14
|
-
* streamed delta appends onto the existing history, and the resumed tool
|
|
15
|
-
* events must reconcile to the existing gated tool call rather than
|
|
16
|
-
* duplicating it. The persisted status after resume must therefore contain
|
|
17
|
-
* the full transcript with exactly one copy of the gated tool call.
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
21
|
-
import { makeInMemoryArtifactStorage } from "../../../__test-utils__/fake-artifact-storage.js";
|
|
22
|
-
import { create, clone } from "@bufbuild/protobuf";
|
|
23
|
-
import {
|
|
24
|
-
AgentExecutionStatusSchema,
|
|
25
|
-
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
26
|
-
import type { AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
27
|
-
import {
|
|
28
|
-
AgentMessageSchema,
|
|
29
|
-
ToolCallSchema,
|
|
30
|
-
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
31
|
-
import {
|
|
32
|
-
ApprovalAction,
|
|
33
|
-
ExecutionPhase,
|
|
34
|
-
MessageType,
|
|
35
|
-
ToolCallStatus,
|
|
36
|
-
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
37
|
-
import type { V3ProtocolEvent } from "../v3-event-recorder.js";
|
|
38
|
-
import type { Config } from "../../../config.js";
|
|
39
|
-
import type { SetupResult } from "../setup.js";
|
|
40
|
-
|
|
41
|
-
// The Temporal activity context is unavailable outside a worker.
|
|
42
|
-
vi.mock("@temporalio/activity", () => ({
|
|
43
|
-
Context: {
|
|
44
|
-
current: () => ({
|
|
45
|
-
// A real AbortSignal: the workspace-lock wait registers abort listeners
|
|
46
|
-
// on it, which a bare `{ aborted: false }` stub cannot satisfy.
|
|
47
|
-
cancellationSignal: new AbortController().signal,
|
|
48
|
-
heartbeat: vi.fn(),
|
|
49
|
-
info: { taskQueue: "test-queue" },
|
|
50
|
-
}),
|
|
51
|
-
},
|
|
52
|
-
CancelledFailure: class CancelledFailure extends Error {},
|
|
53
|
-
}));
|
|
54
|
-
|
|
55
|
-
vi.mock("../../../idle-watchdog.js", () => ({
|
|
56
|
-
activityStarted: vi.fn(),
|
|
57
|
-
activityFinished: vi.fn(),
|
|
58
|
-
}));
|
|
59
|
-
|
|
60
|
-
// Capture every persisted status (the gRPC chokepoint) for assertions.
|
|
61
|
-
const { persistedStatuses } = vi.hoisted(() => ({
|
|
62
|
-
persistedStatuses: [] as AgentExecutionStatus[],
|
|
63
|
-
}));
|
|
64
|
-
|
|
65
|
-
vi.mock("../../../client/stigmer-client.js", () => ({
|
|
66
|
-
StigmerClient: vi.fn().mockImplementation(() => ({
|
|
67
|
-
updateStatus: vi.fn(async (_id: string, status: AgentExecutionStatus) => {
|
|
68
|
-
// Snapshot point-in-time: persistStatus mutates the same object in place.
|
|
69
|
-
persistedStatuses.push(clone(AgentExecutionStatusSchema, status));
|
|
70
|
-
return { signal: 0 };
|
|
71
|
-
}),
|
|
72
|
-
getExecution: vi.fn(),
|
|
73
|
-
})),
|
|
74
|
-
}));
|
|
75
|
-
|
|
76
|
-
// performSetup is mocked per-test to return a fake durable-resume SetupResult.
|
|
77
|
-
vi.mock("../setup.js", () => ({ performSetup: vi.fn() }));
|
|
78
|
-
|
|
79
|
-
import { createDeepAgentActivities } from "../index.js";
|
|
80
|
-
import { performSetup } from "../setup.js";
|
|
81
|
-
|
|
82
|
-
const GATED_TOOL_CALL_ID = "toolu_hitl_01";
|
|
83
|
-
const PRE_RESUME_AI_TEXT = "I'll call the echo tool.";
|
|
84
|
-
const POST_RESUME_AI_TEXT = "The echo tool returned the result.";
|
|
85
|
-
|
|
86
|
-
function v3Event(
|
|
87
|
-
seq: number,
|
|
88
|
-
method: string,
|
|
89
|
-
data: unknown,
|
|
90
|
-
namespace: string[] = [],
|
|
91
|
-
): V3ProtocolEvent {
|
|
92
|
-
return {
|
|
93
|
-
type: "event",
|
|
94
|
-
seq,
|
|
95
|
-
method,
|
|
96
|
-
params: { namespace, timestamp: Date.now(), data },
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/** The events a durable resume re-emits: tool execution + assistant turn. */
|
|
101
|
-
function resumeEvents(): V3ProtocolEvent[] {
|
|
102
|
-
return [
|
|
103
|
-
v3Event(0, "tools", {
|
|
104
|
-
event: "tool-started",
|
|
105
|
-
tool_call_id: GATED_TOOL_CALL_ID,
|
|
106
|
-
tool_name: "echo",
|
|
107
|
-
input: { input: "hello-hitl" },
|
|
108
|
-
}, [`tools:${GATED_TOOL_CALL_ID}`]),
|
|
109
|
-
v3Event(1, "tools", {
|
|
110
|
-
event: "tool-finished",
|
|
111
|
-
tool_call_id: GATED_TOOL_CALL_ID,
|
|
112
|
-
output: {
|
|
113
|
-
lc: 1,
|
|
114
|
-
type: "constructor",
|
|
115
|
-
id: ["langchain_core", "messages", "ToolMessage"],
|
|
116
|
-
kwargs: { content: "hello-hitl", tool_call_id: GATED_TOOL_CALL_ID },
|
|
117
|
-
},
|
|
118
|
-
}, [`tools:${GATED_TOOL_CALL_ID}`]),
|
|
119
|
-
v3Event(2, "messages", { event: "message-start", run_id: "r2" }),
|
|
120
|
-
v3Event(3, "messages", {
|
|
121
|
-
event: "content-block-delta",
|
|
122
|
-
index: 0,
|
|
123
|
-
delta: { type: "text-delta", text: POST_RESUME_AI_TEXT },
|
|
124
|
-
run_id: "r2",
|
|
125
|
-
}),
|
|
126
|
-
v3Event(4, "messages", { event: "message-finish", run_id: "r2" }),
|
|
127
|
-
];
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
function mockV3Run(events: V3ProtocolEvent[]) {
|
|
131
|
-
return {
|
|
132
|
-
[Symbol.asyncIterator]: async function* () {
|
|
133
|
-
for (const e of events) yield e;
|
|
134
|
-
},
|
|
135
|
-
output: Promise.resolve({ messages: [] }),
|
|
136
|
-
abort: vi.fn(),
|
|
137
|
-
signal: new AbortController().signal,
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/** The run-1 transcript already persisted on the execution. */
|
|
142
|
-
function persistedRunOneStatus(): AgentExecutionStatus {
|
|
143
|
-
return create(AgentExecutionStatusSchema, {
|
|
144
|
-
phase: ExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL,
|
|
145
|
-
startedAt: "2026-06-15T00:00:00.000Z",
|
|
146
|
-
messages: [
|
|
147
|
-
create(AgentMessageSchema, {
|
|
148
|
-
type: MessageType.MESSAGE_AI,
|
|
149
|
-
content: PRE_RESUME_AI_TEXT,
|
|
150
|
-
timestamp: "2026-06-15T00:00:01.000Z",
|
|
151
|
-
toolCalls: [
|
|
152
|
-
create(ToolCallSchema, {
|
|
153
|
-
id: GATED_TOOL_CALL_ID,
|
|
154
|
-
name: "echo",
|
|
155
|
-
status: ToolCallStatus.TOOL_CALL_WAITING_APPROVAL,
|
|
156
|
-
requiresApproval: true,
|
|
157
|
-
approvalMessage: "Execute echo tool",
|
|
158
|
-
approvalAction: ApprovalAction.APPROVE,
|
|
159
|
-
mcpServerSlug: "test-mcp",
|
|
160
|
-
}),
|
|
161
|
-
],
|
|
162
|
-
}),
|
|
163
|
-
],
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
function fakeDurableResumeSetup(): SetupResult {
|
|
168
|
-
let streamed = false;
|
|
169
|
-
|
|
170
|
-
const pendingInterruptState = {
|
|
171
|
-
values: { messages: [{ role: "assistant", content: PRE_RESUME_AI_TEXT }] },
|
|
172
|
-
tasks: [{
|
|
173
|
-
id: "task-1",
|
|
174
|
-
interrupts: [{
|
|
175
|
-
value: {
|
|
176
|
-
tool_call_id: GATED_TOOL_CALL_ID,
|
|
177
|
-
tool_name: "echo",
|
|
178
|
-
mcp_server_slug: "test-mcp",
|
|
179
|
-
message: "Execute echo tool",
|
|
180
|
-
},
|
|
181
|
-
resumeValue: undefined,
|
|
182
|
-
}],
|
|
183
|
-
}],
|
|
184
|
-
};
|
|
185
|
-
const resolvedState = {
|
|
186
|
-
values: { messages: [{ role: "assistant", content: PRE_RESUME_AI_TEXT }] },
|
|
187
|
-
tasks: [],
|
|
188
|
-
};
|
|
189
|
-
|
|
190
|
-
const agentGraph = {
|
|
191
|
-
// Before the resumed stream: a pending interrupt awaits the decision.
|
|
192
|
-
// After the stream: the interrupt is resolved (no pending approvals).
|
|
193
|
-
getState: vi.fn(async () => (streamed ? resolvedState : pendingInterruptState)),
|
|
194
|
-
streamEvents: vi.fn(async () => {
|
|
195
|
-
streamed = true;
|
|
196
|
-
return mockV3Run(resumeEvents());
|
|
197
|
-
}),
|
|
198
|
-
};
|
|
199
|
-
|
|
200
|
-
const approvalPolicies = new Map([
|
|
201
|
-
["test-mcp/echo", {
|
|
202
|
-
toolName: "echo",
|
|
203
|
-
mcpServerSlug: "test-mcp",
|
|
204
|
-
requiresApproval: true,
|
|
205
|
-
approvalMessage: "Execute echo tool",
|
|
206
|
-
}],
|
|
207
|
-
]);
|
|
208
|
-
|
|
209
|
-
return {
|
|
210
|
-
agentGraph,
|
|
211
|
-
langgraphConfig: { configurable: { thread_id: "thread-1" } },
|
|
212
|
-
langgraphInput: { messages: [{ role: "user", content: "Call echo" }] },
|
|
213
|
-
execution: {
|
|
214
|
-
spec: { message: "Call echo with 'hello-hitl'." },
|
|
215
|
-
status: persistedRunOneStatus(),
|
|
216
|
-
},
|
|
217
|
-
agent: {},
|
|
218
|
-
session: { spec: { workspaceEntries: [] } },
|
|
219
|
-
// Unique per test file: the workspace turn lock keys on this path, and a
|
|
220
|
-
// path shared across files would serialize parallel test workers for real.
|
|
221
|
-
workspaceBackend: { rootDir: "/tmp/stigmer-test-ws-hitl-history" },
|
|
222
|
-
mcpConnection: null,
|
|
223
|
-
mergedEnvVars: {},
|
|
224
|
-
secretKeys: new Set<string>(),
|
|
225
|
-
modelName: "claude-sonnet",
|
|
226
|
-
gracefulStop: undefined,
|
|
227
|
-
artifactStorage: makeInMemoryArtifactStorage({ urlBase: "https://artifacts.local/" }).storage,
|
|
228
|
-
provisionResults: [],
|
|
229
|
-
approvalPolicies,
|
|
230
|
-
toolServerMap: new Map([["echo", "test-mcp"]]),
|
|
231
|
-
autoApproveAll: false,
|
|
232
|
-
hasStructuredOutput: false,
|
|
233
|
-
streamVersion: "v3",
|
|
234
|
-
} as unknown as SetupResult;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
const baseConfig: Config = {
|
|
238
|
-
taskQueue: "test-queue",
|
|
239
|
-
temporalAddress: "localhost:7233",
|
|
240
|
-
temporalNamespace: "default",
|
|
241
|
-
stigmerBackendEndpoint: "http://localhost:7234",
|
|
242
|
-
mcpBridgeEndpoint: null,
|
|
243
|
-
stigmerToken: null,
|
|
244
|
-
cursorApiKey: "",
|
|
245
|
-
workspaceRootDir: "/tmp/test",
|
|
246
|
-
mode: "cloud",
|
|
247
|
-
proxyEndpoint: "http://localhost:7234",
|
|
248
|
-
maxConcurrentActivities: 5,
|
|
249
|
-
idleTimeoutSeconds: null,
|
|
250
|
-
cloudModeEnabled: true,
|
|
251
|
-
checkpointerType: "http",
|
|
252
|
-
checkpointerProxyEndpoint: "http://localhost:7234",
|
|
253
|
-
artifactProxyEndpoint: null,
|
|
254
|
-
primaryModel: "claude-sonnet",
|
|
255
|
-
cursorStreamStallTimeoutMs: 180000,
|
|
256
|
-
agentResolveTimeoutMs: 120000,
|
|
257
|
-
workspaceLockTimeoutMs: 900000,
|
|
258
|
-
};
|
|
259
|
-
|
|
260
|
-
describe("ExecuteDeepAgent — durable-checkpoint resume preserves history", () => {
|
|
261
|
-
beforeEach(() => {
|
|
262
|
-
persistedStatuses.length = 0;
|
|
263
|
-
vi.mocked(performSetup).mockResolvedValue(fakeDurableResumeSetup());
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
it("retains the full transcript and resolves the gated tool call in place", async () => {
|
|
267
|
-
const activities = createDeepAgentActivities(baseConfig);
|
|
268
|
-
await activities.ExecuteDeepAgent("exec-1", "thread-1");
|
|
269
|
-
|
|
270
|
-
expect(persistedStatuses.length).toBeGreaterThan(0);
|
|
271
|
-
const finalStatus = persistedStatuses.at(-1)!;
|
|
272
|
-
|
|
273
|
-
// 1. The pre-resume transcript survives the resume.
|
|
274
|
-
const allText = finalStatus.messages.map(m => m.content).join("\n");
|
|
275
|
-
expect(allText).toContain(PRE_RESUME_AI_TEXT);
|
|
276
|
-
|
|
277
|
-
// 2. The post-resume assistant turn is appended.
|
|
278
|
-
expect(allText).toContain(POST_RESUME_AI_TEXT);
|
|
279
|
-
|
|
280
|
-
// 3. Exactly one copy of the gated tool call — no duplicate on resume.
|
|
281
|
-
const gatedToolCalls = finalStatus.messages
|
|
282
|
-
.flatMap(m => m.toolCalls)
|
|
283
|
-
.filter(tc => tc.id === GATED_TOOL_CALL_ID);
|
|
284
|
-
expect(gatedToolCalls).toHaveLength(1);
|
|
285
|
-
|
|
286
|
-
// 4. The gated tool call is resolved with its result, not stuck waiting.
|
|
287
|
-
expect(gatedToolCalls[0].status).toBe(ToolCallStatus.TOOL_CALL_COMPLETED);
|
|
288
|
-
expect(gatedToolCalls[0].result).toContain("hello-hitl");
|
|
289
|
-
|
|
290
|
-
// 5. The execution reaches a terminal COMPLETED phase.
|
|
291
|
-
expect(finalStatus.phase).toBe(ExecutionPhase.EXECUTION_COMPLETED);
|
|
292
|
-
});
|
|
293
|
-
});
|