@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
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The native deep-agent harness's stream phase — the single per-event
|
|
3
|
+
* consumption loop that turns a live LangGraph v3 event stream into the
|
|
4
|
+
* streamed transcript and the one fact that decides how
|
|
5
|
+
* the turn goes on (the graph paused at a gate).
|
|
6
|
+
*
|
|
7
|
+
* What the loop asks of the runtime, through the sink (`harness/types.ts`):
|
|
8
|
+
* `recordActivity()` per event (with the tool name on a tool start), so the
|
|
9
|
+
* runtime's stall watchdog measures the engine; `reportUsage()` per parent
|
|
10
|
+
* `message_finish`, priced here at the registry's rates for the model the
|
|
11
|
+
* turn runs on (`shared/model-pricing.ts`), so the runtime accounts and
|
|
12
|
+
* enforces the cost cap and writes `streamingUsage` (Q-M2a-2); `requestPersist()`
|
|
13
|
+
* where a discrete change or the streaming cadence says so
|
|
14
|
+
* (`shared/persist-decision.ts` over the builder's one dirty flag), AWAITED,
|
|
15
|
+
* so a platform STOP the runtime reads from that write aborts the signal
|
|
16
|
+
* before the next event is pulled; and `stopSignal`, checked at every event
|
|
17
|
+
* boundary and listened to inside the pull, where a stop cancels the graph
|
|
18
|
+
* run — the same act for every cause of stopping (the runtime knows why;
|
|
19
|
+
* this loop never does). An error the aborted run throws is the abort itself
|
|
20
|
+
* and settles `interrupted`, never `failed`.
|
|
21
|
+
*
|
|
22
|
+
* WHEN the run is aborted (S3 M2a, F-M2a-18): on the arrival of the next
|
|
23
|
+
* event — the graph's own step boundary — or after {@link STOP_GRACE_MS} if
|
|
24
|
+
* no event arrives. A LangGraph run aborted while a step is in flight leaves
|
|
25
|
+
* `@langchain/core` with an orphaned rejection (`AsyncGeneratorWithSetup`
|
|
26
|
+
* races its first pull against the signal eagerly, and an abort mid-step
|
|
27
|
+
* rejects a promise nothing awaits), which surfaces as a process-level
|
|
28
|
+
* `unhandledRejection` — logged by `main.ts`, but noise the runner must not
|
|
29
|
+
* produce on every pause. Aborting as an event arrives is clean, and it is
|
|
30
|
+
* exactly when the orchestrator's loop aborted; so the loop never aborts
|
|
31
|
+
* right after a persist, even one that answered STOP — it lets the next
|
|
32
|
+
* event arrive and stops there. A live engine yields an event well inside
|
|
33
|
+
* the grace; a wedged engine (the runtime's stall watchdog is the caller
|
|
34
|
+
* here) is forced, and that one orphan is the price of unblocking it — the
|
|
35
|
+
* contract's bound on settling `interrupted` is what wins.
|
|
36
|
+
*
|
|
37
|
+
* Until S3 M2a this loop (`streaming-v3.ts`) armed its own 120 s stall
|
|
38
|
+
* check, pulsed the Temporal heartbeat every 2 s, read STOP from its own
|
|
39
|
+
* persist and activated a graceful-stop middleware on it, told a pause from
|
|
40
|
+
* the activity's cancellation signal, and wrote PAUSED, COMPLETED and
|
|
41
|
+
* TERMINATED itself; every one of those is the runtime's now, and the loop
|
|
42
|
+
* reports only `completed`, `awaiting_approval` or `interrupted`. The
|
|
43
|
+
* graph's recursion limit propagates as its own error for `turn.ts` to
|
|
44
|
+
* classify (`tool_call_limit`), and an empty stream is an error the same
|
|
45
|
+
* way (`failed` on the `internal` surface).
|
|
46
|
+
*/
|
|
47
|
+
|
|
48
|
+
import type { TurnInput, TurnSink } from "../../harness/types.js";
|
|
49
|
+
import { shouldPersistStreamingStatus } from "../../shared/persist-decision.js";
|
|
50
|
+
import { StreamingUpdateScheduler, loadStreamingConfig } from "../../shared/streaming-scheduler.js";
|
|
51
|
+
import { computeTurnCost } from "../../shared/model-pricing.js";
|
|
52
|
+
import { TimeoutError, withTimeout } from "../../shared/with-timeout.js";
|
|
53
|
+
import { InlinePublisher } from "./inline-publisher.js";
|
|
54
|
+
import { StreamingSideEffects } from "./streaming-side-effects.js";
|
|
55
|
+
import { createV3EventRecorder, type V3ProtocolEvent } from "./v3-event-recorder.js";
|
|
56
|
+
import { normalize } from "./v3-protocol-normalizer.js";
|
|
57
|
+
import { V3StatusBuilder } from "./v3-status-builder.js";
|
|
58
|
+
import type { DeepAgentEngine, DeepAgentGraphInput, DeepAgentWorkspace } from "./turn-setup.js";
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* The subset of the v3 `GraphRunStream` this loop consumes. Kept structural
|
|
62
|
+
* so the loop is unit-testable with a scripted stream — no live graph.
|
|
63
|
+
*/
|
|
64
|
+
export interface StreamableRun extends AsyncIterable<V3ProtocolEvent> {
|
|
65
|
+
readonly output: Promise<unknown>;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* How long the loop waits for `run.output` after the stream ended before
|
|
70
|
+
* proceeding without the final state (the structured response rides it).
|
|
71
|
+
*/
|
|
72
|
+
const RUN_OUTPUT_TIMEOUT_MS = 30_000;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* How long a stop waits for the next event before the run is aborted
|
|
76
|
+
* mid-step (see the header). Well inside the contract kit's settle bound and
|
|
77
|
+
* far above any token cadence a live model has.
|
|
78
|
+
*/
|
|
79
|
+
const STOP_GRACE_MS = 1_000;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Why the turn's stream ended. `completed` and `awaiting_approval` proceed to
|
|
83
|
+
* the settle; `interrupted` is the runtime's stop, and the adapter settles
|
|
84
|
+
* `interrupted` (the runtime classifies the cause from its own evidence).
|
|
85
|
+
*/
|
|
86
|
+
export type DeepAgentStreamReason = "completed" | "awaiting_approval" | "interrupted";
|
|
87
|
+
|
|
88
|
+
export interface DeepAgentStreamResult {
|
|
89
|
+
readonly reason: DeepAgentStreamReason;
|
|
90
|
+
readonly eventsProcessed: number;
|
|
91
|
+
/** The graph's final state (`structuredResponse` rides it); absent unless the stream completed and the output resolved in time. */
|
|
92
|
+
readonly runOutput: Record<string, unknown> | undefined;
|
|
93
|
+
/** Inline publishes fired mid-turn, drained by the settle. */
|
|
94
|
+
readonly pendingPublishPromises: readonly Promise<void>[];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* The transcript writers of one turn: the builder over `sink.status` and the
|
|
99
|
+
* publisher that writes artifacts through it (so a published artifact still
|
|
100
|
+
* forces the next persist). Built by the adapter's turn once and shared by
|
|
101
|
+
* the stream and the settle; the builder reports usage into the sink, priced
|
|
102
|
+
* for the model the turn runs on.
|
|
103
|
+
*/
|
|
104
|
+
export interface DeepAgentTranscript {
|
|
105
|
+
readonly builder: V3StatusBuilder;
|
|
106
|
+
readonly publisher: InlinePublisher;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function createDeepAgentTranscript(
|
|
110
|
+
input: TurnInput,
|
|
111
|
+
sink: TurnSink,
|
|
112
|
+
engine: DeepAgentEngine,
|
|
113
|
+
workspace: DeepAgentWorkspace,
|
|
114
|
+
): DeepAgentTranscript {
|
|
115
|
+
const builder = new V3StatusBuilder(input.executionId, sink.status, {
|
|
116
|
+
onUsage: (usage) => {
|
|
117
|
+
// LangChain's `input_tokens` already INCLUDES the cache buckets (the
|
|
118
|
+
// Anthropic adapter folds them in; the cost advisory reads them the
|
|
119
|
+
// same way), so the counts are reported as delivered and the price
|
|
120
|
+
// is computed over the disjoint buckets.
|
|
121
|
+
const inputTokens = usage.input_tokens ?? 0;
|
|
122
|
+
const outputTokens = usage.output_tokens ?? 0;
|
|
123
|
+
const cacheReadTokens = usage.input_token_details?.cache_read ?? 0;
|
|
124
|
+
const cacheWriteTokens = usage.input_token_details?.cache_creation ?? 0;
|
|
125
|
+
const uncachedInput = Math.max(inputTokens - cacheReadTokens - cacheWriteTokens, 0);
|
|
126
|
+
sink.reportUsage({
|
|
127
|
+
inputTokens,
|
|
128
|
+
outputTokens,
|
|
129
|
+
cacheReadTokens,
|
|
130
|
+
cacheWriteTokens,
|
|
131
|
+
estimatedCostUsd: computeTurnCost(engine.pricing, uncachedInput, outputTokens, cacheWriteTokens, cacheReadTokens),
|
|
132
|
+
model: engine.modelName,
|
|
133
|
+
});
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
builder.setApprovalProvider({
|
|
137
|
+
policies: engine.gate.policies,
|
|
138
|
+
toolServerMap: engine.gate.toolServerMap,
|
|
139
|
+
leasedCategories: engine.gate.leasedCategories,
|
|
140
|
+
globalBypass: engine.gate.globalBypass,
|
|
141
|
+
unattended: engine.gate.unattended,
|
|
142
|
+
});
|
|
143
|
+
const publisher = new InlinePublisher({
|
|
144
|
+
workspaceBackend: workspace.backend,
|
|
145
|
+
artifactStorage: input.artifactStorage,
|
|
146
|
+
statusWriter: builder,
|
|
147
|
+
executionId: input.executionId,
|
|
148
|
+
});
|
|
149
|
+
return { builder, publisher };
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export interface DeepAgentStreamDeps {
|
|
153
|
+
readonly input: TurnInput;
|
|
154
|
+
readonly sink: TurnSink;
|
|
155
|
+
readonly engine: DeepAgentEngine;
|
|
156
|
+
readonly graphInput: DeepAgentGraphInput;
|
|
157
|
+
readonly transcript: DeepAgentTranscript;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Start the graph run and consume it to the end, folding every event into
|
|
162
|
+
* the transcript. Returns why it ended; throws only what `turn.ts`
|
|
163
|
+
* classifies (the recursion limit, an empty stream, an engine error).
|
|
164
|
+
*/
|
|
165
|
+
export async function consumeDeepAgentStream(deps: DeepAgentStreamDeps): Promise<DeepAgentStreamResult> {
|
|
166
|
+
const { input, sink, engine, graphInput, transcript } = deps;
|
|
167
|
+
const { executionId } = input;
|
|
168
|
+
const { builder, publisher } = transcript;
|
|
169
|
+
|
|
170
|
+
const scheduler = new StreamingUpdateScheduler(loadStreamingConfig());
|
|
171
|
+
const recorder = createV3EventRecorder(executionId, process.env.V3_EVENT_RECORD_DIR);
|
|
172
|
+
const sideEffects = new StreamingSideEffects({ inlinePublisher: publisher });
|
|
173
|
+
const abortController = new AbortController();
|
|
174
|
+
let forceAbort: ReturnType<typeof setTimeout> | undefined;
|
|
175
|
+
const abortRun = (): void => {
|
|
176
|
+
if (forceAbort !== undefined) clearTimeout(forceAbort);
|
|
177
|
+
forceAbort = undefined;
|
|
178
|
+
abortController.abort("stopped by the runtime");
|
|
179
|
+
};
|
|
180
|
+
const onStop = (): void => {
|
|
181
|
+
forceAbort = setTimeout(abortRun, STOP_GRACE_MS);
|
|
182
|
+
};
|
|
183
|
+
sink.stopSignal.addEventListener("abort", onStop, { once: true });
|
|
184
|
+
|
|
185
|
+
let eventsProcessed = 0;
|
|
186
|
+
/** The stop, taken at a boundary: abort the run now and settle. */
|
|
187
|
+
const interrupted = (): DeepAgentStreamResult => {
|
|
188
|
+
abortRun();
|
|
189
|
+
return {
|
|
190
|
+
reason: "interrupted",
|
|
191
|
+
eventsProcessed,
|
|
192
|
+
runOutput: undefined,
|
|
193
|
+
pendingPublishPromises: sideEffects.pendingPublishPromises,
|
|
194
|
+
};
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
try {
|
|
198
|
+
if (sink.stopSignal.aborted) return interrupted();
|
|
199
|
+
|
|
200
|
+
const run = (await engine.graph.streamEvents(
|
|
201
|
+
graphInput.kind === "resume" ? graphInput.command : graphInput.input,
|
|
202
|
+
{ ...engine.langgraphConfig, version: "v3", signal: abortController.signal },
|
|
203
|
+
)) as StreamableRun;
|
|
204
|
+
sink.recordActivity();
|
|
205
|
+
// An aborted run rejects `run.output` with the abort error; an
|
|
206
|
+
// interrupted turn never awaits it (there is no final state to read), so
|
|
207
|
+
// the rejection is claimed here or it surfaces as unhandled. A completed
|
|
208
|
+
// turn still awaits the same promise below and reads its value.
|
|
209
|
+
run.output.catch(() => undefined);
|
|
210
|
+
|
|
211
|
+
try {
|
|
212
|
+
for await (const event of run) {
|
|
213
|
+
if (sink.stopSignal.aborted) return interrupted();
|
|
214
|
+
|
|
215
|
+
recorder?.record(event, eventsProcessed);
|
|
216
|
+
let detail: string | undefined;
|
|
217
|
+
for (const normalized of normalize(event)) {
|
|
218
|
+
builder.processEvent(normalized);
|
|
219
|
+
if (normalized.kind === "tool_started") detail = normalized.name;
|
|
220
|
+
}
|
|
221
|
+
sideEffects.onProtocolEvent(event);
|
|
222
|
+
eventsProcessed++;
|
|
223
|
+
sink.recordActivity(detail);
|
|
224
|
+
|
|
225
|
+
const persist = shouldPersistStreamingStatus(
|
|
226
|
+
{ deltaEnricherDirty: false, todosDirty: false, contentDirty: builder.forceNextUpdate },
|
|
227
|
+
scheduler,
|
|
228
|
+
eventsProcessed,
|
|
229
|
+
);
|
|
230
|
+
if (!persist) continue;
|
|
231
|
+
builder.clearForceFlag();
|
|
232
|
+
// The runtime attaches the mid-run file-change progress on this write
|
|
233
|
+
// (the chokepoint's step 2), as it does on every write. Awaited so a platform STOP the runtime reads from this write has
|
|
234
|
+
// aborted the signal by the time the next event arrives — where the
|
|
235
|
+
// stop is taken (see the header on why not here).
|
|
236
|
+
await sink.requestPersist();
|
|
237
|
+
scheduler.markUpdateSent(eventsProcessed);
|
|
238
|
+
}
|
|
239
|
+
} catch (err) {
|
|
240
|
+
// The aborted run throws its own abort out of the pull; that is the
|
|
241
|
+
// stop the runtime asked for, not a failure.
|
|
242
|
+
if (sink.stopSignal.aborted) return interrupted();
|
|
243
|
+
throw err;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
if (eventsProcessed === 0) {
|
|
247
|
+
throw new Error(
|
|
248
|
+
"Stream completed without processing any events. " +
|
|
249
|
+
"This may indicate a configuration error or v3 API incompatibility.",
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
if (builder.awaitingApproval) {
|
|
254
|
+
console.log(`[turn-stream] execution=${executionId} stream ended at a gate; awaiting approval`);
|
|
255
|
+
return {
|
|
256
|
+
reason: "awaiting_approval",
|
|
257
|
+
eventsProcessed,
|
|
258
|
+
runOutput: undefined,
|
|
259
|
+
pendingPublishPromises: sideEffects.pendingPublishPromises,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
console.log(`[turn-stream] execution=${executionId} stream finished — processed ${eventsProcessed} events`);
|
|
264
|
+
const runOutput = await extractRunOutput(run, executionId);
|
|
265
|
+
sink.recordActivity();
|
|
266
|
+
return { reason: "completed", eventsProcessed, runOutput, pendingPublishPromises: sideEffects.pendingPublishPromises };
|
|
267
|
+
} finally {
|
|
268
|
+
sink.stopSignal.removeEventListener("abort", onStop);
|
|
269
|
+
if (forceAbort !== undefined) clearTimeout(forceAbort);
|
|
270
|
+
await recorder?.flush();
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* The graph's final state, bounded: `run.output` normally resolves the
|
|
276
|
+
* moment the stream ends, but a state that never settles must not hold the
|
|
277
|
+
* turn (the structured response is recoverable from the final text; the
|
|
278
|
+
* runtime's epilogue does that).
|
|
279
|
+
*
|
|
280
|
+
* Bounded through the shared `withTimeout`, never a hand-rolled
|
|
281
|
+
* `Promise.race` against a bare `setTimeout`: a race leaves its losing timer
|
|
282
|
+
* armed, and a referenced timer holds the Node event loop open. The
|
|
283
|
+
* orchestrator's copy of this wait left a 30 s timer behind every completed
|
|
284
|
+
* execution, so a runner asked to exit right after one idled for the full
|
|
285
|
+
* Kubernetes termination grace (stigmer#1008, fixed on the orchestrator in
|
|
286
|
+
* stigmer#1092 while this adapter was on its branch; this copy had cleared
|
|
287
|
+
* its timer in a `finally` from the start, and took the shared shape at the
|
|
288
|
+
* merge so there is one way to bound a wait). `withTimeout` clears the timer
|
|
289
|
+
* on whichever side settles first; `turn-stream.test.ts` pins that nothing
|
|
290
|
+
* stays armed on either side.
|
|
291
|
+
*/
|
|
292
|
+
async function extractRunOutput(run: StreamableRun, executionId: string): Promise<Record<string, unknown> | undefined> {
|
|
293
|
+
try {
|
|
294
|
+
const finalState = await withTimeout(
|
|
295
|
+
RUN_OUTPUT_TIMEOUT_MS,
|
|
296
|
+
`run.output did not resolve within ${RUN_OUTPUT_TIMEOUT_MS}ms`,
|
|
297
|
+
() => run.output,
|
|
298
|
+
);
|
|
299
|
+
const output = finalState as Record<string, unknown>;
|
|
300
|
+
console.log(
|
|
301
|
+
`[turn-stream] execution=${executionId} — run.output resolved. ` +
|
|
302
|
+
`Keys: [${Object.keys(output ?? {}).join(", ")}]. hasStructuredResponse=${output?.structuredResponse !== undefined}`,
|
|
303
|
+
);
|
|
304
|
+
return output;
|
|
305
|
+
} catch (err) {
|
|
306
|
+
if (err instanceof TimeoutError) {
|
|
307
|
+
console.warn(`[turn-stream] execution=${executionId} — ${err.message}. Proceeding without final state.`);
|
|
308
|
+
return undefined;
|
|
309
|
+
}
|
|
310
|
+
console.warn(`[turn-stream] execution=${executionId} — run.output rejected: ${err}`);
|
|
311
|
+
return undefined;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One native deep-agent engine turn — the LangGraph slice of the harness,
|
|
3
|
+
* behind the turn runtime's contract (`harness/types.ts`).
|
|
4
|
+
*
|
|
5
|
+
* `runDeepAgentTurn` is what `adapter.ts`'s `runTurn` delegates to: the
|
|
6
|
+
* setup over the runtime's record (`turn-setup.ts`), the stream over the
|
|
7
|
+
* sink (`turn-stream.ts`), the settle (`turn-settle.ts`), and its own
|
|
8
|
+
* teardown — the MCP connection and the checkpoint saver. Everything else
|
|
9
|
+
* about a turn is the runtime's (`harness/run-turn.ts`): the resolution
|
|
10
|
+
* phases, the workspace lock and the `.stigmer` link, the persist
|
|
11
|
+
* chokepoint, the watchdog, the heartbeat, the cost cap, the interruption
|
|
12
|
+
* table, the completion epilogue, the SKIP/REJECT settlement.
|
|
13
|
+
*
|
|
14
|
+
* This module is where `deepagents` and `@langchain/*` enter the adapter's
|
|
15
|
+
* graph (through `turn-setup.ts` and its siblings), which is WHY it is a
|
|
16
|
+
* separate module from `adapter.ts` and is loaded there with a dynamic
|
|
17
|
+
* import inside `boot`: the harness table's static graph must stay SDK-free
|
|
18
|
+
* so a worker that does not serve this harness never pays for LangChain
|
|
19
|
+
* (`harness-adapters.ts`). Nothing outside `adapter.ts` imports this module.
|
|
20
|
+
*
|
|
21
|
+
* Never throws out of `runDeepAgentTurn`: the graph exhausting its recursion
|
|
22
|
+
* limit is the `tool_call_limit` outcome (the platform's budget, not a
|
|
23
|
+
* failure; the runtime writes TERMINATED with the cross-repo prefix); any
|
|
24
|
+
* other exception — a provider error unwrapped from LangChain's middleware
|
|
25
|
+
* wrapper, an MCP connect failure, an empty stream — is `failed` on the
|
|
26
|
+
* `internal` surface with `describeExecutionError`'s sentence as
|
|
27
|
+
* `status.error` whole (Q-M2a-9). Never branches on why `stopSignal`
|
|
28
|
+
* aborted, never writes a phase or a terminal copy, never imports
|
|
29
|
+
* `@temporalio/*` (`__tests__/adapter-is-temporal-free.test.ts`).
|
|
30
|
+
*
|
|
31
|
+
* Engine disposition: nothing is parked between turns. The sqlite saver is
|
|
32
|
+
* opened and closed per turn (it holds an OS handle); the MCP subprocesses
|
|
33
|
+
* are connected and closed per turn. Both are closed on EVERY exit path in
|
|
34
|
+
* the `finally`, before the runtime removes the link and releases the lock.
|
|
35
|
+
*
|
|
36
|
+
* Extracted from `index.ts` `createDeepAgentActivities` at S3 M2a; the
|
|
37
|
+
* hermetic goldens under `__tests__/hermetic/` pin the result byte for
|
|
38
|
+
* byte, with the ruled alignments quoted in their headers.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
import type { BaseCheckpointSaver } from "@langchain/langgraph-checkpoint";
|
|
42
|
+
|
|
43
|
+
import type { TurnInput, TurnOutcome, TurnSink } from "../../harness/types.js";
|
|
44
|
+
import type { McpConnectionResult } from "../../shared/mcp-manager.js";
|
|
45
|
+
import { tryInferProvider } from "../../shared/llm-proxy.js";
|
|
46
|
+
import { describeExecutionError } from "../../shared/model-error.js";
|
|
47
|
+
import { isGraphRecursionError } from "../../shared/tool-rounds.js";
|
|
48
|
+
import {
|
|
49
|
+
buildDeepAgentWorkspace,
|
|
50
|
+
buildEngine,
|
|
51
|
+
composeGraphInput,
|
|
52
|
+
connectTools,
|
|
53
|
+
openCheckpointer,
|
|
54
|
+
readGateState,
|
|
55
|
+
resolveModelName,
|
|
56
|
+
type DeepAgentAdapterConfig,
|
|
57
|
+
} from "./turn-setup.js";
|
|
58
|
+
import { consumeDeepAgentStream, createDeepAgentTranscript } from "./turn-stream.js";
|
|
59
|
+
import { settleDeepAgentTurn } from "./turn-settle.js";
|
|
60
|
+
|
|
61
|
+
export async function runDeepAgentTurn(input: TurnInput, sink: TurnSink, config: DeepAgentAdapterConfig): Promise<TurnOutcome> {
|
|
62
|
+
if (sink.stopSignal.aborted) return { kind: "interrupted" };
|
|
63
|
+
|
|
64
|
+
let checkpointer: BaseCheckpointSaver | undefined;
|
|
65
|
+
let connection: McpConnectionResult | undefined;
|
|
66
|
+
let modelName: string | undefined;
|
|
67
|
+
|
|
68
|
+
try {
|
|
69
|
+
modelName = await resolveModelName(input);
|
|
70
|
+
checkpointer = await openCheckpointer(input, sink, config);
|
|
71
|
+
const workspace = buildDeepAgentWorkspace(input);
|
|
72
|
+
// What this engine observes touching CAS-owned paths — the one capture
|
|
73
|
+
// fact the runtime cannot read from the tree (`harness/capture.ts`).
|
|
74
|
+
sink.bindCasObservations(() => workspace.casObserver.snapshot());
|
|
75
|
+
const tools = await connectTools(input, sink);
|
|
76
|
+
connection = tools.connection;
|
|
77
|
+
if (sink.stopSignal.aborted) return { kind: "interrupted" };
|
|
78
|
+
|
|
79
|
+
const gate = readGateState(input, tools);
|
|
80
|
+
const engine = await buildEngine(input, sink, config, { modelName, checkpointer, workspace, tools, gate });
|
|
81
|
+
if (sink.stopSignal.aborted) return { kind: "interrupted" };
|
|
82
|
+
|
|
83
|
+
const graphInput = await composeGraphInput(input, engine);
|
|
84
|
+
sink.recordActivity();
|
|
85
|
+
|
|
86
|
+
const transcript = createDeepAgentTranscript(input, sink, engine, workspace);
|
|
87
|
+
const stream = await consumeDeepAgentStream({ input, sink, engine, graphInput, transcript });
|
|
88
|
+
return await settleDeepAgentTurn({ input, sink, engine, transcript, stream });
|
|
89
|
+
} catch (err) {
|
|
90
|
+
return classifyThrown(err, input, config, modelName);
|
|
91
|
+
} finally {
|
|
92
|
+
await closeQuietly(input.executionId, "MCP connection", () => connection?.client.close());
|
|
93
|
+
// Only the durable sqlite saver holds an OS handle (an open DB file);
|
|
94
|
+
// memory/http savers have no close(), so this is duck-typed.
|
|
95
|
+
const closable = checkpointer as { close?: () => void } | undefined;
|
|
96
|
+
await closeQuietly(input.executionId, "checkpointer", () => closable?.close?.());
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* An exception that escaped the turn, classified. The graph's recursion
|
|
102
|
+
* limit is the budget's own signal (`shared/tool-rounds.ts`), not an error:
|
|
103
|
+
* the work is checkpointed and the conversation continues on the next
|
|
104
|
+
* message. Anything else is described by `describeExecutionError` (a model
|
|
105
|
+
* error arrives MiddlewareError-wrapped with raw provider prose and is
|
|
106
|
+
* unwrapped to its stable platform code; non-model errors keep the root
|
|
107
|
+
* error's identity) on the `internal` surface: the runner or its transport
|
|
108
|
+
* broke.
|
|
109
|
+
*/
|
|
110
|
+
function classifyThrown(err: unknown, input: TurnInput, config: DeepAgentAdapterConfig, modelName: string | undefined): TurnOutcome {
|
|
111
|
+
if (isGraphRecursionError(err)) {
|
|
112
|
+
console.log(`ExecuteDeepAgent reached the tool-call limit: execution=${input.executionId}`);
|
|
113
|
+
return { kind: "tool_call_limit" };
|
|
114
|
+
}
|
|
115
|
+
const { errorType, errorMessage } = describeExecutionError(err, {
|
|
116
|
+
proxyMode: !!config.proxyEndpoint,
|
|
117
|
+
modelId: modelName,
|
|
118
|
+
provider: modelName ? (tryInferProvider(modelName) ?? undefined) : undefined,
|
|
119
|
+
});
|
|
120
|
+
console.error(`ExecuteDeepAgent failed: execution=${input.executionId}, [${errorType}] ${errorMessage}`);
|
|
121
|
+
return { kind: "failed", surface: "internal", message: `[${errorType}] ${errorMessage}`, cause: err };
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** Best-effort teardown: a failed close is logged and never masks the turn's outcome. */
|
|
125
|
+
async function closeQuietly(executionId: string, what: string, close: () => void | Promise<void> | undefined): Promise<void> {
|
|
126
|
+
try {
|
|
127
|
+
await close();
|
|
128
|
+
} catch (err) {
|
|
129
|
+
console.warn(`ExecuteDeepAgent ${what} cleanup failed (non-fatal): execution=${executionId}, error=${err}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
* V3 event recorder for capturing raw LangGraph v3 ProtocolEvents.
|
|
3
3
|
*
|
|
4
4
|
* Activated by the V3_EVENT_RECORD_DIR environment variable. When set,
|
|
5
|
-
* the
|
|
6
|
-
* them atomically to a JSON file after the stream
|
|
5
|
+
* the adapter's stream loop (`turn-stream.ts`) records every raw protocol
|
|
6
|
+
* event and flushes them atomically to a JSON file after the stream
|
|
7
|
+
* completes — the native twin of `execute-cursor/cursor-event-recorder.ts`.
|
|
7
8
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
9
|
+
* Development infrastructure: the captured events are the ground truth the
|
|
10
|
+
* v3 fixtures (`__test-utils__/v3-event-fixtures.ts`) and the builder's
|
|
11
|
+
* tests were shaped from, and the way a new provider's event shape is read.
|
|
11
12
|
*/
|
|
12
13
|
|
|
13
14
|
import { writeFile, mkdir } from "node:fs/promises";
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* AgentExecutionStatus proto.
|
|
7
7
|
*
|
|
8
8
|
* This is a runner-internal contract (not persisted, not exposed to
|
|
9
|
-
* clients). It isolates the
|
|
9
|
+
* clients). It isolates the V3StatusBuilder from LangGraph protocol
|
|
10
10
|
* instability (field naming, delta shapes, channel semantics).
|
|
11
11
|
*
|
|
12
12
|
* ID conventions:
|