@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
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* (`harness/run-turn.ts`) — in capture mode on the APPROVED tree after the
|
|
19
19
|
* review decisions reconcile, so speculative mid-turn edits never reach
|
|
20
20
|
* GitHub; on a non-capture git turn on whatever the turn left in the tree.
|
|
21
|
-
* Until
|
|
21
|
+
* Until #1096 an incremental path also existed — `onFileModified`,
|
|
22
22
|
* a commit-and-push per file-modifying tool call on non-capture turns — and
|
|
23
23
|
* was reachable in no supported posture (every git workspace with artifact
|
|
24
24
|
* storage is a capture workspace, `shared/filereview/capture.ts`
|
|
@@ -29,18 +29,29 @@
|
|
|
29
29
|
*/
|
|
30
30
|
|
|
31
31
|
import { create } from "@bufbuild/protobuf";
|
|
32
|
-
import {
|
|
33
|
-
WorkspaceWriteBackSchema,
|
|
34
|
-
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/writeback_pb";
|
|
35
32
|
import {
|
|
36
33
|
WorkspaceWriteBackPhase,
|
|
34
|
+
WorkspaceWriteBackSchema,
|
|
35
|
+
type WorkspaceWriteBack,
|
|
37
36
|
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/writeback_pb";
|
|
38
37
|
import { GitWriteBackMode } from "@stigmer/protos/ai/stigmer/agentic/session/v1/enum_pb";
|
|
39
38
|
import type { WorkspaceEntry } from "@stigmer/protos/ai/stigmer/agentic/session/v1/workspace_pb";
|
|
40
39
|
import type { WorkspaceBackend, ProvisionResult } from "./types.js";
|
|
41
|
-
import { SourceType } from "./types.js";
|
|
42
40
|
import { gitCommitAsAgent } from "./git-identity.js";
|
|
43
|
-
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Where a write-back record is registered: the one member of the turn's
|
|
44
|
+
* transcript builder this coordinator needs (`harness/transcript/builder.ts`
|
|
45
|
+
* `addWriteBack`, which owns the upsert-by-entry rule — each git-backed
|
|
46
|
+
* workspace entry carries at most one record, progressing through phases).
|
|
47
|
+
* Declared here as the narrow view this consumer needs, never the whole
|
|
48
|
+
* builder, so `shared/` keeps importing nothing from `harness/` (the
|
|
49
|
+
* `SessionProvisionConfig` rule: a shared helper is handed a narrowed view,
|
|
50
|
+
* never the other way round).
|
|
51
|
+
*/
|
|
52
|
+
export interface WriteBackSink {
|
|
53
|
+
addWriteBack(wb: WorkspaceWriteBack): void;
|
|
54
|
+
}
|
|
44
55
|
|
|
45
56
|
const WRITE_BACK_ENABLED_MODES = new Set([
|
|
46
57
|
GitWriteBackMode.GIT_WRITE_BACK_MODE_UNSPECIFIED,
|
|
@@ -68,7 +79,7 @@ interface EligibleEntry {
|
|
|
68
79
|
}
|
|
69
80
|
|
|
70
81
|
export class WriteBackCoordinator {
|
|
71
|
-
private readonly
|
|
82
|
+
private readonly writeBacks: WriteBackSink;
|
|
72
83
|
private readonly executionId: string;
|
|
73
84
|
private readonly workspaceBackend: WorkspaceBackend;
|
|
74
85
|
private readonly branchName: string;
|
|
@@ -85,7 +96,7 @@ export class WriteBackCoordinator {
|
|
|
85
96
|
private readonly state = new Map<string, EntryState>();
|
|
86
97
|
|
|
87
98
|
constructor(opts: {
|
|
88
|
-
|
|
99
|
+
writeBacks: WriteBackSink;
|
|
89
100
|
executionId: string;
|
|
90
101
|
/** The owning session's id — the branch/PR are session-scoped. */
|
|
91
102
|
sessionId: string;
|
|
@@ -94,7 +105,7 @@ export class WriteBackCoordinator {
|
|
|
94
105
|
workspaceEntries: readonly WorkspaceEntry[];
|
|
95
106
|
workspaceBackend: WorkspaceBackend;
|
|
96
107
|
}) {
|
|
97
|
-
this.
|
|
108
|
+
this.writeBacks = opts.writeBacks;
|
|
98
109
|
this.executionId = opts.executionId;
|
|
99
110
|
this.workspaceBackend = opts.workspaceBackend;
|
|
100
111
|
this.githubToken = opts.githubToken;
|
|
@@ -143,7 +154,7 @@ export class WriteBackCoordinator {
|
|
|
143
154
|
}
|
|
144
155
|
|
|
145
156
|
for (const pr of provisionResults) {
|
|
146
|
-
if (pr.sourceType !==
|
|
157
|
+
if (pr.sourceType !== "git_repo") continue;
|
|
147
158
|
if (!pr.gitMetadata) continue;
|
|
148
159
|
if (!pr.gitMetadata.gitCredentialsConfigured) continue;
|
|
149
160
|
|
|
@@ -222,7 +233,7 @@ export class WriteBackCoordinator {
|
|
|
222
233
|
wb.pullRequestUrl = entryState.prUrl;
|
|
223
234
|
wb.pullRequestNumber = entryState.prNumber;
|
|
224
235
|
}
|
|
225
|
-
this.
|
|
236
|
+
this.writeBacks.addWriteBack(wb);
|
|
226
237
|
return;
|
|
227
238
|
}
|
|
228
239
|
|
|
@@ -466,7 +477,7 @@ export class WriteBackCoordinator {
|
|
|
466
477
|
error: prError,
|
|
467
478
|
});
|
|
468
479
|
|
|
469
|
-
this.
|
|
480
|
+
this.writeBacks.addWriteBack(wb);
|
|
470
481
|
}
|
|
471
482
|
|
|
472
483
|
}
|
package/src/worker.ts
CHANGED
|
@@ -18,7 +18,12 @@ import { createRequire } from "node:module";
|
|
|
18
18
|
import { NativeConnection, Worker, type ActivityInterceptorsFactory, type InjectedSinks } from "@temporalio/worker";
|
|
19
19
|
import type { PayloadCodec } from "@temporalio/common";
|
|
20
20
|
import type { Config } from "./config.js";
|
|
21
|
-
import {
|
|
21
|
+
import {
|
|
22
|
+
resolveWorkflowSource,
|
|
23
|
+
runCredentialWorkflowInterceptorModule,
|
|
24
|
+
OTEL_WORKFLOW_INTERCEPTOR_MODULE,
|
|
25
|
+
} from "./workflow-source.js";
|
|
26
|
+
import { runCredentialActivityInterceptor } from "./interceptors/run-credential-activity.js";
|
|
22
27
|
|
|
23
28
|
export interface WorkerActivities {
|
|
24
29
|
[key: string]: (...args: any[]) => Promise<unknown>;
|
|
@@ -42,9 +47,16 @@ export async function startWorker(opts: StartWorkerOptions): Promise<Worker> {
|
|
|
42
47
|
|
|
43
48
|
const workflowSource = resolveWorkflowSource();
|
|
44
49
|
|
|
45
|
-
|
|
50
|
+
// The run credential's two ends (shared/run-credential.ts): the workflow
|
|
51
|
+
// side lifts a run's credential onto every activity it schedules, the
|
|
52
|
+
// activity side enters it for the client to present. Always on; inert
|
|
53
|
+
// without a credential. Workflow-side modules must live INSIDE the
|
|
54
|
+
// workflow bundle — a pre-built bundle has it baked in
|
|
55
|
+
// (scripts/bundle-slim.mjs); only the runtime path registers it here.
|
|
56
|
+
const activityInterceptors: ActivityInterceptorsFactory[] = [runCredentialActivityInterceptor];
|
|
46
57
|
let sinks: InjectedSinks<any> = { ...createWorkflowMetricsSinks() };
|
|
47
|
-
const workflowInterceptorModules: string[] =
|
|
58
|
+
const workflowInterceptorModules: string[] =
|
|
59
|
+
workflowSource.kind === "runtime" ? [runCredentialWorkflowInterceptorModule()] : [];
|
|
48
60
|
|
|
49
61
|
if (process.env.OTEL_EXPORTER_OTLP_ENDPOINT) {
|
|
50
62
|
const {
|
package/src/workflow-source.ts
CHANGED
|
@@ -44,6 +44,21 @@ export type WorkflowSource =
|
|
|
44
44
|
export const OTEL_WORKFLOW_INTERCEPTOR_MODULE =
|
|
45
45
|
"@temporalio/interceptors-opentelemetry/lib/workflow-interceptors";
|
|
46
46
|
|
|
47
|
+
/**
|
|
48
|
+
* Path of the runner's own workflow interceptor — the one that carries a
|
|
49
|
+
* run's credential from the workflow input to every activity it schedules
|
|
50
|
+
* (`workflows/interceptors/run-credential.ts`). Always registered, unlike
|
|
51
|
+
* the OTel module: it is inert without a credential and load-bearing with
|
|
52
|
+
* one. Resolved beside this module so the tsc dist and the slim artifact
|
|
53
|
+
* both find their own compiled copy; the build script names the source
|
|
54
|
+
* file itself.
|
|
55
|
+
*/
|
|
56
|
+
export function runCredentialWorkflowInterceptorModule(): string {
|
|
57
|
+
return fileURLToPath(
|
|
58
|
+
new URL("./workflows/interceptors/run-credential.js", import.meta.url),
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
47
62
|
export function resolveWorkflowSource(): WorkflowSource {
|
|
48
63
|
const explicit = process.env.STIGMER_WORKFLOW_BUNDLE;
|
|
49
64
|
if (explicit) {
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The workflow side of the run credential (`interceptors/run-credential.ts`):
|
|
3
|
+
* the stamp on both activity kinds, the gate by workflow type, the
|
|
4
|
+
* credential-less pass-through, and the fence that every gated type is a
|
|
5
|
+
* real export alias of the workflow barrel.
|
|
6
|
+
*
|
|
7
|
+
* `workflowInfo()` is the only sandbox API the interceptor reads; it is
|
|
8
|
+
* replaced here so the factory can run outside an isolate. Everything else
|
|
9
|
+
* from `@temporalio/workflow` is the real module, imported once for the
|
|
10
|
+
* barrel fence.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
14
|
+
import { defaultPayloadConverter } from "@temporalio/common";
|
|
15
|
+
import type {
|
|
16
|
+
ActivityInput,
|
|
17
|
+
LocalActivityInput,
|
|
18
|
+
WorkflowExecuteInput,
|
|
19
|
+
} from "@temporalio/workflow";
|
|
20
|
+
|
|
21
|
+
let workflowType = "";
|
|
22
|
+
|
|
23
|
+
vi.mock("@temporalio/workflow", async (importOriginal) => {
|
|
24
|
+
const original =
|
|
25
|
+
await importOriginal<typeof import("@temporalio/workflow")>();
|
|
26
|
+
return { ...original, workflowInfo: () => ({ workflowType }) };
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
import {
|
|
30
|
+
RUN_WORKFLOW_TYPES,
|
|
31
|
+
interceptors,
|
|
32
|
+
} from "../interceptors/run-credential.js";
|
|
33
|
+
import { EXECUTE_FROM_EXECUTION_WORKFLOW_TYPE } from "../execute-from-execution.js";
|
|
34
|
+
import {
|
|
35
|
+
RUN_CREDENTIAL_HEADER,
|
|
36
|
+
RUN_CREDENTIAL_INPUT_KEY,
|
|
37
|
+
} from "../../shared/run-credential.js";
|
|
38
|
+
import * as barrel from "../index.js";
|
|
39
|
+
|
|
40
|
+
/** Drive one workflow run through the factory: its inbound execute, then one schedule of each kind. */
|
|
41
|
+
async function run(type: string, workflowArg: unknown) {
|
|
42
|
+
workflowType = type;
|
|
43
|
+
const { inbound, outbound } = interceptors();
|
|
44
|
+
const executeInput: WorkflowExecuteInput = {
|
|
45
|
+
args: [workflowArg],
|
|
46
|
+
headers: {},
|
|
47
|
+
};
|
|
48
|
+
await inbound![0]!.execute!(executeInput, async () => undefined);
|
|
49
|
+
|
|
50
|
+
const seen: { activity?: ActivityInput; local?: LocalActivityInput } = {};
|
|
51
|
+
const activityInput = {
|
|
52
|
+
activityType: "EmitWorkflowEvents",
|
|
53
|
+
args: ["wex_1"],
|
|
54
|
+
headers: {},
|
|
55
|
+
options: {},
|
|
56
|
+
seq: 1,
|
|
57
|
+
} as unknown as ActivityInput;
|
|
58
|
+
const localInput = {
|
|
59
|
+
activityType: "PromoteTaskOutput",
|
|
60
|
+
args: ["out", "wex_1"],
|
|
61
|
+
headers: {},
|
|
62
|
+
options: {},
|
|
63
|
+
seq: 2,
|
|
64
|
+
} as unknown as LocalActivityInput;
|
|
65
|
+
await outbound![0]!.scheduleActivity!(activityInput, async (input) => {
|
|
66
|
+
seen.activity = input;
|
|
67
|
+
return undefined;
|
|
68
|
+
});
|
|
69
|
+
await outbound![0]!.scheduleLocalActivity!(localInput, async (input) => {
|
|
70
|
+
seen.local = input;
|
|
71
|
+
return undefined;
|
|
72
|
+
});
|
|
73
|
+
return seen;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function credentialIn(headers: ActivityInput["headers"] | undefined): unknown {
|
|
77
|
+
const payload = headers?.[RUN_CREDENTIAL_HEADER];
|
|
78
|
+
return payload === undefined
|
|
79
|
+
? undefined
|
|
80
|
+
: defaultPayloadConverter.fromPayload(payload);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
describe("run-credential workflow interceptors", () => {
|
|
84
|
+
beforeEach(() => {
|
|
85
|
+
workflowType = "";
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it("stamps the run workflow's credential onto a remote activity and a local activity alike", async () => {
|
|
89
|
+
const seen = await run(EXECUTE_FROM_EXECUTION_WORKFLOW_TYPE, {
|
|
90
|
+
execution_id: "wex_1",
|
|
91
|
+
[RUN_CREDENTIAL_INPUT_KEY]: "cred-run",
|
|
92
|
+
});
|
|
93
|
+
expect(credentialIn(seen.activity?.headers)).toBe("cred-run");
|
|
94
|
+
expect(credentialIn(seen.local?.headers)).toBe("cred-run");
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it("keeps the other headers a schedule already carries", async () => {
|
|
98
|
+
workflowType = EXECUTE_FROM_EXECUTION_WORKFLOW_TYPE;
|
|
99
|
+
const { inbound, outbound } = interceptors();
|
|
100
|
+
await inbound![0]!.execute!(
|
|
101
|
+
{ args: [{ [RUN_CREDENTIAL_INPUT_KEY]: "cred-run" }], headers: {} },
|
|
102
|
+
async () => undefined,
|
|
103
|
+
);
|
|
104
|
+
const other = defaultPayloadConverter.toPayload("trace");
|
|
105
|
+
let stamped: ActivityInput | undefined;
|
|
106
|
+
await outbound![0]!.scheduleActivity!(
|
|
107
|
+
{
|
|
108
|
+
activityType: "X",
|
|
109
|
+
args: [],
|
|
110
|
+
headers: { "_tracer-data": other },
|
|
111
|
+
options: {},
|
|
112
|
+
seq: 1,
|
|
113
|
+
} as unknown as ActivityInput,
|
|
114
|
+
async (input) => {
|
|
115
|
+
stamped = input;
|
|
116
|
+
return undefined;
|
|
117
|
+
},
|
|
118
|
+
);
|
|
119
|
+
expect(stamped?.headers["_tracer-data"]).toBe(other);
|
|
120
|
+
expect(credentialIn(stamped?.headers)).toBe("cred-run");
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it("stamps nothing when the run workflow's input carries no credential — an older server's dispatch replays byte for byte", async () => {
|
|
124
|
+
const seen = await run(EXECUTE_FROM_EXECUTION_WORKFLOW_TYPE, {
|
|
125
|
+
execution_id: "wex_1",
|
|
126
|
+
});
|
|
127
|
+
expect(seen.activity?.headers).toEqual({});
|
|
128
|
+
expect(seen.local?.headers).toEqual({});
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it("stamps nothing for the connect workflow even though its input carries the same key — that token is not a run credential", async () => {
|
|
132
|
+
const seen = await run("stigmer/mcp-server/connect", {
|
|
133
|
+
mcp_server_id: "mcp_1",
|
|
134
|
+
[RUN_CREDENTIAL_INPUT_KEY]: "connect-token",
|
|
135
|
+
});
|
|
136
|
+
expect(seen.activity?.headers).toEqual({});
|
|
137
|
+
expect(seen.local?.headers).toEqual({});
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it("keeps each workflow run's credential on its own factory instance", async () => {
|
|
141
|
+
workflowType = EXECUTE_FROM_EXECUTION_WORKFLOW_TYPE;
|
|
142
|
+
const first = interceptors();
|
|
143
|
+
const second = interceptors();
|
|
144
|
+
await first.inbound![0]!.execute!(
|
|
145
|
+
{ args: [{ [RUN_CREDENTIAL_INPUT_KEY]: "cred-1" }], headers: {} },
|
|
146
|
+
async () => undefined,
|
|
147
|
+
);
|
|
148
|
+
await second.inbound![0]!.execute!(
|
|
149
|
+
{ args: [{ execution_id: "wex_2" }], headers: {} },
|
|
150
|
+
async () => undefined,
|
|
151
|
+
);
|
|
152
|
+
let fromSecond: ActivityInput | undefined;
|
|
153
|
+
await second.outbound![0]!.scheduleActivity!(
|
|
154
|
+
{
|
|
155
|
+
activityType: "X",
|
|
156
|
+
args: [],
|
|
157
|
+
headers: {},
|
|
158
|
+
options: {},
|
|
159
|
+
seq: 1,
|
|
160
|
+
} as unknown as ActivityInput,
|
|
161
|
+
async (input) => {
|
|
162
|
+
fromSecond = input;
|
|
163
|
+
return undefined;
|
|
164
|
+
},
|
|
165
|
+
);
|
|
166
|
+
expect(fromSecond?.headers).toEqual({});
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it("gates on workflow types that are export aliases of the barrel — the list cannot name a type that does not exist", () => {
|
|
170
|
+
expect(RUN_WORKFLOW_TYPES).toEqual([EXECUTE_FROM_EXECUTION_WORKFLOW_TYPE]);
|
|
171
|
+
for (const type of RUN_WORKFLOW_TYPES) {
|
|
172
|
+
expect(
|
|
173
|
+
Object.keys(barrel),
|
|
174
|
+
`"${type}" must be exported by workflows/index.ts`,
|
|
175
|
+
).toContain(type);
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
});
|
|
@@ -47,6 +47,16 @@ const hydrateProxy = proxyActivities<HydrateActivities>({
|
|
|
47
47
|
// Workflow Input Type (Temporal wire contract with Java/Go orchestrators)
|
|
48
48
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
49
49
|
|
|
50
|
+
/**
|
|
51
|
+
* The Temporal workflow type this function is exported as in `index.ts` — the
|
|
52
|
+
* server's `CHILD_WORKFLOW_TYPE`, byte-pinned on both sides. Named here so
|
|
53
|
+
* the run-credential interceptor can gate on it without a second literal; a
|
|
54
|
+
* test pins it to the barrel's export alias (an ES2022 export alias must be a
|
|
55
|
+
* literal, so the barrel cannot import this).
|
|
56
|
+
*/
|
|
57
|
+
export const EXECUTE_FROM_EXECUTION_WORKFLOW_TYPE =
|
|
58
|
+
"stigmer/workflow/execute-from-execution";
|
|
59
|
+
|
|
50
60
|
export interface ExecuteFromExecutionInput {
|
|
51
61
|
execution_id: string;
|
|
52
62
|
workflow_instance_id: string;
|
|
@@ -55,6 +65,13 @@ export interface ExecuteFromExecutionInput {
|
|
|
55
65
|
callback_token?: Uint8Array | null;
|
|
56
66
|
invoker_identity_account_id?: string;
|
|
57
67
|
recovery_mode?: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* The run credential the server minted for this execution at dispatch —
|
|
70
|
+
* absent from an older server's dispatch. This workflow never reads it: the
|
|
71
|
+
* interceptor in `interceptors/run-credential.ts` lifts it onto every
|
|
72
|
+
* activity this workflow schedules, as a header (`shared/run-credential.ts`).
|
|
73
|
+
*/
|
|
74
|
+
execution_context_token?: string;
|
|
58
75
|
}
|
|
59
76
|
|
|
60
77
|
// ─────────────────────────────────────────────────────────────────────────────
|
package/src/workflows/index.ts
CHANGED
|
@@ -13,9 +13,11 @@
|
|
|
13
13
|
* us map TypeScript function names to the slash-delimited Temporal
|
|
14
14
|
* workflow type names that the backend expects.
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
16
|
+
* Workflow interceptors are registered at bundle time — not imported
|
|
17
|
+
* here: the runner's own run-credential interceptor
|
|
18
|
+
* (./interceptors/run-credential.ts, always) and OTel's (when the host
|
|
19
|
+
* configures the sink). Pre-built bundles (scripts/bundle-slim.mjs) bake
|
|
20
|
+
* them in; the runtime-bundling fallback passes them to the bundler (see
|
|
19
21
|
* src/workflow-source.ts).
|
|
20
22
|
*/
|
|
21
23
|
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow-side interceptors that carry a run's credential from the workflow
|
|
3
|
+
* input to every activity the workflow schedules — as a Temporal activity
|
|
4
|
+
* header, the SDK's channel for context that crosses the isolate boundary
|
|
5
|
+
* without being anybody's argument (`shared/run-credential.ts` has the
|
|
6
|
+
* whole story; `interceptors/run-credential-activity.ts` is the other end).
|
|
7
|
+
*
|
|
8
|
+
* Gated by WORKFLOW TYPE, not by input shape. The connect workflow's input
|
|
9
|
+
* carries the same key for a different token — a clocked decrypt-lane token
|
|
10
|
+
* bound to a synthetic id that no verifier admits as a run — and stamping it
|
|
11
|
+
* onto that lane's activities would present it where it does not belong.
|
|
12
|
+
* The gate is the positive list below: the workflow types whose input
|
|
13
|
+
* carries a RUN credential. One entry today; a test pins each entry to an
|
|
14
|
+
* export of `workflows/index.ts`, so the list cannot name a type that does
|
|
15
|
+
* not exist.
|
|
16
|
+
*
|
|
17
|
+
* Per-run state lives on this factory's closure: the SDK instantiates the
|
|
18
|
+
* factory once per workflow run, which is the documented contract. The
|
|
19
|
+
* header is a pure function of the input, so replay recomputes exactly what
|
|
20
|
+
* was recorded, and a credential-less input stamps nothing — an in-flight
|
|
21
|
+
* run from before the credential existed replays byte for byte.
|
|
22
|
+
*
|
|
23
|
+
* TEMPORAL SANDBOX: this file is bundled into the workflow isolate. No Node
|
|
24
|
+
* built-ins. It is baked into the pre-built bundle by
|
|
25
|
+
* `scripts/bundle-slim.mjs` and passed to the runtime bundler by both worker
|
|
26
|
+
* roots (`src/workflow-source.ts` names it beside the OTel module).
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import { workflowInfo } from "@temporalio/workflow";
|
|
30
|
+
import type {
|
|
31
|
+
ActivityInput,
|
|
32
|
+
LocalActivityInput,
|
|
33
|
+
Next,
|
|
34
|
+
WorkflowExecuteInput,
|
|
35
|
+
WorkflowInboundCallsInterceptor,
|
|
36
|
+
WorkflowInterceptorsFactory,
|
|
37
|
+
WorkflowOutboundCallsInterceptor,
|
|
38
|
+
} from "@temporalio/workflow";
|
|
39
|
+
import { defaultPayloadConverter } from "@temporalio/common";
|
|
40
|
+
|
|
41
|
+
import {
|
|
42
|
+
RUN_CREDENTIAL_HEADER,
|
|
43
|
+
readRunCredentialFromInput,
|
|
44
|
+
} from "../../shared/run-credential.js";
|
|
45
|
+
import { EXECUTE_FROM_EXECUTION_WORKFLOW_TYPE } from "../execute-from-execution.js";
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* The workflow types whose input carries a run credential. Byte-pinned wire
|
|
49
|
+
* names; each must be an export alias of `workflows/index.ts`.
|
|
50
|
+
*/
|
|
51
|
+
export const RUN_WORKFLOW_TYPES: readonly string[] = [
|
|
52
|
+
EXECUTE_FROM_EXECUTION_WORKFLOW_TYPE,
|
|
53
|
+
];
|
|
54
|
+
|
|
55
|
+
export const interceptors: WorkflowInterceptorsFactory = () => {
|
|
56
|
+
let credential: string | undefined;
|
|
57
|
+
|
|
58
|
+
const inbound: WorkflowInboundCallsInterceptor = {
|
|
59
|
+
async execute(
|
|
60
|
+
input: WorkflowExecuteInput,
|
|
61
|
+
next: Next<WorkflowInboundCallsInterceptor, "execute">,
|
|
62
|
+
) {
|
|
63
|
+
if (RUN_WORKFLOW_TYPES.includes(workflowInfo().workflowType)) {
|
|
64
|
+
credential = readRunCredentialFromInput(input.args[0]);
|
|
65
|
+
}
|
|
66
|
+
return next(input);
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const outbound: WorkflowOutboundCallsInterceptor = {
|
|
71
|
+
async scheduleActivity(
|
|
72
|
+
input: ActivityInput,
|
|
73
|
+
next: Next<WorkflowOutboundCallsInterceptor, "scheduleActivity">,
|
|
74
|
+
) {
|
|
75
|
+
return next(stamped(input));
|
|
76
|
+
},
|
|
77
|
+
async scheduleLocalActivity(
|
|
78
|
+
input: LocalActivityInput,
|
|
79
|
+
next: Next<WorkflowOutboundCallsInterceptor, "scheduleLocalActivity">,
|
|
80
|
+
) {
|
|
81
|
+
return next(stamped(input));
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
function stamped<T extends { readonly headers: ActivityInput["headers"] }>(
|
|
86
|
+
input: T,
|
|
87
|
+
): T {
|
|
88
|
+
if (credential === undefined) {
|
|
89
|
+
return input;
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
...input,
|
|
93
|
+
headers: {
|
|
94
|
+
...input.headers,
|
|
95
|
+
[RUN_CREDENTIAL_HEADER]: defaultPayloadConverter.toPayload(credential),
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return { inbound: [inbound], outbound: [outbound] };
|
|
101
|
+
};
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DeltaEnricher processes Cursor SDK InteractionUpdate events to provide
|
|
3
|
-
* real-time enrichments that the stream channel alone cannot deliver.
|
|
4
|
-
*
|
|
5
|
-
* The Cursor SDK provides two concurrent event channels:
|
|
6
|
-
* - run.stream() (SDKMessage) — coarse-grained, post-hoc events
|
|
7
|
-
* - onDelta (InteractionUpdate) — fine-grained, real-time deltas
|
|
8
|
-
*
|
|
9
|
-
* The stream channel remains the source of truth for message construction.
|
|
10
|
-
* The delta channel provides supplementary real-time signals:
|
|
11
|
-
* - shell-output-delta: live stdout/stderr from running shell commands
|
|
12
|
-
* - tool-call-started/completed: precise lifecycle timestamps
|
|
13
|
-
* - thinking-completed: accurate thinking duration from the SDK
|
|
14
|
-
*
|
|
15
|
-
* Concurrency model: Node.js is single-threaded. The onDelta callback fires
|
|
16
|
-
* between iterations of the for-await stream loop (during event loop yields).
|
|
17
|
-
* The enricher buffers data internally; the stream loop calls
|
|
18
|
-
* applyEnrichments() on each iteration to flush buffered state onto the
|
|
19
|
-
* message array. No locks needed — access is always sequential.
|
|
20
|
-
*
|
|
21
|
-
* Design invariant: The enricher never creates messages or tool calls.
|
|
22
|
-
* It only mutates existing ones that the MessageAccumulator has created.
|
|
23
|
-
* If a delta arrives before its corresponding stream event (e.g.,
|
|
24
|
-
* shell-output-delta before tool_call running), the data is buffered
|
|
25
|
-
* and applied retroactively on the next applyEnrichments() call that
|
|
26
|
-
* finds the matching ToolCall.
|
|
27
|
-
*/
|
|
28
|
-
import type { AgentMessage } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
29
|
-
import type { InteractionUpdate } from "@cursor/sdk";
|
|
30
|
-
export declare class DeltaEnricher {
|
|
31
|
-
private shellOutputByCallId;
|
|
32
|
-
private timingByCallId;
|
|
33
|
-
private thinkingDurationMs;
|
|
34
|
-
private _isDirty;
|
|
35
|
-
private lastPersistTime;
|
|
36
|
-
private lastShellCallId;
|
|
37
|
-
/**
|
|
38
|
-
* Minimum interval between persist-triggering dirty flags (milliseconds).
|
|
39
|
-
* Prevents excessive backend writes during rapid shell output bursts.
|
|
40
|
-
* Matches the Python agent-runner's update_scheduler interval.
|
|
41
|
-
*/
|
|
42
|
-
static readonly PERSIST_DEBOUNCE_MS = 500;
|
|
43
|
-
/**
|
|
44
|
-
* Process a single InteractionUpdate from the onDelta callback.
|
|
45
|
-
* Buffers enrichment data for later application by applyEnrichments().
|
|
46
|
-
*
|
|
47
|
-
* Called from the onDelta callback (between stream loop iterations).
|
|
48
|
-
*/
|
|
49
|
-
processDelta(update: InteractionUpdate): void;
|
|
50
|
-
/**
|
|
51
|
-
* Apply all buffered enrichments to the current message array.
|
|
52
|
-
* Called from the stream loop after each processEvent() iteration.
|
|
53
|
-
*
|
|
54
|
-
* Returns true if any enrichments were applied (messages were mutated).
|
|
55
|
-
*/
|
|
56
|
-
applyEnrichments(messages: AgentMessage[]): boolean;
|
|
57
|
-
/**
|
|
58
|
-
* Whether the enricher has pending data that warrants an immediate persist.
|
|
59
|
-
* Only returns true when meaningful UI-visible data has arrived AND the
|
|
60
|
-
* debounce interval has elapsed since the last persist.
|
|
61
|
-
*/
|
|
62
|
-
get isDirty(): boolean;
|
|
63
|
-
/**
|
|
64
|
-
* Acknowledge that a persist has occurred. Resets the dirty flag and
|
|
65
|
-
* records the persist timestamp for debounce calculations.
|
|
66
|
-
*/
|
|
67
|
-
markPersisted(): void;
|
|
68
|
-
/**
|
|
69
|
-
* Finalize streaming state and reconcile tool call statuses.
|
|
70
|
-
*
|
|
71
|
-
* Called after the stream loop ends (alongside accumulator.finalize()).
|
|
72
|
-
* Two passes:
|
|
73
|
-
* 1. Clear `isStreaming` on all tool calls (existing behavior).
|
|
74
|
-
* 2. Reconciliation sweep: any tool call still RUNNING with evidence
|
|
75
|
-
* of completion (completedAt set or result non-empty) is promoted
|
|
76
|
-
* to COMPLETED. This is the catch-all safety net — when the stream
|
|
77
|
-
* ends, no tool call should remain in a non-terminal status.
|
|
78
|
-
*/
|
|
79
|
-
finalize(messages: AgentMessage[]): void;
|
|
80
|
-
private handleShellOutputDelta;
|
|
81
|
-
private handleToolCallStarted;
|
|
82
|
-
private handleToolCallCompleted;
|
|
83
|
-
private getOrCreateTiming;
|
|
84
|
-
private applyShellOutput;
|
|
85
|
-
private applyTiming;
|
|
86
|
-
private applyThinkingDuration;
|
|
87
|
-
}
|