@stigmer/runner 3.15.3-dev.20260914121148 → 3.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- 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/activities/generate-session-subject.d.ts +25 -4
- package/dist/activities/generate-session-subject.js +17 -7
- package/dist/activities/generate-session-subject.js.map +1 -1
- package/dist/client/stigmer-client.d.ts +17 -6
- package/dist/client/stigmer-client.js +47 -14
- package/dist/client/stigmer-client.js.map +1 -1
- package/dist/config.d.ts +6 -3
- package/dist/config.js +4 -1
- package/dist/config.js.map +1 -1
- 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/interceptors/run-credential-activity.d.ts +28 -0
- package/dist/interceptors/run-credential-activity.js +56 -0
- package/dist/interceptors/run-credential-activity.js.map +1 -0
- 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 +10 -4
- package/dist/runner-manager.js.map +1 -1
- package/dist/shared/activity-input.d.ts +9 -0
- package/dist/shared/activity-input.js +17 -0
- package/dist/shared/activity-input.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/channel-attachment.d.ts +8 -5
- package/dist/shared/channel-attachment.js +10 -6
- package/dist/shared/channel-attachment.js.map +1 -1
- 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/filereview/progress.d.ts +13 -0
- package/dist/shared/filereview/progress.js +13 -0
- package/dist/shared/filereview/progress.js.map +1 -1
- 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/memory-attachment.d.ts +16 -9
- package/dist/shared/memory-attachment.js +18 -10
- package/dist/shared/memory-attachment.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/run-credential-store.d.ts +32 -0
- package/dist/shared/run-credential-store.js +39 -0
- package/dist/shared/run-credential-store.js.map +1 -0
- package/dist/shared/run-credential.d.ts +61 -0
- package/dist/shared/run-credential.js +68 -0
- package/dist/shared/run-credential.js.map +1 -0
- 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/synthesized-attachment.d.ts +30 -3
- package/dist/shared/synthesized-attachment.js +26 -0
- package/dist/shared/synthesized-attachment.js.map +1 -1
- 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/dist/worker.js +10 -3
- package/dist/worker.js.map +1 -1
- package/dist/workflow-source.d.ts +10 -0
- package/dist/workflow-source.js +12 -0
- package/dist/workflow-source.js.map +1 -1
- package/dist/workflows/execute-from-execution.d.ts +15 -0
- package/dist/workflows/execute-from-execution.js +11 -0
- package/dist/workflows/execute-from-execution.js.map +1 -1
- package/dist/workflows/index.d.ts +5 -3
- package/dist/workflows/index.js +5 -3
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/interceptors/run-credential.d.ts +34 -0
- package/dist/workflows/interceptors/run-credential.js +71 -0
- package/dist/workflows/interceptors/run-credential.js.map +1 -0
- 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__/run-credential-e2e.test.ts +233 -0
- package/src/__tests__/run-credential-registration.test.ts +80 -0
- package/src/__tests__/runner-manager.test.ts +1 -1
- package/src/activities/__tests__/generate-session-subject-wire.test.ts +119 -0
- 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/activities/generate-session-subject.ts +29 -4
- package/src/client/__tests__/stigmer-client.test.ts +92 -0
- package/src/client/stigmer-client.ts +48 -14
- package/src/config.ts +6 -3
- 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/interceptors/__tests__/run-credential-activity.test.ts +133 -0
- package/src/interceptors/run-credential-activity.ts +67 -0
- 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 +14 -4
- 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__/channel-attachment.test.ts +12 -0
- package/src/shared/__tests__/cost-guard.test.ts +1 -1
- package/src/shared/__tests__/exact-apply.test.ts +2 -1
- package/src/shared/__tests__/memory-attachment.test.ts +17 -0
- package/src/shared/__tests__/persist-decision.test.ts +19 -33
- package/src/shared/__tests__/prompt-sections.test.ts +1 -1
- package/src/shared/__tests__/run-credential.test.ts +111 -0
- 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/activity-input.ts +21 -0
- 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/channel-attachment.ts +14 -6
- 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/filereview/progress.ts +13 -0
- package/src/shared/heartbeat.ts +1 -1
- package/src/shared/llm-backend.ts +0 -4
- package/src/shared/memory-attachment.ts +22 -10
- 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/run-credential-store.ts +45 -0
- package/src/shared/run-credential.ts +70 -0
- 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/synthesized-attachment.ts +38 -3
- 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/src/worker.ts +15 -3
- package/src/workflow-source.ts +15 -0
- package/src/workflows/__tests__/run-credential-interceptor.test.ts +178 -0
- package/src/workflows/execute-from-execution.ts +17 -0
- package/src/workflows/index.ts +5 -3
- package/src/workflows/interceptors/run-credential.ts +101 -0
- 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,565 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* V3StatusBuilder — consumes StigmerRunEvents from the V3ProtocolNormalizer
|
|
3
|
-
* and progressively builds the transcript half of the AgentExecutionStatus
|
|
4
|
-
* proto it is handed: messages, tool-call rows and their approval status,
|
|
5
|
-
* sub-agent rows, todos, artifacts, write-backs.
|
|
6
|
-
*
|
|
7
|
-
* The one transcript builder of the native harness since S3 M2b: v3 event
|
|
8
|
-
* semantics (tool_call_id keying, content-block-level deltas, explicit tool
|
|
9
|
-
* lifecycle). Its predecessor, the v2 `StatusBuilder` over LangChain's
|
|
10
|
-
* `streamEvents` v2, was retired with the v2 stream (Q-S3-1); the eight
|
|
11
|
-
* golden sequences both once had to agree on are this builder's test's.
|
|
12
|
-
*
|
|
13
|
-
* What this builder deliberately does NOT write, and who does (the adapter
|
|
14
|
-
* contract's field ownership, `harness/types.ts` `TurnSink`): the phase,
|
|
15
|
-
* `startedAt` and `streamingUsage` are the turn runtime's. A gated tool
|
|
16
|
-
* start is reported as the {@link awaitingApproval} fact and the caller
|
|
17
|
-
* (`turn-stream.ts`) decides what that means for the turn; usage is reported
|
|
18
|
-
* raw through {@link V3StatusBuilderOptions.onUsage} and the caller prices
|
|
19
|
-
* it into the sink (until S3 M2a this builder flipped WAITING_FOR_APPROVAL
|
|
20
|
-
* itself and summed usage into `streamingUsage` — a second writer of each
|
|
21
|
-
* field beside the runtime's).
|
|
22
|
-
*
|
|
23
|
-
* Usage is reported on message_finish only (standalone usage events are
|
|
24
|
-
* no-ops) to prevent double-counting — v3 emits both for the same turn.
|
|
25
|
-
* EVERY graph's usage is reported, the sub-agents' included (S3 M2b,
|
|
26
|
-
* Q-M2b-1): a sub-agent's `message_finish` fires the same hook before it is
|
|
27
|
-
* routed to the tracker, so the execution's usage — and the cost cap the
|
|
28
|
-
* runtime enforces over it — is the whole execution's spend. Until M2b the
|
|
29
|
-
* sub-agents' turns were discarded (S3 M2a finding F-M2a-12); the cost cap
|
|
30
|
-
* then lived inside the graph, where a middleware saw every model call.
|
|
31
|
-
*/
|
|
32
|
-
|
|
33
|
-
import { create, type JsonObject } from "@bufbuild/protobuf";
|
|
34
|
-
import type { AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
35
|
-
import {
|
|
36
|
-
AgentMessageSchema,
|
|
37
|
-
ToolCallSchema,
|
|
38
|
-
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
39
|
-
import type { AgentMessage, ToolCall } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
40
|
-
import type { ExecutionArtifact } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/artifact_pb";
|
|
41
|
-
import type { WorkspaceWriteBack } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/writeback_pb";
|
|
42
|
-
import {
|
|
43
|
-
MessageType,
|
|
44
|
-
ToolCallStatus,
|
|
45
|
-
ToolKind,
|
|
46
|
-
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
47
|
-
import { resolveApprovalMessage as resolveApprovalMsg } from "../../shared/approval-policy.js";
|
|
48
|
-
import { classifyTool } from "../../shared/tool-kind.js";
|
|
49
|
-
import { applyTodoUpdate } from "../../shared/todos.js";
|
|
50
|
-
import { ExecutionState } from "./execution-state.js";
|
|
51
|
-
import { utcTimestamp } from "../../shared/status.js";
|
|
52
|
-
import type { ExecutionStatusWriter } from "../../shared/execution-status-writer.js";
|
|
53
|
-
import type { StigmerRunEvent, V3UsagePayload } from "./v3-events.js";
|
|
54
|
-
import { namespaceDepth } from "./v3-events.js";
|
|
55
|
-
import {
|
|
56
|
-
extractToolResultV3,
|
|
57
|
-
sanitizeArgsPreview,
|
|
58
|
-
stampApprovalProvenance,
|
|
59
|
-
type ApprovalPolicyProvider,
|
|
60
|
-
} from "./status-builder-shared.js";
|
|
61
|
-
import { SubAgentTracker } from "./subagent-tracker.js";
|
|
62
|
-
|
|
63
|
-
export interface V3StatusBuilderOptions {
|
|
64
|
-
/**
|
|
65
|
-
* Fired once per `message_finish` that carries usage — the parent graph's
|
|
66
|
-
* and every sub-agent's — with the payload exactly as the protocol
|
|
67
|
-
* delivered it. The builder never sums or prices: the caller accounts (the
|
|
68
|
-
* turn runtime through `TurnSink.reportUsage`, priced at the turn's model;
|
|
69
|
-
* a sub-agent on its own model is priced at the parent's rate, as the
|
|
70
|
-
* in-graph cost cap always did — per-sub-agent pricing is an S5 item).
|
|
71
|
-
*/
|
|
72
|
-
readonly onUsage?: (usage: V3UsagePayload) => void;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
export class V3StatusBuilder implements ExecutionStatusWriter {
|
|
76
|
-
readonly executionId: string;
|
|
77
|
-
private readonly state: ExecutionState;
|
|
78
|
-
private _forceNextUpdate = false;
|
|
79
|
-
private _awaitingApproval = false;
|
|
80
|
-
private approvalProvider: ApprovalPolicyProvider | null = null;
|
|
81
|
-
private readonly onUsage: ((usage: V3UsagePayload) => void) | undefined;
|
|
82
|
-
private readonly subAgentTracker: SubAgentTracker;
|
|
83
|
-
|
|
84
|
-
/** Progressive tool call arg accumulation keyed by callId. */
|
|
85
|
-
private readonly toolArgBuffers = new Map<string, string>();
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Builds INTO `status`, by reference: its `messages` and
|
|
89
|
-
* `subAgentExecutions` arrays are the ones indexed and pushed into, never
|
|
90
|
-
* replaced, so a caller that wraps the same status (the write-back
|
|
91
|
-
* coordinator's writer, the runtime's chokepoint) keeps seeing every row.
|
|
92
|
-
*/
|
|
93
|
-
constructor(executionId: string, status: AgentExecutionStatus, options: V3StatusBuilderOptions = {}) {
|
|
94
|
-
this.executionId = executionId;
|
|
95
|
-
this.state = new ExecutionState(status);
|
|
96
|
-
this.onUsage = options.onUsage;
|
|
97
|
-
|
|
98
|
-
// Resume path: when constructed over a persisted transcript (seeded by the
|
|
99
|
-
// caller on a reinvocation), rebuild the tool-call index so resumed
|
|
100
|
-
// tool_started/tool_finished events reconcile to the existing calls
|
|
101
|
-
// instead of duplicating them. A first run carries no messages, so this
|
|
102
|
-
// is a no-op. The tracker does the same for the seeded sub-agent rows.
|
|
103
|
-
if (status.messages.length > 0) {
|
|
104
|
-
this.state.rebuildToolCallIndex();
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
this.subAgentTracker = new SubAgentTracker(status.subAgentExecutions);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
setApprovalProvider(provider: ApprovalPolicyProvider): void {
|
|
111
|
-
this.approvalProvider = provider;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
get currentStatus(): AgentExecutionStatus {
|
|
115
|
-
return this.state.proto;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* True once a tool call this turn was gated and left WAITING_APPROVAL: the
|
|
120
|
-
* engine has interrupted (or will, at this step's end) and the turn should
|
|
121
|
-
* end awaiting a decision. A fact about the transcript, not a phase — the
|
|
122
|
-
* caller owns the phase.
|
|
123
|
-
*/
|
|
124
|
-
get awaitingApproval(): boolean {
|
|
125
|
-
return this._awaitingApproval;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
get forceNextUpdate(): boolean {
|
|
129
|
-
return this._forceNextUpdate;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
clearForceFlag(): void {
|
|
133
|
-
this._forceNextUpdate = false;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
processEvent(event: StigmerRunEvent): void {
|
|
137
|
-
try {
|
|
138
|
-
// Sub-agent routing: detect "task" tool starts at depth 0 (root) or depth 1
|
|
139
|
-
// (inside LangGraph tools-node). In real runtime, task tool-started arrives
|
|
140
|
-
// at depth 1 with namespace like "tools:<pregelTaskUuid>".
|
|
141
|
-
if (event.kind === "tool_started" && event.name === "task" && namespaceDepth(event.namespace) <= 1) {
|
|
142
|
-
const routingPrefix = event.namespace || `tools:${event.callId}`;
|
|
143
|
-
this.subAgentTracker.onTaskToolStarted(event.callId, event.input, routingPrefix);
|
|
144
|
-
this.handleToolStarted(event.callId, event.name, event.input, event.namespace);
|
|
145
|
-
this._forceNextUpdate = true;
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
if (event.kind === "tool_finished" && this.isTrackedTaskTool(event.callId)) {
|
|
150
|
-
this.subAgentTracker.onTaskToolFinished(event.callId, event.output);
|
|
151
|
-
this.handleToolFinished(event.callId, event.output);
|
|
152
|
-
this._forceNextUpdate = true;
|
|
153
|
-
return;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
if (event.kind === "tool_error" && this.isTrackedTaskTool(event.callId)) {
|
|
157
|
-
this.subAgentTracker.onTaskToolError(event.callId, event.message);
|
|
158
|
-
this.handleToolError(event.callId, event.message);
|
|
159
|
-
this._forceNextUpdate = true;
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
if (this.subAgentTracker.isSubAgentNamespace(event.namespace)) {
|
|
164
|
-
// A sub-agent's spend is the execution's spend (Q-M2b-1): report it
|
|
165
|
-
// through the one hook before the tracker folds the message.
|
|
166
|
-
if (event.kind === "message_finish" && event.usage) this.onUsage?.(event.usage);
|
|
167
|
-
this.subAgentTracker.routeEvent(event);
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
// Parent event routing (unchanged for non-sub-agent events)
|
|
172
|
-
switch (event.kind) {
|
|
173
|
-
case "message_start":
|
|
174
|
-
this.handleMessageStart(event.runId, event.namespace);
|
|
175
|
-
break;
|
|
176
|
-
case "text_delta":
|
|
177
|
-
this.appendTextContent(event.runId, event.namespace, event.text);
|
|
178
|
-
break;
|
|
179
|
-
case "reasoning_delta":
|
|
180
|
-
this.appendThinkingContent(event.runId, event.namespace, event.text);
|
|
181
|
-
break;
|
|
182
|
-
case "tool_call_arg_delta":
|
|
183
|
-
this.handleToolCallArgDelta(event.callId, event.argsChunk);
|
|
184
|
-
break;
|
|
185
|
-
case "message_finish":
|
|
186
|
-
this.handleMessageFinish(event.runId, event.namespace, event.usage);
|
|
187
|
-
break;
|
|
188
|
-
case "tool_started":
|
|
189
|
-
this.handleToolStarted(event.callId, event.name, event.input, event.namespace);
|
|
190
|
-
break;
|
|
191
|
-
case "tool_finished":
|
|
192
|
-
this.handleToolFinished(event.callId, event.output);
|
|
193
|
-
break;
|
|
194
|
-
case "tool_error":
|
|
195
|
-
this.handleToolError(event.callId, event.message);
|
|
196
|
-
break;
|
|
197
|
-
case "tool_output_delta":
|
|
198
|
-
this.handleToolOutputDelta(event.callId, event.delta);
|
|
199
|
-
break;
|
|
200
|
-
case "usage":
|
|
201
|
-
case "lifecycle":
|
|
202
|
-
case "provider":
|
|
203
|
-
break;
|
|
204
|
-
}
|
|
205
|
-
} catch (err) {
|
|
206
|
-
console.error(
|
|
207
|
-
`[V3StatusBuilder] Event handler error: execution=${this.executionId} ` +
|
|
208
|
-
`kind=${event.kind} seq=${event.seq}: ${err}`,
|
|
209
|
-
);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
// ── Artifact & WriteBack ───────────────────────────────────────────
|
|
214
|
-
|
|
215
|
-
addArtifact(artifact: ExecutionArtifact): void {
|
|
216
|
-
const artifacts = this.state.proto.artifacts;
|
|
217
|
-
const idx = artifacts.findIndex(a => a.sandboxPath === artifact.sandboxPath);
|
|
218
|
-
|
|
219
|
-
if (idx >= 0) {
|
|
220
|
-
if (artifacts[idx].contentHash !== artifact.contentHash) {
|
|
221
|
-
artifacts[idx] = artifact;
|
|
222
|
-
this._forceNextUpdate = true;
|
|
223
|
-
}
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
artifacts.push(artifact);
|
|
228
|
-
this._forceNextUpdate = true;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
addWriteBack(wb: WorkspaceWriteBack): void {
|
|
232
|
-
const backs = this.state.proto.workspaceWriteBacks;
|
|
233
|
-
const idx = backs.findIndex(b => b.workspaceEntryName === wb.workspaceEntryName);
|
|
234
|
-
|
|
235
|
-
if (idx >= 0) {
|
|
236
|
-
backs[idx] = wb;
|
|
237
|
-
} else {
|
|
238
|
-
backs.push(wb);
|
|
239
|
-
}
|
|
240
|
-
this._forceNextUpdate = true;
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
// ── Message Handlers ───────────────────────────────────────────────
|
|
244
|
-
|
|
245
|
-
private handleMessageStart(runId: string, namespace: string): void {
|
|
246
|
-
// Record the runId for turn-boundary detection but do NOT create
|
|
247
|
-
// the AI message yet. The message is created lazily on the first
|
|
248
|
-
// text_delta, preserving the v2 ordering (THINKING before AI text
|
|
249
|
-
// when both appear in the same turn).
|
|
250
|
-
const lastRunId = this.state.lastLlmRunId.get(namespace);
|
|
251
|
-
if (lastRunId && lastRunId !== runId) {
|
|
252
|
-
const existingMsg = this.state.currentAiMessage.get(namespace);
|
|
253
|
-
if (existingMsg) {
|
|
254
|
-
existingMsg.isStreaming = false;
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
this.state.lastLlmRunId.set(namespace, runId);
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
private handleMessageFinish(runId: string, _namespace: string, usage?: V3UsagePayload): void {
|
|
261
|
-
const msg = this.state.messagesByRun.get(runId);
|
|
262
|
-
if (msg) {
|
|
263
|
-
msg.isStreaming = false;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
if (usage) {
|
|
267
|
-
this.onUsage?.(usage);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
private appendTextContent(runId: string, namespace: string, text: string): void {
|
|
272
|
-
const msg = this.ensureAiMessage(runId, namespace, MessageType.MESSAGE_AI);
|
|
273
|
-
msg.content += text;
|
|
274
|
-
msg.isStreaming = true;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
private appendThinkingContent(runId: string, namespace: string, text: string): void {
|
|
278
|
-
const thinkingKey = `thinking:${namespace}`;
|
|
279
|
-
const existingMsg = this.state.messagesByRun.get(thinkingKey);
|
|
280
|
-
if (existingMsg && existingMsg.type === MessageType.MESSAGE_THINKING) {
|
|
281
|
-
existingMsg.content += text;
|
|
282
|
-
existingMsg.isStreaming = true;
|
|
283
|
-
return;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
const msg = create(AgentMessageSchema, {
|
|
287
|
-
type: MessageType.MESSAGE_THINKING,
|
|
288
|
-
content: text,
|
|
289
|
-
timestamp: utcTimestamp(),
|
|
290
|
-
isStreaming: true,
|
|
291
|
-
});
|
|
292
|
-
this.state.proto.messages.push(msg);
|
|
293
|
-
this.state.messagesByRun.set(thinkingKey, msg);
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
// ── Tool Handlers ──────────────────────────────────────────────────
|
|
297
|
-
|
|
298
|
-
private handleToolStarted(
|
|
299
|
-
callId: string,
|
|
300
|
-
name: string,
|
|
301
|
-
input: Record<string, unknown>,
|
|
302
|
-
namespace: string,
|
|
303
|
-
): void {
|
|
304
|
-
// Resume reconciliation: the gated tool call already exists, seeded from the
|
|
305
|
-
// persisted transcript of a prior invocation (the runtime's
|
|
306
|
-
// `seedFromPersistedStatus`, `harness/turn-context.ts`). The durable
|
|
307
|
-
// checkpoint re-emits tool_started now that approval
|
|
308
|
-
// is granted — flip the existing call to RUNNING in place rather than
|
|
309
|
-
// appending a duplicate or re-triggering the approval gate. v3 keys by
|
|
310
|
-
// tool_call_id, so this is an exact match (no name heuristics needed).
|
|
311
|
-
const existing = this.state.toolCalls.get(callId);
|
|
312
|
-
if (existing) {
|
|
313
|
-
if (existing.status === ToolCallStatus.TOOL_CALL_WAITING_APPROVAL) {
|
|
314
|
-
existing.status = ToolCallStatus.TOOL_CALL_RUNNING;
|
|
315
|
-
}
|
|
316
|
-
if (Object.keys(input).length > 0 && !existing.args) {
|
|
317
|
-
existing.args = input as JsonObject;
|
|
318
|
-
}
|
|
319
|
-
this._forceNextUpdate = true;
|
|
320
|
-
return;
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
const agentNs = this.resolveAgentNamespace(namespace);
|
|
324
|
-
const parentMsg = this.state.currentAiMessage.get(agentNs)
|
|
325
|
-
?? this.ensureAiMessageForToolCall(agentNs);
|
|
326
|
-
if (!parentMsg) return;
|
|
327
|
-
|
|
328
|
-
const approvalReq = this.checkApprovalRequirement(name, input);
|
|
329
|
-
|
|
330
|
-
const tc = create(ToolCallSchema, {
|
|
331
|
-
id: callId,
|
|
332
|
-
name,
|
|
333
|
-
status: approvalReq.requiresApproval
|
|
334
|
-
? ToolCallStatus.TOOL_CALL_WAITING_APPROVAL
|
|
335
|
-
: ToolCallStatus.TOOL_CALL_RUNNING,
|
|
336
|
-
startedAt: utcTimestamp(),
|
|
337
|
-
});
|
|
338
|
-
|
|
339
|
-
if (Object.keys(input).length > 0) {
|
|
340
|
-
tc.args = input as JsonObject;
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
if (approvalReq.serverSlug) {
|
|
344
|
-
tc.mcpServerSlug = approvalReq.serverSlug;
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
// Classify after mcpServerSlug is set so MCP tools resolve correctly.
|
|
348
|
-
tc.toolKind = classifyTool(tc.name, tc.mcpServerSlug);
|
|
349
|
-
|
|
350
|
-
// Stamp authorization provenance in the same spot as tool_kind, for every
|
|
351
|
-
// observed tool call (gated or auto-approved). A gated call is re-seeded on
|
|
352
|
-
// reinvocation (the runtime's wide seed) with the same source carried
|
|
353
|
-
// through the interrupt.
|
|
354
|
-
stampApprovalProvenance(tc, this.approvalProvider);
|
|
355
|
-
|
|
356
|
-
if (approvalReq.requiresApproval) {
|
|
357
|
-
tc.requiresApproval = true;
|
|
358
|
-
tc.approvalMessage = approvalReq.message;
|
|
359
|
-
tc.approvalRequestedAt = utcTimestamp();
|
|
360
|
-
|
|
361
|
-
const argsPreview = sanitizeArgsPreview(input);
|
|
362
|
-
if (argsPreview) {
|
|
363
|
-
tc.argsPreview = argsPreview;
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
this._awaitingApproval = true;
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
parentMsg.toolCalls.push(tc);
|
|
370
|
-
this.state.toolCalls.set(callId, tc);
|
|
371
|
-
|
|
372
|
-
this._forceNextUpdate = true;
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
private handleToolFinished(callId: string, output: unknown): void {
|
|
376
|
-
const tc = this.state.toolCalls.get(callId);
|
|
377
|
-
if (!tc) return;
|
|
378
|
-
|
|
379
|
-
// Store the faithful result; bounding the gRPC payload is owned solely by
|
|
380
|
-
// the persist chokepoint (offload + enforce in status.ts/status-offload.ts).
|
|
381
|
-
// Truncating here would corrupt binary content (e.g. a screenshot's base64)
|
|
382
|
-
// before offload can lift it into a renderable ToolCallOutputRef.
|
|
383
|
-
tc.status = ToolCallStatus.TOOL_CALL_COMPLETED;
|
|
384
|
-
tc.result = extractToolResultV3(output);
|
|
385
|
-
tc.completedAt = utcTimestamp();
|
|
386
|
-
tc.isStreaming = false;
|
|
387
|
-
this.toolArgBuffers.delete(callId);
|
|
388
|
-
|
|
389
|
-
// Project a completed to-do write into status.todos. deepagents' write_todos
|
|
390
|
-
// runs its state-mutating Command when the tool node COMPLETES, so we mirror
|
|
391
|
-
// it here (not at tool-start) — a call cancelled before finishing correctly
|
|
392
|
-
// projects nothing. Keyed on the harness-agnostic ToolKind.TODO (stamped at
|
|
393
|
-
// tool-start) and fed by the same shared mapper the Cursor tracker uses;
|
|
394
|
-
// deepagents always full-replaces (no merge field). The tool call itself
|
|
395
|
-
// stays in messages (the client filters ToolKind.TODO from the thread).
|
|
396
|
-
if (tc.toolKind === ToolKind.TODO) {
|
|
397
|
-
applyTodoUpdate(this.state.proto.todos, tc.args?.todos, { merge: false });
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
this._forceNextUpdate = true;
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
private handleToolError(callId: string, message: string): void {
|
|
404
|
-
const tc = this.state.toolCalls.get(callId);
|
|
405
|
-
if (!tc) return;
|
|
406
|
-
|
|
407
|
-
tc.status = ToolCallStatus.TOOL_CALL_FAILED;
|
|
408
|
-
tc.error = message;
|
|
409
|
-
tc.completedAt = utcTimestamp();
|
|
410
|
-
tc.isStreaming = false;
|
|
411
|
-
this.toolArgBuffers.delete(callId);
|
|
412
|
-
|
|
413
|
-
this._forceNextUpdate = true;
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
private handleToolCallArgDelta(callId: string, argsChunk: string): void {
|
|
417
|
-
const tc = this.state.toolCalls.get(callId);
|
|
418
|
-
if (!tc) return;
|
|
419
|
-
|
|
420
|
-
const buffer = (this.toolArgBuffers.get(callId) ?? "") + argsChunk;
|
|
421
|
-
this.toolArgBuffers.set(callId, buffer);
|
|
422
|
-
|
|
423
|
-
try {
|
|
424
|
-
tc.args = JSON.parse(buffer) as JsonObject;
|
|
425
|
-
} catch {
|
|
426
|
-
// Partial JSON — will parse on next chunk or tool-finished
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
private handleToolOutputDelta(callId: string, delta: string): void {
|
|
431
|
-
const tc = this.state.toolCalls.get(callId);
|
|
432
|
-
if (!tc) return;
|
|
433
|
-
tc.result = (tc.result ?? "") + delta;
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
// ── Namespace Resolution ────────────────────────────────────────
|
|
437
|
-
|
|
438
|
-
/**
|
|
439
|
-
* v3 tool events carry namespace like "tools:toolu_abc" or
|
|
440
|
-
* "subagent:worker-1|tools:toolu_abc". Strip tools:* segments
|
|
441
|
-
* to get the agent namespace for AI message lookup.
|
|
442
|
-
*/
|
|
443
|
-
private resolveAgentNamespace(ns: string): string {
|
|
444
|
-
if (!ns) return "";
|
|
445
|
-
const parts = ns.split("|").filter(p => !p.startsWith("tools:"));
|
|
446
|
-
return parts.join("|");
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
// ── Approval ──────────────────────────────────────────────────────
|
|
450
|
-
|
|
451
|
-
private checkApprovalRequirement(
|
|
452
|
-
toolName: string,
|
|
453
|
-
args: Record<string, unknown>,
|
|
454
|
-
): { requiresApproval: boolean; message: string; serverSlug: string } {
|
|
455
|
-
if (!this.approvalProvider) {
|
|
456
|
-
return { requiresApproval: false, message: "", serverSlug: "" };
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
const serverSlug = this.approvalProvider.toolServerMap.get(toolName) ?? "";
|
|
460
|
-
|
|
461
|
-
if (this.approvalProvider.globalBypass) {
|
|
462
|
-
return { requiresApproval: false, message: "", serverSlug };
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
// Unattended mode: the gate auto-skips instead of interrupting, so no row
|
|
466
|
-
// is ever WAITING_APPROVAL and the phase never flips — the streamed row
|
|
467
|
-
// runs to its skip result and reconcileUnattendedSkips terminalizes it.
|
|
468
|
-
if (this.approvalProvider.unattended) {
|
|
469
|
-
return { requiresApproval: false, message: "", serverSlug };
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
if (serverSlug) {
|
|
473
|
-
const key = `${serverSlug}/${toolName}`;
|
|
474
|
-
const policy = this.approvalProvider.policies.get(key);
|
|
475
|
-
if (policy?.requiresApproval) {
|
|
476
|
-
return {
|
|
477
|
-
requiresApproval: true,
|
|
478
|
-
message: resolveApprovalMsg(policy.approvalMessage, toolName, args),
|
|
479
|
-
serverSlug,
|
|
480
|
-
};
|
|
481
|
-
}
|
|
482
|
-
return { requiresApproval: false, message: "", serverSlug };
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
return { requiresApproval: false, message: "", serverSlug: "" };
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
// ── Content Helpers ───────────────────────────────────────────────
|
|
489
|
-
|
|
490
|
-
private ensureAiMessage(
|
|
491
|
-
runId: string,
|
|
492
|
-
namespace: string,
|
|
493
|
-
type: MessageType,
|
|
494
|
-
): AgentMessage {
|
|
495
|
-
const existingByRun = this.state.messagesByRun.get(runId);
|
|
496
|
-
if (existingByRun) return existingByRun;
|
|
497
|
-
|
|
498
|
-
const lastRunId = this.state.lastLlmRunId.get(namespace);
|
|
499
|
-
if (lastRunId && lastRunId !== runId) {
|
|
500
|
-
const existingMsg = this.state.currentAiMessage.get(namespace);
|
|
501
|
-
if (existingMsg) {
|
|
502
|
-
existingMsg.isStreaming = false;
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
const msg = create(AgentMessageSchema, {
|
|
507
|
-
type,
|
|
508
|
-
content: "",
|
|
509
|
-
timestamp: utcTimestamp(),
|
|
510
|
-
isStreaming: true,
|
|
511
|
-
});
|
|
512
|
-
|
|
513
|
-
this.state.proto.messages.push(msg);
|
|
514
|
-
this.state.messagesByRun.set(runId, msg);
|
|
515
|
-
this.state.currentAiMessage.set(namespace, msg);
|
|
516
|
-
this.state.lastLlmRunId.set(namespace, runId);
|
|
517
|
-
|
|
518
|
-
return msg;
|
|
519
|
-
}
|
|
520
|
-
|
|
521
|
-
private ensureAiMessageForToolCall(namespace: string): AgentMessage | null {
|
|
522
|
-
const lastRunId = this.state.lastLlmRunId.get(namespace);
|
|
523
|
-
if (lastRunId) {
|
|
524
|
-
const existing = this.state.messagesByRun.get(lastRunId);
|
|
525
|
-
if (existing) {
|
|
526
|
-
this.state.currentAiMessage.set(namespace, existing);
|
|
527
|
-
return existing;
|
|
528
|
-
}
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
const msg = create(AgentMessageSchema, {
|
|
532
|
-
type: MessageType.MESSAGE_AI,
|
|
533
|
-
content: "",
|
|
534
|
-
timestamp: utcTimestamp(),
|
|
535
|
-
isStreaming: false,
|
|
536
|
-
});
|
|
537
|
-
|
|
538
|
-
this.state.proto.messages.push(msg);
|
|
539
|
-
this.state.currentAiMessage.set(namespace, msg);
|
|
540
|
-
|
|
541
|
-
return msg;
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
// ── Sub-Agent Integration ──────────────────────────────────────────
|
|
545
|
-
|
|
546
|
-
/**
|
|
547
|
-
* Check if a tool_call_id belongs to a tracked "task" tool invocation.
|
|
548
|
-
* Used to route tool_finished/tool_error events to both parent and tracker.
|
|
549
|
-
*/
|
|
550
|
-
private isTrackedTaskTool(callId: string): boolean {
|
|
551
|
-
const tc = this.state.toolCalls.get(callId);
|
|
552
|
-
return tc?.name === "task";
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
/**
|
|
556
|
-
* Clear the streaming flag on every sub-agent message still marked as
|
|
557
|
-
* streaming — what a turn that stopped mid-delegation owes the transcript
|
|
558
|
-
* beside the CANCELLED status the caller stamps on the row itself
|
|
559
|
-
* (`shared/subagent-rows.ts` `cancelInProgressSubAgentProtos`, the one
|
|
560
|
-
* home of that transition for every harness).
|
|
561
|
-
*/
|
|
562
|
-
finalizeSubAgentStreaming(): void {
|
|
563
|
-
this.subAgentTracker.finalizeAllStreaming();
|
|
564
|
-
}
|
|
565
|
-
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared interface for proto mutation consumed by side-effect classes
|
|
3
|
-
* (InlinePublisher, WriteBackCoordinator) and streaming loops.
|
|
4
|
-
*
|
|
5
|
-
* The deep-agent harness implements it on its `V3StatusBuilder`; the Cursor
|
|
6
|
-
* harness — which mutates a bare status proto with no builder — uses
|
|
7
|
-
* {@link statusProtoWriter}. Side-effect classes depend only on this
|
|
8
|
-
* interface, never on a specific implementation.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import type { AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
12
|
-
import type { ExecutionArtifact } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/artifact_pb";
|
|
13
|
-
import type { WorkspaceWriteBack } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/writeback_pb";
|
|
14
|
-
|
|
15
|
-
export interface ExecutionStatusWriter {
|
|
16
|
-
readonly currentStatus: AgentExecutionStatus;
|
|
17
|
-
readonly forceNextUpdate: boolean;
|
|
18
|
-
clearForceFlag(): void;
|
|
19
|
-
addArtifact(artifact: ExecutionArtifact): void;
|
|
20
|
-
addWriteBack(wb: WorkspaceWriteBack): void;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* An {@link ExecutionStatusWriter} over a bare status proto, for harnesses
|
|
25
|
-
* that mutate the status directly instead of through a builder (the Cursor
|
|
26
|
-
* harness). Mutations apply synchronously to the given proto; the caller's
|
|
27
|
-
* own persist points pick them up — the force flag is a streaming-loop
|
|
28
|
-
* concern the direct-mutation style has no use for, so it stays `false`.
|
|
29
|
-
*
|
|
30
|
-
* Write-backs upsert by `workspaceEntryName` — the same contract as the
|
|
31
|
-
* deep-agent `V3StatusBuilder.addWriteBack`: each git-backed workspace entry
|
|
32
|
-
* carries at most one record, progressing through phases.
|
|
33
|
-
*/
|
|
34
|
-
export function statusProtoWriter(status: AgentExecutionStatus): ExecutionStatusWriter {
|
|
35
|
-
return {
|
|
36
|
-
get currentStatus() {
|
|
37
|
-
return status;
|
|
38
|
-
},
|
|
39
|
-
forceNextUpdate: false,
|
|
40
|
-
clearForceFlag() {},
|
|
41
|
-
addArtifact(artifact: ExecutionArtifact) {
|
|
42
|
-
status.artifacts.push(artifact);
|
|
43
|
-
},
|
|
44
|
-
addWriteBack(wb: WorkspaceWriteBack) {
|
|
45
|
-
const backs = status.workspaceWriteBacks;
|
|
46
|
-
const idx = backs.findIndex(
|
|
47
|
-
(b) => b.workspaceEntryName === wb.workspaceEntryName,
|
|
48
|
-
);
|
|
49
|
-
if (idx >= 0) {
|
|
50
|
-
backs[idx] = wb;
|
|
51
|
-
} else {
|
|
52
|
-
backs.push(wb);
|
|
53
|
-
}
|
|
54
|
-
},
|
|
55
|
-
};
|
|
56
|
-
}
|