@stigmer/runner 3.15.3-dev.20260914121148 → 3.15.3-dev.20260916211208
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 +1 -0
- package/dist/.build-fingerprint +1 -1
- package/dist/__test-utils__/approval-contract/types.d.ts +1 -1
- package/dist/__test-utils__/hermetic-activity.d.ts +61 -7
- package/dist/__test-utils__/hermetic-activity.js +100 -9
- package/dist/__test-utils__/hermetic-activity.js.map +1 -1
- package/dist/__test-utils__/model-registry-fixture.d.ts +22 -3
- package/dist/__test-utils__/model-registry-fixture.js +22 -7
- package/dist/__test-utils__/model-registry-fixture.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/contract-subject.d.ts +2 -2
- package/dist/activities/execute-cursor/__test-utils__/contract-subject.js +2 -2
- package/dist/activities/execute-cursor/__test-utils__/fold.d.ts +61 -0
- package/dist/activities/execute-cursor/__test-utils__/fold.js +94 -0
- package/dist/activities/execute-cursor/__test-utils__/fold.js.map +1 -0
- package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.js +1 -1
- package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.d.ts +47 -12
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js +41 -10
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/scripted-agent.d.ts +15 -6
- package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js +17 -4
- package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js.map +1 -1
- package/dist/activities/execute-cursor/adapter.d.ts +4 -4
- package/dist/activities/execute-cursor/adapter.js +4 -4
- package/dist/activities/execute-cursor/approval-policy.d.ts +10 -10
- package/dist/activities/execute-cursor/approval-policy.js +12 -23
- package/dist/activities/execute-cursor/approval-policy.js.map +1 -1
- package/dist/activities/execute-cursor/approval-state.d.ts +35 -1
- package/dist/activities/execute-cursor/approval-state.js +65 -0
- package/dist/activities/execute-cursor/approval-state.js.map +1 -1
- package/dist/activities/execute-cursor/{message-translator.d.ts → boundary-rows.d.ts} +45 -341
- package/dist/activities/execute-cursor/boundary-rows.js +1018 -0
- package/dist/activities/execute-cursor/boundary-rows.js.map +1 -0
- package/dist/activities/execute-cursor/cursor-capabilities.d.ts +1 -1
- package/dist/activities/execute-cursor/cursor-capabilities.js +1 -1
- package/dist/activities/execute-cursor/cursor-event-recorder.d.ts +33 -14
- package/dist/activities/execute-cursor/cursor-event-recorder.js +43 -21
- package/dist/activities/execute-cursor/cursor-event-recorder.js.map +1 -1
- package/dist/activities/execute-cursor/prompt-builder.d.ts +3 -3
- package/dist/activities/execute-cursor/prompt-builder.js +4 -4
- package/dist/activities/execute-cursor/prompt-builder.js.map +1 -1
- package/dist/activities/execute-cursor/service-tier.js +1 -2
- package/dist/activities/execute-cursor/service-tier.js.map +1 -1
- package/dist/activities/execute-cursor/sub-agent-steps.d.ts +79 -0
- package/dist/activities/execute-cursor/sub-agent-steps.js +180 -0
- package/dist/activities/execute-cursor/sub-agent-steps.js.map +1 -0
- package/dist/activities/execute-cursor/tool-result.d.ts +49 -0
- package/dist/activities/execute-cursor/tool-result.js +130 -0
- package/dist/activities/execute-cursor/tool-result.js.map +1 -0
- package/dist/activities/execute-cursor/translator.d.ts +178 -0
- package/dist/activities/execute-cursor/translator.js +485 -0
- package/dist/activities/execute-cursor/translator.js.map +1 -0
- package/dist/activities/execute-cursor/turn-boundary.d.ts +15 -5
- package/dist/activities/execute-cursor/turn-boundary.js +10 -14
- 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 +47 -34
- package/dist/activities/execute-cursor/turn-settle.js.map +1 -1
- package/dist/activities/execute-cursor/turn-setup.d.ts +2 -2
- package/dist/activities/execute-cursor/turn-setup.js +5 -5
- package/dist/activities/execute-cursor/turn-setup.js.map +1 -1
- package/dist/activities/execute-cursor/turn-stream.d.ts +23 -14
- package/dist/activities/execute-cursor/turn-stream.js +41 -28
- package/dist/activities/execute-cursor/turn-stream.js.map +1 -1
- package/dist/activities/execute-cursor/turn.d.ts +4 -4
- package/dist/activities/execute-cursor/turn.js +5 -5
- package/dist/activities/execute-cursor/usage-pricing.d.ts +2 -2
- package/dist/activities/execute-cursor/usage-pricing.js +2 -2
- package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.d.ts +2 -2
- package/dist/activities/execute-deep-agent/__test-utils__/contract-subject.js +2 -2
- package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.d.ts +16 -11
- package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js +22 -10
- package/dist/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js.map +1 -1
- package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js +1 -1
- package/dist/activities/execute-deep-agent/__test-utils__/hitl-script.js.map +1 -1
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.d.ts +2 -3
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js +2 -3
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model-module.js.map +1 -1
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.d.ts +12 -3
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js +18 -4
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js.map +1 -1
- package/dist/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.d.ts +10 -1
- package/dist/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.js +24 -11
- package/dist/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.js.map +1 -1
- package/dist/activities/execute-deep-agent/adapter.d.ts +1 -1
- package/dist/activities/execute-deep-agent/adapter.js +1 -1
- package/dist/activities/execute-deep-agent/approval-file-change.d.ts +19 -19
- package/dist/activities/execute-deep-agent/approval-file-change.js +16 -15
- package/dist/activities/execute-deep-agent/approval-file-change.js.map +1 -1
- package/dist/activities/execute-deep-agent/deep-agent-capabilities.d.ts +2 -2
- package/dist/activities/execute-deep-agent/deep-agent-capabilities.js +2 -2
- package/dist/activities/execute-deep-agent/hitl.d.ts +2 -2
- package/dist/activities/execute-deep-agent/hitl.js +2 -2
- package/dist/activities/execute-deep-agent/inline-publisher.d.ts +13 -3
- package/dist/activities/execute-deep-agent/inline-publisher.js +3 -3
- package/dist/activities/execute-deep-agent/inline-publisher.js.map +1 -1
- package/dist/activities/execute-deep-agent/prompt-builder.d.ts +3 -3
- package/dist/activities/execute-deep-agent/prompt-builder.js +6 -7
- package/dist/activities/execute-deep-agent/prompt-builder.js.map +1 -1
- package/dist/activities/execute-deep-agent/streaming-side-effects.d.ts +16 -8
- package/dist/activities/execute-deep-agent/streaming-side-effects.js +20 -33
- package/dist/activities/execute-deep-agent/streaming-side-effects.js.map +1 -1
- package/dist/activities/execute-deep-agent/subagent-transformer.d.ts +3 -3
- package/dist/activities/execute-deep-agent/subagent-transformer.js +1 -1
- package/dist/activities/execute-deep-agent/translator.d.ts +134 -0
- package/dist/activities/execute-deep-agent/translator.js +418 -0
- package/dist/activities/execute-deep-agent/translator.js.map +1 -0
- package/dist/activities/execute-deep-agent/turn-settle.d.ts +13 -7
- package/dist/activities/execute-deep-agent/turn-settle.js +34 -45
- package/dist/activities/execute-deep-agent/turn-settle.js.map +1 -1
- package/dist/activities/execute-deep-agent/turn-setup.d.ts +8 -8
- package/dist/activities/execute-deep-agent/turn-setup.js +7 -7
- package/dist/activities/execute-deep-agent/turn-stream.d.ts +13 -10
- package/dist/activities/execute-deep-agent/turn-stream.js +44 -41
- package/dist/activities/execute-deep-agent/turn-stream.js.map +1 -1
- package/dist/activities/execute-deep-agent/turn.d.ts +3 -3
- package/dist/activities/execute-deep-agent/turn.js +3 -3
- package/dist/config.d.ts +2 -2
- package/dist/harness/approval-decisions.d.ts +1 -1
- package/dist/harness/approval-decisions.js +1 -1
- package/dist/harness/capabilities.d.ts +21 -11
- package/dist/harness/capabilities.js +2 -2
- package/dist/harness/capture.d.ts +4 -4
- package/dist/harness/capture.js +4 -4
- package/dist/harness/persist-chokepoint.d.ts +3 -3
- package/dist/harness/persist-chokepoint.js +3 -3
- package/dist/harness/registry.d.ts +2 -2
- package/dist/harness/registry.js +2 -2
- package/dist/harness/run-turn.d.ts +6 -4
- package/dist/harness/run-turn.js +31 -9
- package/dist/harness/run-turn.js.map +1 -1
- package/dist/harness/stop-controller.d.ts +1 -1
- package/dist/harness/stop-controller.js +1 -1
- package/dist/harness/terminal-table.d.ts +7 -7
- package/dist/harness/terminal-table.js +7 -7
- package/dist/harness/transcript/builder.d.ts +182 -0
- package/dist/harness/transcript/builder.js +693 -0
- package/dist/harness/transcript/builder.js.map +1 -0
- package/dist/harness/transcript/events.d.ts +218 -0
- package/dist/harness/transcript/events.js +50 -0
- package/dist/harness/transcript/events.js.map +1 -0
- package/dist/harness/transcript/state.d.ts +110 -0
- package/dist/harness/transcript/state.js +148 -0
- package/dist/harness/transcript/state.js.map +1 -0
- package/dist/harness/turn-context.d.ts +54 -38
- package/dist/harness/turn-context.js +42 -43
- package/dist/harness/turn-context.js.map +1 -1
- package/dist/harness/types.d.ts +63 -22
- package/dist/harness/types.js +12 -11
- package/dist/harness/types.js.map +1 -1
- package/dist/harness/usage-accumulator.d.ts +2 -2
- package/dist/harness/usage-accumulator.js +2 -2
- package/dist/harness-adapters.d.ts +5 -4
- package/dist/harness-adapters.js +5 -4
- package/dist/harness-adapters.js.map +1 -1
- package/dist/middleware/approval-gate.d.ts +6 -0
- package/dist/middleware/approval-gate.js +7 -57
- package/dist/middleware/approval-gate.js.map +1 -1
- package/dist/middleware/cost-advisory.d.ts +3 -3
- package/dist/middleware/cost-advisory.js +3 -3
- package/dist/middleware/index.d.ts +1 -1
- package/dist/middleware/index.js +1 -1
- package/dist/runner-manager.js +1 -1
- package/dist/runner-manager.js.map +1 -1
- package/dist/shared/approval-policy.d.ts +53 -0
- package/dist/shared/approval-policy.js +76 -0
- package/dist/shared/approval-policy.js.map +1 -1
- package/dist/shared/args-preview.d.ts +45 -22
- package/dist/shared/args-preview.js +51 -41
- package/dist/shared/args-preview.js.map +1 -1
- package/dist/shared/attachment-resolver.d.ts +4 -4
- package/dist/shared/attachment-resolver.js +4 -4
- package/dist/shared/attachment-zip.d.ts +2 -2
- package/dist/shared/attachment-zip.js +2 -2
- package/dist/shared/cost-guard.d.ts +2 -2
- package/dist/shared/cost-guard.js +2 -2
- package/dist/shared/exact-apply.d.ts +1 -1
- package/dist/shared/exact-apply.js +1 -1
- package/dist/shared/execution-context.d.ts +2 -2
- package/dist/shared/execution-context.js +2 -2
- package/dist/shared/extract-structured-output.d.ts +2 -2
- package/dist/shared/extract-structured-output.js +2 -2
- package/dist/shared/filereview/cas-touched.d.ts +2 -2
- package/dist/shared/filereview/cas-touched.js +2 -2
- package/dist/shared/heartbeat.d.ts +1 -1
- package/dist/shared/heartbeat.js +1 -1
- package/dist/shared/llm-backend.d.ts +0 -4
- package/dist/shared/llm-backend.js +0 -4
- package/dist/shared/llm-backend.js.map +1 -1
- package/dist/shared/model-error.d.ts +1 -2
- package/dist/shared/model-error.js +1 -2
- package/dist/shared/model-error.js.map +1 -1
- package/dist/shared/persist-decision.d.ts +18 -24
- package/dist/shared/persist-decision.js +19 -11
- package/dist/shared/persist-decision.js.map +1 -1
- package/dist/shared/prompt-sections.d.ts +4 -4
- package/dist/shared/prompt-sections.js +4 -4
- package/dist/shared/skill-resolver.d.ts +3 -3
- package/dist/shared/skill-resolver.js +3 -3
- package/dist/shared/status-offload.d.ts +1 -1
- package/dist/shared/status-offload.js +2 -2
- package/dist/shared/status-offload.js.map +1 -1
- package/dist/shared/streaming-scheduler.d.ts +2 -7
- package/dist/shared/streaming-scheduler.js +6 -14
- package/dist/shared/streaming-scheduler.js.map +1 -1
- package/dist/shared/subagent-rows.d.ts +2 -2
- package/dist/shared/subagent-rows.js +2 -2
- package/dist/shared/todos.d.ts +3 -3
- package/dist/shared/todos.js +3 -3
- package/dist/shared/tool-row.d.ts +19 -1
- package/dist/shared/tool-row.js +36 -2
- package/dist/shared/tool-row.js.map +1 -1
- package/dist/shared/worker-shutdown.d.ts +1 -1
- package/dist/shared/worker-shutdown.js +1 -1
- package/dist/shared/workspace/session-provision.d.ts +1 -1
- package/dist/shared/workspace/session-provision.js +1 -1
- package/dist/shared/workspace/sources/empty.d.ts +1 -1
- package/dist/shared/workspace/sources/empty.js +1 -2
- package/dist/shared/workspace/sources/empty.js.map +1 -1
- package/dist/shared/workspace/sources/git.js +4 -4
- package/dist/shared/workspace/sources/git.js.map +1 -1
- package/dist/shared/workspace/sources/local-path.js +6 -6
- package/dist/shared/workspace/sources/local-path.js.map +1 -1
- package/dist/shared/workspace/stigmer-link.d.ts +1 -1
- package/dist/shared/workspace/stigmer-link.js +1 -1
- package/dist/shared/workspace/types.d.ts +2 -5
- package/dist/shared/workspace/types.js +0 -6
- package/dist/shared/workspace/types.js.map +1 -1
- package/dist/shared/workspace/writeback-coordinator.d.ts +17 -4
- package/dist/shared/workspace/writeback-coordinator.js +7 -9
- package/dist/shared/workspace/writeback-coordinator.js.map +1 -1
- package/package.json +4 -4
- package/src/__test-utils__/__tests__/execution-record-barrier.test.ts +70 -0
- package/src/__test-utils__/__tests__/harness-contract-self-check.test.ts +35 -1
- package/src/__test-utils__/approval-contract/contract.ts +1 -1
- package/src/__test-utils__/approval-contract/types.ts +1 -1
- package/src/__test-utils__/harness-boot-order-child.ts +1 -1
- package/src/__test-utils__/harness-contract/contract.ts +8 -8
- package/src/__test-utils__/harness-contract/recording-sink.ts +11 -1
- package/src/__test-utils__/harness-contract/runtime-contract.ts +52 -16
- package/src/__test-utils__/harness-contract/scripted-adapter.ts +47 -43
- package/src/__test-utils__/hermetic-activity.ts +113 -9
- package/src/__test-utils__/model-registry-fixture.ts +31 -7
- package/src/__test-utils__/module-specifiers.ts +32 -3
- package/src/__tests__/harness-boot-order.test.ts +1 -1
- package/src/__tests__/harness-contract.test.ts +1 -1
- package/src/__tests__/runner-manager.test.ts +1 -1
- package/src/activities/execute-cursor/__test-utils__/__tests__/scripted-double.test.ts +1 -1
- package/src/activities/execute-cursor/__test-utils__/contract-subject.ts +2 -2
- package/src/activities/execute-cursor/__test-utils__/fold.ts +116 -0
- package/src/activities/execute-cursor/__test-utils__/gateway-substrate.ts +1 -1
- package/src/activities/execute-cursor/__test-utils__/hermetic-cursor.ts +67 -17
- package/src/activities/execute-cursor/__test-utils__/scripted-agent.ts +19 -5
- package/src/activities/execute-cursor/__tests__/approval-gate.test.ts +2 -1
- package/src/activities/execute-cursor/__tests__/approval-state.test.ts +14 -21
- package/src/activities/execute-cursor/__tests__/build-prompt.test.ts +3 -3
- package/src/activities/execute-cursor/__tests__/coarse-fingerprint.test.ts +2 -1
- package/src/activities/execute-cursor/__tests__/cursor-event-recorder.test.ts +142 -0
- package/src/activities/execute-cursor/__tests__/cursor-fetch-interceptor-bypass.test.ts +19 -8
- package/src/activities/execute-cursor/__tests__/cursor-sdk-auth-smoke.test.ts +10 -8
- package/src/activities/execute-cursor/__tests__/cursor-transcript-live.test.ts +298 -0
- package/src/activities/execute-cursor/__tests__/deny-gate-exact-apply.test.ts +4 -2
- package/src/activities/execute-cursor/__tests__/fetch-interceptor.test.ts +1 -1
- package/src/activities/execute-cursor/__tests__/hermetic/deny-and-retry.test.ts +1 -1
- package/src/activities/execute-cursor/__tests__/hermetic/file-review-capture.test.ts +1 -1
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/mcp-tool-call.status.json +71 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/sdk-task-note.status.json +73 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/shell-output-delta.error-delta.status.json +78 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/shell-output-delta.output-first.status.json +72 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/shell-output-delta.status.json +72 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/sub-agent-delegation.status.json +109 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/thinking-turn.status.json +78 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/todo-write.status.json +119 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/tool-error.status.json +68 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/tool-only-step.status.json +67 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/unattributed-hook-block.status.json +1 -1
- package/src/activities/execute-cursor/__tests__/hermetic/harness-contract.test.ts +7 -7
- package/src/activities/execute-cursor/__tests__/hermetic/mcp-tool-call.test.ts +146 -0
- package/src/activities/execute-cursor/__tests__/hermetic/pause-vs-shutdown.test.ts +5 -5
- package/src/activities/execute-cursor/__tests__/hermetic/plain-turn.test.ts +2 -1
- package/src/activities/execute-cursor/__tests__/hermetic/run-wait-arms.test.ts +2 -1
- package/src/activities/execute-cursor/__tests__/hermetic/sdk-task-note.test.ts +122 -0
- package/src/activities/execute-cursor/__tests__/hermetic/shell-output-delta.test.ts +276 -0
- package/src/activities/execute-cursor/__tests__/hermetic/stream-self-stop-arms.test.ts +8 -8
- package/src/activities/execute-cursor/__tests__/hermetic/sub-agent-delegation.test.ts +196 -0
- package/src/activities/execute-cursor/__tests__/hermetic/thinking-turn.test.ts +145 -0
- package/src/activities/execute-cursor/__tests__/hermetic/thrown-error-arms.test.ts +1 -1
- package/src/activities/execute-cursor/__tests__/hermetic/todo-write.test.ts +165 -0
- package/src/activities/execute-cursor/__tests__/hermetic/tool-call.test.ts +3 -3
- package/src/activities/execute-cursor/__tests__/hermetic/tool-error.test.ts +138 -0
- package/src/activities/execute-cursor/__tests__/hermetic/tool-only-step.test.ts +130 -0
- package/src/activities/execute-cursor/__tests__/hermetic/unattributed-hook-block.test.ts +13 -1
- package/src/activities/execute-cursor/__tests__/hermetic/workspace-lock-timeout.test.ts +2 -2
- package/src/activities/execute-cursor/__tests__/hitl-ledger.test.ts +43 -60
- package/src/activities/execute-cursor/__tests__/hitl-resume-history.test.ts +23 -28
- package/src/activities/execute-cursor/__tests__/hook-script.test.ts +2 -1
- package/src/activities/execute-cursor/__tests__/http2-interceptor.test.ts +1 -1
- package/src/activities/execute-cursor/__tests__/prompt-goldens.test.ts +5 -5
- package/src/activities/execute-cursor/__tests__/same-identity-reproposal.test.ts +11 -13
- package/src/activities/execute-cursor/__tests__/sequential-gate-resume.test.ts +8 -11
- package/src/activities/execute-cursor/__tests__/tool-result-image.test.ts +8 -22
- package/src/activities/execute-cursor/__tests__/translator.test.ts +594 -0
- package/src/activities/execute-cursor/__tests__/turn-boundary.test.ts +8 -5
- package/src/activities/execute-cursor/__tests__/turn-stream.test.ts +87 -63
- package/src/activities/execute-cursor/adapter.ts +4 -4
- package/src/activities/execute-cursor/approval-policy.ts +12 -24
- package/src/activities/execute-cursor/approval-state.ts +66 -1
- package/src/activities/execute-cursor/boundary-rows.ts +1132 -0
- package/src/activities/execute-cursor/cursor-capabilities.ts +1 -1
- package/src/activities/execute-cursor/cursor-event-recorder.ts +57 -28
- package/src/activities/execute-cursor/fetch-interceptor.ts +1 -1
- package/src/activities/execute-cursor/http2-interceptor.ts +1 -1
- package/src/activities/execute-cursor/prompt-builder.ts +6 -6
- package/src/activities/execute-cursor/service-tier.ts +1 -2
- package/src/activities/execute-cursor/sub-agent-steps.ts +188 -0
- package/src/activities/execute-cursor/tool-result.ts +128 -0
- package/src/activities/execute-cursor/translator.ts +541 -0
- package/src/activities/execute-cursor/turn-boundary.ts +21 -14
- package/src/activities/execute-cursor/turn-settle.ts +46 -34
- package/src/activities/execute-cursor/turn-setup.ts +5 -5
- package/src/activities/execute-cursor/turn-stream.ts +49 -46
- package/src/activities/execute-cursor/turn.ts +5 -5
- package/src/activities/execute-cursor/usage-pricing.ts +2 -2
- package/src/activities/execute-deep-agent/__test-utils__/contract-subject.ts +2 -2
- package/src/activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.ts +23 -11
- package/src/activities/execute-deep-agent/__test-utils__/hitl-script.ts +1 -1
- package/src/activities/execute-deep-agent/__test-utils__/scripted-model-module.ts +2 -3
- package/src/activities/execute-deep-agent/__test-utils__/scripted-model.ts +25 -4
- package/src/activities/execute-deep-agent/__test-utils__/v3-event-fixtures.ts +25 -11
- package/src/activities/execute-deep-agent/__tests__/adapter-graph-is-sdk-free.test.ts +1 -1
- package/src/activities/execute-deep-agent/__tests__/adapter-is-temporal-free.test.ts +1 -1
- package/src/activities/execute-deep-agent/__tests__/approval-file-change.test.ts +6 -17
- package/src/activities/execute-deep-agent/__tests__/hermetic/file-review-capture.test.ts +25 -8
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn1.status.json +2 -7
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve-all-lease.turn2.status.json +4 -14
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/approve.turn2.status.json +1 -5
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/file-review-capture.status.json +4 -7
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/gate.turn1.status.json +1 -5
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn1.status.json +2 -9
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/inline-artifact.turn2.status.json +2 -9
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.after-tool.status.json +1 -4
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/pause.loop.mid-tool.status.json +1 -4
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/platform-stop.status.json +1 -4
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/recursion-limit.persisted.status.json +109 -76
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/reject.turn2.status.json +1 -5
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn2.status.json +2 -10
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sequential-gates.turn3.status.json +2 -10
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/skip.turn2.status.json +1 -5
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/sub-agent-delegation.status.json +3 -6
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/tool-call.status.json +1 -4
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/worker-shutdown.status.json +1 -4
- package/src/activities/execute-deep-agent/__tests__/hermetic/goldens/write-todos.status.json +92 -0
- package/src/activities/execute-deep-agent/__tests__/hermetic/harness-contract.test.ts +3 -3
- package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-approve-all-lease.test.ts +9 -5
- package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-round-trips.test.ts +3 -3
- package/src/activities/execute-deep-agent/__tests__/hermetic/hitl-sequential-gates.test.ts +3 -3
- package/src/activities/execute-deep-agent/__tests__/hermetic/inline-artifact-across-gate.test.ts +7 -6
- package/src/activities/execute-deep-agent/__tests__/hermetic/pause-vs-shutdown.test.ts +10 -11
- package/src/activities/execute-deep-agent/__tests__/hermetic/plain-turn.test.ts +4 -4
- package/src/activities/execute-deep-agent/__tests__/hermetic/platform-stop.test.ts +9 -8
- package/src/activities/execute-deep-agent/__tests__/hermetic/recursion-limit.test.ts +21 -13
- package/src/activities/execute-deep-agent/__tests__/hermetic/resolution-error.test.ts +2 -2
- package/src/activities/execute-deep-agent/__tests__/hermetic/structured-output.test.ts +7 -7
- package/src/activities/execute-deep-agent/__tests__/hermetic/sub-agent-delegation.test.ts +28 -12
- package/src/activities/execute-deep-agent/__tests__/hermetic/tool-call.test.ts +21 -21
- package/src/activities/execute-deep-agent/__tests__/hermetic/workspace-lock-timeout.test.ts +5 -5
- package/src/activities/execute-deep-agent/__tests__/hermetic/write-todos.test.ts +160 -0
- package/src/activities/execute-deep-agent/__tests__/inline-publisher.test.ts +35 -30
- package/src/activities/execute-deep-agent/__tests__/prompt-builder.test.ts +3 -4
- package/src/activities/execute-deep-agent/__tests__/prompt-goldens.test.ts +12 -10
- package/src/activities/execute-deep-agent/__tests__/scripted-model.test.ts +13 -3
- package/src/activities/execute-deep-agent/__tests__/streaming-side-effects.test.ts +26 -18
- package/src/activities/execute-deep-agent/__tests__/subagent-wiring.test.ts +1 -1
- package/src/activities/execute-deep-agent/__tests__/{subagent-tracker.test.ts → translator-subagents.test.ts} +76 -57
- package/src/activities/execute-deep-agent/__tests__/{v3-status-builder.test.ts → translator-through-builder.test.ts} +213 -299
- package/src/activities/execute-deep-agent/__tests__/translator.test.ts +505 -0
- package/src/activities/execute-deep-agent/__tests__/turn-stream.test.ts +11 -29
- package/src/activities/execute-deep-agent/adapter.ts +1 -1
- package/src/activities/execute-deep-agent/approval-file-change.ts +20 -22
- package/src/activities/execute-deep-agent/deep-agent-capabilities.ts +2 -2
- package/src/activities/execute-deep-agent/hitl.ts +2 -2
- package/src/activities/execute-deep-agent/inline-publisher.ts +16 -5
- package/src/activities/execute-deep-agent/prompt-builder.ts +6 -7
- package/src/activities/execute-deep-agent/streaming-side-effects.ts +22 -31
- package/src/activities/execute-deep-agent/subagent-transformer.ts +3 -3
- package/src/activities/execute-deep-agent/translator.ts +463 -0
- package/src/activities/execute-deep-agent/turn-settle.ts +35 -43
- package/src/activities/execute-deep-agent/turn-setup.ts +8 -8
- package/src/activities/execute-deep-agent/turn-stream.ts +53 -51
- package/src/activities/execute-deep-agent/turn.ts +3 -3
- package/src/config.ts +2 -2
- package/src/harness/README.md +335 -0
- package/src/harness/__tests__/approval-decisions.test.ts +2 -2
- package/src/harness/__tests__/capture.test.ts +3 -3
- package/src/harness/__tests__/import-direction.test.ts +3 -2
- package/src/harness/__tests__/mount-skills.test.ts +4 -1
- package/src/harness/__tests__/readme-index.test.ts +339 -0
- package/src/harness/__tests__/run-turn.test.ts +131 -6
- package/src/harness/__tests__/transcript-is-engine-free.test.ts +83 -0
- package/src/harness/__tests__/transcript-writers.test.ts +191 -0
- package/src/harness/__tests__/turn-attachments-vision.test.ts +5 -2
- package/src/harness/__tests__/turn-context.test.ts +5 -5
- package/src/harness/approval-decisions.ts +1 -1
- package/src/harness/capabilities.ts +21 -11
- package/src/harness/capture.ts +4 -4
- package/src/harness/persist-chokepoint.ts +3 -3
- package/src/harness/registry.ts +2 -2
- package/src/harness/run-turn.ts +33 -9
- package/src/harness/stop-controller.ts +1 -1
- package/src/harness/terminal-table.ts +7 -7
- package/src/harness/transcript/__tests__/builder.test.ts +975 -0
- package/src/harness/transcript/__tests__/state.test.ts +143 -0
- package/src/harness/transcript/builder.ts +755 -0
- package/src/harness/transcript/events.ts +262 -0
- package/src/harness/transcript/state.ts +167 -0
- package/src/harness/turn-context.ts +61 -46
- package/src/harness/types.ts +64 -22
- package/src/harness/usage-accumulator.ts +2 -2
- package/src/harness-adapters.ts +5 -4
- package/src/middleware/__tests__/cost-advisory.test.ts +2 -2
- package/src/middleware/approval-gate.ts +7 -74
- package/src/middleware/cost-advisory.ts +3 -3
- package/src/middleware/index.ts +1 -1
- package/src/runner-manager.ts +1 -1
- package/src/shared/__tests__/approval-policy.test.ts +45 -0
- package/src/shared/__tests__/args-preview.test.ts +40 -20
- package/src/shared/__tests__/attachment-naming.test.ts +1 -1
- package/src/shared/__tests__/attachment-resolver.test.ts +5 -5
- package/src/shared/__tests__/attachment-zip.test.ts +1 -1
- package/src/shared/__tests__/blueprint-resolver.test.ts +1 -1
- package/src/shared/__tests__/cost-guard.test.ts +1 -1
- package/src/shared/__tests__/exact-apply.test.ts +2 -1
- package/src/shared/__tests__/persist-decision.test.ts +19 -33
- package/src/shared/__tests__/prompt-sections.test.ts +1 -1
- package/src/shared/__tests__/stamp-flowed-rows.test.ts +1 -1
- package/src/shared/__tests__/status-offload.test.ts +1 -1
- package/src/shared/__tests__/streaming-scheduler.test.ts +8 -9
- package/src/shared/__tests__/todos.test.ts +1 -1
- package/src/shared/__tests__/tool-row.test.ts +1 -1
- package/src/shared/approval-policy.ts +95 -0
- package/src/shared/args-preview.ts +51 -42
- package/src/shared/attachment-resolver.ts +4 -4
- package/src/shared/attachment-zip.ts +2 -2
- package/src/shared/cost-guard.ts +2 -2
- package/src/shared/exact-apply.ts +1 -1
- package/src/shared/execution-context.ts +2 -2
- package/src/shared/extract-structured-output.ts +2 -2
- package/src/shared/filereview/__tests__/capture.test.ts +9 -5
- package/src/shared/filereview/__tests__/git-substrate.test.ts +4 -1
- package/src/shared/filereview/__tests__/proxy-reconcile.test.ts +3 -3
- package/src/shared/filereview/cas-touched.ts +2 -2
- package/src/shared/heartbeat.ts +1 -1
- package/src/shared/llm-backend.ts +0 -4
- package/src/shared/model-error.ts +1 -2
- package/src/shared/persist-decision.ts +19 -28
- package/src/shared/prompt-sections.ts +4 -4
- package/src/shared/skill-resolver.ts +3 -3
- package/src/shared/status-offload.ts +2 -2
- package/src/shared/streaming-scheduler.ts +8 -13
- package/src/shared/subagent-rows.ts +2 -2
- package/src/shared/todos.ts +3 -3
- package/src/shared/tool-row.ts +38 -2
- package/src/shared/worker-shutdown.ts +1 -1
- package/src/shared/workspace/__tests__/git-source.test.ts +3 -3
- package/src/shared/workspace/__tests__/provisioner.test.ts +5 -5
- package/src/shared/workspace/__tests__/session-provision.test.ts +2 -2
- package/src/shared/workspace/__tests__/writeback-coordinator.integration.test.ts +8 -9
- package/src/shared/workspace/__tests__/writeback-coordinator.test.ts +25 -25
- package/src/shared/workspace/provisioner.ts +1 -1
- package/src/shared/workspace/session-provision.ts +1 -1
- package/src/shared/workspace/sources/empty.ts +2 -2
- package/src/shared/workspace/sources/git.ts +3 -4
- package/src/shared/workspace/sources/local-path.ts +5 -6
- package/src/shared/workspace/stigmer-link.ts +1 -1
- package/src/shared/workspace/types.ts +2 -5
- package/src/shared/workspace/writeback-coordinator.ts +23 -12
- package/dist/activities/execute-cursor/delta-enricher.d.ts +0 -87
- package/dist/activities/execute-cursor/delta-enricher.js +0 -265
- package/dist/activities/execute-cursor/delta-enricher.js.map +0 -1
- package/dist/activities/execute-cursor/message-translator.js +0 -2040
- package/dist/activities/execute-cursor/message-translator.js.map +0 -1
- package/dist/activities/execute-cursor/todo-tracker.d.ts +0 -40
- package/dist/activities/execute-cursor/todo-tracker.js +0 -80
- package/dist/activities/execute-cursor/todo-tracker.js.map +0 -1
- package/dist/activities/execute-deep-agent/execution-state.d.ts +0 -54
- package/dist/activities/execute-deep-agent/execution-state.js +0 -68
- package/dist/activities/execute-deep-agent/execution-state.js.map +0 -1
- package/dist/activities/execute-deep-agent/status-builder-shared.d.ts +0 -65
- package/dist/activities/execute-deep-agent/status-builder-shared.js +0 -90
- package/dist/activities/execute-deep-agent/status-builder-shared.js.map +0 -1
- package/dist/activities/execute-deep-agent/subagent-tracker.d.ts +0 -113
- package/dist/activities/execute-deep-agent/subagent-tracker.js +0 -400
- package/dist/activities/execute-deep-agent/subagent-tracker.js.map +0 -1
- package/dist/activities/execute-deep-agent/v3-events.d.ts +0 -102
- package/dist/activities/execute-deep-agent/v3-events.js +0 -35
- package/dist/activities/execute-deep-agent/v3-events.js.map +0 -1
- package/dist/activities/execute-deep-agent/v3-protocol-normalizer.d.ts +0 -15
- package/dist/activities/execute-deep-agent/v3-protocol-normalizer.js +0 -235
- package/dist/activities/execute-deep-agent/v3-protocol-normalizer.js.map +0 -1
- package/dist/activities/execute-deep-agent/v3-status-builder.d.ts +0 -111
- package/dist/activities/execute-deep-agent/v3-status-builder.js +0 -457
- package/dist/activities/execute-deep-agent/v3-status-builder.js.map +0 -1
- package/dist/shared/execution-status-writer.d.ts +0 -31
- package/dist/shared/execution-status-writer.js +0 -43
- package/dist/shared/execution-status-writer.js.map +0 -1
- package/src/activities/execute-cursor/__tests__/delta-enricher.test.ts +0 -310
- package/src/activities/execute-cursor/__tests__/message-translator.test.ts +0 -1033
- package/src/activities/execute-cursor/__tests__/todo-tracker.test.ts +0 -498
- package/src/activities/execute-cursor/delta-enricher.ts +0 -307
- package/src/activities/execute-cursor/message-translator.ts +0 -2319
- package/src/activities/execute-cursor/todo-tracker.ts +0 -91
- package/src/activities/execute-deep-agent/__tests__/execution-state-extended.test.ts +0 -148
- package/src/activities/execute-deep-agent/__tests__/execution-state.test.ts +0 -154
- package/src/activities/execute-deep-agent/__tests__/status-builder-shared.test.ts +0 -47
- package/src/activities/execute-deep-agent/__tests__/v3-protocol-normalizer.test.ts +0 -324
- package/src/activities/execute-deep-agent/execution-state.ts +0 -78
- package/src/activities/execute-deep-agent/status-builder-shared.ts +0 -142
- package/src/activities/execute-deep-agent/subagent-tracker.ts +0 -479
- package/src/activities/execute-deep-agent/v3-events.ts +0 -153
- package/src/activities/execute-deep-agent/v3-protocol-normalizer.ts +0 -264
- package/src/activities/execute-deep-agent/v3-status-builder.ts +0 -565
- package/src/shared/execution-status-writer.ts +0 -56
package/src/activities/execute-deep-agent/__tests__/hermetic/inline-artifact-across-gate.test.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Hermetic goldens: an INLINE-PUBLISHED ARTIFACT survives a HITL gate — the
|
|
3
|
-
* arbiter for
|
|
3
|
+
* arbiter for the seed's breadth (what a reinvocation carries forward), two
|
|
4
|
+
* invocations on the durable
|
|
4
5
|
* (sqlite) checkpointer.
|
|
5
6
|
*
|
|
6
7
|
* Turn 1: the model writes a report (`write_file`; under capture mode in a
|
|
@@ -18,19 +19,19 @@
|
|
|
18
19
|
* list is non-empty (`update-status.ts`), so a runtime that seeded messages
|
|
19
20
|
* only and then published nothing new would carry an empty list — and the
|
|
20
21
|
* server would keep the old one, but a runtime that published one NEW
|
|
21
|
-
* artifact from an empty list would ERASE the prior one.
|
|
22
|
+
* artifact from an empty list would ERASE the prior one.
|
|
22
23
|
* `seedFromPersistedStatus` carries `artifacts` for exactly this reason;
|
|
23
24
|
* this pair of goldens (`inline-artifact.turn1`, `inline-artifact.turn2`) is
|
|
24
25
|
* what proves it did.
|
|
25
26
|
*
|
|
26
|
-
* Also recorded
|
|
27
|
+
* Also recorded (a shape fact, as found): the write's tool row
|
|
27
28
|
* shows `requiresApproval: true` with `approvalPolicySource` BUILTIN_CATEGORY
|
|
28
29
|
* — the category policy's verdict — while the row is COMPLETED because
|
|
29
30
|
* capture mode let it flow; the artifact carries no URL (the local store's
|
|
30
31
|
* serve URL never enters the record).
|
|
31
32
|
*
|
|
32
|
-
* What every reinvocation golden here shows since
|
|
33
|
-
* the native adapter
|
|
33
|
+
* What every reinvocation golden here shows since #1096 (the runtime over
|
|
34
|
+
* the native adapter): `startedAt` is THIS turn's own,
|
|
34
35
|
* not turn 1's carried by the orchestrator's whole-status clone; the
|
|
35
36
|
* `fileReviewEventStream` carries only the events THIS turn authored (the
|
|
36
37
|
* runtime seeds messages, sub-agents, artifacts, write-backs, todos, usage,
|
|
@@ -41,7 +42,7 @@
|
|
|
41
42
|
* runtime accountant's fields (`model`, `estimatedCostUsd`, the requested
|
|
42
43
|
* tier and thinking mode).
|
|
43
44
|
*
|
|
44
|
-
* Golden hunk since
|
|
45
|
+
* Golden hunk since #1096: turn 1's
|
|
45
46
|
* `fileChangeProgress` is the TRUE snapshot at the WAITING write
|
|
46
47
|
* (`filesChanged: 1`, `report.md` ADD +3, `capturedAt` t=2) where it was a
|
|
47
48
|
* stale t=0 snapshot taken by the stream loop before the engine wrote the
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Hermetic goldens: the two ways a turn is INTERRUPTED from outside, and how
|
|
3
3
|
* the activity tells them apart — the throw-vs-return table the control
|
|
4
|
-
* plane's workflow keys on. Since
|
|
4
|
+
* plane's workflow keys on. Since #1096 the activity is the turn runtime
|
|
5
5
|
* over the native adapter, and the shapes below are the runtime's terminal
|
|
6
|
-
* table (`harness/terminal-table.ts
|
|
7
|
-
*
|
|
6
|
+
* table (`harness/terminal-table.ts`; the pause copy is Cursor's) and
|
|
7
|
+
* stigmer#1071 ("persist a thrown terminal once").
|
|
8
8
|
*
|
|
9
9
|
* 1. USER PAUSE: the activity's `cancellationSignal` aborts. Whether the
|
|
10
10
|
* abort lands inside a model call (staged from the scripted model's
|
|
@@ -13,11 +13,11 @@
|
|
|
13
13
|
* stop controller aborts the adapter's signal, the adapter cancels the
|
|
14
14
|
* graph run and settles `interrupted`, and the runtime persists PAUSED
|
|
15
15
|
* ONCE — WITH the transcript and the row "Execution paused by user. Use
|
|
16
|
-
* resume to continue." (
|
|
16
|
+
* resume to continue." (the runtime's pause copy is Cursor's; the
|
|
17
17
|
* orchestrator's said "… from this checkpoint.") — then throws
|
|
18
|
-
* `CancelledFailure("Activity paused by orchestrator")`. Until
|
|
18
|
+
* `CancelledFailure("Activity paused by orchestrator")`. Until #1096 the
|
|
19
19
|
* orchestrator persisted PAUSED TWICE, the second write bare and erasing
|
|
20
|
-
* the transcript (
|
|
20
|
+
* the transcript (stigmer#1054's double persist);
|
|
21
21
|
* `pause.bare.status.json` recorded that write and is gone with it. The
|
|
22
22
|
* one write differs by where the cancel landed — after the tool finished
|
|
23
23
|
* (`pause.loop.after-tool`) or while it was still RUNNING
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
* copy and one row, thrown as
|
|
29
29
|
* `CancelledFailure("Activity cancelled (worker shutdown, not user pause)")`
|
|
30
30
|
* (#776) — the workflow re-invokes instead of waiting for a resume. The
|
|
31
|
-
* copy is unchanged; what changed
|
|
31
|
+
* copy is unchanged; what changed in #1096 (the runtime's arm
|
|
32
32
|
* wins) is that the runtime's arm KEEPS the transcript the turn produced
|
|
33
33
|
* and appends the row, where the orchestrator's `buildWorkerShutdownStatus`
|
|
34
34
|
* replaced the whole status with the row alone.
|
|
@@ -145,7 +145,7 @@ describe("ExecuteDeepAgent hermetic — pause vs worker shutdown", () => {
|
|
|
145
145
|
expect(record.persistedPhases).toEqual([ExecutionPhase.EXECUTION_IN_PROGRESS, ExecutionPhase.EXECUTION_PAUSED]);
|
|
146
146
|
|
|
147
147
|
const pausedWrites = record.persisted.filter((s) => s.phase === ExecutionPhase.EXECUTION_PAUSED);
|
|
148
|
-
expect(pausedWrites, "PAUSED is persisted exactly once (stigmer#1071
|
|
148
|
+
expect(pausedWrites, "PAUSED is persisted exactly once (stigmer#1071)").toHaveLength(1);
|
|
149
149
|
const [paused] = pausedWrites;
|
|
150
150
|
expect(paused.messages.filter((m) => m.type === MessageType.MESSAGE_SYSTEM).map((m) => m.content)).toEqual([
|
|
151
151
|
"Execution paused by user. Use resume to continue.",
|
|
@@ -188,11 +188,10 @@ describe("ExecuteDeepAgent hermetic — pause vs worker shutdown", () => {
|
|
|
188
188
|
const final = record.lastFullStatus!;
|
|
189
189
|
expect(final.error).toBe("Execution interrupted: runner worker was shut down. Retry or resume.");
|
|
190
190
|
// The transcript the turn produced is kept and the row appended (the
|
|
191
|
-
// runtime's arm
|
|
192
|
-
// (
|
|
191
|
+
// runtime's arm); the tool row sits on the message whose text
|
|
192
|
+
// proposed it (since #1097 — until then on its own empty message).
|
|
193
193
|
expect(final.messages.map((m) => [m.type, m.content])).toEqual([
|
|
194
194
|
[MessageType.MESSAGE_AI, "Let me look."],
|
|
195
|
-
[MessageType.MESSAGE_AI, ""],
|
|
196
195
|
[
|
|
197
196
|
MessageType.MESSAGE_SYSTEM,
|
|
198
197
|
"Execution interrupted: the runner worker was shut down while the agent was still running. You can retry or resume.",
|
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Invariant pinned: the activity resolves the four-resource chain, builds the
|
|
7
7
|
* REAL deepagents graph, streams it through the v3 protocol into
|
|
8
|
-
* `
|
|
8
|
+
* `TranscriptBuilder`, persists IN_PROGRESS then COMPLETED, and returns the slim
|
|
9
9
|
* status. The golden (`goldens/plain-turn.status.json`) is the smallest
|
|
10
10
|
* status the native harness produces: one AI message with the scripted text
|
|
11
11
|
* and the scripted usage, `startedAt` / `completedAt` on the scripted clock.
|
|
12
12
|
*
|
|
13
|
-
* This file is also the PROBE the
|
|
13
|
+
* This file is also the PROBE the native net opened with (#1096): no earlier test drove the
|
|
14
14
|
* real graph through `streamEvents(..., { version: "v3" })`. The scripted
|
|
15
15
|
* model streams, so the events under this golden are the ones a provider
|
|
16
16
|
* produces (`scripted-model.ts` header).
|
|
@@ -22,10 +22,10 @@
|
|
|
22
22
|
* `thread_id` (carried from `index.test.ts`: "handles empty threadId
|
|
23
23
|
* gracefully").
|
|
24
24
|
*
|
|
25
|
-
* Since
|
|
25
|
+
* Since #1096 the activity is the turn runtime over the native adapter, and
|
|
26
26
|
* `streamingUsage` carries the runtime accountant's fields — `model`,
|
|
27
27
|
* `estimatedCostUsd` priced at the registry's rates, the requested tier and
|
|
28
|
-
* thinking mode (
|
|
28
|
+
* thinking mode (one writer of the summary, the runtime). Nothing
|
|
29
29
|
* else in this golden moved with the flip.
|
|
30
30
|
*
|
|
31
31
|
* Regenerate ONLY after a deliberate behavior change:
|
|
@@ -4,21 +4,21 @@
|
|
|
4
4
|
*
|
|
5
5
|
* What the arm does: the record's `controlSignal` answers STOP on the first
|
|
6
6
|
* full write that carries a tool row (the tool-call boundary forces that
|
|
7
|
-
* persist, `persist-decision.ts` `
|
|
7
|
+
* persist, `persist-decision.ts` over the builder's `dirty` flag); the runtime's chokepoint
|
|
8
8
|
* reads the signal off the write and aborts the adapter's `stopSignal`; the
|
|
9
9
|
* adapter's loop, which AWAITED that persist, sees the abort before it pulls
|
|
10
10
|
* the next event, cancels the graph run and settles `interrupted`; the
|
|
11
11
|
* runtime's table maps the stop to COMPLETED with `platformStopArm`'s one
|
|
12
12
|
* row, "Execution stopped by the platform.", no `status.error`, and RETURNS.
|
|
13
13
|
*
|
|
14
|
-
*
|
|
15
|
-
* now"; the runtime's abort is the one stop)
|
|
14
|
+
* The rule (a platform STOP is the platform saying "stop spending
|
|
15
|
+
* now"; the runtime's abort is the one stop) landed in #1096. Until
|
|
16
16
|
* then the orchestrator answered STOP by activating `graceful-stop.ts`,
|
|
17
17
|
* which handed the model one more tool-free round: the transcript carried
|
|
18
18
|
* the model's wrap-up ("Stopping here as asked.") AND the middleware's own
|
|
19
|
-
* notice rendered as the agent's words
|
|
20
|
-
* COMPLETED with no row. The graceful-stop middleware was deleted
|
|
21
|
-
* (
|
|
19
|
+
* notice rendered as the agent's words, and the run ended
|
|
20
|
+
* COMPLETED with no row. The graceful-stop middleware was deleted in #1096
|
|
21
|
+
* (after the legacy loop that activated it); nothing in
|
|
22
22
|
* the graph answers a STOP any more, so the second scripted turn is never
|
|
23
23
|
* reached — this golden was byte-identical across the deletion.
|
|
24
24
|
*
|
|
@@ -74,7 +74,7 @@ describe("ExecuteDeepAgent hermetic — platform STOP", () => {
|
|
|
74
74
|
env.dispose();
|
|
75
75
|
});
|
|
76
76
|
|
|
77
|
-
it("stops the run at the STOP and completes with the platform-stop row
|
|
77
|
+
it("stops the run at the STOP and completes with the platform-stop row", async () => {
|
|
78
78
|
// ── Arrange ──────────────────────────────────────────────────────────────
|
|
79
79
|
let stopsAnswered = 0;
|
|
80
80
|
const record = deepAgentExecutionRecord({
|
|
@@ -113,7 +113,8 @@ describe("ExecuteDeepAgent hermetic — platform STOP", () => {
|
|
|
113
113
|
"Execution stopped by the platform.",
|
|
114
114
|
]);
|
|
115
115
|
const ai = final.messages.filter((m) => m.type === MessageType.MESSAGE_AI).map((m) => m.content);
|
|
116
|
-
expect(ai, "no wrap-up round and no injected notice: the run stopped at the STOP").toEqual(["Let me look."
|
|
116
|
+
expect(ai, "no wrap-up round and no injected notice: the run stopped at the STOP").toEqual(["Let me look."]);
|
|
117
|
+
expect(final.messages[0].toolCalls.map((tc) => tc.name), "the row sits on the text that proposed it").toEqual(["read_file"]);
|
|
117
118
|
expect(ai).not.toContain(WRAP_UP);
|
|
118
119
|
|
|
119
120
|
// ── Assert: hermeticity ──────────────────────────────────────────────────
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
* (matched with `startsWith` by stigmer-cloud's `reply-extractor.ts`) and
|
|
15
15
|
* its row, PERSISTS it, and returns the slim.
|
|
16
16
|
*
|
|
17
|
-
*
|
|
18
|
-
* the TERMINATED status but never PERSISTED it (
|
|
17
|
+
* The rule landed in #1096. Until then the orchestrator RETURNED
|
|
18
|
+
* the TERMINATED status but never PERSISTED it (a
|
|
19
19
|
* production defect): the last status the control plane held was the
|
|
20
20
|
* stream's mid-run IN_PROGRESS with no error, and only the activity's return
|
|
21
21
|
* value carried the truth. The golden
|
|
@@ -23,18 +23,20 @@
|
|
|
23
23
|
* TERMINATED status the control plane holds, which is what that fix changed
|
|
24
24
|
* on purpose.
|
|
25
25
|
*
|
|
26
|
-
* Also visible here,
|
|
27
|
-
*
|
|
28
|
-
*
|
|
26
|
+
* Also visible here, the message boundary at scale (since #1097): every tool
|
|
27
|
+
* row sits on the "Reading file N." message whose text proposed it. Until
|
|
28
|
+
* then all of them sat on ONE empty AI message: the namespace miss created the
|
|
29
|
+
* empty message once and its `currentAiMessage[""]` then caught every later
|
|
30
|
+
* row.
|
|
29
31
|
*
|
|
30
32
|
* How many rounds fit is the middleware stack's shape, not the knob's
|
|
31
|
-
* (
|
|
33
|
+
* (ruled 2026-09-13, #1096): LangChain makes every
|
|
32
34
|
* middleware hook its own graph node, and `max_tool_rounds` becomes a
|
|
33
35
|
* super-step budget at the ×6 floor estimate, so a node fewer per round
|
|
34
36
|
* means more rounds within the same 60 steps. When `graceful-stop.ts` (an
|
|
35
|
-
* `afterModel` node) was deleted
|
|
37
|
+
* `afterModel` node) was deleted in #1096, this golden went from 11 tool
|
|
36
38
|
* calls to 13 before TERMINATED — the only hunk, the copy unchanged. That the
|
|
37
|
-
* knob counts super-steps and not rounds is recorded as
|
|
39
|
+
* knob counts super-steps and not rounds is recorded as #1113
|
|
38
40
|
* (a round counter in the budget middleware would make it mean what it
|
|
39
41
|
* says); this file pins what the stack delivers today.
|
|
40
42
|
*
|
|
@@ -88,7 +90,7 @@ describe("ExecuteDeepAgent hermetic — tool-call budget exhausted", () => {
|
|
|
88
90
|
env.dispose();
|
|
89
91
|
});
|
|
90
92
|
|
|
91
|
-
it("returns TERMINATED with the cross-repo prefix, and persists
|
|
93
|
+
it("returns TERMINATED with the cross-repo prefix, and persists that terminal", async () => {
|
|
92
94
|
// ── Arrange ──────────────────────────────────────────────────────────────
|
|
93
95
|
const record = deepAgentExecutionRecord({ message: "Keep reading files.", maxToolRounds: MIN_TOOL_ROUNDS });
|
|
94
96
|
const scenario = beginDeepAgentScenario({
|
|
@@ -113,21 +115,27 @@ describe("ExecuteDeepAgent hermetic — tool-call budget exhausted", () => {
|
|
|
113
115
|
expect(slim.phase).toBe("EXECUTION_TERMINATED");
|
|
114
116
|
expect(String(slim.error).startsWith(TOOL_CALL_LIMIT_ERROR_PREFIX), "the cross-repo prefix").toBe(true);
|
|
115
117
|
|
|
116
|
-
// ── Assert: what the control plane holds
|
|
118
|
+
// ── Assert: what the control plane holds ─────────────────────────────────
|
|
117
119
|
expect(record.persistedPhases, "the TERMINATED terminal is persisted").toEqual([
|
|
118
120
|
ExecutionPhase.EXECUTION_IN_PROGRESS,
|
|
119
121
|
ExecutionPhase.EXECUTION_TERMINATED,
|
|
120
122
|
]);
|
|
121
123
|
const persisted = record.lastFullStatus!;
|
|
122
124
|
expect(String(persisted.error).startsWith(TOOL_CALL_LIMIT_ERROR_PREFIX), "the persisted error carries the prefix").toBe(true);
|
|
123
|
-
expect(persisted.error, "the event count left the copy
|
|
125
|
+
expect(persisted.error, "the event count left the copy").not.toMatch(/\d+ events?/);
|
|
124
126
|
expect(persisted.completedAt).not.toBe("");
|
|
125
127
|
const rows = record.toolCalls();
|
|
126
128
|
expect(rows.length, "fewer rounds ran than were scripted: the budget stopped the graph").toBeLessThan(SCRIPTED_ROUNDS);
|
|
127
129
|
expect(rows.length).toBeGreaterThanOrEqual(MIN_TOOL_ROUNDS);
|
|
130
|
+
// The message boundary: every row sits on the message whose text proposed it
|
|
131
|
+
// — one "Reading file N." message per row, no empty host (before #1097 all
|
|
132
|
+
// thirteen rows sat on ONE empty message).
|
|
128
133
|
const rowHosts = persisted.messages.filter((m) => m.type === MessageType.MESSAGE_AI && m.toolCalls.length > 0);
|
|
129
|
-
expect(rowHosts
|
|
130
|
-
|
|
134
|
+
expect(rowHosts).toHaveLength(rows.length);
|
|
135
|
+
for (const host of rowHosts) {
|
|
136
|
+
expect(host.content).toMatch(/^Reading file \d+\.$/);
|
|
137
|
+
expect(host.toolCalls).toHaveLength(1);
|
|
138
|
+
}
|
|
131
139
|
|
|
132
140
|
// ── Assert: hermeticity ──────────────────────────────────────────────────
|
|
133
141
|
expect(registry.urls.every((u) => u.includes("/model-registry"))).toBe(true);
|
|
@@ -12,11 +12,11 @@
|
|
|
12
12
|
* Temporal retry a deterministic failure). Nothing streamed, no lock taken
|
|
13
13
|
* (the fault precedes the lock phase), no artifacts.
|
|
14
14
|
*
|
|
15
|
-
* The row shape is one of
|
|
15
|
+
* The row shape is one of the alignments #1096 made on purpose: the
|
|
16
16
|
* orchestrator wrote one row `"Error: [Error] <message>"`; the runtime's arm
|
|
17
17
|
* writes the boilerplate plus the details row. `status.error` itself did
|
|
18
18
|
* not move (the conformance suite pins it). The setup labels are the
|
|
19
|
-
* runtime's resolution phases'
|
|
19
|
+
* runtime's resolution phases'.
|
|
20
20
|
*
|
|
21
21
|
* Carried from `index.test.ts` ("returns EXECUTION_FAILED status when setup
|
|
22
22
|
* fails", "includes error message in failed status", "always returns a
|
|
@@ -13,13 +13,13 @@
|
|
|
13
13
|
* 2. The text fallback (the runtime's tier 1): the model answers in prose
|
|
14
14
|
* with a fenced JSON block and `shared/extract-json.ts` recovers the
|
|
15
15
|
* object from the final text (`run-turn.ts` `extractStructuredOutputFromText`).
|
|
16
|
-
* 3. The LLM fallback (the runtime's tier 2
|
|
16
|
+
* 3. The LLM fallback (the runtime's tier 2): the final text carries
|
|
17
17
|
* no JSON at all, so the runtime asks a second model — the registry's
|
|
18
18
|
* economy tier for the primary's provider — to extract it through
|
|
19
19
|
* `withStructuredOutput` (`shared/extract-structured-output.ts`). Native
|
|
20
|
-
* gained this arm
|
|
21
|
-
* over; it is pinned here
|
|
22
|
-
*
|
|
20
|
+
* gained this arm in #1096, when the turn runtime took the epilogue
|
|
21
|
+
* over; it is pinned here, where every other alignment of that move
|
|
22
|
+
* is. Two facts the golden records: the extraction call is a
|
|
23
23
|
* SECOND model build (`maxTokens: 4096`, on the primary — the fixture
|
|
24
24
|
* registry declares no economy row, `getEconomyModel`'s last resort),
|
|
25
25
|
* and its tool call never reaches the transcript (it is not a graph
|
|
@@ -38,10 +38,10 @@
|
|
|
38
38
|
* `extract` (`withStructuredOutput` with no name), bound on the extraction
|
|
39
39
|
* model alone, which is how the script tells the two calls apart.
|
|
40
40
|
*
|
|
41
|
-
* Since
|
|
41
|
+
* Since #1096 the activity is the turn runtime over the native adapter, and
|
|
42
42
|
* `streamingUsage` carries the runtime accountant's fields — `model`,
|
|
43
43
|
* `estimatedCostUsd` priced at the registry's rates, the requested tier and
|
|
44
|
-
* thinking mode (
|
|
44
|
+
* thinking mode (one writer of the summary, the runtime). Nothing
|
|
45
45
|
* else in this golden moved with the flip.
|
|
46
46
|
*
|
|
47
47
|
* Regenerate ONLY after a deliberate behavior change:
|
|
@@ -176,7 +176,7 @@ describe("ExecuteDeepAgent hermetic — structured output", () => {
|
|
|
176
176
|
await expect(json).toMatchFileSnapshot("./goldens/structured-output.text-fallback.status.json");
|
|
177
177
|
});
|
|
178
178
|
|
|
179
|
-
it("LLM fallback (tier 2): prose with no JSON is extracted by a second model call the transcript never sees
|
|
179
|
+
it("LLM fallback (tier 2): prose with no JSON is extracted by a second model call the transcript never sees", async () => {
|
|
180
180
|
// ── Arrange ──────────────────────────────────────────────────────────────
|
|
181
181
|
clock.reset();
|
|
182
182
|
// The OSS direct-credential posture, for this arm only: with no proxy the
|
|
@@ -8,35 +8,51 @@
|
|
|
8
8
|
* runner's `shell`) on the SAME model double through `modelFactory`; the root
|
|
9
9
|
* proposes `task({ subagent_type, description })`; the tools node runs the
|
|
10
10
|
* sub-agent graph under a nested namespace (`tools:<uuid>|...`); the
|
|
11
|
-
* `
|
|
12
|
-
* (not by the namespace uuid, which never reaches the status),
|
|
13
|
-
* nested model events into
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
11
|
+
* translator's `sub_agent_started` opens a `SubAgentExecution` keyed by the
|
|
12
|
+
* `task` call id (not by the namespace uuid, which never reaches the status),
|
|
13
|
+
* the builder folds the nested model events into that row's own transcript
|
|
14
|
+
* scope, and `sub_agent_finished` closes it COMPLETED when the `task` tool
|
|
15
|
+
* finishes; the root's transcript carries the `task` row and its closing
|
|
16
|
+
* text. The golden (`goldens/sub-agent-delegation.status.json`) pins the
|
|
17
|
+
* nested transcript shape; its three moves in #1097 are quoted below with
|
|
18
|
+
* their reasons, and every other line is byte-identical through that PR.
|
|
17
19
|
*
|
|
18
20
|
* Role selection: `createDeepAgent` gives the sub-agent the same tool set as
|
|
19
21
|
* its parent (`task` included), so the script tells the roles apart by the
|
|
20
22
|
* system prompt (`ScriptRoleContext.systemPrompt`), which carries the
|
|
21
23
|
* sub-agent's own instructions — the one thing that differs.
|
|
22
24
|
*
|
|
23
|
-
* Since
|
|
25
|
+
* Since #1096 the activity is the turn runtime over the native adapter, and
|
|
24
26
|
* `streamingUsage` carries the runtime accountant's fields — `model`,
|
|
25
27
|
* `estimatedCostUsd` priced at the registry's rates, the requested tier and
|
|
26
|
-
* thinking mode (
|
|
28
|
+
* thinking mode (one writer of the summary, the runtime). Nothing
|
|
27
29
|
* else in this golden moved with the flip.
|
|
28
30
|
*
|
|
29
|
-
* Since
|
|
31
|
+
* Since #1096 (ruled 2026-09-13) the sub-agent's spend is
|
|
30
32
|
* the execution's spend: the helper's one turn (600 in, 12 out) is reported
|
|
31
33
|
* through the same hook as the root's, so `streamingUsage` reads 3,900 in /
|
|
32
34
|
* 102 out / 3 turns where it read 3,300 / 90 / 2, and `estimatedCostUsd`
|
|
33
35
|
* 0.00441 where it read 0.00375 — the helper's 660 micro-dollars at the
|
|
34
|
-
* PARENT's rate (per-sub-agent pricing is
|
|
36
|
+
* PARENT's rate (per-sub-agent pricing is #1121; the in-graph cost cap
|
|
35
37
|
* this replaces priced sub-agents the same way). The five lines of
|
|
36
38
|
* `streamingUsage` are the whole diff; the transcript and the sub-agent row
|
|
37
39
|
* are byte-identical. `max_cost_usd` is now enforced over this total by the
|
|
38
40
|
* runtime, the one enforcement since the cost middleware became advisory
|
|
39
|
-
* (
|
|
41
|
+
* (#1096).
|
|
42
|
+
*
|
|
43
|
+
* Since #1097: deepagents' `task` tool
|
|
44
|
+
* returns a LangGraph `Command` like `write_todos` does, so the `task` row's
|
|
45
|
+
* `result` and the sub-agent row's `output` are the nested ToolMessage's
|
|
46
|
+
* content — `[{"type":"text","text":"The fixture value is forty-two."}]`,
|
|
47
|
+
* the blocks array the image offload reads — where they were the whole
|
|
48
|
+
* serialized Command. Those two lines are the whole of that hunk.
|
|
49
|
+
*
|
|
50
|
+
* Also since #1097: the `task` row sits on the AI message whose text
|
|
51
|
+
* delegated ("Delegating to the helper."), not on an empty AI message of its
|
|
52
|
+
* own after it — two root AI messages (the delegating text with the row, the
|
|
53
|
+
* closing text) where there were three; the same scoping fix
|
|
54
|
+
* `tool-call.test.ts` records. And the row carries
|
|
55
|
+
* `argsPreview`, the one preview rule for every row on every harness.
|
|
40
56
|
*
|
|
41
57
|
* Regenerate ONLY after a deliberate behavior change:
|
|
42
58
|
* npx vitest run src/activities/execute-deep-agent/__tests__/hermetic -u
|
|
@@ -137,9 +153,9 @@ describe("ExecuteDeepAgent hermetic — sub-agent delegation", () => {
|
|
|
137
153
|
expect(rows.map((tc) => [tc.id, tc.name, tc.status])).toEqual([[TASK_CALL_ID, "task", ToolCallStatus.TOOL_CALL_COMPLETED]]);
|
|
138
154
|
expect(final.messages.filter((m) => m.type === MessageType.MESSAGE_AI).map((m) => m.content)).toEqual([
|
|
139
155
|
"Delegating to the helper.",
|
|
140
|
-
"",
|
|
141
156
|
ROOT_CLOSING,
|
|
142
157
|
]);
|
|
158
|
+
expect(final.messages[0].toolCalls.map((tc) => tc.id), "the task row sits on the text that delegated").toEqual([TASK_CALL_ID]);
|
|
143
159
|
|
|
144
160
|
// ── Assert: the sub-agent execution ──────────────────────────────────────
|
|
145
161
|
expect(final.subAgentExecutions).toHaveLength(1);
|
|
@@ -10,27 +10,27 @@
|
|
|
10
10
|
* into ONE tool row, and the turn ends COMPLETED. A read-only built-in is never
|
|
11
11
|
* gated (`shared/tool-kind.ts` FILE_READ), so no approval fields are set. The
|
|
12
12
|
* mid-stream persist the tool-call boundary forces (`persist-decision.ts`
|
|
13
|
-
* `
|
|
13
|
+
* over the builder's `dirty` flag) is what the platform-stop arm relies on.
|
|
14
14
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* stamps the model's events with namespace
|
|
19
|
-
* tools node's with `["tools:<uuid>"]
|
|
20
|
-
*
|
|
21
|
-
* parent up under
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* (`goldens/tool-call.status.json`) is the shape
|
|
28
|
-
*
|
|
15
|
+
* The transcript shape (since #1097): the row sits on the AI
|
|
16
|
+
* message whose text proposed it — TWO AI messages, the text carrying the
|
|
17
|
+
* row and the closing text. Until then it did not (found in #1096):
|
|
18
|
+
* LangGraph 1.3.2 stamps the model's events with namespace
|
|
19
|
+
* `["model_request:<uuid>"]` and the tools node's with `["tools:<uuid>"]`, the
|
|
20
|
+
* builder filed the text under the raw namespace and looked the tool's
|
|
21
|
+
* parent up under a namespace stripped of `tools:` only — a miss, so the row
|
|
22
|
+
* rode an EMPTY AI message between the two texts. The fix is not a patch on
|
|
23
|
+
* the lookup: scope became `subAgentId?` (the root, or one sub-agent) and the
|
|
24
|
+
* translator resolves it from the namespace, so the builder has one
|
|
25
|
+
* "current AI message" per scope and that class of miss cannot exist. The
|
|
26
|
+
* hand-authored fixtures now default to the real namespaces too.
|
|
27
|
+
* The golden (`goldens/tool-call.status.json`) is the shape any later change
|
|
28
|
+
* must move on purpose.
|
|
29
29
|
*
|
|
30
|
-
* Since
|
|
30
|
+
* Since #1096 the activity is the turn runtime over the native adapter, and
|
|
31
31
|
* `streamingUsage` carries the runtime accountant's fields — `model`,
|
|
32
32
|
* `estimatedCostUsd` priced at the registry's rates, the requested tier and
|
|
33
|
-
* thinking mode (
|
|
33
|
+
* thinking mode (one writer of the summary, the runtime). Nothing
|
|
34
34
|
* else in this golden moved with the flip.
|
|
35
35
|
*
|
|
36
36
|
* Regenerate ONLY after a deliberate behavior change:
|
|
@@ -134,17 +134,17 @@ describe("ExecuteDeepAgent hermetic — ungated tool call", () => {
|
|
|
134
134
|
expect(row.result, "the built-in's numbered listing of the seeded file").toContain("A fixture readme.");
|
|
135
135
|
expect(row.requiresApproval, "a read-only built-in is not gated").toBe(false);
|
|
136
136
|
|
|
137
|
-
// ── Assert: the transcript
|
|
137
|
+
// ── Assert: the transcript — the row beside the text that proposed it ──
|
|
138
138
|
const final = record.lastFullStatus!;
|
|
139
139
|
const ai = final.messages.filter((m) => m.type === MessageType.MESSAGE_AI);
|
|
140
|
-
expect(ai.map((m) => m.content), "text,
|
|
140
|
+
expect(ai.map((m) => m.content), "the proposing text, then the closing text").toEqual([
|
|
141
141
|
"Let me read it.",
|
|
142
|
-
"",
|
|
143
142
|
ASSISTANT_TEXT,
|
|
144
143
|
]);
|
|
145
|
-
expect(ai[
|
|
144
|
+
expect(ai[0].toolCalls.map((tc) => tc.id), "the row sits on the message whose text proposed it").toEqual([
|
|
146
145
|
CALL_ID,
|
|
147
146
|
]);
|
|
147
|
+
expect(ai[1].toolCalls).toHaveLength(0);
|
|
148
148
|
expect(final.streamingUsage?.turnCount).toBe(2);
|
|
149
149
|
|
|
150
150
|
// ── Assert: hermeticity ──────────────────────────────────────────────────
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* and one system row, persists ONCE, and returns — a Temporal retry would only
|
|
12
12
|
* queue behind the same holder.
|
|
13
13
|
*
|
|
14
|
-
* The order,
|
|
14
|
+
* The order, since #1096: the runtime takes the
|
|
15
15
|
* lock right after provisioning the workspace, BEFORE the tool surface, the
|
|
16
16
|
* skills, the attachments and the graph — so a turn that cannot have the
|
|
17
17
|
* tree builds no model and compiles no sub-agent. Until then the
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
* appear, because the turn ends before the adapter runs.
|
|
22
22
|
*
|
|
23
23
|
* Why this is the one terminal arm WITHOUT a file golden (owner ruling,
|
|
24
|
-
* 2026-09-11,
|
|
25
|
-
* the absolute workspace path, a per-run temp directory. The
|
|
24
|
+
* 2026-09-11, #1070; carried for native): the wire copy embeds
|
|
25
|
+
* the absolute workspace path, a per-run temp directory. The hermetic rule (#1048) is to
|
|
26
26
|
* control a volatile source at its origin or escalate — never redact — so
|
|
27
27
|
* this scenario pins every byte the path does not touch with explicit
|
|
28
28
|
* assertions and builds the expected message with the SAME error class over
|
|
@@ -136,11 +136,11 @@ describe("ExecuteDeepAgent hermetic — workspace lock timeout", () => {
|
|
|
136
136
|
"Provisioning workspace",
|
|
137
137
|
"Waiting for workspace — in use by another session",
|
|
138
138
|
]);
|
|
139
|
-
expect(recordedModelBuilds(), "no model is built for a turn that cannot have the tree
|
|
139
|
+
expect(recordedModelBuilds(), "no model is built for a turn that cannot have the tree").toHaveLength(0);
|
|
140
140
|
|
|
141
141
|
// ── Assert: hermeticity ────────────────────────────────────────────────
|
|
142
142
|
expect(registry.urls.every((u) => u.includes("/model-registry"))).toBe(true);
|
|
143
|
-
// The runtime's heartbeat posture
|
|
143
|
+
// The runtime's heartbeat posture: every resolution
|
|
144
144
|
// phase pulses on entry and the terminal write pulses once, so a turn
|
|
145
145
|
// that ends at the lock has heartbeated before any stream existed.
|
|
146
146
|
expect(invocation.heartbeats.length, "the runtime heartbeats through resolution").toBeGreaterThan(0);
|