@stigmer/runner 3.15.3-dev.20260914100347 → 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 +14 -11
- package/dist/activities/execute-cursor/__test-utils__/contract-subject.js.map +1 -1
- 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 +52 -14
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js +46 -12
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/scripted-agent.d.ts +21 -28
- package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js +27 -11
- package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.d.ts +70 -26
- package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.js +82 -32
- package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.js.map +1 -1
- package/dist/activities/execute-cursor/adapter.d.ts +8 -7
- package/dist/activities/execute-cursor/adapter.js +13 -9
- package/dist/activities/execute-cursor/adapter.js.map +1 -1
- 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/sdk-warmup.d.ts +15 -6
- package/dist/activities/execute-cursor/sdk-warmup.js +15 -6
- package/dist/activities/execute-cursor/sdk-warmup.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/session-lifecycle.d.ts +38 -59
- package/dist/activities/execute-cursor/session-lifecycle.js +59 -96
- package/dist/activities/execute-cursor/session-lifecycle.js.map +1 -1
- package/dist/activities/execute-cursor/session-store.d.ts +100 -0
- package/dist/activities/execute-cursor/session-store.js +157 -0
- package/dist/activities/execute-cursor/session-store.js.map +1 -0
- 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-vision.d.ts +2 -1
- package/dist/shared/attachment-vision.js.map +1 -1
- 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 +5 -5
- 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 +32 -8
- package/src/activities/execute-cursor/__test-utils__/contract-subject.ts +12 -10
- 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 +72 -19
- package/src/activities/execute-cursor/__test-utils__/scripted-agent.ts +35 -29
- package/src/activities/execute-cursor/__test-utils__/scripted-sdk.ts +94 -38
- 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-baseurl-routing.test.ts +10 -8
- 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 +24 -12
- package/src/activities/execute-cursor/__tests__/cursor-generate-image-live.test.ts +7 -2
- package/src/activities/execute-cursor/__tests__/cursor-hook-protocol-live.test.ts +163 -0
- package/src/activities/execute-cursor/__tests__/cursor-sdk-auth-smoke.test.ts +23 -20
- 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 +5 -2
- package/src/activities/execute-cursor/__tests__/hermetic/file-review-capture.test.ts +5 -2
- 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 +10 -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 +8 -5
- package/src/activities/execute-cursor/__tests__/hermetic/plain-turn.test.ts +6 -2
- package/src/activities/execute-cursor/__tests__/hermetic/recovery-fresh-agent.test.ts +4 -1
- package/src/activities/execute-cursor/__tests__/hermetic/run-wait-arms.test.ts +6 -2
- 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 +12 -9
- 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 +4 -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 +7 -4
- 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 +17 -2
- package/src/activities/execute-cursor/__tests__/hermetic/workspace-lock-timeout.test.ts +5 -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__/session-lifecycle.test.ts +86 -58
- package/src/activities/execute-cursor/__tests__/session-store.test.ts +220 -0
- 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 +13 -9
- 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/sdk-warmup.ts +15 -6
- package/src/activities/execute-cursor/service-tier.ts +1 -2
- package/src/activities/execute-cursor/session-lifecycle.ts +63 -109
- package/src/activities/execute-cursor/session-store.ts +187 -0
- 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-vision.ts +2 -1
- 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
|
@@ -1,324 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach } from "vitest";
|
|
2
|
-
import { normalize } from "../v3-protocol-normalizer.js";
|
|
3
|
-
import {
|
|
4
|
-
resetSeq,
|
|
5
|
-
makeProtocolEvent,
|
|
6
|
-
makeMessageStart,
|
|
7
|
-
makeMessageFinish,
|
|
8
|
-
makeTextDelta,
|
|
9
|
-
makeReasoningDelta,
|
|
10
|
-
makeToolCallArgDelta,
|
|
11
|
-
makeToolStarted,
|
|
12
|
-
makeToolFinished,
|
|
13
|
-
makeToolError,
|
|
14
|
-
makeToolOutputDelta,
|
|
15
|
-
makeUsageEvent,
|
|
16
|
-
makeProviderEvent,
|
|
17
|
-
makeLifecycleRunning,
|
|
18
|
-
makeLifecycleCompleted,
|
|
19
|
-
makeContentBlockStartText,
|
|
20
|
-
makeContentBlockFinish,
|
|
21
|
-
makeCheckpointEvent,
|
|
22
|
-
makeTasksEvent,
|
|
23
|
-
makeValuesEvent,
|
|
24
|
-
makeUpdatesEvent,
|
|
25
|
-
} from "../__test-utils__/v3-event-fixtures.js";
|
|
26
|
-
|
|
27
|
-
beforeEach(() => resetSeq());
|
|
28
|
-
|
|
29
|
-
describe("V3ProtocolNormalizer", () => {
|
|
30
|
-
|
|
31
|
-
// ── Message channel ──────────────────────────────────────────────
|
|
32
|
-
|
|
33
|
-
describe("messages channel", () => {
|
|
34
|
-
it("normalizes message-start", () => {
|
|
35
|
-
const result = normalize(makeMessageStart("run-1", { messageId: "msg_abc" }));
|
|
36
|
-
expect(result).toHaveLength(1);
|
|
37
|
-
expect(result[0]).toMatchObject({
|
|
38
|
-
kind: "message_start",
|
|
39
|
-
runId: "run-1",
|
|
40
|
-
messageId: "msg_abc",
|
|
41
|
-
namespace: "",
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it("normalizes text-delta", () => {
|
|
46
|
-
const result = normalize(makeTextDelta("run-1", "Hello "));
|
|
47
|
-
expect(result).toHaveLength(1);
|
|
48
|
-
expect(result[0]).toMatchObject({
|
|
49
|
-
kind: "text_delta",
|
|
50
|
-
runId: "run-1",
|
|
51
|
-
text: "Hello ",
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it("normalizes reasoning-delta", () => {
|
|
56
|
-
const result = normalize(makeReasoningDelta("run-1", "Let me think..."));
|
|
57
|
-
expect(result).toHaveLength(1);
|
|
58
|
-
expect(result[0]).toMatchObject({
|
|
59
|
-
kind: "reasoning_delta",
|
|
60
|
-
runId: "run-1",
|
|
61
|
-
text: "Let me think...",
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
it("normalizes tool_call_chunk via block-delta", () => {
|
|
66
|
-
const result = normalize(makeToolCallArgDelta("run-1", "toolu_123", '{"path":'));
|
|
67
|
-
expect(result).toHaveLength(1);
|
|
68
|
-
expect(result[0]).toMatchObject({
|
|
69
|
-
kind: "tool_call_arg_delta",
|
|
70
|
-
callId: "toolu_123",
|
|
71
|
-
argsChunk: '{"path":',
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
it("normalizes message-finish with usage", () => {
|
|
76
|
-
const result = normalize(makeMessageFinish("run-1", {
|
|
77
|
-
reason: "end_turn",
|
|
78
|
-
usage: { input_tokens: 100, output_tokens: 20, total_tokens: 120 },
|
|
79
|
-
}));
|
|
80
|
-
expect(result).toHaveLength(1);
|
|
81
|
-
expect(result[0]).toMatchObject({
|
|
82
|
-
kind: "message_finish",
|
|
83
|
-
runId: "run-1",
|
|
84
|
-
reason: "end_turn",
|
|
85
|
-
usage: {
|
|
86
|
-
input_tokens: 100,
|
|
87
|
-
output_tokens: 20,
|
|
88
|
-
},
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it("normalizes message-finish without usage", () => {
|
|
93
|
-
const result = normalize(makeMessageFinish("run-1"));
|
|
94
|
-
expect(result).toHaveLength(1);
|
|
95
|
-
expect(result[0]).toMatchObject({
|
|
96
|
-
kind: "message_finish",
|
|
97
|
-
runId: "run-1",
|
|
98
|
-
usage: undefined,
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
it("normalizes usage event", () => {
|
|
103
|
-
const result = normalize(makeUsageEvent("run-1", {
|
|
104
|
-
input_tokens: 50, output_tokens: 10,
|
|
105
|
-
input_token_details: { cache_creation: 40, cache_read: 5 },
|
|
106
|
-
}));
|
|
107
|
-
expect(result).toHaveLength(1);
|
|
108
|
-
expect(result[0]).toMatchObject({
|
|
109
|
-
kind: "usage",
|
|
110
|
-
usage: {
|
|
111
|
-
input_tokens: 50,
|
|
112
|
-
output_tokens: 10,
|
|
113
|
-
input_token_details: { cache_creation: 40, cache_read: 5 },
|
|
114
|
-
},
|
|
115
|
-
});
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
it("normalizes provider event with model", () => {
|
|
119
|
-
const result = normalize(makeProviderEvent("run-1", "anthropic", "claude-sonnet-4-6"));
|
|
120
|
-
expect(result).toHaveLength(1);
|
|
121
|
-
expect(result[0]).toMatchObject({
|
|
122
|
-
kind: "provider",
|
|
123
|
-
provider: "anthropic",
|
|
124
|
-
model: "claude-sonnet-4-6",
|
|
125
|
-
});
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
it("returns empty for content-block-start", () => {
|
|
129
|
-
const result = normalize(makeContentBlockStartText("run-1"));
|
|
130
|
-
expect(result).toHaveLength(0);
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
it("returns empty for content-block-finish", () => {
|
|
134
|
-
const result = normalize(makeContentBlockFinish("run-1"));
|
|
135
|
-
expect(result).toHaveLength(0);
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
it("ignores empty text-delta", () => {
|
|
139
|
-
const result = normalize(makeTextDelta("run-1", ""));
|
|
140
|
-
expect(result).toHaveLength(0);
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
it("ignores empty reasoning-delta", () => {
|
|
144
|
-
const result = normalize(makeReasoningDelta("run-1", ""));
|
|
145
|
-
expect(result).toHaveLength(0);
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
// ── Tools channel ────────────────────────────────────────────────
|
|
150
|
-
|
|
151
|
-
describe("tools channel", () => {
|
|
152
|
-
it("normalizes tool-started with snake_case fields", () => {
|
|
153
|
-
const result = normalize(makeToolStarted("toolu_abc", "read_file", '{"path":"/src/main.ts"}'));
|
|
154
|
-
expect(result).toHaveLength(1);
|
|
155
|
-
expect(result[0]).toMatchObject({
|
|
156
|
-
kind: "tool_started",
|
|
157
|
-
callId: "toolu_abc",
|
|
158
|
-
name: "read_file",
|
|
159
|
-
input: { path: "/src/main.ts" },
|
|
160
|
-
});
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
it("normalizes tool-started with camelCase fields", () => {
|
|
164
|
-
const event = makeProtocolEvent("tools", {
|
|
165
|
-
event: "tool-started",
|
|
166
|
-
toolCallId: "toolu_abc",
|
|
167
|
-
toolName: "read_file",
|
|
168
|
-
input: { path: "/src/main.ts" },
|
|
169
|
-
}, { namespace: ["tools:toolu_abc"] });
|
|
170
|
-
const result = normalize(event);
|
|
171
|
-
expect(result).toHaveLength(1);
|
|
172
|
-
expect(result[0]).toMatchObject({
|
|
173
|
-
kind: "tool_started",
|
|
174
|
-
callId: "toolu_abc",
|
|
175
|
-
name: "read_file",
|
|
176
|
-
});
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
it("normalizes tool-finished", () => {
|
|
180
|
-
const result = normalize(makeToolFinished("toolu_abc", "file content here"));
|
|
181
|
-
expect(result).toHaveLength(1);
|
|
182
|
-
expect(result[0]).toMatchObject({
|
|
183
|
-
kind: "tool_finished",
|
|
184
|
-
callId: "toolu_abc",
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
it("normalizes tool-error", () => {
|
|
189
|
-
const result = normalize(makeToolError("toolu_abc", "permission denied"));
|
|
190
|
-
expect(result).toHaveLength(1);
|
|
191
|
-
expect(result[0]).toMatchObject({
|
|
192
|
-
kind: "tool_error",
|
|
193
|
-
callId: "toolu_abc",
|
|
194
|
-
message: "permission denied",
|
|
195
|
-
});
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
it("normalizes tool-output-delta", () => {
|
|
199
|
-
const result = normalize(makeToolOutputDelta("toolu_abc", "partial output"));
|
|
200
|
-
expect(result).toHaveLength(1);
|
|
201
|
-
expect(result[0]).toMatchObject({
|
|
202
|
-
kind: "tool_output_delta",
|
|
203
|
-
callId: "toolu_abc",
|
|
204
|
-
delta: "partial output",
|
|
205
|
-
});
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
it("parses string JSON input into object", () => {
|
|
209
|
-
const result = normalize(makeToolStarted("toolu_abc", "think", '{"thought":"test"}'));
|
|
210
|
-
expect(result[0]).toMatchObject({
|
|
211
|
-
kind: "tool_started",
|
|
212
|
-
input: { thought: "test" },
|
|
213
|
-
});
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
it("handles malformed JSON input gracefully", () => {
|
|
217
|
-
const result = normalize(makeToolStarted("toolu_abc", "think", "not json"));
|
|
218
|
-
expect(result[0]).toMatchObject({
|
|
219
|
-
kind: "tool_started",
|
|
220
|
-
input: {},
|
|
221
|
-
});
|
|
222
|
-
});
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
// ── Lifecycle channel ────────────────────────────────────────────
|
|
226
|
-
|
|
227
|
-
describe("lifecycle channel", () => {
|
|
228
|
-
it("normalizes running event", () => {
|
|
229
|
-
const result = normalize(makeLifecycleRunning("root"));
|
|
230
|
-
expect(result).toHaveLength(1);
|
|
231
|
-
expect(result[0]).toMatchObject({
|
|
232
|
-
kind: "lifecycle",
|
|
233
|
-
event: "running",
|
|
234
|
-
graphName: "root",
|
|
235
|
-
});
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
it("normalizes completed event", () => {
|
|
239
|
-
const result = normalize(makeLifecycleCompleted("model_request", ["model_request:abc"]));
|
|
240
|
-
expect(result).toHaveLength(1);
|
|
241
|
-
expect(result[0]).toMatchObject({
|
|
242
|
-
kind: "lifecycle",
|
|
243
|
-
event: "completed",
|
|
244
|
-
graphName: "model_request",
|
|
245
|
-
namespace: "model_request:abc",
|
|
246
|
-
});
|
|
247
|
-
});
|
|
248
|
-
});
|
|
249
|
-
|
|
250
|
-
// ── Ignored channels ─────────────────────────────────────────────
|
|
251
|
-
|
|
252
|
-
describe("ignored channels", () => {
|
|
253
|
-
it("returns empty for checkpoints", () => {
|
|
254
|
-
expect(normalize(makeCheckpointEvent())).toHaveLength(0);
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
it("returns empty for tasks", () => {
|
|
258
|
-
expect(normalize(makeTasksEvent())).toHaveLength(0);
|
|
259
|
-
});
|
|
260
|
-
|
|
261
|
-
it("returns empty for values", () => {
|
|
262
|
-
expect(normalize(makeValuesEvent())).toHaveLength(0);
|
|
263
|
-
});
|
|
264
|
-
|
|
265
|
-
it("returns empty for updates", () => {
|
|
266
|
-
expect(normalize(makeUpdatesEvent())).toHaveLength(0);
|
|
267
|
-
});
|
|
268
|
-
});
|
|
269
|
-
|
|
270
|
-
// ── Edge cases ───────────────────────────────────────────────────
|
|
271
|
-
|
|
272
|
-
describe("edge cases", () => {
|
|
273
|
-
it("returns empty for unknown method", () => {
|
|
274
|
-
const event = makeProtocolEvent("input", { event: "something" });
|
|
275
|
-
expect(normalize(event)).toHaveLength(0);
|
|
276
|
-
});
|
|
277
|
-
|
|
278
|
-
it("returns empty for missing data", () => {
|
|
279
|
-
const event = makeProtocolEvent("messages", undefined);
|
|
280
|
-
expect(normalize(event)).toHaveLength(0);
|
|
281
|
-
});
|
|
282
|
-
|
|
283
|
-
it("returns empty for unknown message event type", () => {
|
|
284
|
-
const event = makeProtocolEvent("messages", { event: "brand-new-thing", run_id: "r" });
|
|
285
|
-
expect(normalize(event)).toHaveLength(0);
|
|
286
|
-
});
|
|
287
|
-
|
|
288
|
-
it("preserves namespace from event params", () => {
|
|
289
|
-
const result = normalize(makeTextDelta("run-1", "hi", { namespace: ["subagent:worker-1"] }));
|
|
290
|
-
expect(result[0]).toMatchObject({ namespace: "subagent:worker-1" });
|
|
291
|
-
});
|
|
292
|
-
|
|
293
|
-
it("joins multi-segment namespace with pipe", () => {
|
|
294
|
-
const result = normalize(makeTextDelta("run-1", "hi", { namespace: ["a", "b"] }));
|
|
295
|
-
expect(result[0]).toMatchObject({ namespace: "a|b" });
|
|
296
|
-
});
|
|
297
|
-
|
|
298
|
-
it("preserves seq from original event", () => {
|
|
299
|
-
const event = makeTextDelta("run-1", "hi");
|
|
300
|
-
const result = normalize(event);
|
|
301
|
-
expect(result[0].seq).toBe(event.seq);
|
|
302
|
-
});
|
|
303
|
-
|
|
304
|
-
it("handles delta with no type gracefully", () => {
|
|
305
|
-
const event = makeProtocolEvent("messages", {
|
|
306
|
-
event: "content-block-delta",
|
|
307
|
-
index: 0,
|
|
308
|
-
delta: {},
|
|
309
|
-
run_id: "run-1",
|
|
310
|
-
});
|
|
311
|
-
expect(normalize(event)).toHaveLength(0);
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
it("handles missing tool_call_id in tool-started", () => {
|
|
315
|
-
const event = makeProtocolEvent("tools", {
|
|
316
|
-
event: "tool-started",
|
|
317
|
-
tool_name: "read_file",
|
|
318
|
-
}, { namespace: ["tools:abc"] });
|
|
319
|
-
const result = normalize(event);
|
|
320
|
-
expect(result).toHaveLength(1);
|
|
321
|
-
expect(result[0]).toMatchObject({ kind: "tool_started", callId: "" });
|
|
322
|
-
});
|
|
323
|
-
});
|
|
324
|
-
});
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mutable execution state for `V3StatusBuilder`.
|
|
3
|
-
*
|
|
4
|
-
* Holds the AgentExecutionStatus proto being progressively built and
|
|
5
|
-
* O(1) lookup indexes into its repeated fields. Mutations to indexed
|
|
6
|
-
* references (ToolCall, AgentMessage) propagate directly to the proto
|
|
7
|
-
* because they share the same object reference. Sub-agent transcripts are
|
|
8
|
-
* `SubAgentTracker`'s, keyed by namespace beside this state.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import type { AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
12
|
-
import type { AgentMessage, ToolCall } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
13
|
-
|
|
14
|
-
export class ExecutionState {
|
|
15
|
-
/** The protobuf projection being built. */
|
|
16
|
-
readonly proto: AgentExecutionStatus;
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* tool_call_id -> live ToolCall reference inside a message's repeated
|
|
20
|
-
* field. Mutations propagate directly to the proto.
|
|
21
|
-
*/
|
|
22
|
-
readonly toolCalls: Map<string, ToolCall> = new Map();
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* LLM run_id -> the AgentMessage that run is streaming into.
|
|
26
|
-
* Prevents token interleaving when the model produces multiple runs.
|
|
27
|
-
*/
|
|
28
|
-
readonly messagesByRun: Map<string, AgentMessage> = new Map();
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Namespace -> most recently created AI message in that execution
|
|
32
|
-
* context. Tool calls are appended to this message's toolCalls field.
|
|
33
|
-
* Empty string key represents the main agent.
|
|
34
|
-
*/
|
|
35
|
-
readonly currentAiMessage: Map<string, AgentMessage> = new Map();
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Namespace -> latest LLM run_id for turn-boundary detection.
|
|
39
|
-
* When a new run_id appears in the same namespace, a new AgentMessage
|
|
40
|
-
* is created rather than appending to the existing one.
|
|
41
|
-
*/
|
|
42
|
-
readonly lastLlmRunId: Map<string, string> = new Map();
|
|
43
|
-
|
|
44
|
-
constructor(proto: AgentExecutionStatus) {
|
|
45
|
-
this.proto = proto;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Reset all ephemeral indexes. The proto itself is not cleared —
|
|
50
|
-
* this is used when resuming from a persisted status where the proto
|
|
51
|
-
* already has messages and tool calls, but runtime tracking state
|
|
52
|
-
* (run_id maps, timing) must start fresh.
|
|
53
|
-
*/
|
|
54
|
-
resetEphemeralState(): void {
|
|
55
|
-
this.messagesByRun.clear();
|
|
56
|
-
this.currentAiMessage.clear();
|
|
57
|
-
this.lastLlmRunId.clear();
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Rebuild the toolCalls index from the proto's messages.
|
|
62
|
-
*
|
|
63
|
-
* Used on the resume path where the V3StatusBuilder is initialized
|
|
64
|
-
* with a persisted AgentExecutionStatus that already contains
|
|
65
|
-
* messages and tool calls. Only proto-derivable indexes are rebuilt;
|
|
66
|
-
* ephemeral runtime state starts fresh.
|
|
67
|
-
*/
|
|
68
|
-
rebuildToolCallIndex(): void {
|
|
69
|
-
this.toolCalls.clear();
|
|
70
|
-
for (const message of this.proto.messages) {
|
|
71
|
-
for (const tc of message.toolCalls) {
|
|
72
|
-
if (tc.id) {
|
|
73
|
-
this.toolCalls.set(tc.id, tc);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* What the transcript builders share: the tool-result serialization and the
|
|
3
|
-
* approval-provenance stamp that `V3StatusBuilder` (the root transcript) and
|
|
4
|
-
* `SubAgentTracker` (the sub-agent transcripts) both perform at the moment
|
|
5
|
-
* they classify a tool call, so the two never drift on either rule.
|
|
6
|
-
*
|
|
7
|
-
* Until S3 M2b this module also carried the v2 `StatusBuilder`'s share — the
|
|
8
|
-
* `UsageAccumulator` that summed `streamingUsage` (the turn runtime's
|
|
9
|
-
* accountant owns the field now, `harness/usage-accumulator.ts`) and the v2
|
|
10
|
-
* `on_tool_end` result extractor — both retired with the v2 stream (Q-S3-1).
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import type { ToolCall } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
14
|
-
import {
|
|
15
|
-
POLICY_ENGINE_VERSION,
|
|
16
|
-
resolveApprovalProvenance,
|
|
17
|
-
toProtoPolicySource,
|
|
18
|
-
type MergedToolPolicy,
|
|
19
|
-
} from "../../shared/approval-policy.js";
|
|
20
|
-
import type { ToolApprovalCategory } from "../../shared/tool-kind.js";
|
|
21
|
-
|
|
22
|
-
// ── Tool Result Extraction ─────────────────────────────────────────
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Serialize a LangChain message `content` field into the canonical tool-result
|
|
26
|
-
* string.
|
|
27
|
-
*
|
|
28
|
-
* Text-only content is a plain string and passes through unchanged. Multimodal
|
|
29
|
-
* content (image, or mixed text+image — e.g. a computer-use screenshot) is an
|
|
30
|
-
* array of content blocks; we serialize the blocks array ITSELF, not the
|
|
31
|
-
* surrounding message envelope, so the result lands in the exact top-level-array
|
|
32
|
-
* shape the persist-time offload (`detectImagePayload`/`contentBlocks` in
|
|
33
|
-
* status-offload.ts) consumes to lift the image out into a renderable
|
|
34
|
-
* `ToolCallOutputRef`. Serializing the envelope instead would bury the base64
|
|
35
|
-
* one level deeper and defeat that detection.
|
|
36
|
-
*
|
|
37
|
-
* Returns undefined when `content` is neither a string nor an array, letting the
|
|
38
|
-
* caller fall back to serializing whatever else it holds.
|
|
39
|
-
*/
|
|
40
|
-
function serializeToolContent(content: unknown): string | undefined {
|
|
41
|
-
if (typeof content === "string") return content;
|
|
42
|
-
if (Array.isArray(content)) return JSON.stringify(content);
|
|
43
|
-
return undefined;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Extract tool result from v3 tool-finished output.
|
|
48
|
-
* v3 output wraps LangChain ToolMessage in a constructor envelope:
|
|
49
|
-
* `{ lc, type, id, kwargs: { content, status, ... } }`
|
|
50
|
-
*/
|
|
51
|
-
export function extractToolResultV3(output: unknown): string {
|
|
52
|
-
if (typeof output === "string") return output;
|
|
53
|
-
if (typeof output === "object" && output !== null) {
|
|
54
|
-
const obj = output as Record<string, unknown>;
|
|
55
|
-
const kwargs = obj.kwargs as Record<string, unknown> | undefined;
|
|
56
|
-
if (kwargs) {
|
|
57
|
-
const fromKwargs = serializeToolContent(kwargs.content);
|
|
58
|
-
if (fromKwargs !== undefined) return fromKwargs;
|
|
59
|
-
}
|
|
60
|
-
const fromContent = serializeToolContent(obj.content);
|
|
61
|
-
if (fromContent !== undefined) return fromContent;
|
|
62
|
-
}
|
|
63
|
-
try {
|
|
64
|
-
return JSON.stringify(output);
|
|
65
|
-
} catch {
|
|
66
|
-
return "[serialization error]";
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// ── Authorization Provenance ───────────────────────────────────────
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* The policy inputs the builders need to decide whether a tool call waits for
|
|
74
|
-
* approval and to attribute its authorization provenance.
|
|
75
|
-
*/
|
|
76
|
-
export interface ApprovalProvenanceInputs {
|
|
77
|
-
readonly policies: ReadonlyMap<string, MergedToolPolicy>;
|
|
78
|
-
readonly toolServerMap: ReadonlyMap<string, string>;
|
|
79
|
-
/**
|
|
80
|
-
* Built-in categories with a run-lifetime lease, so a leased built-in is
|
|
81
|
-
* attributed to its lease (approval_lease) rather than the plain category gate.
|
|
82
|
-
* Optional (mirroring {@link ApprovalGateConfig.leasedCategories}); absent =
|
|
83
|
-
* no lease active.
|
|
84
|
-
*/
|
|
85
|
-
readonly leasedCategories?: ReadonlySet<ToolApprovalCategory>;
|
|
86
|
-
/** Pre-armed spec.auto_approve_all — the one whole-run global bypass. */
|
|
87
|
-
readonly globalBypass: boolean;
|
|
88
|
-
/**
|
|
89
|
-
* Unattended approval mode (ExecutionConfig.approval_mode = UNATTENDED):
|
|
90
|
-
* the gate auto-skips gated calls instead of interrupting, so the builders
|
|
91
|
-
* must NOT seed WAITING_APPROVAL rows or flip the phase to
|
|
92
|
-
* WAITING_FOR_APPROVAL — the row streams as RUNNING and the post-stream
|
|
93
|
-
* `reconcileUnattendedSkips` stamps the terminal SKIPPED + provenance.
|
|
94
|
-
*/
|
|
95
|
-
readonly unattended?: boolean;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* The name the builder's API uses for the same shape (`setApprovalProvider`):
|
|
100
|
-
* the adapter hands the gate's policy state in under this name. One shape, two
|
|
101
|
-
* names on purpose — the provider is what a caller SUPPLIES, the inputs are
|
|
102
|
-
* what the stamper READS; until S3 M2b the v2 builder declared the provider as
|
|
103
|
-
* an empty `interface extends`, a second type for one shape.
|
|
104
|
-
*/
|
|
105
|
-
export type ApprovalPolicyProvider = ApprovalProvenanceInputs;
|
|
106
|
-
|
|
107
|
-
/** Shared empty set so a provider without leases allocates nothing per call. */
|
|
108
|
-
const NO_LEASED_CATEGORIES: ReadonlySet<ToolApprovalCategory> = new Set();
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Stamp a tool call's authorization provenance — which policy layer governs it —
|
|
112
|
-
* alongside `tool_kind`, in exactly the spot both builders classify the tool.
|
|
113
|
-
*
|
|
114
|
-
* This is the read-side companion to the gate: it records WHY a tool is gated or
|
|
115
|
-
* auto-approved for every observed tool call, so the persisted record is
|
|
116
|
-
* auditable and the UI can explain the gate. Built-ins that no layer governs (a
|
|
117
|
-
* read-only built-in) and the no-provider path both leave the field at
|
|
118
|
-
* UNSPECIFIED, like an unclassified tool_kind.
|
|
119
|
-
*/
|
|
120
|
-
export function stampApprovalProvenance(
|
|
121
|
-
tc: ToolCall,
|
|
122
|
-
provider: ApprovalProvenanceInputs | null,
|
|
123
|
-
): void {
|
|
124
|
-
if (!provider) return;
|
|
125
|
-
const serverSlug = tc.mcpServerSlug || provider.toolServerMap.get(tc.name) || "";
|
|
126
|
-
const source = resolveApprovalProvenance(
|
|
127
|
-
tc.name,
|
|
128
|
-
serverSlug,
|
|
129
|
-
provider.policies,
|
|
130
|
-
provider.leasedCategories ?? NO_LEASED_CATEGORIES,
|
|
131
|
-
provider.globalBypass,
|
|
132
|
-
);
|
|
133
|
-
tc.approvalPolicySource = toProtoPolicySource(source);
|
|
134
|
-
if (source) tc.policyEngineVersion = POLICY_ENGINE_VERSION;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// ── Approval Args Sanitization ─────────────────────────────────────
|
|
138
|
-
|
|
139
|
-
// Relocated to src/shared/args-preview.ts so both harnesses share one home for
|
|
140
|
-
// arg sanitization. Re-exported here so the native importers (v3-status-builder,
|
|
141
|
-
// approval-file-change) keep their existing import path.
|
|
142
|
-
export { sanitizeArgsPreview } from "../../shared/args-preview.js";
|