@stigmer/runner 3.14.1 → 3.15.1
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/dist/.build-fingerprint +1 -1
- package/dist/__test-utils__/execution-record-fixture.d.ts +47 -0
- package/dist/__test-utils__/execution-record-fixture.js +68 -0
- package/dist/__test-utils__/execution-record-fixture.js.map +1 -0
- package/dist/__test-utils__/harness-contract/types.d.ts +166 -0
- package/dist/__test-utils__/harness-contract/types.js +49 -0
- package/dist/__test-utils__/harness-contract/types.js.map +1 -0
- package/dist/__test-utils__/hermetic-activity.d.ts +28 -5
- package/dist/__test-utils__/hermetic-activity.js +23 -7
- package/dist/__test-utils__/hermetic-activity.js.map +1 -1
- package/dist/__test-utils__/mock-workspace.d.ts +15 -0
- package/dist/__test-utils__/mock-workspace.js +21 -0
- package/dist/__test-utils__/mock-workspace.js.map +1 -0
- package/dist/__test-utils__/model-registry-fixture.d.ts +56 -0
- package/dist/__test-utils__/model-registry-fixture.js +66 -0
- package/dist/__test-utils__/model-registry-fixture.js.map +1 -0
- package/dist/__test-utils__/turn-input-fixture.d.ts +60 -0
- package/dist/__test-utils__/turn-input-fixture.js +118 -0
- package/dist/__test-utils__/turn-input-fixture.js.map +1 -0
- package/dist/activities/execute-cursor/__test-utils__/contract-subject.d.ts +107 -0
- package/dist/activities/execute-cursor/__test-utils__/contract-subject.js +344 -0
- package/dist/activities/execute-cursor/__test-utils__/contract-subject.js.map +1 -0
- package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.d.ts +20 -0
- package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.js +58 -0
- package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.js +2 -32
- package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.d.ts +38 -62
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js +47 -121
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/scripted-agent.d.ts +17 -1
- package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js +27 -4
- package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.d.ts +52 -11
- package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.js +66 -7
- package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.js.map +1 -1
- package/dist/activities/execute-cursor/adapter.d.ts +55 -0
- package/dist/activities/execute-cursor/adapter.js +119 -0
- package/dist/activities/execute-cursor/adapter.js.map +1 -0
- package/dist/activities/execute-cursor/approval-state.d.ts +2 -2
- package/dist/activities/execute-cursor/approval-state.js.map +1 -1
- package/dist/activities/execute-cursor/capture-flow.d.ts +15 -30
- package/dist/activities/execute-cursor/capture-flow.js +17 -26
- package/dist/activities/execute-cursor/capture-flow.js.map +1 -1
- package/dist/activities/execute-cursor/cursor-capabilities.d.ts +23 -0
- package/dist/activities/execute-cursor/cursor-capabilities.js +33 -0
- package/dist/activities/execute-cursor/cursor-capabilities.js.map +1 -0
- package/dist/activities/execute-cursor/cursor-mcp-config.d.ts +2 -2
- package/dist/activities/execute-cursor/cursor-mcp-config.js.map +1 -1
- package/dist/activities/execute-cursor/fetch-interceptor.d.ts +15 -25
- package/dist/activities/execute-cursor/fetch-interceptor.js +39 -33
- package/dist/activities/execute-cursor/fetch-interceptor.js.map +1 -1
- package/dist/activities/execute-cursor/http2-interceptor.d.ts +21 -17
- package/dist/activities/execute-cursor/http2-interceptor.js +38 -31
- package/dist/activities/execute-cursor/http2-interceptor.js.map +1 -1
- package/dist/activities/execute-cursor/message-translator.d.ts +28 -19
- package/dist/activities/execute-cursor/message-translator.js +76 -27
- package/dist/activities/execute-cursor/message-translator.js.map +1 -1
- package/dist/activities/execute-cursor/prompt-builder.d.ts +180 -11
- package/dist/activities/execute-cursor/prompt-builder.js +171 -0
- package/dist/activities/execute-cursor/prompt-builder.js.map +1 -1
- package/dist/activities/execute-cursor/rejection-capture.d.ts +3 -6
- package/dist/activities/execute-cursor/rejection-capture.js +5 -7
- package/dist/activities/execute-cursor/rejection-capture.js.map +1 -1
- package/dist/activities/execute-cursor/session-lifecycle.d.ts +1 -4
- package/dist/activities/execute-cursor/session-lifecycle.js.map +1 -1
- package/dist/activities/execute-cursor/turn-boundary.d.ts +1 -1
- package/dist/activities/execute-cursor/turn-settle.d.ts +49 -0
- package/dist/activities/execute-cursor/turn-settle.js +507 -0
- package/dist/activities/execute-cursor/turn-settle.js.map +1 -0
- package/dist/activities/execute-cursor/turn-setup.d.ts +173 -0
- package/dist/activities/execute-cursor/turn-setup.js +496 -0
- package/dist/activities/execute-cursor/turn-setup.js.map +1 -0
- package/dist/activities/execute-cursor/turn-stream.d.ts +41 -71
- package/dist/activities/execute-cursor/turn-stream.js +70 -135
- package/dist/activities/execute-cursor/turn-stream.js.map +1 -1
- package/dist/activities/execute-cursor/turn.d.ts +43 -0
- package/dist/activities/execute-cursor/turn.js +222 -0
- package/dist/activities/execute-cursor/turn.js.map +1 -0
- package/dist/activities/execute-cursor/usage-pricing.d.ts +38 -0
- package/dist/activities/execute-cursor/usage-pricing.js +50 -0
- package/dist/activities/execute-cursor/usage-pricing.js.map +1 -0
- package/dist/activities/execute-deep-agent/approval-file-change.d.ts +1 -1
- package/dist/activities/execute-deep-agent/approval-file-change.js +1 -1
- package/dist/activities/execute-deep-agent/environment.js +1 -1
- package/dist/activities/execute-deep-agent/environment.js.map +1 -1
- package/dist/activities/execute-deep-agent/setup.js +3 -2
- package/dist/activities/execute-deep-agent/setup.js.map +1 -1
- package/dist/activities/hydrate-workflow-execution.js +1 -1
- package/dist/activities/hydrate-workflow-execution.js.map +1 -1
- package/dist/config.d.ts +15 -0
- package/dist/config.js.map +1 -1
- package/dist/harness/capabilities.d.ts +16 -0
- package/dist/harness/capabilities.js +1 -0
- package/dist/harness/capabilities.js.map +1 -1
- package/dist/harness/persist-chokepoint.d.ts +74 -0
- package/dist/harness/persist-chokepoint.js +88 -0
- package/dist/harness/persist-chokepoint.js.map +1 -0
- package/dist/harness/registry.d.ts +44 -5
- package/dist/harness/registry.js +61 -5
- package/dist/harness/registry.js.map +1 -1
- package/dist/harness/run-turn.d.ts +53 -0
- package/dist/harness/run-turn.js +528 -0
- package/dist/harness/run-turn.js.map +1 -0
- package/dist/harness/stop-controller.d.ts +50 -0
- package/dist/harness/stop-controller.js +62 -0
- package/dist/harness/stop-controller.js.map +1 -0
- package/dist/harness/terminal-table.d.ts +141 -0
- package/dist/harness/terminal-table.js +239 -0
- package/dist/harness/terminal-table.js.map +1 -0
- package/dist/harness/turn-context.d.ts +523 -0
- package/dist/harness/turn-context.js +739 -0
- package/dist/harness/turn-context.js.map +1 -0
- package/dist/harness/types.d.ts +232 -52
- package/dist/harness/types.js +17 -8
- package/dist/harness/types.js.map +1 -1
- package/dist/harness/usage-accumulator.d.ts +68 -0
- package/dist/harness/usage-accumulator.js +101 -0
- package/dist/harness/usage-accumulator.js.map +1 -0
- package/dist/harness-adapters.d.ts +27 -0
- package/dist/harness-adapters.js +28 -0
- package/dist/harness-adapters.js.map +1 -0
- package/dist/main.js.map +1 -1
- package/dist/runner-manager.js +64 -48
- package/dist/runner-manager.js.map +1 -1
- package/dist/runner.d.ts +5 -4
- package/dist/runner.js +65 -64
- package/dist/runner.js.map +1 -1
- package/dist/shared/approval-policy.d.ts +1 -1
- package/dist/shared/approval-policy.js.map +1 -1
- package/dist/{activities/execute-cursor → shared}/attachment-resolver.d.ts +2 -2
- package/dist/{activities/execute-cursor → shared}/attachment-resolver.js +5 -5
- package/dist/shared/attachment-resolver.js.map +1 -0
- package/dist/{activities/execute-cursor → shared}/blueprint-resolver.d.ts +7 -5
- package/dist/{activities/execute-cursor → shared}/blueprint-resolver.js +3 -63
- package/dist/shared/blueprint-resolver.js.map +1 -0
- package/dist/shared/channel-attachment.d.ts +1 -1
- package/dist/shared/channel-attachment.js.map +1 -1
- package/dist/{activities/execute-cursor → shared}/cost-guard.d.ts +5 -1
- package/dist/{activities/execute-cursor → shared}/cost-guard.js +5 -1
- package/dist/shared/cost-guard.js.map +1 -0
- package/dist/{activities/execute-cursor → shared}/env-resolver.d.ts +1 -1
- package/dist/shared/env-resolver.js.map +1 -0
- package/dist/{activities/execute-cursor → shared}/exact-apply.d.ts +1 -1
- package/dist/{activities/execute-cursor → shared}/exact-apply.js +6 -6
- package/dist/shared/exact-apply.js.map +1 -0
- package/dist/shared/execution-context.d.ts +35 -0
- package/dist/shared/execution-context.js +38 -0
- package/dist/shared/execution-context.js.map +1 -0
- package/dist/{activities/execute-cursor → shared}/extract-structured-output.d.ts +5 -2
- package/dist/{activities/execute-cursor → shared}/extract-structured-output.js +9 -6
- package/dist/shared/extract-structured-output.js.map +1 -0
- package/dist/shared/filereview/capture.d.ts +1 -1
- package/dist/shared/filereview/capture.js +1 -1
- package/dist/shared/heartbeat.d.ts +13 -11
- package/dist/shared/heartbeat.js +14 -29
- package/dist/shared/heartbeat.js.map +1 -1
- package/dist/{activities/execute-cursor → shared}/persist-decision.d.ts +5 -2
- package/dist/{activities/execute-cursor → shared}/persist-decision.js +4 -1
- package/dist/shared/persist-decision.js.map +1 -0
- package/dist/{activities/execute-cursor → shared}/skill-resolver.d.ts +16 -3
- package/dist/{activities/execute-cursor → shared}/skill-resolver.js +12 -4
- package/dist/shared/skill-resolver.js.map +1 -0
- package/dist/shared/subagent-rows.d.ts +21 -0
- package/dist/shared/subagent-rows.js +34 -0
- package/dist/shared/subagent-rows.js.map +1 -0
- package/dist/shared/worker-shutdown.d.ts +43 -16
- package/dist/shared/worker-shutdown.js +28 -13
- package/dist/shared/worker-shutdown.js.map +1 -1
- package/dist/shared/workspace/platform-dir.d.ts +1 -1
- package/dist/shared/workspace/platform-dir.js +1 -1
- package/dist/shared/workspace/session-provision.d.ts +54 -0
- package/dist/{activities/execute-cursor/workspace-provision.js → shared/workspace/session-provision.js} +15 -12
- package/dist/shared/workspace/session-provision.js.map +1 -0
- package/package.json +4 -4
- package/src/__test-utils__/__tests__/harness-contract-self-check.test.ts +110 -14
- package/src/__test-utils__/execution-record-fixture.ts +104 -0
- package/src/__test-utils__/harness-boot-order-child.ts +58 -0
- package/src/__test-utils__/harness-contract/contract.ts +128 -83
- package/src/__test-utils__/harness-contract/recording-sink.ts +15 -4
- package/src/__test-utils__/harness-contract/runtime-contract.ts +666 -0
- package/src/__test-utils__/harness-contract/scripted-adapter.ts +92 -32
- package/src/__test-utils__/harness-contract/types.ts +85 -9
- package/src/__test-utils__/hermetic-activity.ts +33 -8
- package/src/__test-utils__/model-registry-fixture.ts +72 -0
- package/src/__test-utils__/module-specifiers.ts +82 -0
- package/src/__test-utils__/turn-input-fixture.ts +155 -0
- package/src/__tests__/harness-boot-order.test.ts +77 -0
- package/src/__tests__/harness-contract.test.ts +7 -5
- package/src/__tests__/runner-manager.test.ts +18 -0
- package/src/activities/execute-cursor/__test-utils__/__tests__/scripted-double.test.ts +102 -0
- package/src/activities/execute-cursor/__test-utils__/contract-subject.ts +396 -0
- package/src/activities/execute-cursor/__test-utils__/cursor-hook-harness.ts +66 -0
- package/src/activities/execute-cursor/__test-utils__/gateway-substrate.ts +2 -43
- package/src/activities/execute-cursor/__test-utils__/hermetic-cursor.ts +65 -145
- package/src/activities/execute-cursor/__test-utils__/scripted-agent.ts +30 -4
- package/src/activities/execute-cursor/__test-utils__/scripted-sdk.ts +96 -8
- package/src/activities/execute-cursor/__tests__/adapter-is-temporal-free.test.ts +45 -0
- package/src/activities/execute-cursor/__tests__/approval-decisions-agree.test.ts +90 -0
- package/src/activities/execute-cursor/__tests__/build-prompt.test.ts +7 -8
- package/src/activities/execute-cursor/__tests__/capture-flow.test.ts +28 -1
- package/src/activities/execute-cursor/__tests__/deny-gate-exact-apply.test.ts +1 -1
- package/src/activities/execute-cursor/__tests__/fetch-interceptor.test.ts +64 -6
- 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/cost-cap.status.json +53 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/pause.status.json +1 -6
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/platform-stop.status.json +56 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/recovery-transport-timeout.status.json +48 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/resolution-error.status.json +18 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/run-cancelled.status.json +36 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/run-error-non-retryable.status.json +37 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/sdk-error-at-create.status.json +38 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/stall.status.json +59 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/unattributed-hook-block.status.json +79 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/worker-shutdown.status.json +2 -7
- package/src/activities/execute-cursor/__tests__/hermetic/harness-contract.test.ts +170 -0
- package/src/activities/execute-cursor/__tests__/hermetic/pause-vs-shutdown.test.ts +22 -18
- package/src/activities/execute-cursor/__tests__/hermetic/plain-turn.test.ts +1 -1
- package/src/activities/execute-cursor/__tests__/hermetic/recovery-fresh-agent.test.ts +1 -1
- package/src/activities/execute-cursor/__tests__/hermetic/run-wait-arms.test.ts +286 -0
- package/src/activities/execute-cursor/__tests__/hermetic/stream-self-stop-arms.test.ts +332 -0
- package/src/activities/execute-cursor/__tests__/hermetic/thrown-error-arms.test.ts +193 -0
- package/src/activities/execute-cursor/__tests__/hermetic/tool-call.test.ts +1 -1
- package/src/activities/execute-cursor/__tests__/hermetic/unattributed-hook-block.test.ts +185 -0
- package/src/activities/execute-cursor/__tests__/hermetic/workspace-lock-timeout.test.ts +151 -0
- package/src/activities/execute-cursor/__tests__/http2-interceptor.test.ts +65 -35
- package/src/activities/execute-cursor/__tests__/message-translator.test.ts +0 -40
- package/src/activities/execute-cursor/__tests__/same-identity-reproposal.test.ts +171 -0
- package/src/activities/execute-cursor/__tests__/turn-stream.test.ts +118 -243
- package/src/activities/execute-cursor/__tests__/usage-pricing.test.ts +84 -0
- package/src/activities/execute-cursor/adapter.ts +138 -0
- package/src/activities/execute-cursor/approval-state.ts +2 -2
- package/src/activities/execute-cursor/capture-flow.ts +18 -41
- package/src/activities/execute-cursor/cursor-capabilities.ts +35 -0
- package/src/activities/execute-cursor/cursor-mcp-config.ts +2 -2
- package/src/activities/execute-cursor/fetch-interceptor.ts +48 -45
- package/src/activities/execute-cursor/http2-interceptor.ts +47 -34
- package/src/activities/execute-cursor/message-translator.ts +90 -45
- package/src/activities/execute-cursor/prompt-builder.ts +327 -12
- package/src/activities/execute-cursor/rejection-capture.ts +5 -12
- package/src/activities/execute-cursor/session-lifecycle.ts +1 -5
- package/src/activities/execute-cursor/turn-boundary.ts +1 -1
- package/src/activities/execute-cursor/turn-settle.ts +601 -0
- package/src/activities/execute-cursor/turn-setup.ts +645 -0
- package/src/activities/execute-cursor/turn-stream.ts +84 -210
- package/src/activities/execute-cursor/turn.ts +240 -0
- package/src/activities/execute-cursor/usage-pricing.ts +67 -0
- package/src/activities/execute-deep-agent/approval-file-change.ts +1 -1
- package/src/activities/execute-deep-agent/environment.ts +1 -1
- package/src/activities/execute-deep-agent/setup.ts +3 -2
- package/src/activities/hydrate-workflow-execution.ts +1 -1
- package/src/config.ts +13 -0
- package/src/harness/__tests__/import-direction.test.ts +168 -0
- package/src/harness/__tests__/persist-chokepoint.test.ts +146 -0
- package/src/harness/__tests__/registry.test.ts +1 -0
- package/src/harness/__tests__/run-turn.test.ts +165 -0
- package/src/harness/__tests__/stop-controller.test.ts +49 -0
- package/src/harness/__tests__/turn-context.test.ts +178 -0
- package/src/harness/__tests__/usage-accumulator.test.ts +83 -0
- package/src/harness/capabilities.ts +17 -0
- package/src/harness/persist-chokepoint.ts +112 -0
- package/src/harness/registry.ts +79 -5
- package/src/harness/run-turn.ts +618 -0
- package/src/harness/stop-controller.ts +83 -0
- package/src/harness/terminal-table.ts +276 -0
- package/src/harness/turn-context.ts +1028 -0
- package/src/harness/types.ts +248 -53
- package/src/harness/usage-accumulator.ts +122 -0
- package/src/harness-adapters.ts +30 -0
- package/src/main.ts +1 -1
- package/src/runner-manager.ts +68 -61
- package/src/runner.ts +67 -78
- package/src/shared/__tests__/attachment-naming.test.ts +1 -1
- package/src/{activities/execute-cursor → shared}/__tests__/attachment-resolver.test.ts +6 -4
- package/src/{activities/execute-cursor → shared}/__tests__/cost-guard.test.ts +2 -1
- package/src/{activities/execute-cursor → shared}/__tests__/exact-apply.test.ts +3 -3
- package/src/{activities/execute-cursor → shared}/__tests__/extract-structured-output.test.ts +8 -8
- package/src/{activities/execute-cursor → shared}/__tests__/persist-decision.test.ts +4 -2
- package/src/{activities/execute-cursor → shared}/__tests__/skill-resolver.test.ts +1 -1
- package/src/shared/__tests__/subagent-rows.test.ts +34 -0
- package/src/shared/__tests__/worker-shutdown.test.ts +44 -39
- package/src/shared/approval-policy.ts +1 -1
- package/src/{activities/execute-cursor → shared}/attachment-resolver.ts +6 -6
- package/src/{activities/execute-cursor → shared}/blueprint-resolver.ts +7 -78
- package/src/shared/channel-attachment.ts +1 -1
- package/src/{activities/execute-cursor → shared}/cost-guard.ts +5 -1
- package/src/{activities/execute-cursor → shared}/env-resolver.ts +1 -1
- package/src/{activities/execute-cursor → shared}/exact-apply.ts +7 -7
- package/src/shared/execution-context.ts +45 -0
- package/src/{activities/execute-cursor → shared}/extract-structured-output.ts +10 -7
- package/src/shared/filereview/capture.ts +1 -1
- package/src/shared/heartbeat.ts +13 -33
- package/src/{activities/execute-cursor → shared}/persist-decision.ts +5 -2
- package/src/{activities/execute-cursor → shared}/skill-resolver.ts +20 -6
- package/src/shared/subagent-rows.ts +39 -0
- package/src/shared/worker-shutdown.ts +55 -25
- package/src/{activities/execute-cursor/__tests__/workspace-provision.test.ts → shared/workspace/__tests__/session-provision.test.ts} +25 -28
- package/src/shared/workspace/platform-dir.ts +1 -1
- package/src/{activities/execute-cursor/workspace-provision.ts → shared/workspace/session-provision.ts} +29 -16
- package/dist/activities/execute-cursor/attachment-resolver.js.map +0 -1
- package/dist/activities/execute-cursor/blueprint-resolver.js.map +0 -1
- package/dist/activities/execute-cursor/cost-guard.js.map +0 -1
- package/dist/activities/execute-cursor/env-resolver.js.map +0 -1
- package/dist/activities/execute-cursor/exact-apply.js.map +0 -1
- package/dist/activities/execute-cursor/extract-structured-output.js.map +0 -1
- package/dist/activities/execute-cursor/index.d.ts +0 -209
- package/dist/activities/execute-cursor/index.js +0 -2345
- package/dist/activities/execute-cursor/index.js.map +0 -1
- package/dist/activities/execute-cursor/persist-decision.js.map +0 -1
- package/dist/activities/execute-cursor/skill-resolver.js.map +0 -1
- package/dist/activities/execute-cursor/usage-accumulator.d.ts +0 -89
- package/dist/activities/execute-cursor/usage-accumulator.js +0 -121
- package/dist/activities/execute-cursor/usage-accumulator.js.map +0 -1
- package/dist/activities/execute-cursor/workspace-provision.d.ts +0 -42
- package/dist/activities/execute-cursor/workspace-provision.js.map +0 -1
- package/src/activities/execute-cursor/__tests__/usage-accumulator.test.ts +0 -164
- package/src/activities/execute-cursor/index.ts +0 -2876
- package/src/activities/execute-cursor/usage-accumulator.ts +0 -169
- /package/dist/{activities/execute-cursor → shared}/env-resolver.js +0 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The turn runtime's single persist chokepoint: every write of the
|
|
3
|
+
* execution status during a turn — the adapter's streaming requests, the
|
|
4
|
+
* runtime's own terminal writes — goes through here and nowhere else, so
|
|
5
|
+
* the guards that must never be skipped cannot be skipped by a call site
|
|
6
|
+
* that forgot them.
|
|
7
|
+
*
|
|
8
|
+
* What one write does, in order:
|
|
9
|
+
* 1. The never-persist-secret backstop (DD-26 #2): content is withheld from
|
|
10
|
+
* any built-in write row targeting a secret-like path, top-level and
|
|
11
|
+
* sub-agent. The single airtight choke point for a deny-gate harness and
|
|
12
|
+
* the only guarantee under `auto_approve_all`. Idempotent.
|
|
13
|
+
* 2. `streaming_usage` is refreshed from the accumulator when it has turns,
|
|
14
|
+
* so the summary the UI shows is the one the write carries.
|
|
15
|
+
* 3. `persistStatus` (`shared/status.ts`): tool-output offload, the
|
|
16
|
+
* aggregate size cap, transient retry, oversize recovery. Never rejects.
|
|
17
|
+
* 4. A Temporal heartbeat, so a long streaming turn's liveness is proven by
|
|
18
|
+
* the writes it makes (Q-S2-10).
|
|
19
|
+
* 5. The control plane's answer: STOP becomes the runtime's platform-stop
|
|
20
|
+
* cause on the stop controller, which aborts the adapter's signal.
|
|
21
|
+
*
|
|
22
|
+
* Single-flight with coalescing: an adapter's `requestPersist()` while a
|
|
23
|
+
* write is in flight does not start a second concurrent write (two writes of
|
|
24
|
+
* one status racing on the wire is the drift the chokepoint exists to
|
|
25
|
+
* prevent); it schedules ONE follow-up write after the current one lands,
|
|
26
|
+
* and resolves when that follow-up has. The promise it returns therefore
|
|
27
|
+
* always means "the state as of my request is on the control plane", which
|
|
28
|
+
* is what lets the Cursor loop await it and see a STOP before it pulls the
|
|
29
|
+
* next event, exactly as its own inline persist did (Q-M3-2).
|
|
30
|
+
*
|
|
31
|
+
* The runtime's terminal writes use the same path (`write()`), so the
|
|
32
|
+
* secret backstop and the usage summary ride the final status too, as they
|
|
33
|
+
* did when the orchestrator's `persist` closure was the one place to write.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
import { create } from "@bufbuild/protobuf";
|
|
37
|
+
import type { AgentExecutionStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
38
|
+
import { ExecutionControlSignal } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
39
|
+
import { StreamingUsageSummarySchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/usage_pb";
|
|
40
|
+
|
|
41
|
+
import type { StigmerClient } from "../client/stigmer-client.js";
|
|
42
|
+
import { persistStatus } from "../shared/status.js";
|
|
43
|
+
import type { ToolOutputOffloadContext } from "../shared/status-offload.js";
|
|
44
|
+
import { withholdSecretContentFromMessages } from "../shared/tool-row.js";
|
|
45
|
+
import type { UsageAccumulator } from "./usage-accumulator.js";
|
|
46
|
+
|
|
47
|
+
export interface PersistChokepointDeps {
|
|
48
|
+
readonly client: StigmerClient;
|
|
49
|
+
readonly executionId: string;
|
|
50
|
+
readonly status: AgentExecutionStatus;
|
|
51
|
+
/** Present when artifact storage resolved; enables tool-output offload on every write. */
|
|
52
|
+
readonly offload: ToolOutputOffloadContext | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* The accumulator, read at WRITE time: it exists only once the runtime has
|
|
55
|
+
* the turn's model preferences, after resolution, so it arrives as a thunk
|
|
56
|
+
* and is `undefined` for a write made before then (no usage yet anyway).
|
|
57
|
+
*/
|
|
58
|
+
readonly usage: () => UsageAccumulator | undefined;
|
|
59
|
+
/** The Temporal heartbeat, pulsed after each write. */
|
|
60
|
+
readonly heartbeat: () => void;
|
|
61
|
+
/** The control plane answered STOP to this write. */
|
|
62
|
+
readonly onPlatformStop: () => void;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export class PersistChokepoint {
|
|
66
|
+
private inFlight: Promise<void> | undefined;
|
|
67
|
+
private followUp: Promise<void> | undefined;
|
|
68
|
+
|
|
69
|
+
constructor(private readonly deps: PersistChokepointDeps) {}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* The adapter's `requestPersist()`: a write now, or one follow-up write
|
|
73
|
+
* after the in-flight one. Resolves when the state as of this call has
|
|
74
|
+
* been written. Never rejects.
|
|
75
|
+
*/
|
|
76
|
+
request(): Promise<void> {
|
|
77
|
+
if (this.inFlight === undefined) {
|
|
78
|
+
const write = this.write().finally(() => {
|
|
79
|
+
this.inFlight = undefined;
|
|
80
|
+
});
|
|
81
|
+
this.inFlight = write;
|
|
82
|
+
return write;
|
|
83
|
+
}
|
|
84
|
+
if (this.followUp === undefined) {
|
|
85
|
+
this.followUp = this.inFlight.then(() => {
|
|
86
|
+
this.followUp = undefined;
|
|
87
|
+
return this.request();
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return this.followUp;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* One write, now. The runtime's own writes (a settlement, a terminal
|
|
95
|
+
* status) call this directly: they run when no adapter write can be in
|
|
96
|
+
* flight (before `runTurn` or after it settled), so they need no
|
|
97
|
+
* coalescing, and they must not be deferred behind one.
|
|
98
|
+
*/
|
|
99
|
+
async write(): Promise<void> {
|
|
100
|
+
const { client, executionId, status, offload, heartbeat } = this.deps;
|
|
101
|
+
withholdSecretContentFromMessages(status.messages, status.subAgentExecutions);
|
|
102
|
+
const usage = this.deps.usage();
|
|
103
|
+
if (usage?.hasTurns) {
|
|
104
|
+
status.streamingUsage = create(StreamingUsageSummarySchema, usage.snapshot());
|
|
105
|
+
}
|
|
106
|
+
const signal = await persistStatus(client, executionId, status, { offload });
|
|
107
|
+
heartbeat();
|
|
108
|
+
if (signal === ExecutionControlSignal.STOP) {
|
|
109
|
+
this.deps.onPlatformStop();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
package/src/harness/registry.ts
CHANGED
|
@@ -19,19 +19,35 @@
|
|
|
19
19
|
* one `AggregateError` at the end naming each failure, so one bad teardown
|
|
20
20
|
* never leaks the others' resources.
|
|
21
21
|
*
|
|
22
|
-
*
|
|
23
|
-
* runtime
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
22
|
+
* `createHarnessActivities` binds each row to its Temporal activity over the
|
|
23
|
+
* turn runtime (`run-turn.ts`). The table of real rows is NOT here: it lives
|
|
24
|
+
* at the source root (`src/harness-adapters.ts`), because a row imports its
|
|
25
|
+
* adapter from `activities/` and nothing under `src/harness/` may
|
|
26
|
+
* (`__tests__/import-direction.test.ts`; Q-M3-1). The registry knows rows,
|
|
27
|
+
* never which adapters exist.
|
|
27
28
|
*
|
|
28
29
|
* `HarnessName` lives here and not in `types.ts` on purpose: the wire
|
|
29
30
|
* vocabulary is the registry's concern. An adapter never declares the
|
|
30
31
|
* activity it is bound to (its `name` is a diagnostic identity); the registry
|
|
31
32
|
* row does.
|
|
33
|
+
*
|
|
34
|
+
* THIS MODULE'S STATIC GRAPH MUST STAY CONNECT-FREE. Both composition roots
|
|
35
|
+
* import it BEFORE they boot the harnesses, and the Cursor adapter's boot
|
|
36
|
+
* patches `node:http2` (its HTTP/2 auth interceptor); a static import of
|
|
37
|
+
* anything that loads `@connectrpc/connect-node` here would snapshot the
|
|
38
|
+
* `node:http2` ESM facade to the unpatched `connect` before that boot ran,
|
|
39
|
+
* and every BiDi stream would silently 401. So `StigmerClient` is loaded
|
|
40
|
+
* with a dynamic import inside `createHarnessActivities`, the runner's
|
|
41
|
+
* dynamic-import-for-order convention (`bootstrap.ts` documents the same
|
|
42
|
+
* omission for the same reason). `__tests__/harness-boot-order.test.ts`
|
|
43
|
+
* boots a fresh process through this module and fails if the facade froze.
|
|
32
44
|
*/
|
|
33
45
|
|
|
34
46
|
import type { Config } from "../config.js";
|
|
47
|
+
import type { StigmerClient } from "../client/stigmer-client.js";
|
|
48
|
+
import { activityFinished, activityStarted } from "../idle-watchdog.js";
|
|
49
|
+
import { normalizeActivityInput, type ExecuteActivityInput } from "../shared/activity-input.js";
|
|
50
|
+
import { runTurnActivity } from "./run-turn.js";
|
|
35
51
|
import type { HarnessAdapter } from "./types.js";
|
|
36
52
|
|
|
37
53
|
/** The harnesses the control plane can dispatch to, as the registry knows them. */
|
|
@@ -51,6 +67,64 @@ export const HARNESS_ACTIVITY_NAMES = {
|
|
|
51
67
|
|
|
52
68
|
export type HarnessActivityName = (typeof HARNESS_ACTIVITY_NAMES)[HarnessName];
|
|
53
69
|
|
|
70
|
+
/** One harness the worker serves: the wire name it answers to and the adapter that runs its turns. */
|
|
71
|
+
export interface HarnessRow {
|
|
72
|
+
readonly harness: HarnessName;
|
|
73
|
+
readonly adapter: HarnessAdapter;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* The legacy positional activity signature, kept as the wire shape both
|
|
78
|
+
* control planes send until they both send the typed object
|
|
79
|
+
* (`shared/activity-input.ts`). Every harness's activity has it.
|
|
80
|
+
*/
|
|
81
|
+
export type HarnessActivity = (arg0: ExecuteActivityInput | string, arg1?: string) => Promise<unknown>;
|
|
82
|
+
|
|
83
|
+
/** The adapters of a row list, for the lifecycle functions below. */
|
|
84
|
+
export function adaptersOf(rows: readonly HarnessRow[]): HarnessAdapter[] {
|
|
85
|
+
return rows.map((row) => row.adapter);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* One Temporal activity per row, under the row's byte-pinned name, over ONE
|
|
90
|
+
* `StigmerClient` for all of them (each harness used to build its own). The
|
|
91
|
+
* activity normalizes the wire input, brackets the turn with the idle
|
|
92
|
+
* watchdog, and hands the turn runtime the adapter. The roots spread the
|
|
93
|
+
* result into the worker's activity map beside the activities the runtime
|
|
94
|
+
* does not own.
|
|
95
|
+
*
|
|
96
|
+
* Async because the client is loaded here, not at the top of the module (see
|
|
97
|
+
* the header): the roots call this after the harnesses have booted, when
|
|
98
|
+
* connect-node may load.
|
|
99
|
+
*/
|
|
100
|
+
export async function createHarnessActivities(
|
|
101
|
+
rows: readonly HarnessRow[],
|
|
102
|
+
config: Config,
|
|
103
|
+
): Promise<Partial<Record<HarnessActivityName, HarnessActivity>>> {
|
|
104
|
+
const { StigmerClient } = await import("../client/stigmer-client.js");
|
|
105
|
+
const client: StigmerClient = new StigmerClient({
|
|
106
|
+
endpoint: config.stigmerBackendEndpoint,
|
|
107
|
+
token: config.stigmerToken,
|
|
108
|
+
tokenRef: config.stigmerTokenRef,
|
|
109
|
+
runnerTokenRef: config.stigmerRunnerTokenRef,
|
|
110
|
+
});
|
|
111
|
+
const activities: Partial<Record<HarnessActivityName, HarnessActivity>> = {};
|
|
112
|
+
for (const row of rows) {
|
|
113
|
+
const activityName = HARNESS_ACTIVITY_NAMES[row.harness];
|
|
114
|
+
const deps = { adapter: row.adapter, activityName, client, config };
|
|
115
|
+
activities[activityName] = async (arg0, arg1) => {
|
|
116
|
+
const input = normalizeActivityInput(arg0, arg1);
|
|
117
|
+
activityStarted();
|
|
118
|
+
try {
|
|
119
|
+
return await runTurnActivity(deps, input);
|
|
120
|
+
} finally {
|
|
121
|
+
activityFinished();
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
return activities;
|
|
126
|
+
}
|
|
127
|
+
|
|
54
128
|
/**
|
|
55
129
|
* Refuse a table two of whose adapters share a name. Names are the registry's
|
|
56
130
|
* identity for diagnostics and for this check; a duplicate means two adapters
|