@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,277 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* V3 streaming execution loop for ExecuteDeepAgent.
|
|
3
|
-
*
|
|
4
|
-
* Feature-flagged path activated by LANGGRAPH_STREAM_EVENTS_VERSION=v3.
|
|
5
|
-
* Calls the v3 streamEvents API (two-arg, returns Promise<GraphRunStream>),
|
|
6
|
-
* iterates raw ProtocolEvents, feeds them through the V3ProtocolNormalizer
|
|
7
|
-
* and V3StatusBuilder, persists status on schedule, and handles terminal
|
|
8
|
-
* conditions (STOP, pause, recursion limit) identically to v2.
|
|
9
|
-
*
|
|
10
|
-
* Phase 2: full orchestration parity with streamExecutionV2.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import type { StreamDependencies, StreamResult } from "./streaming.js";
|
|
14
|
-
import { StallTimeoutError } from "./streaming.js";
|
|
15
|
-
import { ExecutionControlSignal, ExecutionPhase } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
16
|
-
import { createV3EventRecorder, type V3ProtocolEvent } from "./v3-event-recorder.js";
|
|
17
|
-
import { normalize } from "./v3-protocol-normalizer.js";
|
|
18
|
-
import { V3StatusBuilder } from "./v3-status-builder.js";
|
|
19
|
-
import { StreamingUpdateScheduler } from "../../shared/streaming-scheduler.js";
|
|
20
|
-
import { persistStatus, slimStatus } from "../../shared/status.js";
|
|
21
|
-
import { StreamingSideEffects } from "./streaming-side-effects.js";
|
|
22
|
-
import {
|
|
23
|
-
handlePause,
|
|
24
|
-
handleStop,
|
|
25
|
-
handleRecursionLimit,
|
|
26
|
-
isGraphRecursionError,
|
|
27
|
-
} from "./streaming-terminal.js";
|
|
28
|
-
|
|
29
|
-
interface V3RunStream extends AsyncIterable<V3ProtocolEvent> {
|
|
30
|
-
readonly output: Promise<unknown>;
|
|
31
|
-
abort(reason?: unknown): void;
|
|
32
|
-
readonly signal: AbortSignal;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const DEFAULT_STALL_TIMEOUT_MS = 120_000;
|
|
36
|
-
const HEARTBEAT_INTERVAL_MS = 2_000;
|
|
37
|
-
const RUN_OUTPUT_TIMEOUT_MS = 30_000;
|
|
38
|
-
|
|
39
|
-
export async function streamExecutionV3(
|
|
40
|
-
deps: StreamDependencies,
|
|
41
|
-
): Promise<StreamResult> {
|
|
42
|
-
const {
|
|
43
|
-
agentGraph,
|
|
44
|
-
langgraphInput,
|
|
45
|
-
langgraphConfig,
|
|
46
|
-
executionId,
|
|
47
|
-
client,
|
|
48
|
-
initialStatus,
|
|
49
|
-
streamingConfig,
|
|
50
|
-
retryOptions,
|
|
51
|
-
offload,
|
|
52
|
-
stallTimeoutMs = DEFAULT_STALL_TIMEOUT_MS,
|
|
53
|
-
heartbeatFn,
|
|
54
|
-
isCancelledFn,
|
|
55
|
-
gracefulStop,
|
|
56
|
-
inlinePublisher,
|
|
57
|
-
writebackCoordinator,
|
|
58
|
-
approvalProvider,
|
|
59
|
-
} = deps;
|
|
60
|
-
|
|
61
|
-
const statusBuilder = new V3StatusBuilder(executionId, initialStatus);
|
|
62
|
-
if (approvalProvider) {
|
|
63
|
-
statusBuilder.setApprovalProvider(approvalProvider);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const scheduler = new StreamingUpdateScheduler(streamingConfig);
|
|
67
|
-
const recorder = createV3EventRecorder(executionId, process.env.V3_EVENT_RECORD_DIR);
|
|
68
|
-
const abortController = new AbortController();
|
|
69
|
-
|
|
70
|
-
const sideEffects = new StreamingSideEffects({
|
|
71
|
-
inlinePublisher,
|
|
72
|
-
writebackCoordinator,
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
// Pre-loop heartbeat to cover the initial await
|
|
76
|
-
sendHeartbeat(heartbeatFn, executionId, 0, statusBuilder);
|
|
77
|
-
|
|
78
|
-
const run = await (agentGraph as any).streamEvents(langgraphInput, {
|
|
79
|
-
...langgraphConfig,
|
|
80
|
-
version: "v3",
|
|
81
|
-
signal: abortController.signal,
|
|
82
|
-
}) as V3RunStream;
|
|
83
|
-
|
|
84
|
-
let eventsProcessed = 0;
|
|
85
|
-
let lastActivityAt = performance.now();
|
|
86
|
-
|
|
87
|
-
const heartbeatTimer = setInterval(() => {
|
|
88
|
-
sendHeartbeat(heartbeatFn, executionId, eventsProcessed, statusBuilder);
|
|
89
|
-
}, HEARTBEAT_INTERVAL_MS);
|
|
90
|
-
|
|
91
|
-
try {
|
|
92
|
-
for await (const event of run as AsyncIterable<V3ProtocolEvent>) {
|
|
93
|
-
if (isCancelledFn?.()) {
|
|
94
|
-
abortController.abort("Cancelled by platform");
|
|
95
|
-
statusBuilder.cancelSubAgents();
|
|
96
|
-
return handlePause(
|
|
97
|
-
statusBuilder, eventsProcessed,
|
|
98
|
-
sideEffects.pendingPublishPromises,
|
|
99
|
-
sideEffects.pendingWritebackPromises,
|
|
100
|
-
);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
lastActivityAt = performance.now();
|
|
104
|
-
recorder?.record(event, eventsProcessed);
|
|
105
|
-
|
|
106
|
-
for (const normalized of normalize(event)) {
|
|
107
|
-
statusBuilder.processEvent(normalized);
|
|
108
|
-
}
|
|
109
|
-
sideEffects.onProtocolEvent(event);
|
|
110
|
-
eventsProcessed++;
|
|
111
|
-
|
|
112
|
-
const shouldPersist = statusBuilder.forceNextUpdate ||
|
|
113
|
-
scheduler.shouldSendUpdate(eventsProcessed);
|
|
114
|
-
|
|
115
|
-
if (shouldPersist) {
|
|
116
|
-
if (statusBuilder.forceNextUpdate) {
|
|
117
|
-
statusBuilder.clearForceFlag();
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
statusBuilder.syncSubAgentExecutions();
|
|
121
|
-
// Mid-run live capture (DD-32): attach file_change_progress to the live
|
|
122
|
-
// status before it is persisted. Injected so this loop stays ignorant of
|
|
123
|
-
// file-review specifics; a no-op when the hook is absent or nothing changed.
|
|
124
|
-
const statusToPersist = statusBuilder.currentStatus;
|
|
125
|
-
await deps.beforePersist?.(statusToPersist);
|
|
126
|
-
const signal = await persistStatus(
|
|
127
|
-
client,
|
|
128
|
-
executionId,
|
|
129
|
-
statusToPersist,
|
|
130
|
-
{ offload, retry: retryOptions },
|
|
131
|
-
);
|
|
132
|
-
scheduler.markUpdateSent(eventsProcessed);
|
|
133
|
-
|
|
134
|
-
if (signal === ExecutionControlSignal.STOP) {
|
|
135
|
-
console.warn(
|
|
136
|
-
`[streaming-v3] STOP signal received for execution ${executionId}`,
|
|
137
|
-
);
|
|
138
|
-
if (gracefulStop) {
|
|
139
|
-
gracefulStop.activate("Platform STOP signal");
|
|
140
|
-
} else {
|
|
141
|
-
return handleStop(
|
|
142
|
-
statusBuilder, eventsProcessed,
|
|
143
|
-
sideEffects.pendingPublishPromises,
|
|
144
|
-
sideEffects.pendingWritebackPromises,
|
|
145
|
-
);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
checkStallTimeout(lastActivityAt, stallTimeoutMs, executionId);
|
|
151
|
-
}
|
|
152
|
-
} catch (err: unknown) {
|
|
153
|
-
if (isGraphRecursionError(err)) {
|
|
154
|
-
await recorder?.flush();
|
|
155
|
-
return handleRecursionLimit(
|
|
156
|
-
statusBuilder, eventsProcessed,
|
|
157
|
-
sideEffects.pendingPublishPromises,
|
|
158
|
-
sideEffects.pendingWritebackPromises,
|
|
159
|
-
);
|
|
160
|
-
}
|
|
161
|
-
throw err;
|
|
162
|
-
} finally {
|
|
163
|
-
clearInterval(heartbeatTimer);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
await recorder?.flush();
|
|
167
|
-
|
|
168
|
-
if (eventsProcessed === 0) {
|
|
169
|
-
throw new Error(
|
|
170
|
-
"Stream completed without processing any events. " +
|
|
171
|
-
"This may indicate a configuration error or v3 API incompatibility.",
|
|
172
|
-
);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
statusBuilder.syncSubAgentExecutions();
|
|
176
|
-
|
|
177
|
-
if (initialStatus.phase === ExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL) {
|
|
178
|
-
console.log(
|
|
179
|
-
`[streaming-v3] execution=${executionId} stream ended with WAITING_FOR_APPROVAL. ` +
|
|
180
|
-
`Not setting COMPLETED. pending_approvals computed server-side.`,
|
|
181
|
-
);
|
|
182
|
-
return {
|
|
183
|
-
eventsProcessed,
|
|
184
|
-
terminalStatus: slimStatus(initialStatus),
|
|
185
|
-
pendingPublishPromises: sideEffects.pendingPublishPromises,
|
|
186
|
-
pendingWritebackPromises: sideEffects.pendingWritebackPromises,
|
|
187
|
-
};
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
console.log(
|
|
191
|
-
`[streaming-v3] execution=${executionId} stream finished — ` +
|
|
192
|
-
`processed ${eventsProcessed} events`,
|
|
193
|
-
);
|
|
194
|
-
|
|
195
|
-
const runOutput = await extractRunOutput(run, executionId);
|
|
196
|
-
|
|
197
|
-
return {
|
|
198
|
-
eventsProcessed,
|
|
199
|
-
runOutput,
|
|
200
|
-
pendingPublishPromises: sideEffects.pendingPublishPromises,
|
|
201
|
-
pendingWritebackPromises: sideEffects.pendingWritebackPromises,
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
// ── Run Output Extraction ────────────────────────────────────────────
|
|
206
|
-
|
|
207
|
-
async function extractRunOutput(
|
|
208
|
-
run: { output: Promise<unknown> },
|
|
209
|
-
executionId: string,
|
|
210
|
-
): Promise<Record<string, unknown> | undefined> {
|
|
211
|
-
try {
|
|
212
|
-
const finalState = await Promise.race([
|
|
213
|
-
run.output,
|
|
214
|
-
timeoutPromise(RUN_OUTPUT_TIMEOUT_MS),
|
|
215
|
-
]);
|
|
216
|
-
|
|
217
|
-
if (finalState === TIMEOUT_SENTINEL) {
|
|
218
|
-
console.warn(
|
|
219
|
-
`[streaming-v3] execution=${executionId} — run.output did not resolve ` +
|
|
220
|
-
`within ${RUN_OUTPUT_TIMEOUT_MS}ms. Proceeding without final state.`,
|
|
221
|
-
);
|
|
222
|
-
return undefined;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
const output = finalState as Record<string, unknown>;
|
|
226
|
-
console.log(
|
|
227
|
-
`[streaming-v3] execution=${executionId} — run.output resolved. ` +
|
|
228
|
-
`Keys: [${Object.keys(output ?? {}).join(", ")}]. ` +
|
|
229
|
-
`hasStructuredResponse=${output?.structuredResponse !== undefined}`,
|
|
230
|
-
);
|
|
231
|
-
return output;
|
|
232
|
-
} catch (err) {
|
|
233
|
-
console.warn(
|
|
234
|
-
`[streaming-v3] execution=${executionId} — run.output rejected: ${err}`,
|
|
235
|
-
);
|
|
236
|
-
return undefined;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
const TIMEOUT_SENTINEL = Symbol("timeout");
|
|
241
|
-
|
|
242
|
-
function timeoutPromise(ms: number): Promise<typeof TIMEOUT_SENTINEL> {
|
|
243
|
-
return new Promise((resolve) => setTimeout(() => resolve(TIMEOUT_SENTINEL), ms));
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
// ── Helpers ──────────────────────────────────────────────────────────
|
|
247
|
-
|
|
248
|
-
function sendHeartbeat(
|
|
249
|
-
fn: ((details: Record<string, unknown>) => void) | undefined,
|
|
250
|
-
executionId: string,
|
|
251
|
-
eventsProcessed: number,
|
|
252
|
-
sb: V3StatusBuilder,
|
|
253
|
-
): void {
|
|
254
|
-
if (!fn) return;
|
|
255
|
-
try {
|
|
256
|
-
fn({
|
|
257
|
-
executionId,
|
|
258
|
-
eventsProcessed,
|
|
259
|
-
messages: sb.currentStatus.messages.length,
|
|
260
|
-
phase: sb.currentStatus.phase,
|
|
261
|
-
});
|
|
262
|
-
} catch { /* swallow */ }
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
function checkStallTimeout(
|
|
266
|
-
lastActivityAt: number,
|
|
267
|
-
stallTimeoutMs: number,
|
|
268
|
-
executionId: string,
|
|
269
|
-
): void {
|
|
270
|
-
const elapsed = performance.now() - lastActivityAt;
|
|
271
|
-
if (elapsed > stallTimeoutMs) {
|
|
272
|
-
throw new StallTimeoutError(
|
|
273
|
-
`Agent stream stalled: no events received for ${Math.round(elapsed / 1000)}s ` +
|
|
274
|
-
`for execution ${executionId}`,
|
|
275
|
-
);
|
|
276
|
-
}
|
|
277
|
-
}
|
|
@@ -1,313 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Streaming execution loop for ExecuteDeepAgent.
|
|
3
|
-
*
|
|
4
|
-
* Replaces the Phase 3a invoke() approach with streamEvents() v2
|
|
5
|
-
* consumption. Feeds events to the StatusBuilder, persists status
|
|
6
|
-
* via the scheduler + retry executor, handles terminal conditions
|
|
7
|
-
* (STOP signal, stall, recursion limit, cancellation).
|
|
8
|
-
*
|
|
9
|
-
* Phase 3b-iii: inline artifact publish and incremental git writeback
|
|
10
|
-
* on file-modifying tool completions (write, edit, create).
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { create, toJson } from "@bufbuild/protobuf";
|
|
14
|
-
import {
|
|
15
|
-
AgentExecutionStatusSchema,
|
|
16
|
-
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
17
|
-
import type { AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
18
|
-
import { AgentMessageSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
19
|
-
import {
|
|
20
|
-
ExecutionControlSignal,
|
|
21
|
-
ExecutionPhase,
|
|
22
|
-
MessageType,
|
|
23
|
-
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
24
|
-
|
|
25
|
-
import { StatusBuilder, type StreamEvent, type ApprovalPolicyProvider } from "./status-builder.js";
|
|
26
|
-
import {
|
|
27
|
-
handlePause,
|
|
28
|
-
handleStop,
|
|
29
|
-
handleRecursionLimit,
|
|
30
|
-
isGraphRecursionError,
|
|
31
|
-
} from "./streaming-terminal.js";
|
|
32
|
-
import {
|
|
33
|
-
StreamingUpdateScheduler,
|
|
34
|
-
type StreamingConfig,
|
|
35
|
-
} from "../../shared/streaming-scheduler.js";
|
|
36
|
-
import { type RetryOptions } from "../../shared/grpc-retry.js";
|
|
37
|
-
import { persistStatus, slimStatus, utcTimestamp } from "../../shared/status.js";
|
|
38
|
-
import type { ToolOutputOffloadContext } from "../../shared/status-offload.js";
|
|
39
|
-
import type { StigmerClient } from "../../client/stigmer-client.js";
|
|
40
|
-
import type { GracefulStopMiddleware } from "../../middleware/index.js";
|
|
41
|
-
import type { InlinePublisher } from "./inline-publisher.js";
|
|
42
|
-
import type { WriteBackCoordinator } from "../../shared/workspace/writeback-coordinator.js";
|
|
43
|
-
import { createV2EventRecorder } from "./event-recorder.js";
|
|
44
|
-
import { streamExecutionV3 } from "./streaming-v3.js";
|
|
45
|
-
import { extractFilePath, isFileModifyingTool } from "../../shared/file-tools.js";
|
|
46
|
-
|
|
47
|
-
const DEFAULT_STALL_TIMEOUT_MS = 120_000;
|
|
48
|
-
|
|
49
|
-
export interface StreamDependencies {
|
|
50
|
-
readonly agentGraph: {
|
|
51
|
-
streamEvents(
|
|
52
|
-
input: Record<string, unknown>,
|
|
53
|
-
config: Record<string, unknown>,
|
|
54
|
-
options: { version: string },
|
|
55
|
-
): AsyncIterable<StreamEvent>;
|
|
56
|
-
};
|
|
57
|
-
readonly langgraphInput: Record<string, unknown>;
|
|
58
|
-
readonly langgraphConfig: Record<string, unknown>;
|
|
59
|
-
readonly executionId: string;
|
|
60
|
-
readonly client: StigmerClient;
|
|
61
|
-
readonly initialStatus: AgentExecutionStatus;
|
|
62
|
-
readonly streamingConfig?: StreamingConfig;
|
|
63
|
-
readonly retryOptions?: RetryOptions;
|
|
64
|
-
/**
|
|
65
|
-
* Offload context for the persist chokepoint. When set, oversized tool
|
|
66
|
-
* outputs (e.g. computer-use screenshots) are spilled to artifact storage so
|
|
67
|
-
* the UI can render them; when omitted, the aggregate size backstop still
|
|
68
|
-
* keeps the payload under the gRPC cap.
|
|
69
|
-
*/
|
|
70
|
-
readonly offload?: ToolOutputOffloadContext;
|
|
71
|
-
readonly stallTimeoutMs?: number;
|
|
72
|
-
/** Temporal heartbeat. Injected so the loop is testable without Temporal. */
|
|
73
|
-
readonly heartbeatFn?: (details: Record<string, unknown>) => void;
|
|
74
|
-
/** Temporal cancellation check. */
|
|
75
|
-
readonly isCancelledFn?: () => boolean;
|
|
76
|
-
/** GracefulStopMiddleware instance for platform STOP signal handling. */
|
|
77
|
-
readonly gracefulStop?: GracefulStopMiddleware;
|
|
78
|
-
/** Inline artifact publisher for file-modifying tool completions. */
|
|
79
|
-
readonly inlinePublisher?: InlinePublisher;
|
|
80
|
-
/** Incremental git write-back coordinator. */
|
|
81
|
-
readonly writebackCoordinator?: WriteBackCoordinator;
|
|
82
|
-
/** Approval policy provider for StatusBuilder tool-call phase tracking. */
|
|
83
|
-
readonly approvalProvider?: ApprovalPolicyProvider;
|
|
84
|
-
/** Streaming protocol version. Defaults to "v2" if unset. */
|
|
85
|
-
readonly streamVersion?: "v2" | "v3";
|
|
86
|
-
/**
|
|
87
|
-
* Optional hook invoked with the live status just before each scheduled
|
|
88
|
-
* persist. Used by mid-run live capture (DD-32) to attach file_change_progress.
|
|
89
|
-
* Kept as an injected callback (closing over the turn's baseline tree / change
|
|
90
|
-
* set id in index.ts) so this loop stays ignorant of file-review specifics.
|
|
91
|
-
*/
|
|
92
|
-
readonly beforePersist?: (status: AgentExecutionStatus) => Promise<void>;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
export interface StreamResult {
|
|
96
|
-
readonly eventsProcessed: number;
|
|
97
|
-
readonly terminalStatus?: unknown;
|
|
98
|
-
readonly pendingPublishPromises: readonly Promise<void>[];
|
|
99
|
-
readonly pendingWritebackPromises: readonly Promise<void>[];
|
|
100
|
-
/** v3 only: the final state from run.output (includes structuredResponse if present). */
|
|
101
|
-
readonly runOutput?: Record<string, unknown>;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Run the streaming loop: consume streamEvents, map to proto via
|
|
106
|
-
* StatusBuilder, persist on schedule, and handle terminal conditions.
|
|
107
|
-
*
|
|
108
|
-
* Routes to v3 when deps.streamVersion === "v3".
|
|
109
|
-
*/
|
|
110
|
-
export async function streamExecution(
|
|
111
|
-
deps: StreamDependencies,
|
|
112
|
-
): Promise<StreamResult> {
|
|
113
|
-
if (deps.streamVersion === "v3") {
|
|
114
|
-
return streamExecutionV3(deps);
|
|
115
|
-
}
|
|
116
|
-
return streamExecutionV2(deps);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
async function streamExecutionV2(
|
|
120
|
-
deps: StreamDependencies,
|
|
121
|
-
): Promise<StreamResult> {
|
|
122
|
-
const {
|
|
123
|
-
agentGraph,
|
|
124
|
-
langgraphInput,
|
|
125
|
-
langgraphConfig,
|
|
126
|
-
executionId,
|
|
127
|
-
client,
|
|
128
|
-
initialStatus,
|
|
129
|
-
streamingConfig,
|
|
130
|
-
retryOptions,
|
|
131
|
-
offload,
|
|
132
|
-
stallTimeoutMs = DEFAULT_STALL_TIMEOUT_MS,
|
|
133
|
-
heartbeatFn,
|
|
134
|
-
isCancelledFn,
|
|
135
|
-
gracefulStop,
|
|
136
|
-
inlinePublisher,
|
|
137
|
-
writebackCoordinator,
|
|
138
|
-
approvalProvider,
|
|
139
|
-
} = deps;
|
|
140
|
-
|
|
141
|
-
const statusBuilder = new StatusBuilder(executionId, initialStatus);
|
|
142
|
-
if (approvalProvider) {
|
|
143
|
-
statusBuilder.setApprovalProvider(approvalProvider);
|
|
144
|
-
}
|
|
145
|
-
const scheduler = new StreamingUpdateScheduler(streamingConfig);
|
|
146
|
-
const recorder = createV2EventRecorder(executionId, process.env.V2_EVENT_RECORD_DIR);
|
|
147
|
-
|
|
148
|
-
let eventsProcessed = 0;
|
|
149
|
-
let lastEventTime = performance.now();
|
|
150
|
-
let lastHeartbeatTime = performance.now();
|
|
151
|
-
const heartbeatIntervalMs = 2000;
|
|
152
|
-
|
|
153
|
-
const pendingPublishPromises: Promise<void>[] = [];
|
|
154
|
-
const pendingWritebackPromises: Promise<void>[] = [];
|
|
155
|
-
|
|
156
|
-
try {
|
|
157
|
-
const stream = agentGraph.streamEvents(
|
|
158
|
-
langgraphInput,
|
|
159
|
-
langgraphConfig,
|
|
160
|
-
{ version: "v2" },
|
|
161
|
-
);
|
|
162
|
-
|
|
163
|
-
for await (const event of stream) {
|
|
164
|
-
if (isCancelledFn?.()) {
|
|
165
|
-
return handlePause(statusBuilder, eventsProcessed, pendingPublishPromises, pendingWritebackPromises);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
lastEventTime = performance.now();
|
|
169
|
-
recorder?.record(event, eventsProcessed);
|
|
170
|
-
statusBuilder.processEvent(event);
|
|
171
|
-
eventsProcessed++;
|
|
172
|
-
|
|
173
|
-
if (event.event === "on_tool_end" && (inlinePublisher || writebackCoordinator)) {
|
|
174
|
-
const filePath = extractFilePathFromToolEnd(event);
|
|
175
|
-
if (filePath) {
|
|
176
|
-
if (inlinePublisher) {
|
|
177
|
-
pendingPublishPromises.push(inlinePublisher.publish(filePath));
|
|
178
|
-
}
|
|
179
|
-
if (writebackCoordinator) {
|
|
180
|
-
pendingWritebackPromises.push(writebackCoordinator.onFileModified(filePath));
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
const now = performance.now();
|
|
186
|
-
if (heartbeatFn && (now - lastHeartbeatTime) >= heartbeatIntervalMs) {
|
|
187
|
-
sendHeartbeat(heartbeatFn, executionId, eventsProcessed, statusBuilder);
|
|
188
|
-
lastHeartbeatTime = now;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
const shouldPersist = statusBuilder.forceNextUpdate ||
|
|
192
|
-
scheduler.shouldSendUpdate(eventsProcessed);
|
|
193
|
-
|
|
194
|
-
if (shouldPersist) {
|
|
195
|
-
if (statusBuilder.forceNextUpdate) {
|
|
196
|
-
statusBuilder.clearForceFlag();
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
// Mid-run live capture (DD-32): attach file_change_progress to the live
|
|
200
|
-
// status before persisting (see streaming-v3.ts for the rationale).
|
|
201
|
-
const statusToPersist = statusBuilder.currentStatus;
|
|
202
|
-
await deps.beforePersist?.(statusToPersist);
|
|
203
|
-
const signal = await persistStatus(
|
|
204
|
-
client,
|
|
205
|
-
executionId,
|
|
206
|
-
statusToPersist,
|
|
207
|
-
{ offload, retry: retryOptions },
|
|
208
|
-
);
|
|
209
|
-
scheduler.markUpdateSent(eventsProcessed);
|
|
210
|
-
|
|
211
|
-
if (signal === ExecutionControlSignal.STOP) {
|
|
212
|
-
console.warn(
|
|
213
|
-
`[streaming] STOP signal received for execution ${executionId}`,
|
|
214
|
-
);
|
|
215
|
-
if (gracefulStop) {
|
|
216
|
-
gracefulStop.activate("Platform STOP signal");
|
|
217
|
-
} else {
|
|
218
|
-
return handleStop(statusBuilder, eventsProcessed, pendingPublishPromises, pendingWritebackPromises);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
checkStallTimeout(lastEventTime, stallTimeoutMs, executionId);
|
|
224
|
-
}
|
|
225
|
-
} catch (err: unknown) {
|
|
226
|
-
if (isGraphRecursionError(err)) {
|
|
227
|
-
return handleRecursionLimit(statusBuilder, eventsProcessed, pendingPublishPromises, pendingWritebackPromises);
|
|
228
|
-
}
|
|
229
|
-
throw err;
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
await recorder?.flush();
|
|
233
|
-
|
|
234
|
-
if (eventsProcessed === 0) {
|
|
235
|
-
throw new Error(
|
|
236
|
-
"Stream completed without processing any events. " +
|
|
237
|
-
"This may indicate a configuration error.",
|
|
238
|
-
);
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
if (initialStatus.phase === ExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL) {
|
|
242
|
-
console.log(
|
|
243
|
-
`[streaming] execution=${executionId} stream ended with WAITING_FOR_APPROVAL. ` +
|
|
244
|
-
`Not setting COMPLETED. pending_approvals computed server-side.`,
|
|
245
|
-
);
|
|
246
|
-
return {
|
|
247
|
-
eventsProcessed,
|
|
248
|
-
terminalStatus: slimStatus(initialStatus),
|
|
249
|
-
pendingPublishPromises,
|
|
250
|
-
pendingWritebackPromises,
|
|
251
|
-
};
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
console.log(
|
|
255
|
-
`[streaming] execution=${executionId} stream finished — ` +
|
|
256
|
-
`processed ${eventsProcessed} events`,
|
|
257
|
-
);
|
|
258
|
-
|
|
259
|
-
return { eventsProcessed, pendingPublishPromises, pendingWritebackPromises };
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
// Terminal state handlers imported from streaming-terminal.ts
|
|
263
|
-
|
|
264
|
-
// ── Helpers ──────────────────────────────────────────────────────────
|
|
265
|
-
|
|
266
|
-
function sendHeartbeat(
|
|
267
|
-
fn: (details: Record<string, unknown>) => void,
|
|
268
|
-
executionId: string,
|
|
269
|
-
eventsProcessed: number,
|
|
270
|
-
sb: StatusBuilder,
|
|
271
|
-
): void {
|
|
272
|
-
try {
|
|
273
|
-
fn({
|
|
274
|
-
executionId,
|
|
275
|
-
eventsProcessed,
|
|
276
|
-
messages: sb.currentStatus.messages.length,
|
|
277
|
-
phase: sb.currentStatus.phase,
|
|
278
|
-
});
|
|
279
|
-
} catch (err) {
|
|
280
|
-
console.warn(`[streaming] Heartbeat failed for ${executionId}:`, err);
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
function checkStallTimeout(
|
|
285
|
-
lastEventTime: number,
|
|
286
|
-
stallTimeoutMs: number,
|
|
287
|
-
executionId: string,
|
|
288
|
-
): void {
|
|
289
|
-
const elapsed = performance.now() - lastEventTime;
|
|
290
|
-
if (elapsed > stallTimeoutMs) {
|
|
291
|
-
throw new StallTimeoutError(
|
|
292
|
-
`Agent stream stalled: no events received for ${Math.round(elapsed / 1000)}s ` +
|
|
293
|
-
`for execution ${executionId}`,
|
|
294
|
-
);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
function extractFilePathFromToolEnd(event: StreamEvent): string | null {
|
|
299
|
-
const toolName = event.name ?? "";
|
|
300
|
-
if (!isFileModifyingTool(toolName)) return null;
|
|
301
|
-
|
|
302
|
-
const input = event.data?.input as Record<string, unknown> | undefined;
|
|
303
|
-
if (!input) return null;
|
|
304
|
-
|
|
305
|
-
return extractFilePath(input);
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
export class StallTimeoutError extends Error {
|
|
309
|
-
constructor(message: string) {
|
|
310
|
-
super(message);
|
|
311
|
-
this.name = "StallTimeoutError";
|
|
312
|
-
}
|
|
313
|
-
}
|