@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
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* runtime's stall watchdog measures the engine; `reportUsage()` per parent
|
|
10
10
|
* `message_finish`, priced here at the registry's rates for the model the
|
|
11
11
|
* turn runs on (`shared/model-pricing.ts`), so the runtime accounts and
|
|
12
|
-
* enforces the cost cap and writes `streamingUsage
|
|
12
|
+
* enforces the cost cap and writes `streamingUsage`; `requestPersist()`
|
|
13
13
|
* where a discrete change or the streaming cadence says so
|
|
14
14
|
* (`shared/persist-decision.ts` over the builder's one dirty flag), AWAITED,
|
|
15
15
|
* so a platform STOP the runtime reads from that write aborts the signal
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* this loop never does). An error the aborted run throws is the abort itself
|
|
20
20
|
* and settles `interrupted`, never `failed`.
|
|
21
21
|
*
|
|
22
|
-
* WHEN the run is aborted
|
|
22
|
+
* WHEN the run is aborted: on the arrival of the next
|
|
23
23
|
* event — the graph's own step boundary — or after {@link STOP_GRACE_MS} if
|
|
24
24
|
* no event arrives. A LangGraph run aborted while a step is in flight leaves
|
|
25
25
|
* `@langchain/core` with an orphaned rejection (`AsyncGeneratorWithSetup`
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
* here) is forced, and that one orphan is the price of unblocking it — the
|
|
35
35
|
* contract's bound on settling `interrupted` is what wins.
|
|
36
36
|
*
|
|
37
|
-
* Until
|
|
37
|
+
* Until #1096 this loop (`streaming-v3.ts`) armed its own 120 s stall
|
|
38
38
|
* check, pulsed the Temporal heartbeat every 2 s, read STOP from its own
|
|
39
39
|
* persist and activated a graceful-stop middleware on it, told a pause from
|
|
40
40
|
* the activity's cancellation signal, and wrote PAUSED, COMPLETED and
|
|
@@ -53,8 +53,7 @@ import { TimeoutError, withTimeout } from "../../shared/with-timeout.js";
|
|
|
53
53
|
import { InlinePublisher } from "./inline-publisher.js";
|
|
54
54
|
import { StreamingSideEffects } from "./streaming-side-effects.js";
|
|
55
55
|
import { createV3EventRecorder, type V3ProtocolEvent } from "./v3-event-recorder.js";
|
|
56
|
-
import {
|
|
57
|
-
import { V3StatusBuilder } from "./v3-status-builder.js";
|
|
56
|
+
import { DeepAgentTranslator, usageOf, type V3UsagePayload } from "./translator.js";
|
|
58
57
|
import type { DeepAgentEngine, DeepAgentGraphInput, DeepAgentWorkspace } from "./turn-setup.js";
|
|
59
58
|
|
|
60
59
|
/**
|
|
@@ -95,14 +94,17 @@ export interface DeepAgentStreamResult {
|
|
|
95
94
|
}
|
|
96
95
|
|
|
97
96
|
/**
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
97
|
+
* This harness's transcript writers for one turn: the translator that turns
|
|
98
|
+
* the engine's events into canonical ones (over the gate's posture, so every
|
|
99
|
+
* tool start carries its attribution and gate answer), and the publisher
|
|
100
|
+
* that registers artifacts on the runtime's builder (`sink.transcript`, so
|
|
101
|
+
* a published artifact still dirties the next persist). The builder itself
|
|
102
|
+
* is the runtime's, one per turn, and is read from the sink where it is
|
|
103
|
+
* needed. Built by the adapter's turn once and shared by the stream and the
|
|
104
|
+
* settle.
|
|
103
105
|
*/
|
|
104
106
|
export interface DeepAgentTranscript {
|
|
105
|
-
readonly
|
|
107
|
+
readonly translator: DeepAgentTranslator;
|
|
106
108
|
readonly publisher: InlinePublisher;
|
|
107
109
|
}
|
|
108
110
|
|
|
@@ -112,41 +114,40 @@ export function createDeepAgentTranscript(
|
|
|
112
114
|
engine: DeepAgentEngine,
|
|
113
115
|
workspace: DeepAgentWorkspace,
|
|
114
116
|
): DeepAgentTranscript {
|
|
115
|
-
const
|
|
116
|
-
onUsage: (usage) => {
|
|
117
|
-
// LangChain's `input_tokens` already INCLUDES the cache buckets (the
|
|
118
|
-
// Anthropic adapter folds them in; the cost advisory reads them the
|
|
119
|
-
// same way), so the counts are reported as delivered and the price
|
|
120
|
-
// is computed over the disjoint buckets.
|
|
121
|
-
const inputTokens = usage.input_tokens ?? 0;
|
|
122
|
-
const outputTokens = usage.output_tokens ?? 0;
|
|
123
|
-
const cacheReadTokens = usage.input_token_details?.cache_read ?? 0;
|
|
124
|
-
const cacheWriteTokens = usage.input_token_details?.cache_creation ?? 0;
|
|
125
|
-
const uncachedInput = Math.max(inputTokens - cacheReadTokens - cacheWriteTokens, 0);
|
|
126
|
-
sink.reportUsage({
|
|
127
|
-
inputTokens,
|
|
128
|
-
outputTokens,
|
|
129
|
-
cacheReadTokens,
|
|
130
|
-
cacheWriteTokens,
|
|
131
|
-
estimatedCostUsd: computeTurnCost(engine.pricing, uncachedInput, outputTokens, cacheWriteTokens, cacheReadTokens),
|
|
132
|
-
model: engine.modelName,
|
|
133
|
-
});
|
|
134
|
-
},
|
|
135
|
-
});
|
|
136
|
-
builder.setApprovalProvider({
|
|
137
|
-
policies: engine.gate.policies,
|
|
138
|
-
toolServerMap: engine.gate.toolServerMap,
|
|
139
|
-
leasedCategories: engine.gate.leasedCategories,
|
|
140
|
-
globalBypass: engine.gate.globalBypass,
|
|
141
|
-
unattended: engine.gate.unattended,
|
|
142
|
-
});
|
|
117
|
+
const translator = new DeepAgentTranslator(engine.gate);
|
|
143
118
|
const publisher = new InlinePublisher({
|
|
144
119
|
workspaceBackend: workspace.backend,
|
|
145
120
|
artifactStorage: input.artifactStorage,
|
|
146
|
-
|
|
121
|
+
artifacts: sink.transcript,
|
|
147
122
|
executionId: input.executionId,
|
|
148
123
|
});
|
|
149
|
-
return {
|
|
124
|
+
return { translator, publisher };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Price one `message-finish`'s usage at the engine's rates and report it to
|
|
129
|
+
* the sink, which accounts, enforces the cost cap and writes `streamingUsage`
|
|
130
|
+
* (one writer of the summary). LangChain's `input_tokens` already INCLUDES the cache buckets
|
|
131
|
+
* (the Anthropic adapter folds them in; the cost advisory reads them the same
|
|
132
|
+
* way), so the counts are reported as delivered and the price is computed
|
|
133
|
+
* over the disjoint buckets. A sub-agent on its own model is priced at the
|
|
134
|
+
* parent's rate, as the in-graph cost cap always did (per-sub-agent pricing
|
|
135
|
+
* is #1121).
|
|
136
|
+
*/
|
|
137
|
+
function reportUsage(sink: TurnSink, engine: DeepAgentEngine, usage: V3UsagePayload): void {
|
|
138
|
+
const inputTokens = usage.input_tokens ?? 0;
|
|
139
|
+
const outputTokens = usage.output_tokens ?? 0;
|
|
140
|
+
const cacheReadTokens = usage.input_token_details?.cache_read ?? 0;
|
|
141
|
+
const cacheWriteTokens = usage.input_token_details?.cache_creation ?? 0;
|
|
142
|
+
const uncachedInput = Math.max(inputTokens - cacheReadTokens - cacheWriteTokens, 0);
|
|
143
|
+
sink.reportUsage({
|
|
144
|
+
inputTokens,
|
|
145
|
+
outputTokens,
|
|
146
|
+
cacheReadTokens,
|
|
147
|
+
cacheWriteTokens,
|
|
148
|
+
estimatedCostUsd: computeTurnCost(engine.pricing, uncachedInput, outputTokens, cacheWriteTokens, cacheReadTokens),
|
|
149
|
+
model: engine.modelName,
|
|
150
|
+
});
|
|
150
151
|
}
|
|
151
152
|
|
|
152
153
|
export interface DeepAgentStreamDeps {
|
|
@@ -165,7 +166,8 @@ export interface DeepAgentStreamDeps {
|
|
|
165
166
|
export async function consumeDeepAgentStream(deps: DeepAgentStreamDeps): Promise<DeepAgentStreamResult> {
|
|
166
167
|
const { input, sink, engine, graphInput, transcript } = deps;
|
|
167
168
|
const { executionId } = input;
|
|
168
|
-
const {
|
|
169
|
+
const { translator, publisher } = transcript;
|
|
170
|
+
const builder = sink.transcript;
|
|
169
171
|
|
|
170
172
|
const scheduler = new StreamingUpdateScheduler(loadStreamingConfig());
|
|
171
173
|
const recorder = createV3EventRecorder(executionId, process.env.V3_EVENT_RECORD_DIR);
|
|
@@ -214,21 +216,21 @@ export async function consumeDeepAgentStream(deps: DeepAgentStreamDeps): Promise
|
|
|
214
216
|
|
|
215
217
|
recorder?.record(event, eventsProcessed);
|
|
216
218
|
let detail: string | undefined;
|
|
217
|
-
for (const normalized of
|
|
218
|
-
builder.
|
|
219
|
+
for (const normalized of translator.translate(event)) {
|
|
220
|
+
builder.apply(normalized);
|
|
221
|
+
sideEffects.onEvent(normalized);
|
|
219
222
|
if (normalized.kind === "tool_started") detail = normalized.name;
|
|
220
223
|
}
|
|
221
|
-
|
|
224
|
+
const usage = usageOf(event);
|
|
225
|
+
if (usage) reportUsage(sink, engine, usage);
|
|
222
226
|
eventsProcessed++;
|
|
223
227
|
sink.recordActivity(detail);
|
|
224
228
|
|
|
225
|
-
const persist = shouldPersistStreamingStatus(
|
|
226
|
-
{ deltaEnricherDirty: false, todosDirty: false, contentDirty: builder.forceNextUpdate },
|
|
227
|
-
scheduler,
|
|
228
|
-
eventsProcessed,
|
|
229
|
-
);
|
|
229
|
+
const persist = shouldPersistStreamingStatus(builder.dirty, scheduler, eventsProcessed);
|
|
230
230
|
if (!persist) continue;
|
|
231
|
-
|
|
231
|
+
// Cleared as the write is requested, not after it lands: a change
|
|
232
|
+
// that folds while the write is in flight must dirty the next one.
|
|
233
|
+
builder.markPersisted();
|
|
232
234
|
// The runtime attaches the mid-run file-change progress on this write
|
|
233
235
|
// (the chokepoint's step 2), as it does on every write. Awaited so a platform STOP the runtime reads from this write has
|
|
234
236
|
// aborted the signal by the time the next event arrives — where the
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
* other exception — a provider error unwrapped from LangChain's middleware
|
|
25
25
|
* wrapper, an MCP connect failure, an empty stream — is `failed` on the
|
|
26
26
|
* `internal` surface with `describeExecutionError`'s sentence as
|
|
27
|
-
* `status.error` whole
|
|
27
|
+
* `status.error` whole. Never branches on why `stopSignal`
|
|
28
28
|
* aborted, never writes a phase or a terminal copy, never imports
|
|
29
29
|
* `@temporalio/*` (`__tests__/adapter-is-temporal-free.test.ts`).
|
|
30
30
|
*
|
|
@@ -33,9 +33,9 @@
|
|
|
33
33
|
* are connected and closed per turn. Both are closed on EVERY exit path in
|
|
34
34
|
* the `finally`, before the runtime removes the link and releases the lock.
|
|
35
35
|
*
|
|
36
|
-
* Extracted from `index.ts` `createDeepAgentActivities`
|
|
36
|
+
* Extracted from `index.ts` `createDeepAgentActivities` in #1096; the
|
|
37
37
|
* hermetic goldens under `__tests__/hermetic/` pin the result byte for
|
|
38
|
-
* byte, with
|
|
38
|
+
* byte, with that move's deliberate alignments quoted in their headers.
|
|
39
39
|
*/
|
|
40
40
|
|
|
41
41
|
import type { BaseCheckpointSaver } from "@langchain/langgraph-checkpoint";
|
|
@@ -23,12 +23,24 @@
|
|
|
23
23
|
* here degrades to a heuristic title (the first words of the user message):
|
|
24
24
|
* a title is worth having even when no model is reachable.
|
|
25
25
|
*
|
|
26
|
-
* Activity contract
|
|
27
|
-
* Java signature carries a second, invokerIdentityAccountId, that never
|
|
28
|
-
* crosses this wire):
|
|
26
|
+
* Activity contract — exactly ONE argument, in one of two shapes:
|
|
29
27
|
* Name: "GenerateSessionSubject"
|
|
30
28
|
* Input: (executionId: string)
|
|
29
|
+
* | ({ execution_id, execution_context_token? }: GenerateSessionSubjectInput)
|
|
31
30
|
* Output: void
|
|
31
|
+
*
|
|
32
|
+
* The object is what a server sends when the dispatch carries the run's
|
|
33
|
+
* credential (shared/run-credential.ts), so that this activity reads the
|
|
34
|
+
* run and titles the session AS THE RUN'S HUMAN — with sign-in on, the
|
|
35
|
+
* operator's key the process holds cannot read a member's run. The string
|
|
36
|
+
* is what every server sent before, and what a server whose dispatch carries
|
|
37
|
+
* no credential still sends (the cloud's, whose desktop runners in the field
|
|
38
|
+
* must keep titling sessions). Both shapes are accepted — the dual-shape
|
|
39
|
+
* posture the turn activities take (shared/activity-input.ts); the
|
|
40
|
+
* credential itself is entered by the activity boundary
|
|
41
|
+
* (interceptors/run-credential-activity.ts), never read here. The cloud's
|
|
42
|
+
* Java signature carries a second argument, invokerIdentityAccountId, that
|
|
43
|
+
* never crosses this wire.
|
|
32
44
|
*/
|
|
33
45
|
|
|
34
46
|
import { SystemMessage, HumanMessage } from "@langchain/core/messages";
|
|
@@ -344,6 +356,16 @@ function log(msg: string): void {
|
|
|
344
356
|
// Temporal Activity Factory
|
|
345
357
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
346
358
|
|
|
359
|
+
/**
|
|
360
|
+
* The typed wire shape of the activity's argument (snake_case keys, the
|
|
361
|
+
* polyglot workflow-input convention). `execution_context_token` is the run
|
|
362
|
+
* credential, present exactly when the dispatch carried one.
|
|
363
|
+
*/
|
|
364
|
+
export interface GenerateSessionSubjectInput {
|
|
365
|
+
readonly execution_id: string;
|
|
366
|
+
readonly execution_context_token?: string;
|
|
367
|
+
}
|
|
368
|
+
|
|
347
369
|
export function createGenerateSessionSubjectActivities(config: Config) {
|
|
348
370
|
const client = new StigmerClient({
|
|
349
371
|
endpoint: config.stigmerBackendEndpoint,
|
|
@@ -353,7 +375,10 @@ export function createGenerateSessionSubjectActivities(config: Config) {
|
|
|
353
375
|
});
|
|
354
376
|
|
|
355
377
|
return {
|
|
356
|
-
GenerateSessionSubject: async (
|
|
378
|
+
GenerateSessionSubject: async (
|
|
379
|
+
input: GenerateSessionSubjectInput | string,
|
|
380
|
+
): Promise<void> => {
|
|
381
|
+
const executionId = typeof input === "string" ? input : input.execution_id;
|
|
357
382
|
activityStarted();
|
|
358
383
|
try {
|
|
359
384
|
log(`started: execution=${executionId}`);
|
|
@@ -20,6 +20,8 @@ vi.mock("@connectrpc/connect", () => ({
|
|
|
20
20
|
}));
|
|
21
21
|
|
|
22
22
|
import { StigmerClient } from "../stigmer-client.js";
|
|
23
|
+
import { withRunCredential } from "../../shared/run-credential-store.js";
|
|
24
|
+
import { AgentExecutionCommandController } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/command_pb";
|
|
23
25
|
import { ExecutionContextQueryController } from "@stigmer/protos/ai/stigmer/agentic/executioncontext/v1/query_pb";
|
|
24
26
|
import { PlatformQueryController } from "@stigmer/protos/ai/stigmer/platform/v1/server_info_pb";
|
|
25
27
|
|
|
@@ -279,6 +281,96 @@ describe("StigmerClient", () => {
|
|
|
279
281
|
});
|
|
280
282
|
});
|
|
281
283
|
|
|
284
|
+
describe("run credential (the activity's own, shared/run-credential-store.ts)", () => {
|
|
285
|
+
// The server mints a credential for ONE execution at dispatch and, with
|
|
286
|
+
// sign-in on, admits its bearer as that run's human. The activity boundary
|
|
287
|
+
// enters it into the store; these arms pin that the client presents it on
|
|
288
|
+
// every RPC about a run, on no process-bound RPC, below an explicit
|
|
289
|
+
// per-call header and above every process credential — and that two
|
|
290
|
+
// concurrent activities never see each other's.
|
|
291
|
+
|
|
292
|
+
function clientWithEveryProcessCredential(): StigmerClient {
|
|
293
|
+
return new StigmerClient({
|
|
294
|
+
endpoint: "http://localhost",
|
|
295
|
+
token: "static-tok",
|
|
296
|
+
tokenRef: { current: "control-plane-tok" },
|
|
297
|
+
runnerTokenRef: { current: "runner-tok" },
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
it("presents the run credential on an ordinary control-plane RPC", async () => {
|
|
302
|
+
clientWithEveryProcessCredential();
|
|
303
|
+
const req = makeRequest();
|
|
304
|
+
await withRunCredential("run-cred", () => runInterceptor(req));
|
|
305
|
+
expect(req.header.get("authorization")).toBe("Bearer run-cred");
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
it("presents it above the runner credential on the three runner-credential RPCs", async () => {
|
|
309
|
+
clientWithEveryProcessCredential();
|
|
310
|
+
for (const req of [
|
|
311
|
+
makeExecutionContextRequest(),
|
|
312
|
+
makeScopedTokenExchangeRequest(),
|
|
313
|
+
makeRequest(AgentExecutionCommandController.typeName, "create"),
|
|
314
|
+
]) {
|
|
315
|
+
await withRunCredential("run-cred", () => runInterceptor(req));
|
|
316
|
+
expect(req.header.get("authorization")).toBe("Bearer run-cred");
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
it("never presents it on the process-bound bootstrap read", async () => {
|
|
321
|
+
clientWithEveryProcessCredential();
|
|
322
|
+
const req = makeRequest(PlatformQueryController.typeName, "getRunnerBootstrapConfig");
|
|
323
|
+
await withRunCredential("run-cred", () => runInterceptor(req));
|
|
324
|
+
expect(req.header.get("authorization")).toBe("Bearer control-plane-tok");
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
it("yields to an explicit per-call credential", async () => {
|
|
328
|
+
clientWithEveryProcessCredential();
|
|
329
|
+
const req = makeRequest();
|
|
330
|
+
req.header.set("authorization", "Bearer explicit-tok");
|
|
331
|
+
await withRunCredential("run-cred", () => runInterceptor(req));
|
|
332
|
+
expect(req.header.get("authorization")).toBe("Bearer explicit-tok");
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
it("leaves every rule below untouched when no activity credential is current", async () => {
|
|
336
|
+
clientWithEveryProcessCredential();
|
|
337
|
+
const ordinary = makeRequest();
|
|
338
|
+
await runInterceptor(ordinary);
|
|
339
|
+
expect(ordinary.header.get("authorization")).toBe("Bearer control-plane-tok");
|
|
340
|
+
const ec = makeExecutionContextRequest();
|
|
341
|
+
await runInterceptor(ec);
|
|
342
|
+
expect(ec.header.get("authorization")).toBe("Bearer runner-tok");
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
it("never crosses between two concurrent activities sharing one client", async () => {
|
|
346
|
+
clientWithEveryProcessCredential();
|
|
347
|
+
const reqA = makeRequest();
|
|
348
|
+
const reqB = makeRequest();
|
|
349
|
+
await Promise.all([
|
|
350
|
+
withRunCredential("run-cred-A", async () => {
|
|
351
|
+
await new Promise((resolve) => setTimeout(resolve, 2));
|
|
352
|
+
await runInterceptor(reqA);
|
|
353
|
+
}),
|
|
354
|
+
withRunCredential("run-cred-B", async () => {
|
|
355
|
+
await new Promise((resolve) => setTimeout(resolve, 1));
|
|
356
|
+
await runInterceptor(reqB);
|
|
357
|
+
}),
|
|
358
|
+
]);
|
|
359
|
+
expect(reqA.header.get("authorization")).toBe("Bearer run-cred-A");
|
|
360
|
+
expect(reqB.header.get("authorization")).toBe("Bearer run-cred-B");
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
it("acquireScopedRunnerToken answers the run credential without an exchange", async () => {
|
|
364
|
+
const client = clientWithEveryProcessCredential();
|
|
365
|
+
const exchange = vi.spyOn(client, "getRunnerScopedToken");
|
|
366
|
+
const token = await withRunCredential("run-cred", () =>
|
|
367
|
+
client.acquireScopedRunnerToken({ agentExecutionId: "aex_1" }),
|
|
368
|
+
);
|
|
369
|
+
expect(token).toBe("run-cred");
|
|
370
|
+
expect(exchange).not.toHaveBeenCalled();
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
|
|
282
374
|
describe("acquireScopedRunnerToken", () => {
|
|
283
375
|
function clientWithRunnerCredential(token: string | null): StigmerClient {
|
|
284
376
|
return new StigmerClient({
|
|
@@ -55,6 +55,7 @@ import { ChannelMessageQueryController } from "@stigmer/protos/ai/stigmer/agenti
|
|
|
55
55
|
import type { ChannelTemplate, MessagingChannel } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/message_io_pb";
|
|
56
56
|
import { TOKEN_TYPE_EMBEDDED_RUNNER, tokenTypeOf } from "./token-claims.js";
|
|
57
57
|
import { assertCreateRequirements, assertReferenceRequirements } from "./server-contracts.js";
|
|
58
|
+
import { currentRunCredential } from "../shared/run-credential-store.js";
|
|
58
59
|
|
|
59
60
|
/**
|
|
60
61
|
* Server-managed Temporal payload-encryption keys for this runner.
|
|
@@ -223,11 +224,25 @@ export class StigmerClient {
|
|
|
223
224
|
// 1. An explicit per-call credential (an authorization header set via
|
|
224
225
|
// CallOptions) always wins. The scoped-token flow (issue #156)
|
|
225
226
|
// authenticates each ExecutionContext read with a token minted for
|
|
226
|
-
// that specific execution;
|
|
227
|
-
//
|
|
228
|
-
//
|
|
227
|
+
// that specific execution; the renewal and pool-claim exchanges
|
|
228
|
+
// present the token being exchanged; the connect lane hands its
|
|
229
|
+
// decrypt-lane token per call.
|
|
229
230
|
//
|
|
230
|
-
// 2. The
|
|
231
|
+
// 2. The run credential of the activity this request belongs to
|
|
232
|
+
// (shared/run-credential-store.ts), on every RPC that is about a
|
|
233
|
+
// run — which is every RPC but the process-bound bootstrap read.
|
|
234
|
+
// The server minted it for exactly this execution at dispatch and,
|
|
235
|
+
// with sign-in on, admits its bearer as the run's own human: the
|
|
236
|
+
// status write, the child create, the artifact, the session title
|
|
237
|
+
// are the member's, whoever's API key this process holds. It is
|
|
238
|
+
// read from the async context, never from a ref: one process serves
|
|
239
|
+
// many runs at once and a shared ref would be the wrong run's the
|
|
240
|
+
// moment two overlap — the same reason rule 1 exists. Absent
|
|
241
|
+
// outside an activity and when the dispatch carried none (an older
|
|
242
|
+
// server; the cloud, whose runner credential is provisioned), so
|
|
243
|
+
// the rules below are exactly what they were.
|
|
244
|
+
//
|
|
245
|
+
// 3. The runner credential (runnerTokenRef) authenticates the services
|
|
231
246
|
// that require a runner-class token_type claim: ExecutionContext
|
|
232
247
|
// reads carry decrypted secrets on cloud, and the server gates that
|
|
233
248
|
// decrypt on runner class + scope (stigmer-cloud#152/#155); the
|
|
@@ -239,13 +254,16 @@ export class StigmerClient {
|
|
|
239
254
|
// reserved-label guard and environment composer accept only from
|
|
240
255
|
// runner-class callers — a user-token create is rejected outright.
|
|
241
256
|
//
|
|
242
|
-
//
|
|
243
|
-
//
|
|
244
|
-
//
|
|
257
|
+
// 4. Everything else uses the control-plane token: the process
|
|
258
|
+
// credential, an operator's API key on a self-host. Falls through
|
|
259
|
+
// unchanged when no runner token exists.
|
|
245
260
|
(next) => async (req) => {
|
|
246
261
|
if (req.header.has("authorization")) {
|
|
247
262
|
return next(req);
|
|
248
263
|
}
|
|
264
|
+
const isProcessBound =
|
|
265
|
+
req.service.typeName === PlatformQueryController.typeName &&
|
|
266
|
+
req.method.name === PlatformQueryController.method.getRunnerBootstrapConfig.name;
|
|
249
267
|
const usesRunnerCredential =
|
|
250
268
|
req.service.typeName === ExecutionContextQueryController.typeName ||
|
|
251
269
|
(req.service.typeName === PlatformQueryController.typeName &&
|
|
@@ -253,7 +271,8 @@ export class StigmerClient {
|
|
|
253
271
|
(req.service.typeName === AgentExecutionCommandController.typeName &&
|
|
254
272
|
req.method.name === AgentExecutionCommandController.method.create.name);
|
|
255
273
|
const token =
|
|
256
|
-
(
|
|
274
|
+
(isProcessBound ? undefined : currentRunCredential())
|
|
275
|
+
?? (usesRunnerCredential ? this.runnerTokenRef?.current : null)
|
|
257
276
|
?? this.tokenRef?.current
|
|
258
277
|
?? this.currentToken;
|
|
259
278
|
if (token) {
|
|
@@ -363,11 +382,16 @@ export class StigmerClient {
|
|
|
363
382
|
* The call authenticates with the runner credential (see the interceptor).
|
|
364
383
|
* Cloud verifies it is an embedded_runner token and that its identity can
|
|
365
384
|
* view the named execution, then mints the same session/execution-scoped
|
|
366
|
-
* sandbox token a cloud sandbox runner receives at provisioning.
|
|
367
|
-
*
|
|
368
|
-
*
|
|
369
|
-
*
|
|
370
|
-
*
|
|
385
|
+
* sandbox token a cloud sandbox runner receives at provisioning. An
|
|
386
|
+
* open-source server with sign-in off mints an execution-scoped token for
|
|
387
|
+
* any caller (oss#535 — there it only unlocks the ExecutionContext decrypt
|
|
388
|
+
* lane); with sign-in on the same token admits its bearer as the run's
|
|
389
|
+
* human, so the exchange mints only for the run's own person (a missing
|
|
390
|
+
* run NOT_FOUND, anyone else PERMISSION_DENIED). Runs normally receive
|
|
391
|
+
* their credential from the dispatch itself (shared/run-credential.ts);
|
|
392
|
+
* this exchange is the fallback. Returns undefined when the server does
|
|
393
|
+
* not mint (pre-oss#535 OSS, or an unserved scope arm) — presence-based,
|
|
394
|
+
* like the bootstrap token fields.
|
|
371
395
|
*
|
|
372
396
|
* `callerToken` authenticates the exchange per-call instead of the
|
|
373
397
|
* process-wide runner credential. The warm-pool attach uses it: a pool
|
|
@@ -400,7 +424,13 @@ export class StigmerClient {
|
|
|
400
424
|
* Acquire a scoped runner token for an ExecutionContext read, if this
|
|
401
425
|
* runner's credential situation calls for one.
|
|
402
426
|
*
|
|
403
|
-
*
|
|
427
|
+
* When the activity this call belongs to carries a run credential (the
|
|
428
|
+
* server minted it for this very execution at dispatch —
|
|
429
|
+
* shared/run-credential.ts), that IS the scoped token: it is answered
|
|
430
|
+
* without an RPC, and the exchange below serves only a dispatch that
|
|
431
|
+
* carried none — an older server, or the cloud's provisioned runner.
|
|
432
|
+
*
|
|
433
|
+
* Otherwise the gate is the credential itself, three ways:
|
|
404
434
|
*
|
|
405
435
|
* 1. An unscoped embedded_runner bootstrap token MUST be exchanged, and a
|
|
406
436
|
* failed exchange is a hard error, not a fallback: since the #156
|
|
@@ -431,6 +461,10 @@ export class StigmerClient {
|
|
|
431
461
|
async acquireScopedRunnerToken(
|
|
432
462
|
scope: RunnerScopedTokenScope,
|
|
433
463
|
): Promise<string | undefined> {
|
|
464
|
+
const runCredential = currentRunCredential();
|
|
465
|
+
if (runCredential !== undefined) {
|
|
466
|
+
return runCredential;
|
|
467
|
+
}
|
|
434
468
|
// Inspect the same credential chain the EC read's interceptor would use.
|
|
435
469
|
const ambientTokenType = tokenTypeOf(
|
|
436
470
|
this.runnerTokenRef?.current ?? this.tokenRef?.current ?? this.currentToken,
|
package/src/config.ts
CHANGED
|
@@ -9,7 +9,10 @@
|
|
|
9
9
|
*
|
|
10
10
|
* 1. Direct mode (local / OSS):
|
|
11
11
|
* - CURSOR_API_KEY provided directly by the user (for Cursor harness).
|
|
12
|
-
* - STIGMER_TOKEN is optional
|
|
12
|
+
* - STIGMER_TOKEN is optional against a trusted-local server (it verifies
|
|
13
|
+
* no credential) and is the runner's own API key against a self-hosted
|
|
14
|
+
* server with sign-in on; each run's credential arrives with its
|
|
15
|
+
* dispatch (shared/run-credential.ts).
|
|
13
16
|
* - STIGMER_PROXY_ENDPOINT is NOT set.
|
|
14
17
|
*
|
|
15
18
|
* 2. Proxy mode (cloud / managed runners):
|
|
@@ -151,8 +154,8 @@ export interface Config {
|
|
|
151
154
|
* provides the proxy credential and mints no other, so
|
|
152
155
|
* `proxyTokenRef === stigmerTokenRef`), the manager binds the minted runner
|
|
153
156
|
* token (`proxyTokenRef === stigmerRunnerTokenRef`). Reading either sibling
|
|
154
|
-
* directly would send the wrong credential from one of the two roots
|
|
155
|
-
*
|
|
157
|
+
* directly would send the wrong credential from one of the two roots.
|
|
158
|
+
* Required whenever `proxyEndpoint` is set; the Cursor adapter's
|
|
156
159
|
* boot refuses a proxy without it.
|
|
157
160
|
*/
|
|
158
161
|
readonly proxyTokenRef?: { current: string | null };
|