@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,99 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
-
import { createDeepAgentActivities } from "../index.js";
|
|
3
|
-
import type { Config } from "../../../config.js";
|
|
4
|
-
|
|
5
|
-
// The activity reads the Temporal activity context (cancellation signal,
|
|
6
|
-
// heartbeat) via `Context.current()`. Outside a worker there is no live
|
|
7
|
-
// context, so provide a minimal stand-in.
|
|
8
|
-
vi.mock("@temporalio/activity", () => ({
|
|
9
|
-
Context: {
|
|
10
|
-
current: () => ({
|
|
11
|
-
// A real AbortSignal: the workspace-lock wait registers abort listeners
|
|
12
|
-
// on it, which a bare `{ aborted: false }` stub cannot satisfy.
|
|
13
|
-
cancellationSignal: new AbortController().signal,
|
|
14
|
-
heartbeat: vi.fn(),
|
|
15
|
-
info: { taskQueue: "test-queue" },
|
|
16
|
-
}),
|
|
17
|
-
},
|
|
18
|
-
CancelledFailure: class CancelledFailure extends Error {},
|
|
19
|
-
}));
|
|
20
|
-
|
|
21
|
-
vi.mock("../../../idle-watchdog.js", () => ({
|
|
22
|
-
activityStarted: vi.fn(),
|
|
23
|
-
activityFinished: vi.fn(),
|
|
24
|
-
}));
|
|
25
|
-
|
|
26
|
-
vi.mock("../../../client/stigmer-client.js", () => ({
|
|
27
|
-
StigmerClient: vi.fn().mockImplementation(() => ({
|
|
28
|
-
updateStatus: vi.fn().mockResolvedValue({ signal: 0 }),
|
|
29
|
-
getExecution: vi.fn().mockRejectedValue(new Error("not mocked")),
|
|
30
|
-
})),
|
|
31
|
-
}));
|
|
32
|
-
|
|
33
|
-
describe("ExecuteDeepAgent activity", () => {
|
|
34
|
-
const mockConfig: Config = {
|
|
35
|
-
taskQueue: "test-queue",
|
|
36
|
-
temporalAddress: "localhost:7233",
|
|
37
|
-
temporalNamespace: "default",
|
|
38
|
-
stigmerBackendEndpoint: "http://localhost:7234",
|
|
39
|
-
mcpBridgeEndpoint: null,
|
|
40
|
-
stigmerToken: null,
|
|
41
|
-
cursorApiKey: "",
|
|
42
|
-
workspaceRootDir: "/tmp/test",
|
|
43
|
-
mode: "local",
|
|
44
|
-
proxyEndpoint: null,
|
|
45
|
-
maxConcurrentActivities: 5,
|
|
46
|
-
idleTimeoutSeconds: null,
|
|
47
|
-
cloudModeEnabled: false,
|
|
48
|
-
checkpointerType: "memory",
|
|
49
|
-
checkpointerProxyEndpoint: null,
|
|
50
|
-
artifactProxyEndpoint: null,
|
|
51
|
-
primaryModel: "gpt-4.1",
|
|
52
|
-
cursorStreamStallTimeoutMs: 180000,
|
|
53
|
-
agentResolveTimeoutMs: 120000,
|
|
54
|
-
workspaceLockTimeoutMs: 900000,
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
let activities: ReturnType<typeof createDeepAgentActivities>;
|
|
58
|
-
|
|
59
|
-
beforeEach(() => {
|
|
60
|
-
activities = createDeepAgentActivities(mockConfig);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
it("registers ExecuteDeepAgent activity", () => {
|
|
64
|
-
expect(activities).toHaveProperty("ExecuteDeepAgent");
|
|
65
|
-
expect(typeof activities.ExecuteDeepAgent).toBe("function");
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it("returns EXECUTION_FAILED status when setup fails", async () => {
|
|
69
|
-
const result = await activities.ExecuteDeepAgent("exec-123", "thread-456");
|
|
70
|
-
|
|
71
|
-
expect(result).toBeDefined();
|
|
72
|
-
const status = result as Record<string, unknown>;
|
|
73
|
-
expect(status).toHaveProperty("phase");
|
|
74
|
-
expect(status.phase).toBe("EXECUTION_FAILED");
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
it("includes error message in failed status", async () => {
|
|
78
|
-
const result = await activities.ExecuteDeepAgent("exec-123", "thread-456");
|
|
79
|
-
const status = result as Record<string, unknown>;
|
|
80
|
-
expect(status.error).toContain("not mocked");
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
it("accepts the correct signature (executionId, threadId)", async () => {
|
|
84
|
-
await expect(
|
|
85
|
-
activities.ExecuteDeepAgent("execution-id", "thread-id"),
|
|
86
|
-
).resolves.toBeDefined();
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
it("handles empty threadId gracefully", async () => {
|
|
90
|
-
await expect(
|
|
91
|
-
activities.ExecuteDeepAgent("execution-id", ""),
|
|
92
|
-
).resolves.toBeDefined();
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
it("always returns a serializable result", async () => {
|
|
96
|
-
const result = await activities.ExecuteDeepAgent("exec-err", "thread-1");
|
|
97
|
-
expect(() => JSON.stringify(result)).not.toThrow();
|
|
98
|
-
});
|
|
99
|
-
});
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The deep-agent MCP gate, arm by arm. A missing arm here means a tool
|
|
3
|
-
* source silently dropped for exactly the agents whose only source it
|
|
4
|
-
* is — the failure DD-006 D7 documented for channel messaging and the
|
|
5
|
-
* reason the predicate lives in its own testable module instead of
|
|
6
|
-
* inline in setup.ts (whose import graph forbids a setup.test.ts).
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { describe, expect, it } from "vitest";
|
|
10
|
-
|
|
11
|
-
import { shouldConnectMcp } from "../mcp-gate.js";
|
|
12
|
-
|
|
13
|
-
const nothing = {
|
|
14
|
-
mcpServerUsageCount: 0,
|
|
15
|
-
channelMessagingCount: 0,
|
|
16
|
-
conversationChannelId: undefined,
|
|
17
|
-
memoryCaptureEnabled: false,
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
describe("shouldConnectMcp", () => {
|
|
21
|
-
it("skips the MCP block when no tool source exists", () => {
|
|
22
|
-
expect(shouldConnectMcp(nothing)).toBe(false);
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it("enters on declared MCP server usages alone", () => {
|
|
26
|
-
expect(shouldConnectMcp({ ...nothing, mcpServerUsageCount: 1 })).toBe(true);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it("enters on a serving proactive channel alone (the channels attachment)", () => {
|
|
30
|
-
expect(shouldConnectMcp({ ...nothing, channelMessagingCount: 1 })).toBe(true);
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
it("enters on a channel conversation alone (the conversation attachment)", () => {
|
|
34
|
-
// The reply-only pilot shape: no declared servers, no proactive
|
|
35
|
-
// channel — the escalation tool is the ONLY source.
|
|
36
|
-
expect(shouldConnectMcp({ ...nothing, conversationChannelId: "agch_1" })).toBe(true);
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it("enters on memory capture alone (the memory attachment)", () => {
|
|
40
|
-
// A tool-less agent whose user has memory on: the remember tool is
|
|
41
|
-
// the ONLY source, and skipping the block would silently drop it.
|
|
42
|
-
expect(shouldConnectMcp({ ...nothing, memoryCaptureEnabled: true })).toBe(true);
|
|
43
|
-
});
|
|
44
|
-
});
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from "vitest";
|
|
2
|
-
import { create } from "@bufbuild/protobuf";
|
|
3
|
-
import { AgentExecutionStatusSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
4
|
-
import { processPostStream } from "../post-stream.js";
|
|
5
|
-
import type { InlinePublisher } from "../inline-publisher.js";
|
|
6
|
-
import type { WriteBackCoordinator } from "../../../shared/workspace/writeback-coordinator.js";
|
|
7
|
-
|
|
8
|
-
function mockInlinePublisher(): InlinePublisher {
|
|
9
|
-
return {
|
|
10
|
-
publishedPaths: new Set(),
|
|
11
|
-
publish: vi.fn(),
|
|
12
|
-
} as any;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function mockWritebackCoordinator(): WriteBackCoordinator & { finalizeCalls: number } {
|
|
16
|
-
let finalizeCalls = 0;
|
|
17
|
-
return {
|
|
18
|
-
get finalizeCalls() { return finalizeCalls; },
|
|
19
|
-
hasEligibleEntries: true,
|
|
20
|
-
onFileModified: vi.fn(),
|
|
21
|
-
finalize: vi.fn(async () => { finalizeCalls++; }),
|
|
22
|
-
} as any;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
describe("processPostStream", () => {
|
|
26
|
-
it("drains pending publish and writeback promises", async () => {
|
|
27
|
-
let publishResolved = false;
|
|
28
|
-
let writebackResolved = false;
|
|
29
|
-
|
|
30
|
-
await processPostStream({
|
|
31
|
-
status: create(AgentExecutionStatusSchema, {}),
|
|
32
|
-
inlinePublisher: mockInlinePublisher(),
|
|
33
|
-
writebackCoordinator: mockWritebackCoordinator(),
|
|
34
|
-
pendingPublishPromises: [
|
|
35
|
-
new Promise<void>(resolve => { publishResolved = true; resolve(); }),
|
|
36
|
-
],
|
|
37
|
-
pendingWritebackPromises: [
|
|
38
|
-
new Promise<void>(resolve => { writebackResolved = true; resolve(); }),
|
|
39
|
-
],
|
|
40
|
-
executionId: "exec-test",
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
expect(publishResolved).toBe(true);
|
|
44
|
-
expect(writebackResolved).toBe(true);
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
it("calls writeback finalize", async () => {
|
|
48
|
-
const coordinator = mockWritebackCoordinator();
|
|
49
|
-
|
|
50
|
-
await processPostStream({
|
|
51
|
-
status: create(AgentExecutionStatusSchema, {}),
|
|
52
|
-
inlinePublisher: mockInlinePublisher(),
|
|
53
|
-
writebackCoordinator: coordinator,
|
|
54
|
-
pendingPublishPromises: [],
|
|
55
|
-
pendingWritebackPromises: [],
|
|
56
|
-
executionId: "exec-test",
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
expect(coordinator.finalize).toHaveBeenCalledOnce();
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it("skips writeback finalize when coordinator is null", async () => {
|
|
63
|
-
await processPostStream({
|
|
64
|
-
status: create(AgentExecutionStatusSchema, {}),
|
|
65
|
-
inlinePublisher: mockInlinePublisher(),
|
|
66
|
-
writebackCoordinator: null,
|
|
67
|
-
pendingPublishPromises: [],
|
|
68
|
-
pendingWritebackPromises: [],
|
|
69
|
-
executionId: "exec-test",
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
// no error thrown
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
it("continues even when pending promise rejects", async () => {
|
|
76
|
-
const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
|
|
77
|
-
const coordinator = mockWritebackCoordinator();
|
|
78
|
-
|
|
79
|
-
await processPostStream({
|
|
80
|
-
status: create(AgentExecutionStatusSchema, {}),
|
|
81
|
-
inlinePublisher: mockInlinePublisher(),
|
|
82
|
-
writebackCoordinator: coordinator,
|
|
83
|
-
pendingPublishPromises: [Promise.reject(new Error("publish boom"))],
|
|
84
|
-
pendingWritebackPromises: [],
|
|
85
|
-
executionId: "exec-test",
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
expect(coordinator.finalize).toHaveBeenCalledOnce();
|
|
89
|
-
warnSpy.mockRestore();
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it("continues even when writeback finalize throws", async () => {
|
|
93
|
-
const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
|
|
94
|
-
const coordinator = mockWritebackCoordinator();
|
|
95
|
-
(coordinator.finalize as ReturnType<typeof vi.fn>).mockRejectedValueOnce(
|
|
96
|
-
new Error("finalize boom"),
|
|
97
|
-
);
|
|
98
|
-
|
|
99
|
-
await processPostStream({
|
|
100
|
-
status: create(AgentExecutionStatusSchema, {}),
|
|
101
|
-
inlinePublisher: mockInlinePublisher(),
|
|
102
|
-
writebackCoordinator: coordinator,
|
|
103
|
-
pendingPublishPromises: [],
|
|
104
|
-
pendingWritebackPromises: [],
|
|
105
|
-
executionId: "exec-test",
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
// no error thrown, just warned
|
|
109
|
-
expect(warnSpy).toHaveBeenCalled();
|
|
110
|
-
warnSpy.mockRestore();
|
|
111
|
-
});
|
|
112
|
-
});
|
|
@@ -1,358 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Regression: two SEQUENTIAL approval gates under the ephemeral memory
|
|
3
|
-
* checkpointer (the OSS local / desktop default — config.ts resolves
|
|
4
|
-
* `checkpointerType: "memory"`).
|
|
5
|
-
*
|
|
6
|
-
* Unlike the durable (http) checkpointer — which resumes via Command(resume) and
|
|
7
|
-
* re-emits only post-checkpoint events — the memory checkpointer is recreated
|
|
8
|
-
* empty every invocation (factory.ts), so the Temporal workflow's post-approval
|
|
9
|
-
* re-invocation REPLAYS the graph from scratch. The langgraph input is just the
|
|
10
|
-
* original user message (setup.ts), and the blind-FIFO mock LLM advances exactly
|
|
11
|
-
* one gate per invocation, so the replay reaches the NEXT gate (gate B) directly.
|
|
12
|
-
*
|
|
13
|
-
* The defect this pins: on that gate-B re-invocation the live checkpoint is
|
|
14
|
-
* empty, so a status rebuilt from an empty proto emits a transcript that holds
|
|
15
|
-
* ONLY gate B and silently drops gate A's already-committed tool-call id. The
|
|
16
|
-
* server's append-only-at-identity guard (update_status.go
|
|
17
|
-
* nonTerminalTranscriptRegression) then rejects the update and keeps the old
|
|
18
|
-
* messages, but projects pending_approvals from those kept messages — gate A is
|
|
19
|
-
* already decided, so pending=0, and WAITING_FOR_APPROVAL + pending=0 makes the
|
|
20
|
-
* workflow auto-resume, skipping gate B. The fix seeds the status from the
|
|
21
|
-
* persisted transcript whenever the execution already has history, so gate B's
|
|
22
|
-
* update is a superset of gate A rather than a replacement.
|
|
23
|
-
*
|
|
24
|
-
* This test exercises BOTH invocations through the real activity, asserting the
|
|
25
|
-
* gate-A tool call survives into the gate-B update — the single behavior that,
|
|
26
|
-
* if regressed, reintroduces the silent skip.
|
|
27
|
-
*/
|
|
28
|
-
|
|
29
|
-
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
30
|
-
import { makeInMemoryArtifactStorage } from "../../../__test-utils__/fake-artifact-storage.js";
|
|
31
|
-
import { create, clone } from "@bufbuild/protobuf";
|
|
32
|
-
import {
|
|
33
|
-
AgentExecutionStatusSchema,
|
|
34
|
-
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
35
|
-
import type { AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
36
|
-
import {
|
|
37
|
-
AgentMessageSchema,
|
|
38
|
-
ToolCallSchema,
|
|
39
|
-
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
40
|
-
import {
|
|
41
|
-
ApprovalAction,
|
|
42
|
-
ExecutionPhase,
|
|
43
|
-
MessageType,
|
|
44
|
-
ToolCallStatus,
|
|
45
|
-
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
46
|
-
import type { V3ProtocolEvent } from "../v3-event-recorder.js";
|
|
47
|
-
import type { Config } from "../../../config.js";
|
|
48
|
-
import type { SetupResult } from "../setup.js";
|
|
49
|
-
|
|
50
|
-
// The Temporal activity context is unavailable outside a worker.
|
|
51
|
-
vi.mock("@temporalio/activity", () => ({
|
|
52
|
-
Context: {
|
|
53
|
-
current: () => ({
|
|
54
|
-
// A real AbortSignal: the workspace-lock wait registers abort listeners
|
|
55
|
-
// on it, which a bare `{ aborted: false }` stub cannot satisfy.
|
|
56
|
-
cancellationSignal: new AbortController().signal,
|
|
57
|
-
heartbeat: vi.fn(),
|
|
58
|
-
info: { taskQueue: "test-queue" },
|
|
59
|
-
}),
|
|
60
|
-
},
|
|
61
|
-
CancelledFailure: class CancelledFailure extends Error {},
|
|
62
|
-
}));
|
|
63
|
-
|
|
64
|
-
vi.mock("../../../idle-watchdog.js", () => ({
|
|
65
|
-
activityStarted: vi.fn(),
|
|
66
|
-
activityFinished: vi.fn(),
|
|
67
|
-
}));
|
|
68
|
-
|
|
69
|
-
// Capture every persisted status (the gRPC chokepoint) for assertions.
|
|
70
|
-
const { persistedStatuses } = vi.hoisted(() => ({
|
|
71
|
-
persistedStatuses: [] as AgentExecutionStatus[],
|
|
72
|
-
}));
|
|
73
|
-
|
|
74
|
-
vi.mock("../../../client/stigmer-client.js", () => ({
|
|
75
|
-
StigmerClient: vi.fn().mockImplementation(() => ({
|
|
76
|
-
updateStatus: vi.fn(async (_id: string, status: AgentExecutionStatus) => {
|
|
77
|
-
// Snapshot point-in-time: persistStatus mutates the same object in place.
|
|
78
|
-
persistedStatuses.push(clone(AgentExecutionStatusSchema, status));
|
|
79
|
-
return { signal: 0 };
|
|
80
|
-
}),
|
|
81
|
-
getExecution: vi.fn(),
|
|
82
|
-
})),
|
|
83
|
-
}));
|
|
84
|
-
|
|
85
|
-
// performSetup is mocked per-invocation to return a fake memory-replay SetupResult.
|
|
86
|
-
vi.mock("../setup.js", () => ({ performSetup: vi.fn() }));
|
|
87
|
-
|
|
88
|
-
import { createDeepAgentActivities } from "../index.js";
|
|
89
|
-
import { performSetup } from "../setup.js";
|
|
90
|
-
|
|
91
|
-
const GATE_A_ID = "toolu_gate_a";
|
|
92
|
-
const GATE_B_ID = "toolu_gate_b";
|
|
93
|
-
|
|
94
|
-
function v3Event(
|
|
95
|
-
seq: number,
|
|
96
|
-
method: string,
|
|
97
|
-
data: unknown,
|
|
98
|
-
namespace: string[] = [],
|
|
99
|
-
): V3ProtocolEvent {
|
|
100
|
-
return {
|
|
101
|
-
type: "event",
|
|
102
|
-
seq,
|
|
103
|
-
method,
|
|
104
|
-
params: { namespace, timestamp: Date.now(), data },
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Events for a replayed turn that proposes a gated tool but pauses BEFORE
|
|
110
|
-
* execution. The model turn commits no transcript message (no text/tool deltas);
|
|
111
|
-
* the gated tool call is authored downstream by the activity from the pending
|
|
112
|
-
* interrupt, matching the live e2e's single-tool gate update. Two events keep the
|
|
113
|
-
* v3 loop from erroring on an empty stream.
|
|
114
|
-
*/
|
|
115
|
-
function gateTurnEvents(): V3ProtocolEvent[] {
|
|
116
|
-
return [
|
|
117
|
-
v3Event(0, "messages", { event: "message-start", run_id: "g1" }),
|
|
118
|
-
v3Event(1, "messages", { event: "message-finish", run_id: "g1" }),
|
|
119
|
-
];
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
function mockV3Run(events: V3ProtocolEvent[]) {
|
|
123
|
-
return {
|
|
124
|
-
[Symbol.asyncIterator]: async function* () {
|
|
125
|
-
for (const e of events) yield e;
|
|
126
|
-
},
|
|
127
|
-
output: Promise.resolve({ messages: [] }),
|
|
128
|
-
abort: vi.fn(),
|
|
129
|
-
signal: new AbortController().signal,
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/** The empty live checkpoint a freshly-recreated MemorySaver reports pre-stream. */
|
|
134
|
-
const EMPTY_REPLAY_STATE = { values: { messages: [] as unknown[] }, tasks: [] };
|
|
135
|
-
|
|
136
|
-
/** The paused graph state after the replayed stream reaches the next gate. */
|
|
137
|
-
function gatedGraphState(toolCallId: string, toolName: string, filePath: string) {
|
|
138
|
-
return {
|
|
139
|
-
values: {
|
|
140
|
-
messages: [{
|
|
141
|
-
role: "assistant",
|
|
142
|
-
content: "",
|
|
143
|
-
tool_calls: [{ id: toolCallId, name: toolName, args: { file_path: filePath, content: "x\n" } }],
|
|
144
|
-
}],
|
|
145
|
-
},
|
|
146
|
-
tasks: [{
|
|
147
|
-
id: "task-gate",
|
|
148
|
-
interrupts: [{
|
|
149
|
-
value: {
|
|
150
|
-
tool_call_id: toolCallId,
|
|
151
|
-
tool_name: toolName,
|
|
152
|
-
message: `Execute ${toolName}`,
|
|
153
|
-
},
|
|
154
|
-
resumeValue: undefined,
|
|
155
|
-
}],
|
|
156
|
-
}],
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* A memory-checkpointer invocation that replays from scratch and re-pauses at a
|
|
162
|
-
* single gate: getState reports an empty live checkpoint before the stream and a
|
|
163
|
-
* pending interrupt after it.
|
|
164
|
-
*/
|
|
165
|
-
function fakeMemoryGateSetup(opts: {
|
|
166
|
-
gateId: string;
|
|
167
|
-
gateName: string;
|
|
168
|
-
filePath: string;
|
|
169
|
-
executionStatus: AgentExecutionStatus;
|
|
170
|
-
}): SetupResult {
|
|
171
|
-
let streamed = false;
|
|
172
|
-
const gated = gatedGraphState(opts.gateId, opts.gateName, opts.filePath);
|
|
173
|
-
|
|
174
|
-
const agentGraph = {
|
|
175
|
-
getState: vi.fn(async () => (streamed ? gated : EMPTY_REPLAY_STATE)),
|
|
176
|
-
streamEvents: vi.fn(async () => {
|
|
177
|
-
streamed = true;
|
|
178
|
-
return mockV3Run(gateTurnEvents());
|
|
179
|
-
}),
|
|
180
|
-
};
|
|
181
|
-
|
|
182
|
-
return {
|
|
183
|
-
agentGraph,
|
|
184
|
-
langgraphConfig: { configurable: { thread_id: "thread-seq" } },
|
|
185
|
-
langgraphInput: { messages: [{ role: "user", content: "Write A then B" }] },
|
|
186
|
-
execution: {
|
|
187
|
-
spec: { message: "Write file A, then write file B." },
|
|
188
|
-
status: opts.executionStatus,
|
|
189
|
-
},
|
|
190
|
-
agent: {},
|
|
191
|
-
session: { spec: { workspaceEntries: [] } },
|
|
192
|
-
workspaceBackend: {
|
|
193
|
-
// Unique per test file: the workspace turn lock keys on this path, and a
|
|
194
|
-
// path shared across files would serialize parallel test workers for real.
|
|
195
|
-
rootDir: "/tmp/stigmer-test-ws-seq-gate",
|
|
196
|
-
exists: vi.fn(async () => false),
|
|
197
|
-
readFile: vi.fn(async () => ""),
|
|
198
|
-
},
|
|
199
|
-
mcpConnection: null,
|
|
200
|
-
mergedEnvVars: {},
|
|
201
|
-
secretKeys: new Set<string>(),
|
|
202
|
-
modelName: "claude-sonnet",
|
|
203
|
-
gracefulStop: undefined,
|
|
204
|
-
artifactStorage: makeInMemoryArtifactStorage({ urlBase: "https://artifacts.local/" }).storage,
|
|
205
|
-
provisionResults: [],
|
|
206
|
-
approvalPolicies: new Map(),
|
|
207
|
-
toolServerMap: new Map(),
|
|
208
|
-
leasedCategories: new Set(),
|
|
209
|
-
globalBypass: false,
|
|
210
|
-
hasStructuredOutput: false,
|
|
211
|
-
streamVersion: "v3",
|
|
212
|
-
} as unknown as SetupResult;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/** Run-1 transcript persisted on the execution, with the user's APPROVE recorded. */
|
|
216
|
-
function approvedGateAStatus(): AgentExecutionStatus {
|
|
217
|
-
return create(AgentExecutionStatusSchema, {
|
|
218
|
-
phase: ExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL,
|
|
219
|
-
startedAt: "2026-06-20T00:00:00.000Z",
|
|
220
|
-
messages: [
|
|
221
|
-
create(AgentMessageSchema, {
|
|
222
|
-
type: MessageType.MESSAGE_AI,
|
|
223
|
-
content: "",
|
|
224
|
-
timestamp: "2026-06-20T00:00:01.000Z",
|
|
225
|
-
toolCalls: [
|
|
226
|
-
create(ToolCallSchema, {
|
|
227
|
-
id: GATE_A_ID,
|
|
228
|
-
name: "write_file",
|
|
229
|
-
status: ToolCallStatus.TOOL_CALL_WAITING_APPROVAL,
|
|
230
|
-
requiresApproval: true,
|
|
231
|
-
approvalMessage: "Execute write_file",
|
|
232
|
-
// The user approved gate A; SubmitApproval records the decision on
|
|
233
|
-
// the persisted transcript (status stays WAITING_APPROVAL until the
|
|
234
|
-
// resumed tool runs), which is what re-invokes the activity.
|
|
235
|
-
approvalAction: ApprovalAction.APPROVE,
|
|
236
|
-
}),
|
|
237
|
-
],
|
|
238
|
-
}),
|
|
239
|
-
],
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
const memoryConfig: Config = {
|
|
244
|
-
taskQueue: "test-queue",
|
|
245
|
-
temporalAddress: "localhost:7233",
|
|
246
|
-
temporalNamespace: "default",
|
|
247
|
-
stigmerBackendEndpoint: "http://localhost:7234",
|
|
248
|
-
mcpBridgeEndpoint: null,
|
|
249
|
-
stigmerToken: null,
|
|
250
|
-
cursorApiKey: "",
|
|
251
|
-
workspaceRootDir: "/tmp/test",
|
|
252
|
-
mode: "local",
|
|
253
|
-
proxyEndpoint: null,
|
|
254
|
-
maxConcurrentActivities: 5,
|
|
255
|
-
idleTimeoutSeconds: null,
|
|
256
|
-
cloudModeEnabled: false,
|
|
257
|
-
checkpointerType: "memory",
|
|
258
|
-
checkpointerProxyEndpoint: null,
|
|
259
|
-
artifactProxyEndpoint: null,
|
|
260
|
-
primaryModel: "claude-sonnet",
|
|
261
|
-
cursorStreamStallTimeoutMs: 180000,
|
|
262
|
-
agentResolveTimeoutMs: 120000,
|
|
263
|
-
workspaceLockTimeoutMs: 900000,
|
|
264
|
-
};
|
|
265
|
-
|
|
266
|
-
function toolCallIds(status: AgentExecutionStatus): string[] {
|
|
267
|
-
return status.messages.flatMap(m => m.toolCalls).map(tc => tc.id);
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
describe("ExecuteDeepAgent — sequential gates under the memory checkpointer", () => {
|
|
271
|
-
beforeEach(() => {
|
|
272
|
-
persistedStatuses.length = 0;
|
|
273
|
-
vi.mocked(performSetup).mockReset();
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
it("preserves gate A's committed tool call when resuming into gate B", async () => {
|
|
277
|
-
const activities = createDeepAgentActivities(memoryConfig);
|
|
278
|
-
|
|
279
|
-
// ── Invocation 1: first run reaches gate A (no prior history to seed). ──
|
|
280
|
-
vi.mocked(performSetup).mockResolvedValueOnce(
|
|
281
|
-
fakeMemoryGateSetup({
|
|
282
|
-
gateId: GATE_A_ID,
|
|
283
|
-
gateName: "write_file",
|
|
284
|
-
filePath: "a.txt",
|
|
285
|
-
executionStatus: create(AgentExecutionStatusSchema, {}),
|
|
286
|
-
}),
|
|
287
|
-
);
|
|
288
|
-
await activities.ExecuteDeepAgent("exec-seq", "thread-seq");
|
|
289
|
-
|
|
290
|
-
const afterGateA = persistedStatuses.at(-1)!;
|
|
291
|
-
expect(afterGateA.phase).toBe(ExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL);
|
|
292
|
-
expect(toolCallIds(afterGateA)).toContain(GATE_A_ID);
|
|
293
|
-
|
|
294
|
-
// ── User approves gate A; the server records the decision on the persisted
|
|
295
|
-
// transcript. The next invocation re-invocation reads this status. ──
|
|
296
|
-
const approved = clone(AgentExecutionStatusSchema, afterGateA);
|
|
297
|
-
for (const m of approved.messages) {
|
|
298
|
-
for (const tc of m.toolCalls) {
|
|
299
|
-
if (tc.id === GATE_A_ID) tc.approvalAction = ApprovalAction.APPROVE;
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
// ── Invocation 2: re-invoked after approval. The memory checkpointer replays
|
|
304
|
-
// from scratch (empty live checkpoint) and the mock serves gate B. ──
|
|
305
|
-
persistedStatuses.length = 0;
|
|
306
|
-
vi.mocked(performSetup).mockResolvedValueOnce(
|
|
307
|
-
fakeMemoryGateSetup({
|
|
308
|
-
gateId: GATE_B_ID,
|
|
309
|
-
gateName: "write_file",
|
|
310
|
-
filePath: "b.txt",
|
|
311
|
-
executionStatus: approved,
|
|
312
|
-
}),
|
|
313
|
-
);
|
|
314
|
-
await activities.ExecuteDeepAgent("exec-seq", "thread-seq");
|
|
315
|
-
|
|
316
|
-
const afterGateB = persistedStatuses.at(-1)!;
|
|
317
|
-
const ids = toolCallIds(afterGateB);
|
|
318
|
-
|
|
319
|
-
// Gate B is the new pending approval.
|
|
320
|
-
expect(afterGateB.phase).toBe(ExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL);
|
|
321
|
-
expect(ids.filter(id => id === GATE_B_ID)).toHaveLength(1);
|
|
322
|
-
|
|
323
|
-
// The regression guard: gate A's committed tool call survives the resume.
|
|
324
|
-
// Dropping it lets the server guard reject the update and project pending=0,
|
|
325
|
-
// which auto-resumes the workflow and silently skips gate B.
|
|
326
|
-
expect(ids).toContain(GATE_A_ID);
|
|
327
|
-
});
|
|
328
|
-
|
|
329
|
-
/** A status that is a strict superset of the persisted transcript is what the
|
|
330
|
-
* server's append-only-at-identity guard accepts (no committed id dropped). */
|
|
331
|
-
it("emits a gate-B transcript that is a superset of the persisted gate-A transcript", async () => {
|
|
332
|
-
const activities = createDeepAgentActivities(memoryConfig);
|
|
333
|
-
|
|
334
|
-
const approved = approvedGateAStatus();
|
|
335
|
-
const priorIds = toolCallIds(approved);
|
|
336
|
-
|
|
337
|
-
vi.mocked(performSetup).mockResolvedValueOnce(
|
|
338
|
-
fakeMemoryGateSetup({
|
|
339
|
-
gateId: GATE_B_ID,
|
|
340
|
-
gateName: "write_file",
|
|
341
|
-
filePath: "b.txt",
|
|
342
|
-
executionStatus: approved,
|
|
343
|
-
}),
|
|
344
|
-
);
|
|
345
|
-
await activities.ExecuteDeepAgent("exec-seq", "thread-seq");
|
|
346
|
-
|
|
347
|
-
const afterGateB = persistedStatuses.at(-1)!;
|
|
348
|
-
const ids = new Set(toolCallIds(afterGateB));
|
|
349
|
-
|
|
350
|
-
// Every previously-committed tool-call id is still present (no drop), and the
|
|
351
|
-
// transcript did not shrink — exactly the two regressions the server guard
|
|
352
|
-
// rejects (update_status.go nonTerminalTranscriptRegression).
|
|
353
|
-
for (const id of priorIds) {
|
|
354
|
-
expect(ids.has(id)).toBe(true);
|
|
355
|
-
}
|
|
356
|
-
expect(afterGateB.messages.length).toBeGreaterThanOrEqual(approved.messages.length);
|
|
357
|
-
});
|
|
358
|
-
});
|