@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
package/dist/worker.js
CHANGED
|
@@ -15,7 +15,8 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { createRequire } from "node:module";
|
|
17
17
|
import { NativeConnection, Worker } from "@temporalio/worker";
|
|
18
|
-
import { resolveWorkflowSource, OTEL_WORKFLOW_INTERCEPTOR_MODULE } from "./workflow-source.js";
|
|
18
|
+
import { resolveWorkflowSource, runCredentialWorkflowInterceptorModule, OTEL_WORKFLOW_INTERCEPTOR_MODULE, } from "./workflow-source.js";
|
|
19
|
+
import { runCredentialActivityInterceptor } from "./interceptors/run-credential-activity.js";
|
|
19
20
|
export async function startWorker(opts) {
|
|
20
21
|
const { config, activities, payloadCodecs } = opts;
|
|
21
22
|
const connection = await NativeConnection.connect({
|
|
@@ -23,9 +24,15 @@ export async function startWorker(opts) {
|
|
|
23
24
|
});
|
|
24
25
|
const { createWorkflowMetricsSinks } = await import("./interceptors/workflow-metrics-sink.js");
|
|
25
26
|
const workflowSource = resolveWorkflowSource();
|
|
26
|
-
|
|
27
|
+
// The run credential's two ends (shared/run-credential.ts): the workflow
|
|
28
|
+
// side lifts a run's credential onto every activity it schedules, the
|
|
29
|
+
// activity side enters it for the client to present. Always on; inert
|
|
30
|
+
// without a credential. Workflow-side modules must live INSIDE the
|
|
31
|
+
// workflow bundle — a pre-built bundle has it baked in
|
|
32
|
+
// (scripts/bundle-slim.mjs); only the runtime path registers it here.
|
|
33
|
+
const activityInterceptors = [runCredentialActivityInterceptor];
|
|
27
34
|
let sinks = { ...createWorkflowMetricsSinks() };
|
|
28
|
-
const workflowInterceptorModules = [];
|
|
35
|
+
const workflowInterceptorModules = workflowSource.kind === "runtime" ? [runCredentialWorkflowInterceptorModule()] : [];
|
|
29
36
|
if (process.env.OTEL_EXPORTER_OTLP_ENDPOINT) {
|
|
30
37
|
const { OpenTelemetryActivityInboundInterceptor, makeWorkflowExporter, } = await import("@temporalio/interceptors-opentelemetry");
|
|
31
38
|
const { OTLPTraceExporter } = await import("@opentelemetry/exporter-trace-otlp-grpc");
|
package/dist/worker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAwD,MAAM,oBAAoB,CAAC;AAGpH,OAAO,
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAwD,MAAM,oBAAoB,CAAC;AAGpH,OAAO,EACL,qBAAqB,EACrB,sCAAsC,EACtC,gCAAgC,GACjC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gCAAgC,EAAE,MAAM,2CAA2C,CAAC;AAa7F,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAwB;IACxD,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAEnD,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC;QAChD,OAAO,EAAE,MAAM,CAAC,eAAe;KAChC,CAAC,CAAC;IAEH,MAAM,EAAE,0BAA0B,EAAE,GAAG,MAAM,MAAM,CAAC,yCAAyC,CAAC,CAAC;IAE/F,MAAM,cAAc,GAAG,qBAAqB,EAAE,CAAC;IAE/C,yEAAyE;IACzE,sEAAsE;IACtE,sEAAsE;IACtE,mEAAmE;IACnE,uDAAuD;IACvD,sEAAsE;IACtE,MAAM,oBAAoB,GAAkC,CAAC,gCAAgC,CAAC,CAAC;IAC/F,IAAI,KAAK,GAAuB,EAAE,GAAG,0BAA0B,EAAE,EAAE,CAAC;IACpE,MAAM,0BAA0B,GAC9B,cAAc,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,sCAAsC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEtF,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,CAAC;QAC5C,MAAM,EACJ,uCAAuC,EACvC,oBAAoB,GACrB,GAAG,MAAM,MAAM,CAAC,wCAAwC,CAAC,CAAC;QAC3D,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,yCAAyC,CAAC,CAAC;QACtF,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;QAE5E,oBAAoB,CAAC,IAAI,CACvB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,uCAAuC,CAAC,GAAG,CAAC,EAAE,CAAC,CACzE,CAAC;QAEF,MAAM,QAAQ,GAAG,sBAAsB,CAAC,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAC9E,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC;YACrC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B;SAC7C,CAAC,CAAC;QACH,iEAAiE;QACjE,mEAAmE;QACnE,mEAAmE;QACnE,MAAM,SAAS,GAAG,oBAAoB,CAAC,QAAe,EAAE,QAAe,CAAkC,CAAC;QAC1G,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,SAAS,EAAE,CAAC;QAEnC,0EAA0E;QAC1E,sEAAsE;QACtE,6CAA6C;QAC7C,IAAI,cAAc,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClD,0BAA0B,CAAC,IAAI,CAC7B,UAAU,CAAC,OAAO,CAAC,gCAAgC,CAAC,CACrD,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;IACnF,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;QACjC,UAAU;QACV,SAAS,EAAE,MAAM,CAAC,iBAAiB;QACnC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,UAAU;QACV,GAAG,CAAC,cAAc,CAAC,IAAI,KAAK,UAAU;YACpC,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE,EAAE;YAC3D,CAAC,CAAC,EAAE,aAAa,EAAE,cAAc,CAAC,aAAa,EAAE,CAAC;QACpD,mCAAmC,EAAE,MAAM,CAAC,uBAAuB;QACnE,aAAa,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS;QACpE,KAAK;QACL,YAAY,EAAE;YACZ,GAAG,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9E,GAAG,CAAC,0BAA0B,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,0BAA0B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClG;KACF,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -35,4 +35,14 @@ export type WorkflowSource = {
|
|
|
35
35
|
* with the workflow bundle.
|
|
36
36
|
*/
|
|
37
37
|
export declare const OTEL_WORKFLOW_INTERCEPTOR_MODULE = "@temporalio/interceptors-opentelemetry/lib/workflow-interceptors";
|
|
38
|
+
/**
|
|
39
|
+
* Path of the runner's own workflow interceptor — the one that carries a
|
|
40
|
+
* run's credential from the workflow input to every activity it schedules
|
|
41
|
+
* (`workflows/interceptors/run-credential.ts`). Always registered, unlike
|
|
42
|
+
* the OTel module: it is inert without a credential and load-bearing with
|
|
43
|
+
* one. Resolved beside this module so the tsc dist and the slim artifact
|
|
44
|
+
* both find their own compiled copy; the build script names the source
|
|
45
|
+
* file itself.
|
|
46
|
+
*/
|
|
47
|
+
export declare function runCredentialWorkflowInterceptorModule(): string;
|
|
38
48
|
export declare function resolveWorkflowSource(): WorkflowSource;
|
package/dist/workflow-source.js
CHANGED
|
@@ -28,6 +28,18 @@ import { fileURLToPath } from "node:url";
|
|
|
28
28
|
* with the workflow bundle.
|
|
29
29
|
*/
|
|
30
30
|
export const OTEL_WORKFLOW_INTERCEPTOR_MODULE = "@temporalio/interceptors-opentelemetry/lib/workflow-interceptors";
|
|
31
|
+
/**
|
|
32
|
+
* Path of the runner's own workflow interceptor — the one that carries a
|
|
33
|
+
* run's credential from the workflow input to every activity it schedules
|
|
34
|
+
* (`workflows/interceptors/run-credential.ts`). Always registered, unlike
|
|
35
|
+
* the OTel module: it is inert without a credential and load-bearing with
|
|
36
|
+
* one. Resolved beside this module so the tsc dist and the slim artifact
|
|
37
|
+
* both find their own compiled copy; the build script names the source
|
|
38
|
+
* file itself.
|
|
39
|
+
*/
|
|
40
|
+
export function runCredentialWorkflowInterceptorModule() {
|
|
41
|
+
return fileURLToPath(new URL("./workflows/interceptors/run-credential.js", import.meta.url));
|
|
42
|
+
}
|
|
31
43
|
export function resolveWorkflowSource() {
|
|
32
44
|
const explicit = process.env.STIGMER_WORKFLOW_BUNDLE;
|
|
33
45
|
if (explicit) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-source.js","sourceRoot":"","sources":["../src/workflow-source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAczC;;;;GAIG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAC3C,kEAAkE,CAAC;AAErE,MAAM,UAAU,qBAAqB;IACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;IACrD,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,0DAA0D,QAAQ,EAAE,CACrE,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAClD,CAAC;IAED,2EAA2E;IAC3E,yEAAyE;IACzE,0EAA0E;IAC1E,4EAA4E;IAC5E,gEAAgE;IAChE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjE,IAAI,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACvC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;IAChE,CAAC;IAED,OAAO;QACL,IAAI,EAAE,SAAS;QACf,aAAa,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KAC/E,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"workflow-source.js","sourceRoot":"","sources":["../src/workflow-source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAczC;;;;GAIG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAC3C,kEAAkE,CAAC;AAErE;;;;;;;;GAQG;AACH,MAAM,UAAU,sCAAsC;IACpD,OAAO,aAAa,CAClB,IAAI,GAAG,CAAC,4CAA4C,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CACvE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;IACrD,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,0DAA0D,QAAQ,EAAE,CACrE,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAClD,CAAC;IAED,2EAA2E;IAC3E,yEAAyE;IACzE,0EAA0E;IAC1E,4EAA4E;IAC5E,gEAAgE;IAChE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjE,IAAI,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACvC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;IAChE,CAAC;IAED,OAAO;QACL,IAAI,EAAE,SAAS;QACf,aAAa,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KAC/E,CAAC;AACJ,CAAC"}
|
|
@@ -20,6 +20,14 @@
|
|
|
20
20
|
* SANDBOX RULES: This file runs inside the Temporal deterministic V8
|
|
21
21
|
* isolate. No Node.js built-ins, no non-deterministic operations.
|
|
22
22
|
*/
|
|
23
|
+
/**
|
|
24
|
+
* The Temporal workflow type this function is exported as in `index.ts` — the
|
|
25
|
+
* server's `CHILD_WORKFLOW_TYPE`, byte-pinned on both sides. Named here so
|
|
26
|
+
* the run-credential interceptor can gate on it without a second literal; a
|
|
27
|
+
* test pins it to the barrel's export alias (an ES2022 export alias must be a
|
|
28
|
+
* literal, so the barrel cannot import this).
|
|
29
|
+
*/
|
|
30
|
+
export declare const EXECUTE_FROM_EXECUTION_WORKFLOW_TYPE = "stigmer/workflow/execute-from-execution";
|
|
23
31
|
export interface ExecuteFromExecutionInput {
|
|
24
32
|
execution_id: string;
|
|
25
33
|
workflow_instance_id: string;
|
|
@@ -28,5 +36,12 @@ export interface ExecuteFromExecutionInput {
|
|
|
28
36
|
callback_token?: Uint8Array | null;
|
|
29
37
|
invoker_identity_account_id?: string;
|
|
30
38
|
recovery_mode?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* The run credential the server minted for this execution at dispatch —
|
|
41
|
+
* absent from an older server's dispatch. This workflow never reads it: the
|
|
42
|
+
* interceptor in `interceptors/run-credential.ts` lifts it onto every
|
|
43
|
+
* activity this workflow schedules, as a header (`shared/run-credential.ts`).
|
|
44
|
+
*/
|
|
45
|
+
execution_context_token?: string;
|
|
31
46
|
}
|
|
32
47
|
export declare function executeFromExecution(input: ExecuteFromExecutionInput): Promise<void>;
|
|
@@ -33,6 +33,17 @@ const hydrateProxy = proxyActivities({
|
|
|
33
33
|
},
|
|
34
34
|
});
|
|
35
35
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
36
|
+
// Workflow Input Type (Temporal wire contract with Java/Go orchestrators)
|
|
37
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
38
|
+
/**
|
|
39
|
+
* The Temporal workflow type this function is exported as in `index.ts` — the
|
|
40
|
+
* server's `CHILD_WORKFLOW_TYPE`, byte-pinned on both sides. Named here so
|
|
41
|
+
* the run-credential interceptor can gate on it without a second literal; a
|
|
42
|
+
* test pins it to the barrel's export alias (an ES2022 export alias must be a
|
|
43
|
+
* literal, so the barrel cannot import this).
|
|
44
|
+
*/
|
|
45
|
+
export const EXECUTE_FROM_EXECUTION_WORKFLOW_TYPE = "stigmer/workflow/execute-from-execution";
|
|
46
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
36
47
|
// Workflow Function
|
|
37
48
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
38
49
|
export async function executeFromExecution(input) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute-from-execution.js","sourceRoot":"","sources":["../../src/workflows/execute-from-execution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAUjE,MAAM,YAAY,GAAG,eAAe,CAAoB;IACtD,mBAAmB,EAAE,IAAI;IACzB,KAAK,EAAE;QACL,eAAe,EAAE,CAAC;QAClB,eAAe,EAAE,IAAI;QACrB,kBAAkB,EAAE,CAAC;QACrB,eAAe,EAAE,KAAK;KACvB;CACF,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"execute-from-execution.js","sourceRoot":"","sources":["../../src/workflows/execute-from-execution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAUjE,MAAM,YAAY,GAAG,eAAe,CAAoB;IACtD,mBAAmB,EAAE,IAAI;IACzB,KAAK,EAAE;QACL,eAAe,EAAE,CAAC;QAClB,eAAe,EAAE,IAAI;QACrB,kBAAkB,EAAE,CAAC;QACrB,eAAe,EAAE,KAAK;KACvB;CACF,CAAC,CAAC;AAEH,gFAAgF;AAChF,0EAA0E;AAC1E,gFAAgF;AAEhF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAC/C,yCAAyC,CAAC;AAmB5C,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAAgC;IAEhC,MAAM,EAAE,UAAU,EAAE,GAAG,wBAAwB,EAAE,CAAC;IAElD,GAAG,CAAC,IAAI,CAAC,4CAA4C,EAAE;QACrD,WAAW,EAAE,KAAK,CAAC,YAAY;QAC/B,UAAU,EAAE,KAAK,CAAC,WAAW;QAC7B,kBAAkB,EAAE,KAAK,CAAC,oBAAoB;QAC9C,KAAK,EAAE,KAAK,CAAC,MAAM;KACpB,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,wBAAwB,CAAC;QAC/D,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,oBAAoB,EAAE,KAAK,CAAC,oBAAoB;QAChD,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,qCAAqC,EAAE;QAC9C,YAAY,EAAE,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI;QAC9C,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM;KAC/C,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,sEAAsE;QACtE,qEAAqE;QACrE,mEAAmE;QACnE,sEAAsE;QACtE,sEAAsE;QACtE,wEAAwE;QACxE,wEAAwE;QACxE,iEAAiE;QACjE,oEAAoE;QACpE,iEAAiE;QACjE,MAAM,iBAAiB,CAAC,YAAY,EAAE;YACpC,UAAU;YACV,YAAY,EAAE,KAAK,CAAC,aAAa,IAAI,KAAK;SAC3C,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,GAAG,CAAC,IAAI,CAAC,8CAA8C,EAAE;gBACvD,WAAW,EAAE,KAAK,CAAC,YAAY;aAChC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -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
|
export { connectMcpServer as "stigmer/mcp-server/connect", discoverMcpServerLegacy as "stigmer/mcp-server/discover", } from "./connect-mcp-server.js";
|
package/dist/workflows/index.js
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
|
export { connectMcpServer as "stigmer/mcp-server/connect", discoverMcpServerLegacy as "stigmer/mcp-server/discover", } from "./connect-mcp-server.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workflows/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workflows/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EACL,gBAAgB,IAAI,4BAA4B,EAChD,uBAAuB,IAAI,6BAA6B,GACzD,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,yBAAyB,IAAI,0BAA0B,GACxD,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,oBAAoB,IAAI,yCAAyC,GAClE,MAAM,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
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
|
+
import type { WorkflowInterceptorsFactory } from "@temporalio/workflow";
|
|
29
|
+
/**
|
|
30
|
+
* The workflow types whose input carries a run credential. Byte-pinned wire
|
|
31
|
+
* names; each must be an export alias of `workflows/index.ts`.
|
|
32
|
+
*/
|
|
33
|
+
export declare const RUN_WORKFLOW_TYPES: readonly string[];
|
|
34
|
+
export declare const interceptors: WorkflowInterceptorsFactory;
|
|
@@ -0,0 +1,71 @@
|
|
|
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
|
+
import { workflowInfo } from "@temporalio/workflow";
|
|
29
|
+
import { defaultPayloadConverter } from "@temporalio/common";
|
|
30
|
+
import { RUN_CREDENTIAL_HEADER, readRunCredentialFromInput, } from "../../shared/run-credential.js";
|
|
31
|
+
import { EXECUTE_FROM_EXECUTION_WORKFLOW_TYPE } from "../execute-from-execution.js";
|
|
32
|
+
/**
|
|
33
|
+
* The workflow types whose input carries a run credential. Byte-pinned wire
|
|
34
|
+
* names; each must be an export alias of `workflows/index.ts`.
|
|
35
|
+
*/
|
|
36
|
+
export const RUN_WORKFLOW_TYPES = [
|
|
37
|
+
EXECUTE_FROM_EXECUTION_WORKFLOW_TYPE,
|
|
38
|
+
];
|
|
39
|
+
export const interceptors = () => {
|
|
40
|
+
let credential;
|
|
41
|
+
const inbound = {
|
|
42
|
+
async execute(input, next) {
|
|
43
|
+
if (RUN_WORKFLOW_TYPES.includes(workflowInfo().workflowType)) {
|
|
44
|
+
credential = readRunCredentialFromInput(input.args[0]);
|
|
45
|
+
}
|
|
46
|
+
return next(input);
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
const outbound = {
|
|
50
|
+
async scheduleActivity(input, next) {
|
|
51
|
+
return next(stamped(input));
|
|
52
|
+
},
|
|
53
|
+
async scheduleLocalActivity(input, next) {
|
|
54
|
+
return next(stamped(input));
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
function stamped(input) {
|
|
58
|
+
if (credential === undefined) {
|
|
59
|
+
return input;
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
...input,
|
|
63
|
+
headers: {
|
|
64
|
+
...input.headers,
|
|
65
|
+
[RUN_CREDENTIAL_HEADER]: defaultPayloadConverter.toPayload(credential),
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
return { inbound: [inbound], outbound: [outbound] };
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=run-credential.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-credential.js","sourceRoot":"","sources":["../../../src/workflows/interceptors/run-credential.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAUpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EACL,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,oCAAoC,EAAE,MAAM,8BAA8B,CAAC;AAEpF;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAsB;IACnD,oCAAoC;CACrC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAgC,GAAG,EAAE;IAC5D,IAAI,UAA8B,CAAC;IAEnC,MAAM,OAAO,GAAoC;QAC/C,KAAK,CAAC,OAAO,CACX,KAA2B,EAC3B,IAAsD;YAEtD,IAAI,kBAAkB,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC7D,UAAU,GAAG,0BAA0B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;KACF,CAAC;IAEF,MAAM,QAAQ,GAAqC;QACjD,KAAK,CAAC,gBAAgB,CACpB,KAAoB,EACpB,IAAgE;YAEhE,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9B,CAAC;QACD,KAAK,CAAC,qBAAqB,CACzB,KAAyB,EACzB,IAAqE;YAErE,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9B,CAAC;KACF,CAAC;IAEF,SAAS,OAAO,CACd,KAAQ;QAER,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO;YACL,GAAG,KAAK;YACR,OAAO,EAAE;gBACP,GAAG,KAAK,CAAC,OAAO;gBAChB,CAAC,qBAAqB,CAAC,EAAE,uBAAuB,CAAC,SAAS,CAAC,UAAU,CAAC;aACvE;SACF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;AACtD,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stigmer/runner",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.16.0",
|
|
4
4
|
"description": "Embeddable Temporal worker for the Stigmer AI agent platform — handles agent execution, workflow orchestration, and MCP server management",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -104,9 +104,9 @@
|
|
|
104
104
|
"@opentelemetry/sdk-metrics": "^2.0.0",
|
|
105
105
|
"@opentelemetry/sdk-trace-base": "^2.0.0",
|
|
106
106
|
"@opentelemetry/sdk-trace-node": "^2.0.0",
|
|
107
|
-
"@stigmer/protos": "3.
|
|
108
|
-
"@stigmer/temporal-codecs": "3.
|
|
109
|
-
"@stigmer/zip-structure": "3.
|
|
107
|
+
"@stigmer/protos": "3.16.0",
|
|
108
|
+
"@stigmer/temporal-codecs": "3.16.0",
|
|
109
|
+
"@stigmer/zip-structure": "3.16.0",
|
|
110
110
|
"@temporalio/activity": "1.16.2",
|
|
111
111
|
"@temporalio/common": "1.16.2",
|
|
112
112
|
"@temporalio/interceptors-opentelemetry": "1.16.2",
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ExecutionRecord.whenToolCallsSettled` — the barrier the hermetic scripted
|
|
3
|
+
* model waits on before it ticks (since #1097): resolves once every named row is
|
|
4
|
+
* persisted settled, across the root and the sub-agent transcripts; resolves
|
|
5
|
+
* at once when there is nothing to wait for; fails naming the open ids rather
|
|
6
|
+
* than hanging when no persist ever carries them.
|
|
7
|
+
*/
|
|
8
|
+
import { describe, expect, it } from "vitest";
|
|
9
|
+
import { create } from "@bufbuild/protobuf";
|
|
10
|
+
import { AgentExecutionStatusSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
11
|
+
import { ExecutionPhase, MessageType, ToolCallStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
12
|
+
import { deepAgentExecutionRecord } from "../../activities/execute-deep-agent/__test-utils__/hermetic-deep-agent.js";
|
|
13
|
+
|
|
14
|
+
function statusWith(rows: Array<{ id: string; status: ToolCallStatus; subAgent?: boolean }>) {
|
|
15
|
+
const message = (ids: typeof rows) => ({
|
|
16
|
+
type: MessageType.MESSAGE_AI,
|
|
17
|
+
content: "",
|
|
18
|
+
toolCalls: ids.map((r) => ({ id: r.id, name: "probe", status: r.status })),
|
|
19
|
+
});
|
|
20
|
+
return create(AgentExecutionStatusSchema, {
|
|
21
|
+
phase: ExecutionPhase.EXECUTION_IN_PROGRESS,
|
|
22
|
+
messages: [message(rows.filter((r) => !r.subAgent))],
|
|
23
|
+
subAgentExecutions: rows.some((r) => r.subAgent)
|
|
24
|
+
? [{ id: "task-1", name: "helper", messages: [message(rows.filter((r) => r.subAgent))] }]
|
|
25
|
+
: [],
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
describe("ExecutionRecord.whenToolCallsSettled", () => {
|
|
30
|
+
it("resolves at once for no ids, and for ids already persisted settled", async () => {
|
|
31
|
+
const record = deepAgentExecutionRecord({ message: "go" });
|
|
32
|
+
await expect(record.whenToolCallsSettled([])).resolves.toBeUndefined();
|
|
33
|
+
|
|
34
|
+
record.applyStatusUpdate(statusWith([{ id: "c-1", status: ToolCallStatus.TOOL_CALL_COMPLETED }]));
|
|
35
|
+
await expect(record.whenToolCallsSettled(["c-1"])).resolves.toBeUndefined();
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it("waits through a RUNNING persist and releases on the persist that settles the row", async () => {
|
|
39
|
+
const record = deepAgentExecutionRecord({ message: "go" });
|
|
40
|
+
let released = false;
|
|
41
|
+
const barrier = record.whenToolCallsSettled(["c-1"]).then(() => {
|
|
42
|
+
released = true;
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
record.applyStatusUpdate(statusWith([{ id: "c-1", status: ToolCallStatus.TOOL_CALL_RUNNING }]));
|
|
46
|
+
await Promise.resolve();
|
|
47
|
+
expect(released, "a RUNNING row is not settled").toBe(false);
|
|
48
|
+
|
|
49
|
+
record.applyStatusUpdate(statusWith([{ id: "c-1", status: ToolCallStatus.TOOL_CALL_WAITING_APPROVAL }]));
|
|
50
|
+
await barrier;
|
|
51
|
+
expect(released).toBe(true);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("finds a sub-agent's rows in its own transcript", async () => {
|
|
55
|
+
const record = deepAgentExecutionRecord({ message: "go" });
|
|
56
|
+
record.applyStatusUpdate(
|
|
57
|
+
statusWith([
|
|
58
|
+
{ id: "task-1", status: ToolCallStatus.TOOL_CALL_RUNNING },
|
|
59
|
+
{ id: "sub-1", status: ToolCallStatus.TOOL_CALL_COMPLETED, subAgent: true },
|
|
60
|
+
]),
|
|
61
|
+
);
|
|
62
|
+
await expect(record.whenToolCallsSettled(["sub-1"])).resolves.toBeUndefined();
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it("fails naming the ids still open when no persist ever settles them, instead of hanging", async () => {
|
|
66
|
+
const record = deepAgentExecutionRecord({ message: "go" });
|
|
67
|
+
record.applyStatusUpdate(statusWith([{ id: "c-1", status: ToolCallStatus.TOOL_CALL_RUNNING }]));
|
|
68
|
+
await expect(record.whenToolCallsSettled(["c-1", "c-2"], 20)).rejects.toThrow(/c-1, c-2 never settled/);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
@@ -27,7 +27,9 @@
|
|
|
27
27
|
|
|
28
28
|
import { describe, it, expect } from "vitest";
|
|
29
29
|
import { CancelledFailure } from "@temporalio/activity";
|
|
30
|
+
import { create } from "@bufbuild/protobuf";
|
|
30
31
|
import { ApprovalAction, ToolCallStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
32
|
+
import { SubAgentExecutionSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/subagent_pb";
|
|
31
33
|
|
|
32
34
|
import type { HarnessAdapter, TurnInput, TurnOutcome, TurnSink } from "../../harness/types.js";
|
|
33
35
|
import {
|
|
@@ -41,11 +43,12 @@ import {
|
|
|
41
43
|
assertStopSignalInterrupts,
|
|
42
44
|
assertUsageReachesSinkAsDeltas,
|
|
43
45
|
} from "../harness-contract/contract.js";
|
|
46
|
+
import { assertTranscriptStreamsNothing } from "../harness-contract/runtime-contract.js";
|
|
44
47
|
import { scriptedSubject } from "../harness-contract/scripted-adapter.js";
|
|
45
48
|
import type { ScriptedSubject } from "../harness-contract/scripted-adapter.js";
|
|
46
49
|
import { scenario } from "../harness-contract/types.js";
|
|
47
50
|
import type { EngineView, HarnessContractSubject, TurnScenario } from "../harness-contract/types.js";
|
|
48
|
-
import { findToolCallRow } from "../proto-helpers.js";
|
|
51
|
+
import { aiMessage, emptyStatus, findToolCallRow, toolCall } from "../proto-helpers.js";
|
|
49
52
|
|
|
50
53
|
/** Short enough to keep this file fast; long enough that an honest microtask settle never trips it. */
|
|
51
54
|
const SHORT_BOUND_MS = 100;
|
|
@@ -75,6 +78,7 @@ function adapterOver(inner: HarnessAdapter, name: string, patch: Partial<Harness
|
|
|
75
78
|
function sinkOver(inner: TurnSink, patch: Partial<TurnSink>): TurnSink {
|
|
76
79
|
return {
|
|
77
80
|
status: inner.status,
|
|
81
|
+
transcript: inner.transcript,
|
|
78
82
|
stopSignal: inner.stopSignal,
|
|
79
83
|
setupTiming: inner.setupTiming,
|
|
80
84
|
requestPersist: () => inner.requestPersist(),
|
|
@@ -324,3 +328,33 @@ describe("harness contract kit self-check — the driver stands in for the runti
|
|
|
324
328
|
expect(turn.sink.status.messages.map((m) => m.content), "the stop landed in the hang, after the setup step and before the step after it").toEqual(["setting up"]);
|
|
325
329
|
});
|
|
326
330
|
});
|
|
331
|
+
|
|
332
|
+
// ── The runtime half's transcript fact ──────────────────────────────────────
|
|
333
|
+
|
|
334
|
+
describe("harness contract kit self-check — the settled-transcript assertion can fail", () => {
|
|
335
|
+
it("passes a transcript with every flag off", () => {
|
|
336
|
+
const status = emptyStatus();
|
|
337
|
+
const message = aiMessage("done");
|
|
338
|
+
message.toolCalls.push(toolCall("t-1", "read", ToolCallStatus.TOOL_CALL_COMPLETED));
|
|
339
|
+
status.messages.push(message);
|
|
340
|
+
expect(() => assertTranscriptStreamsNothing("honest", status)).not.toThrow();
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
it("names a message left streaming", () => {
|
|
344
|
+
const status = emptyStatus();
|
|
345
|
+
const message = aiMessage("still typing");
|
|
346
|
+
message.isStreaming = true;
|
|
347
|
+
status.messages.push(message);
|
|
348
|
+
expect(() => assertTranscriptStreamsNothing("broken:streams", status)).toThrow(/broken:streams: a settled turn's transcript is still streaming at messages\[0\]/);
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
it("names a tool-call row left streaming, inside a sub-agent's transcript", () => {
|
|
352
|
+
const status = emptyStatus();
|
|
353
|
+
const row = toolCall("t-2", "shell");
|
|
354
|
+
row.isStreaming = true;
|
|
355
|
+
const message = aiMessage("");
|
|
356
|
+
message.toolCalls.push(row);
|
|
357
|
+
status.subAgentExecutions.push(create(SubAgentExecutionSchema, { id: "sub-1", messages: [message] }));
|
|
358
|
+
expect(() => assertTranscriptStreamsNothing("broken:streams", status)).toThrow(/subAgentExecutions\[sub-1\]\.messages\[0\]\.toolCalls\[t-2\]/);
|
|
359
|
+
});
|
|
360
|
+
});
|
|
@@ -90,7 +90,7 @@ export function describeGatewayContract(substrate: GatewaySubstrate): void {
|
|
|
90
90
|
// effect is always auditable to the policy layer that governed it. Gated to
|
|
91
91
|
// substrates that decide the source at the gate (the deep-agent gate); the
|
|
92
92
|
// Cursor substrate projects provenance at reconstruction time and is covered
|
|
93
|
-
// by the
|
|
93
|
+
// by the translator + boundary-rows + corpus suites.
|
|
94
94
|
if (substrate.capabilities.surfacesGatePolicySource) {
|
|
95
95
|
it("tags every gated side effect with a non-UNSPECIFIED policy source", async () => {
|
|
96
96
|
for (const action of [WRITE_A, SHELL, DELETE]) {
|
|
@@ -137,7 +137,7 @@ export interface SubstrateCapabilities {
|
|
|
137
137
|
* and stamps the source at interrupt time (`true`); the Cursor substrate's
|
|
138
138
|
* provenance is a reconstruction-time projection over the persisted tool call,
|
|
139
139
|
* not a property of the hook's deny decision, so it is `false` here and is
|
|
140
|
-
* covered instead by the
|
|
140
|
+
* covered instead by the translator, boundary-rows and corpus suites.
|
|
141
141
|
*/
|
|
142
142
|
readonly surfacesGatePolicySource: boolean;
|
|
143
143
|
}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* a bound token ref. Success means the pre-boot graph was connect-free,
|
|
16
16
|
* both interceptors installed, `assertHttp2ConnectPatched` passed, the
|
|
17
17
|
* Cursor SDK slice loaded from inside its `boot`, and the native
|
|
18
|
-
* deep-agent adapter (the table's second row since
|
|
18
|
+
* deep-agent adapter (the table's second row since #1096) registered its
|
|
19
19
|
* profiles and loaded LangChain after the patch. That neither engine is
|
|
20
20
|
* on the table's STATIC graph is each adapter's own fence
|
|
21
21
|
* (`adapter-graph-is-sdk-free.test.ts`); this child proves the boot
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
* is carried to COMPLETED; with REJECT or SKIP → never executes and the
|
|
39
39
|
* turn continues (the row's SKIPPED status is the runtime's to write,
|
|
40
40
|
* `harness/approval-decisions.ts`, proven in the runtime half — the
|
|
41
|
-
* driver stands in for that write between turns
|
|
41
|
+
* driver stands in for that write between turns); reinvoked again
|
|
42
42
|
* after the approval → still once, never re-gated.
|
|
43
43
|
* 4. Aborting `stopSignal` mid-hang settles `runTurn` as `interrupted` within
|
|
44
44
|
* {@link INTERRUPT_SETTLE_BOUND_MS} and nothing after the stop executes or
|
|
@@ -48,8 +48,8 @@
|
|
|
48
48
|
* executes on the resumed turn is the pause primitive's business — an
|
|
49
49
|
* interrupt engine completes the pending task before its model speaks,
|
|
50
50
|
* a deny-and-retry engine re-reaches it whenever its model does — so it
|
|
51
|
-
* is below the contract line (
|
|
52
|
-
*
|
|
51
|
+
* is below the contract line (each harness's own kit file observes its
|
|
52
|
+
* order).
|
|
53
53
|
* 5. Usage reaches the sink as non-negative deltas summing to what the engine
|
|
54
54
|
* emitted.
|
|
55
55
|
* 6. Capability and behaviour agree on the state id: an `engine-minted`
|
|
@@ -154,7 +154,7 @@ export class ExecutionDriver {
|
|
|
154
154
|
|
|
155
155
|
/** Start a turn without awaiting it, for invariants about turns in flight. */
|
|
156
156
|
begin(turn: TurnScenario, options: TurnOptions = {}): TurnInFlight {
|
|
157
|
-
const sink = options.sink ?? new RecordingTurnSink({ status: this.seedStatus() });
|
|
157
|
+
const sink = options.sink ?? new RecordingTurnSink({ status: this.seedStatus(), executionId: this.executionId });
|
|
158
158
|
// The engine's view and the record's copy both derive from the status
|
|
159
159
|
// this turn folds into, so a prepared sink's status is honoured too.
|
|
160
160
|
const view: EngineView = {
|
|
@@ -297,7 +297,7 @@ export async function assertEveryExitIsAnOutcome(subject: HarnessContractSubject
|
|
|
297
297
|
driver.recordTurn(sink);
|
|
298
298
|
}
|
|
299
299
|
|
|
300
|
-
const preAborted = new RecordingTurnSink({ status: driver.seedStatus() });
|
|
300
|
+
const preAborted = new RecordingTurnSink({ status: driver.seedStatus(), executionId: driver.executionId });
|
|
301
301
|
preAborted.abort("kit: aborted before the turn");
|
|
302
302
|
const { settled } = driver.begin([scenario.say("never")], { sink: preAborted });
|
|
303
303
|
await settleAsOutcome(subject, settleWithinBound(subject, settled, "under a pre-aborted signal", boundMs), "under a pre-aborted signal");
|
|
@@ -335,8 +335,8 @@ export async function assertProposalIsWaitingAndUnexecuted(subject: HarnessContr
|
|
|
335
335
|
* turn continues — the row's terminal status is NOT asserted here because
|
|
336
336
|
* it is not the adapter's to write (the decision is the server's field and
|
|
337
337
|
* the WAITING → SKIPPED transition follows from it with no engine knowledge,
|
|
338
|
-
* so it is the runtime's — `terminalizeNonExecutingDecisions`, landed
|
|
339
|
-
*
|
|
338
|
+
* so it is the runtime's — `terminalizeNonExecutingDecisions`, landed in
|
|
339
|
+
* #1096 and pinned by the runtime half's REJECT / SKIP arms).
|
|
340
340
|
* The reinvocation sees a CLONE of the persisted status, as it would from
|
|
341
341
|
* the server.
|
|
342
342
|
*/
|
|
@@ -391,7 +391,7 @@ export async function assertStopSignalInterrupts(subject: HarnessContractSubject
|
|
|
391
391
|
expect(findToolCallRow(hanging.sink.status, id), `${subject.name}: nothing after the stop may even reach the gate — the proposal after the hang has no row`).toBeUndefined();
|
|
392
392
|
driver.recordTurn(hanging.sink);
|
|
393
393
|
|
|
394
|
-
const preAborted = new RecordingTurnSink({ status: driver.seedStatus() });
|
|
394
|
+
const preAborted = new RecordingTurnSink({ status: driver.seedStatus(), executionId: driver.executionId });
|
|
395
395
|
preAborted.abort("kit: aborted before the turn");
|
|
396
396
|
const early = driver.begin([scenario.propose(id, WRITE_ALPHA)], { sink: preAborted });
|
|
397
397
|
const earlyOutcome = await settleWithinBound(subject, early.settled, "under a pre-aborted signal", boundMs);
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
import type { AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
22
22
|
|
|
23
|
+
import { TranscriptBuilder } from "../../harness/transcript/builder.js";
|
|
23
24
|
import type { TurnSink, UsageDelta } from "../../harness/types.js";
|
|
24
25
|
import type { CasTouchedReader } from "../../shared/filereview/cas-touched.js";
|
|
25
26
|
import { TimingRecorder } from "../../shared/cold-start-timing.js";
|
|
@@ -35,14 +36,22 @@ export type SinkEvent =
|
|
|
35
36
|
| { readonly kind: "cas-observations" };
|
|
36
37
|
|
|
37
38
|
export interface RecordingTurnSinkOptions {
|
|
38
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* The status this turn folds into; a fresh empty one when omitted. A
|
|
41
|
+
* reinvocation's clone arrives already carrying last turn's rows, and the
|
|
42
|
+
* builder indexes them as the runtime's would after its seed.
|
|
43
|
+
*/
|
|
39
44
|
readonly status?: AgentExecutionStatus;
|
|
45
|
+
/** The execution the builder names in its log lines; the kit's driver passes its own. */
|
|
46
|
+
readonly executionId?: string;
|
|
40
47
|
/** When set, `bindHarnessState` rejects with this error (a failed session write). */
|
|
41
48
|
readonly bindRejectsWith?: Error;
|
|
42
49
|
}
|
|
43
50
|
|
|
44
51
|
export class RecordingTurnSink implements TurnSink {
|
|
45
52
|
readonly status: AgentExecutionStatus;
|
|
53
|
+
/** The one builder over `status`, as the runtime hands every adapter; the fake creates its rows through it. */
|
|
54
|
+
readonly transcript: TranscriptBuilder;
|
|
46
55
|
readonly stopSignal: AbortSignal;
|
|
47
56
|
readonly setupTiming = new TimingRecorder();
|
|
48
57
|
|
|
@@ -52,6 +61,7 @@ export class RecordingTurnSink implements TurnSink {
|
|
|
52
61
|
|
|
53
62
|
constructor(options: RecordingTurnSinkOptions = {}) {
|
|
54
63
|
this.status = options.status ?? emptyStatus();
|
|
64
|
+
this.transcript = new TranscriptBuilder(options.executionId ?? "kit-exec", this.status);
|
|
55
65
|
this.stopSignal = this.controller.signal;
|
|
56
66
|
this.bindRejectsWith = options.bindRejectsWith;
|
|
57
67
|
}
|