@stigmer/runner 3.14.0 → 3.15.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/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 +268 -0
- package/dist/__test-utils__/hermetic-activity.js +385 -0
- package/dist/__test-utils__/hermetic-activity.js.map +1 -0
- package/dist/__test-utils__/mock-client.d.ts +13 -0
- package/dist/__test-utils__/mock-client.js +45 -0
- package/dist/__test-utils__/mock-client.js.map +1 -0
- 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 +148 -0
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js +257 -0
- package/dist/activities/execute-cursor/__test-utils__/hermetic-cursor.js.map +1 -0
- package/dist/activities/execute-cursor/__test-utils__/scripted-agent.d.ts +183 -0
- package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js +262 -0
- package/dist/activities/execute-cursor/__test-utils__/scripted-agent.js.map +1 -0
- package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.d.ts +138 -0
- package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.js +191 -0
- package/dist/activities/execute-cursor/__test-utils__/scripted-sdk.js.map +1 -0
- 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 +87 -0
- package/dist/harness/capabilities.js +37 -0
- package/dist/harness/capabilities.js.map +1 -0
- 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 +106 -0
- package/dist/harness/registry.js +168 -0
- package/dist/harness/registry.js.map +1 -0
- 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 +448 -0
- package/dist/harness/types.js +64 -0
- package/dist/harness/types.js.map +1 -0
- 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 +325 -0
- package/src/__test-utils__/config-fixture.ts +63 -0
- 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 +581 -0
- package/src/__test-utils__/harness-contract/recording-sink.ts +107 -0
- package/src/__test-utils__/harness-contract/runtime-contract.ts +666 -0
- package/src/__test-utils__/harness-contract/scripted-adapter.ts +349 -0
- package/src/__test-utils__/harness-contract/types.ts +176 -0
- package/src/__test-utils__/hermetic-activity.ts +502 -0
- package/src/__test-utils__/model-registry-fixture.ts +72 -0
- package/src/__test-utils__/module-specifiers.ts +82 -0
- package/src/__test-utils__/proto-helpers.ts +25 -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 +27 -0
- 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 +342 -0
- package/src/activities/execute-cursor/__test-utils__/scripted-agent.ts +368 -0
- package/src/activities/execute-cursor/__test-utils__/scripted-sdk.ts +254 -0
- 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 +228 -0
- package/src/activities/execute-cursor/__tests__/hermetic/file-review-capture.test.ts +180 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/cost-cap.status.json +53 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/deny-and-retry.turn1.status.json +55 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/deny-and-retry.turn2.status.json +77 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/file-review-capture.status.json +126 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/pause.status.json +40 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/plain-turn.status.json +48 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/platform-stop.status.json +56 -0
- package/src/activities/execute-cursor/__tests__/hermetic/goldens/recovery-fresh-agent.status.json +53 -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/tool-call.status.json +68 -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 +42 -0
- 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 +205 -0
- package/src/activities/execute-cursor/__tests__/hermetic/plain-turn.test.ts +171 -0
- package/src/activities/execute-cursor/__tests__/hermetic/recovery-fresh-agent.test.ts +156 -0
- 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 +137 -0
- 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 +168 -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 +92 -0
- package/src/harness/persist-chokepoint.ts +112 -0
- package/src/harness/registry.ts +197 -0
- 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 +473 -0
- 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,385 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hermetic activity driver — run a REAL runner activity end to end with no
|
|
3
|
+
* network, no credentials, and no live Temporal worker, and read back every
|
|
4
|
+
* status it persisted.
|
|
5
|
+
*
|
|
6
|
+
* Why this exists: the runner's activities (`ExecuteCursor`, `ExecuteDeepAgent`)
|
|
7
|
+
* are the wire contract the control plane's workflow keys on — the phases they
|
|
8
|
+
* persist, the copy they write, whether they RETURN a slim status or THROW
|
|
9
|
+
* `CancelledFailure`. Refactoring them safely needs goldens recorded through the
|
|
10
|
+
* activity whole, not through its modules one at a time. The native harness
|
|
11
|
+
* tests already run their activity hermetically by mocking three modules at the
|
|
12
|
+
* boundary (`execute-deep-agent/__tests__/{index,hitl-*,sequential-gate-resume}.test.ts`);
|
|
13
|
+
* this module is that convention made reusable, harness-agnostic, and driven by
|
|
14
|
+
* the framework's own activity environment instead of a hand-written stand-in.
|
|
15
|
+
*
|
|
16
|
+
* What is generic here and what is not: everything an activity touches that is
|
|
17
|
+
* NOT the vendor SDK — the Temporal `Context`, the control-plane client, the
|
|
18
|
+
* runner-owned `~/.stigmer` tree, artifact storage, the model registry, the
|
|
19
|
+
* clock, the worker-shutdown signal — is set up here. The vendor SDK double
|
|
20
|
+
* belongs to the harness (`activities/execute-cursor/__test-utils__/scripted-*.ts`),
|
|
21
|
+
* the same split as `approval-contract/` (runner-wide kit) + each harness's
|
|
22
|
+
* `gateway-substrate.ts`.
|
|
23
|
+
*
|
|
24
|
+
* Three substitutions, and why each is shaped the way it is:
|
|
25
|
+
*
|
|
26
|
+
* 1. `Context.current()` — `MockActivityEnvironment` from `@temporalio/testing`,
|
|
27
|
+
* ONE PER INVOCATION. It gives the activity a real `Context` (real
|
|
28
|
+
* `cancellationSignal`, real `heartbeat()` surfaced as events, real
|
|
29
|
+
* `CancelledFailure` on throw). The native tests' stand-in mints a fresh
|
|
30
|
+
* `AbortController` on every `Context.current()` call and so cannot drive a
|
|
31
|
+
* pause; production hands each attempt one `Context`, and so does this. The
|
|
32
|
+
* environment's documented caveat — once cancelled it stays cancelled — is
|
|
33
|
+
* why it is per invocation and never shared.
|
|
34
|
+
*
|
|
35
|
+
* 2. `StigmerClient` — the test file mocks the module (`vi.mock` is hoisted and
|
|
36
|
+
* must live in the test file; see {@link hermeticStigmerClientModule}) and
|
|
37
|
+
* the constructor hands back whatever client {@link bindHermeticClient} bound
|
|
38
|
+
* for the current run. The client is `mockStigmerClient` over an
|
|
39
|
+
* {@link ExecutionRecord}: `updateStatus` writes back into the record the way
|
|
40
|
+
* the server would, so a REINVOCATION (`threadId` set) reads the transcript
|
|
41
|
+
* the first invocation persisted — the resume path runs on real data, not on
|
|
42
|
+
* a hand-built status.
|
|
43
|
+
*
|
|
44
|
+
* 3. The environment — a temp `HOME` (the runner-owned `~/.stigmer` tree,
|
|
45
|
+
* `platform-dir.ts` reads `process.env.HOME`), a temp workspace root, local
|
|
46
|
+
* artifact storage in a temp dir, and the HITL fingerprint secret pinned by
|
|
47
|
+
* env var (`fingerprint-secret.ts` falls back to `randomBytes` — the ONE
|
|
48
|
+
* source of randomness on the activity path — and memoizes on first call, so
|
|
49
|
+
* the pin must precede the first invocation in the process).
|
|
50
|
+
*
|
|
51
|
+
* Determinism: the clock is faked for `Date` ONLY (`vi.useFakeTimers({ toFake:
|
|
52
|
+
* ["Date"] })`) and TICKS — the harness double advances it a fixed quantum per
|
|
53
|
+
* script step through {@link ScriptedClock}. Frozen time would make
|
|
54
|
+
* `delta-enricher.ts`'s persist debounce (`Date.now() - lastPersistTime`) never
|
|
55
|
+
* elapse and silently skip the mid-stream persist path production always runs;
|
|
56
|
+
* a ticking clock runs the same path and lands on the same instants every run.
|
|
57
|
+
* Timers stay real so the periodic heartbeat and the stall watchdog behave.
|
|
58
|
+
*
|
|
59
|
+
* Not in scope: this module never edits a production module and never
|
|
60
|
+
* normalizes output. If a golden is not byte-stable, the volatile source is
|
|
61
|
+
* controlled at its origin or the surprise is escalated — never redacted here.
|
|
62
|
+
*/
|
|
63
|
+
import { mkdtempSync, rmSync } from "node:fs";
|
|
64
|
+
import { tmpdir } from "node:os";
|
|
65
|
+
import { join } from "node:path";
|
|
66
|
+
import { vi } from "vitest";
|
|
67
|
+
import { MockActivityEnvironment } from "@temporalio/testing";
|
|
68
|
+
import { CancelledFailure } from "@temporalio/activity";
|
|
69
|
+
import { Code, ConnectError } from "@connectrpc/connect";
|
|
70
|
+
import { clone, create } from "@bufbuild/protobuf";
|
|
71
|
+
import { AgentExecutionSchema, AgentExecutionStatusSchema, } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
72
|
+
import { ExecutionControlSignal, ExecutionPhase, ToolCallStatus, } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
73
|
+
import { UpdateStatusResponseSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/io_pb";
|
|
74
|
+
import { SessionSchema } from "@stigmer/protos/ai/stigmer/agentic/session/v1/api_pb";
|
|
75
|
+
import { registerWorkerShutdownSignal, signalWorkerShutdown, unregisterWorkerShutdownSignal, } from "../shared/worker-shutdown.js";
|
|
76
|
+
import { mockStigmerClient } from "./mock-client.js";
|
|
77
|
+
/**
|
|
78
|
+
* An in-memory stand-in for the server's execution row, with the TWO merge
|
|
79
|
+
* rules and the ONE control lever the activity depends on, and no others:
|
|
80
|
+
*
|
|
81
|
+
* - A status whose phase is UNSPECIFIED is a setup-progress report
|
|
82
|
+
* (`reportSetupProgress`): the server keeps `setup_progress` and leaves the
|
|
83
|
+
* phase and transcript alone. Modelled as: record the label, change nothing else.
|
|
84
|
+
* - Any other status replaces the held status wholesale (the runner is the
|
|
85
|
+
* writer of the transcript; the server's own field-ownership merge — approval
|
|
86
|
+
* fields it owns — is exercised by the test SETTING `approvalAction` on the
|
|
87
|
+
* record between invocations, exactly as `SubmitApproval` would).
|
|
88
|
+
* - Every `UpdateStatus` answers a control signal ({@link ExecutionRecordInput.controlSignal});
|
|
89
|
+
* the server's STOP is the one instruction that travels back to the runner
|
|
90
|
+
* on this channel, and it is a server decision, so it is modelled here and
|
|
91
|
+
* not by the test hand-writing the client.
|
|
92
|
+
*
|
|
93
|
+
* Every persisted status is also kept in order (`persisted`) so a test can
|
|
94
|
+
* assert the phase sequence the activity wrote, independent of the final state.
|
|
95
|
+
*/
|
|
96
|
+
export class ExecutionRecord {
|
|
97
|
+
execution;
|
|
98
|
+
session;
|
|
99
|
+
agentInstance;
|
|
100
|
+
agent;
|
|
101
|
+
controlSignal;
|
|
102
|
+
/** Every `updateStatus` payload, in order, snapshotted at write time. */
|
|
103
|
+
persisted = [];
|
|
104
|
+
/** Setup-progress labels reported before the stream started, in order. */
|
|
105
|
+
setupProgress = [];
|
|
106
|
+
/**
|
|
107
|
+
* Every `updateSession` payload, in order (the `harness_state_id` write-back),
|
|
108
|
+
* snapshotted at write time: the activity re-binds the SAME session object on
|
|
109
|
+
* a fresh-agent recovery, so a live reference would show the second id twice.
|
|
110
|
+
*/
|
|
111
|
+
sessionUpdates = [];
|
|
112
|
+
constructor(input) {
|
|
113
|
+
this.execution = clone(AgentExecutionSchema, input.execution);
|
|
114
|
+
this.session = input.session;
|
|
115
|
+
this.agentInstance = input.agentInstance;
|
|
116
|
+
this.agent = input.agent;
|
|
117
|
+
this.controlSignal = input.controlSignal ?? (() => ExecutionControlSignal.UNSPECIFIED);
|
|
118
|
+
}
|
|
119
|
+
get executionId() {
|
|
120
|
+
return this.execution.metadata?.id ?? "";
|
|
121
|
+
}
|
|
122
|
+
/** The status the server would currently hold (what `getExecution` returns). */
|
|
123
|
+
get status() {
|
|
124
|
+
return this.execution.status;
|
|
125
|
+
}
|
|
126
|
+
/** The last FULL status written (phase set), or undefined if none yet. */
|
|
127
|
+
get lastFullStatus() {
|
|
128
|
+
for (let i = this.persisted.length - 1; i >= 0; i--) {
|
|
129
|
+
const s = this.persisted[i];
|
|
130
|
+
if (s.phase !== ExecutionPhase.EXECUTION_PHASE_UNSPECIFIED)
|
|
131
|
+
return s;
|
|
132
|
+
}
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* The ORDERED, DISTINCT phases the activity persisted — the deterministic
|
|
137
|
+
* shape of the persist cadence. The COUNT of persists depends on the
|
|
138
|
+
* debounce timer and is deliberately not exposed as an assertion surface.
|
|
139
|
+
*/
|
|
140
|
+
get persistedPhases() {
|
|
141
|
+
const out = [];
|
|
142
|
+
for (const s of this.persisted) {
|
|
143
|
+
if (s.phase === ExecutionPhase.EXECUTION_PHASE_UNSPECIFIED)
|
|
144
|
+
continue;
|
|
145
|
+
if (out[out.length - 1] !== s.phase)
|
|
146
|
+
out.push(s.phase);
|
|
147
|
+
}
|
|
148
|
+
return out;
|
|
149
|
+
}
|
|
150
|
+
/** Every tool call on the held transcript (top-level messages), in order. */
|
|
151
|
+
toolCalls() {
|
|
152
|
+
return this.execution.status?.messages.flatMap((m) => m.toolCalls) ?? [];
|
|
153
|
+
}
|
|
154
|
+
/** The tool calls currently paused for a decision. */
|
|
155
|
+
waitingToolCalls() {
|
|
156
|
+
return this.toolCalls().filter((tc) => tc.status === ToolCallStatus.TOOL_CALL_WAITING_APPROVAL);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* What the server's `SubmitApproval` does to the row: record the decision on
|
|
160
|
+
* the tool call the runner wrote. The runner owns `status`; the server owns
|
|
161
|
+
* `approval_action` (field ownership, 005 mandate 2) — so this is the ONE
|
|
162
|
+
* place a test writes it, and the status stays WAITING_APPROVAL until the
|
|
163
|
+
* resumed turn runs the tool, exactly as in production.
|
|
164
|
+
*/
|
|
165
|
+
decideWaitingToolCalls(action, decidedAt) {
|
|
166
|
+
const waiting = this.waitingToolCalls();
|
|
167
|
+
for (const tc of waiting) {
|
|
168
|
+
tc.approvalAction = action;
|
|
169
|
+
tc.approvalDecidedAt = decidedAt;
|
|
170
|
+
}
|
|
171
|
+
return waiting.length;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Apply one `UpdateStatus` write and answer the control signal the server
|
|
175
|
+
* would. A setup-progress report never carries a signal (the runner ignores
|
|
176
|
+
* the response there; the server has nothing to say about a label).
|
|
177
|
+
*/
|
|
178
|
+
applyStatusUpdate(status) {
|
|
179
|
+
const snapshot = clone(AgentExecutionStatusSchema, status);
|
|
180
|
+
this.persisted.push(snapshot);
|
|
181
|
+
if (snapshot.phase === ExecutionPhase.EXECUTION_PHASE_UNSPECIFIED) {
|
|
182
|
+
if (snapshot.setupProgress?.currentPhase) {
|
|
183
|
+
this.setupProgress.push(snapshot.setupProgress.currentPhase);
|
|
184
|
+
}
|
|
185
|
+
return ExecutionControlSignal.UNSPECIFIED;
|
|
186
|
+
}
|
|
187
|
+
this.execution.status = clone(AgentExecutionStatusSchema, snapshot);
|
|
188
|
+
return this.controlSignal(snapshot);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* The control-plane client the activity sees: every read answers from this
|
|
192
|
+
* record; every write lands in it. Reads the activity makes for optional
|
|
193
|
+
* facets (execution context, channels, skills) answer the everyday shape —
|
|
194
|
+
* NOT_FOUND for the execution context (an execution with no env vars), no
|
|
195
|
+
* channels, no scoped token (the OSS/local posture) — so a scenario opts INTO
|
|
196
|
+
* a facet by overriding.
|
|
197
|
+
*/
|
|
198
|
+
client(overrides = {}) {
|
|
199
|
+
return mockStigmerClient({
|
|
200
|
+
getExecution: vi.fn(async () => clone(AgentExecutionSchema, this.execution)),
|
|
201
|
+
getSession: vi.fn(async () => this.session),
|
|
202
|
+
getAgentInstance: vi.fn(async () => this.agentInstance),
|
|
203
|
+
getAgent: vi.fn(async () => this.agent),
|
|
204
|
+
updateStatus: vi.fn(async (_id, status) => {
|
|
205
|
+
// The activity reads only `.signal`; UNSPECIFIED means "keep going".
|
|
206
|
+
return create(UpdateStatusResponseSchema, { signal: this.applyStatusUpdate(status) });
|
|
207
|
+
}),
|
|
208
|
+
updateSession: vi.fn(async (session) => {
|
|
209
|
+
this.sessionUpdates.push(clone(SessionSchema, session));
|
|
210
|
+
return session;
|
|
211
|
+
}),
|
|
212
|
+
getExecutionContextByExecutionId: vi.fn(async () => {
|
|
213
|
+
throw new ConnectError("execution context not found", Code.NotFound);
|
|
214
|
+
}),
|
|
215
|
+
...overrides,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// ---------------------------------------------------------------------------
|
|
220
|
+
// The module-boundary seam for StigmerClient
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
222
|
+
let boundClient;
|
|
223
|
+
/**
|
|
224
|
+
* Bind the client the mocked `StigmerClient` constructor hands out for the
|
|
225
|
+
* current run. Called by the harness driver immediately before invoking the
|
|
226
|
+
* activity factory (`createCursorActivities(config)` constructs its client
|
|
227
|
+
* inside the factory, so the bind must precede the factory call).
|
|
228
|
+
*/
|
|
229
|
+
export function bindHermeticClient(client) {
|
|
230
|
+
boundClient = client;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* The factory a test passes to `vi.mock(".../client/stigmer-client.js", ...)`.
|
|
234
|
+
* `vi.mock` is hoisted and must appear in the test file itself; the factory can
|
|
235
|
+
* `await import()` this module. Usage:
|
|
236
|
+
*
|
|
237
|
+
* ```ts
|
|
238
|
+
* vi.mock("../../../../client/stigmer-client.js", async () =>
|
|
239
|
+
* (await import("../../../../__test-utils__/hermetic-activity.js")).hermeticStigmerClientModule(),
|
|
240
|
+
* );
|
|
241
|
+
* ```
|
|
242
|
+
*/
|
|
243
|
+
export function hermeticStigmerClientModule() {
|
|
244
|
+
return {
|
|
245
|
+
StigmerClient: class {
|
|
246
|
+
constructor() {
|
|
247
|
+
if (!boundClient) {
|
|
248
|
+
throw new Error("hermetic-activity: no StigmerClient bound — call bindHermeticClient(record.client()) " +
|
|
249
|
+
"before constructing the activities");
|
|
250
|
+
}
|
|
251
|
+
return boundClient;
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
// ---------------------------------------------------------------------------
|
|
257
|
+
// The environment: temp HOME, temp workspace root, local artifact storage
|
|
258
|
+
// ---------------------------------------------------------------------------
|
|
259
|
+
/**
|
|
260
|
+
* The env-var pins a hermetic run needs, and the reason for each:
|
|
261
|
+
* - `HOME`: `platform-dir.ts` roots the runner-owned `~/.stigmer` tree (HITL
|
|
262
|
+
* gate dir, session dirs, denial ledger) on it.
|
|
263
|
+
* - `ARTIFACT_STORAGE_TYPE=local` + `LOCAL_ARTIFACT_PATH`: a writable local
|
|
264
|
+
* store so capture mode and tool-output offload run the production path
|
|
265
|
+
* (an absent store flips capture off — a different code path).
|
|
266
|
+
* - `STIGMER_RUNNER_HITL_SECRET`: the one randomness source on the activity
|
|
267
|
+
* path, pinned so grant tokens and fingerprints are byte-stable.
|
|
268
|
+
* - `CURSOR_EVENT_RECORD_DIR` cleared: never write recordings from a test.
|
|
269
|
+
*/
|
|
270
|
+
const PINNED_ENV = {
|
|
271
|
+
ARTIFACT_STORAGE_TYPE: "local",
|
|
272
|
+
STIGMER_RUNNER_HITL_SECRET: "hermetic-fixture-secret-do-not-use-in-production",
|
|
273
|
+
};
|
|
274
|
+
const CLEARED_ENV = ["CURSOR_EVENT_RECORD_DIR", "STIGMER_PROXY_ENDPOINT", "STIGMER_CLOUD_API_URL"];
|
|
275
|
+
/**
|
|
276
|
+
* Create the temp tree and pin the env vars. Call once per test FILE (in
|
|
277
|
+
* `beforeAll`) — the fingerprint secret is memoized per process on first use,
|
|
278
|
+
* and vitest isolates files in forks, so per-file is the natural unit.
|
|
279
|
+
*/
|
|
280
|
+
export function createHermeticEnvironment() {
|
|
281
|
+
const root = mkdtempSync(join(tmpdir(), "stigmer-hermetic-"));
|
|
282
|
+
const home = join(root, "home");
|
|
283
|
+
const workspaceRootDir = join(root, "workspaces");
|
|
284
|
+
const artifactPath = join(root, "artifacts");
|
|
285
|
+
const saved = new Map();
|
|
286
|
+
const set = (key, value) => {
|
|
287
|
+
if (!saved.has(key))
|
|
288
|
+
saved.set(key, process.env[key]);
|
|
289
|
+
if (value === undefined)
|
|
290
|
+
delete process.env[key];
|
|
291
|
+
else
|
|
292
|
+
process.env[key] = value;
|
|
293
|
+
};
|
|
294
|
+
set("HOME", home);
|
|
295
|
+
set("LOCAL_ARTIFACT_PATH", artifactPath);
|
|
296
|
+
for (const [k, v] of Object.entries(PINNED_ENV))
|
|
297
|
+
set(k, v);
|
|
298
|
+
for (const k of CLEARED_ENV)
|
|
299
|
+
set(k, undefined);
|
|
300
|
+
let disposed = false;
|
|
301
|
+
return {
|
|
302
|
+
home,
|
|
303
|
+
workspaceRootDir,
|
|
304
|
+
artifactPath,
|
|
305
|
+
dispose() {
|
|
306
|
+
if (disposed)
|
|
307
|
+
return;
|
|
308
|
+
disposed = true;
|
|
309
|
+
for (const [k, v] of saved) {
|
|
310
|
+
if (v === undefined)
|
|
311
|
+
delete process.env[k];
|
|
312
|
+
else
|
|
313
|
+
process.env[k] = v;
|
|
314
|
+
}
|
|
315
|
+
rmSync(root, { recursive: true, force: true });
|
|
316
|
+
},
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
// ---------------------------------------------------------------------------
|
|
320
|
+
// The clock
|
|
321
|
+
// ---------------------------------------------------------------------------
|
|
322
|
+
/**
|
|
323
|
+
* A deterministic, TICKING `Date`. Only `Date` is faked; timers stay real (the
|
|
324
|
+
* periodic heartbeat, the stall watchdog, `withTimeout` all need them). The
|
|
325
|
+
* harness double calls {@link ScriptedClock.tick} once per script step, so
|
|
326
|
+
* every `Date.now()`-based decision on the activity path (status timestamps,
|
|
327
|
+
* the enricher's persist debounce, cache TTLs) sees the same instants run after
|
|
328
|
+
* run and runs the same branches production runs.
|
|
329
|
+
*/
|
|
330
|
+
export class ScriptedClock {
|
|
331
|
+
/** A fixed epoch: 2026-01-01T00:00:00.000Z. Chosen for readability in goldens. */
|
|
332
|
+
static EPOCH_MS = Date.UTC(2026, 0, 1, 0, 0, 0, 0);
|
|
333
|
+
/** One second per step — well under any stall or cache horizon. */
|
|
334
|
+
static STEP_MS = 1_000;
|
|
335
|
+
nowMs = ScriptedClock.EPOCH_MS;
|
|
336
|
+
install() {
|
|
337
|
+
vi.useFakeTimers({ toFake: ["Date"], now: this.nowMs });
|
|
338
|
+
}
|
|
339
|
+
tick(ms = ScriptedClock.STEP_MS) {
|
|
340
|
+
this.nowMs += ms;
|
|
341
|
+
vi.setSystemTime(this.nowMs);
|
|
342
|
+
}
|
|
343
|
+
/** Back to the epoch — for a second scenario in the same file. */
|
|
344
|
+
reset() {
|
|
345
|
+
this.nowMs = ScriptedClock.EPOCH_MS;
|
|
346
|
+
vi.setSystemTime(this.nowMs);
|
|
347
|
+
}
|
|
348
|
+
uninstall() {
|
|
349
|
+
vi.useRealTimers();
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Run one activity function under a fresh `MockActivityEnvironment` and
|
|
354
|
+
* capture how it ended. `CancelledFailure` is caught like any other throw and
|
|
355
|
+
* reported as `{ kind: "threw" }` — the throw-vs-return table is the thing
|
|
356
|
+
* under test, so the driver never interprets it.
|
|
357
|
+
*/
|
|
358
|
+
export async function runActivityHermetically(activity, args, options = {}) {
|
|
359
|
+
const taskQueue = options.taskQueue ?? "hermetic-test-queue";
|
|
360
|
+
const env = new MockActivityEnvironment({ taskQueue });
|
|
361
|
+
const heartbeats = [];
|
|
362
|
+
env.on("heartbeat", (details) => heartbeats.push(details));
|
|
363
|
+
// The worker-shutdown signal is process-global per queue; register for this
|
|
364
|
+
// invocation and always unregister so no state leaks into the next one.
|
|
365
|
+
registerWorkerShutdownSignal(taskQueue);
|
|
366
|
+
options.onControls?.({
|
|
367
|
+
cancel: () => env.cancel(),
|
|
368
|
+
signalWorkerShutdown: () => signalWorkerShutdown(taskQueue),
|
|
369
|
+
});
|
|
370
|
+
try {
|
|
371
|
+
const value = await env.run(activity, ...args);
|
|
372
|
+
return { outcome: { kind: "returned", value }, heartbeats, taskQueue };
|
|
373
|
+
}
|
|
374
|
+
catch (error) {
|
|
375
|
+
return { outcome: { kind: "threw", error }, heartbeats, taskQueue };
|
|
376
|
+
}
|
|
377
|
+
finally {
|
|
378
|
+
unregisterWorkerShutdownSignal(taskQueue);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
/** True when the outcome is a thrown Temporal `CancelledFailure`. */
|
|
382
|
+
export function threwCancelledFailure(outcome) {
|
|
383
|
+
return outcome.kind === "threw" && outcome.error instanceof CancelledFailure;
|
|
384
|
+
}
|
|
385
|
+
//# sourceMappingURL=hermetic-activity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hermetic-activity.js","sourceRoot":"","sources":["../../src/__test-utils__/hermetic-activity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared mock factory for StigmerClient used across test suites.
|
|
3
|
+
*
|
|
4
|
+
* StigmerClient is a class (not an interface), so mocks use
|
|
5
|
+
* `as unknown as StigmerClient` — matching the established pattern
|
|
6
|
+
* in grpc-retry.test.ts and connect-backfill.test.ts.
|
|
7
|
+
*/
|
|
8
|
+
import type { StigmerClient } from "../client/stigmer-client.js";
|
|
9
|
+
type MockMethods = {
|
|
10
|
+
[K in keyof StigmerClient]?: StigmerClient[K];
|
|
11
|
+
};
|
|
12
|
+
export declare function mockStigmerClient(overrides?: MockMethods): StigmerClient;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared mock factory for StigmerClient used across test suites.
|
|
3
|
+
*
|
|
4
|
+
* StigmerClient is a class (not an interface), so mocks use
|
|
5
|
+
* `as unknown as StigmerClient` — matching the established pattern
|
|
6
|
+
* in grpc-retry.test.ts and connect-backfill.test.ts.
|
|
7
|
+
*/
|
|
8
|
+
import { vi } from "vitest";
|
|
9
|
+
import { ExecutionControlSignal } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
10
|
+
export function mockStigmerClient(overrides = {}) {
|
|
11
|
+
return {
|
|
12
|
+
updateStatus: vi.fn().mockResolvedValue({
|
|
13
|
+
signal: ExecutionControlSignal.UNSPECIFIED,
|
|
14
|
+
}),
|
|
15
|
+
getExecution: vi.fn().mockResolvedValue({}),
|
|
16
|
+
getExecutionContextByExecutionId: vi.fn().mockResolvedValue({}),
|
|
17
|
+
// No scoped token by default — the OSS/local shape (no runner credential).
|
|
18
|
+
acquireScopedRunnerToken: vi.fn().mockResolvedValue(undefined),
|
|
19
|
+
getRunnerScopedToken: vi.fn().mockResolvedValue(undefined),
|
|
20
|
+
getSession: vi.fn().mockResolvedValue({}),
|
|
21
|
+
updateSession: vi.fn().mockResolvedValue({}),
|
|
22
|
+
// No proactive channels by default — the everyday answer for most
|
|
23
|
+
// agents (DD-006 D2); tests opt in to a channel-bound agent.
|
|
24
|
+
listMessagingChannels: vi.fn().mockResolvedValue([]),
|
|
25
|
+
listChannelTemplates: vi.fn().mockResolvedValue([]),
|
|
26
|
+
getAgent: vi.fn().mockResolvedValue({}),
|
|
27
|
+
getAgentInstance: vi.fn().mockResolvedValue({}),
|
|
28
|
+
getMcpServer: vi.fn().mockResolvedValue({}),
|
|
29
|
+
getMcpServerByReference: vi.fn().mockResolvedValue({}),
|
|
30
|
+
connectMcpServer: vi.fn().mockResolvedValue({}),
|
|
31
|
+
getSkill: vi.fn().mockResolvedValue({}),
|
|
32
|
+
getSkillByReference: vi.fn().mockResolvedValue({}),
|
|
33
|
+
getSkillArtifact: vi.fn().mockResolvedValue({}),
|
|
34
|
+
recordLlmCallUsage: vi.fn().mockResolvedValue({}),
|
|
35
|
+
getWorkflowExecution: vi.fn().mockResolvedValue({}),
|
|
36
|
+
getWorkflow: vi.fn().mockResolvedValue({}),
|
|
37
|
+
getWorkflowInstance: vi.fn().mockResolvedValue({}),
|
|
38
|
+
updateWorkflowExecutionStatus: vi.fn().mockResolvedValue({}),
|
|
39
|
+
getAgentByReference: vi.fn().mockResolvedValue({}),
|
|
40
|
+
createSession: vi.fn().mockResolvedValue({}),
|
|
41
|
+
createAgentExecution: vi.fn().mockResolvedValue({}),
|
|
42
|
+
...overrides,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=mock-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-client.js","sourceRoot":"","sources":["../../src/__test-utils__/mock-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,8DAA8D,CAAC;AAOtG,MAAM,UAAU,iBAAiB,CAAC,YAAyB,EAAE;IAC3D,OAAO;QACL,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YACtC,MAAM,EAAE,sBAAsB,CAAC,WAAW;SAC3C,CAAC;QACF,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC3C,gCAAgC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC/D,2EAA2E;QAC3E,wBAAwB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAC9D,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAC1D,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACzC,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC5C,kEAAkE;QAClE,6DAA6D;QAC7D,qBAAqB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACpD,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACnD,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACvC,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC/C,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC3C,uBAAuB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACtD,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC/C,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACvC,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAClD,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC/C,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACjD,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACnD,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC1C,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAClD,6BAA6B,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC5D,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAClD,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC5C,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACnD,GAAG,SAAS;KACe,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared mock factory for WorkspaceBackend used across test suites.
|
|
3
|
+
*
|
|
4
|
+
* Returns a typed mock that satisfies the WorkspaceBackend interface.
|
|
5
|
+
* Individual tests can override specific methods via the overrides param
|
|
6
|
+
* or by reassigning the mock after creation.
|
|
7
|
+
*/
|
|
8
|
+
import type { WorkspaceBackend } from "../shared/workspace/types.js";
|
|
9
|
+
type MockOverrides = {
|
|
10
|
+
[K in keyof Omit<WorkspaceBackend, "rootDir">]?: WorkspaceBackend[K];
|
|
11
|
+
} & {
|
|
12
|
+
rootDir?: string;
|
|
13
|
+
};
|
|
14
|
+
export declare function mockWorkspaceBackend(overrides?: MockOverrides): WorkspaceBackend;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared mock factory for WorkspaceBackend used across test suites.
|
|
3
|
+
*
|
|
4
|
+
* Returns a typed mock that satisfies the WorkspaceBackend interface.
|
|
5
|
+
* Individual tests can override specific methods via the overrides param
|
|
6
|
+
* or by reassigning the mock after creation.
|
|
7
|
+
*/
|
|
8
|
+
import { vi } from "vitest";
|
|
9
|
+
export function mockWorkspaceBackend(overrides = {}) {
|
|
10
|
+
const { rootDir = "/tmp/test-workspace", ...methodOverrides } = overrides;
|
|
11
|
+
return {
|
|
12
|
+
rootDir,
|
|
13
|
+
execute: vi.fn().mockResolvedValue(""),
|
|
14
|
+
readFile: vi.fn().mockResolvedValue(""),
|
|
15
|
+
writeFile: vi.fn().mockResolvedValue(undefined),
|
|
16
|
+
writeFileBuffer: vi.fn().mockResolvedValue(undefined),
|
|
17
|
+
exists: vi.fn().mockResolvedValue(false),
|
|
18
|
+
...methodOverrides,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=mock-workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-workspace.js","sourceRoot":"","sources":["../../src/__test-utils__/mock-workspace.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAO5B,MAAM,UAAU,oBAAoB,CAAC,YAA2B,EAAE;IAChE,MAAM,EAAE,OAAO,GAAG,qBAAqB,EAAE,GAAG,eAAe,EAAE,GAAG,SAAS,CAAC;IAE1E,OAAO;QACL,OAAO;QACP,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACtC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACvC,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAC/C,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QACrD,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC;QACxC,GAAG,eAAe;KACnB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The model registry document a hermetic activity run reads, and the `fetch`
|
|
3
|
+
* stub that serves it and refuses everything else.
|
|
4
|
+
*
|
|
5
|
+
* The activity's only HTTP fetch is the model registry (`shared/model-
|
|
6
|
+
* registry.ts` for vision capability; the Cursor harness's `model-pricing-
|
|
7
|
+
* data.ts` for pricing). Both fail SOFT to defaults with a 60 s failure
|
|
8
|
+
* cache, which would make a golden depend on DEFAULT_PRICING and log a
|
|
9
|
+
* warning on every run, so a hermetic run stubs `fetch` to answer one
|
|
10
|
+
* registry document — and to THROW for any other URL, so a new network
|
|
11
|
+
* dependency on the activity path fails the run instead of leaking.
|
|
12
|
+
*
|
|
13
|
+
* One entry, `composer-2.5`, priced at round numbers so a golden's
|
|
14
|
+
* `estimatedCostUsd` is legible (600 000 input tokens = $0.60). The entry is
|
|
15
|
+
* a Cursor-harness model because that is what the registry lists; the
|
|
16
|
+
* document itself is the control plane's, read by every harness's runtime.
|
|
17
|
+
* `parsePricingTable` wants `harness: "cursor"` + `pricing`; `parseRegistry`
|
|
18
|
+
* wants `id` + `provider` and reads `capabilities.vision`.
|
|
19
|
+
*/
|
|
20
|
+
/** The pinned model of every hermetic run; in the registry document AND in the Cursor double's catalog. */
|
|
21
|
+
export declare const FIXTURE_MODEL = "composer-2.5";
|
|
22
|
+
export declare const REGISTRY_DOCUMENT: {
|
|
23
|
+
readonly models: readonly [{
|
|
24
|
+
readonly id: "composer-2.5";
|
|
25
|
+
readonly displayName: "Composer 2.5 (hermetic fixture)";
|
|
26
|
+
readonly provider: "cursor";
|
|
27
|
+
readonly harness: "cursor";
|
|
28
|
+
readonly costTier: "standard";
|
|
29
|
+
readonly featured: true;
|
|
30
|
+
readonly capabilities: {
|
|
31
|
+
readonly vision: true;
|
|
32
|
+
};
|
|
33
|
+
readonly pricing: {
|
|
34
|
+
readonly inputPricePerMillion: 1;
|
|
35
|
+
readonly outputPricePerMillion: 4;
|
|
36
|
+
readonly cacheWritePricePerMillion: 1;
|
|
37
|
+
readonly cacheReadPricePerMillion: 0.1;
|
|
38
|
+
};
|
|
39
|
+
readonly pricingVariants: {
|
|
40
|
+
readonly fast: {
|
|
41
|
+
readonly inputPricePerMillion: 3;
|
|
42
|
+
readonly outputPricePerMillion: 12;
|
|
43
|
+
readonly cacheWritePricePerMillion: 3;
|
|
44
|
+
readonly cacheReadPricePerMillion: 0.3;
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
}];
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Stub `fetch` to answer the registry document and refuse everything else.
|
|
51
|
+
* Returns the URLs fetched, for the "no other network" assertion.
|
|
52
|
+
*/
|
|
53
|
+
export declare function stubRegistryFetch(): {
|
|
54
|
+
readonly urls: string[];
|
|
55
|
+
restore(): void;
|
|
56
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The model registry document a hermetic activity run reads, and the `fetch`
|
|
3
|
+
* stub that serves it and refuses everything else.
|
|
4
|
+
*
|
|
5
|
+
* The activity's only HTTP fetch is the model registry (`shared/model-
|
|
6
|
+
* registry.ts` for vision capability; the Cursor harness's `model-pricing-
|
|
7
|
+
* data.ts` for pricing). Both fail SOFT to defaults with a 60 s failure
|
|
8
|
+
* cache, which would make a golden depend on DEFAULT_PRICING and log a
|
|
9
|
+
* warning on every run, so a hermetic run stubs `fetch` to answer one
|
|
10
|
+
* registry document — and to THROW for any other URL, so a new network
|
|
11
|
+
* dependency on the activity path fails the run instead of leaking.
|
|
12
|
+
*
|
|
13
|
+
* One entry, `composer-2.5`, priced at round numbers so a golden's
|
|
14
|
+
* `estimatedCostUsd` is legible (600 000 input tokens = $0.60). The entry is
|
|
15
|
+
* a Cursor-harness model because that is what the registry lists; the
|
|
16
|
+
* document itself is the control plane's, read by every harness's runtime.
|
|
17
|
+
* `parsePricingTable` wants `harness: "cursor"` + `pricing`; `parseRegistry`
|
|
18
|
+
* wants `id` + `provider` and reads `capabilities.vision`.
|
|
19
|
+
*/
|
|
20
|
+
import { vi } from "vitest";
|
|
21
|
+
/** The pinned model of every hermetic run; in the registry document AND in the Cursor double's catalog. */
|
|
22
|
+
export const FIXTURE_MODEL = "composer-2.5";
|
|
23
|
+
export const REGISTRY_DOCUMENT = {
|
|
24
|
+
models: [
|
|
25
|
+
{
|
|
26
|
+
id: FIXTURE_MODEL,
|
|
27
|
+
displayName: "Composer 2.5 (hermetic fixture)",
|
|
28
|
+
provider: "cursor",
|
|
29
|
+
harness: "cursor",
|
|
30
|
+
costTier: "standard",
|
|
31
|
+
featured: true,
|
|
32
|
+
capabilities: { vision: true },
|
|
33
|
+
pricing: {
|
|
34
|
+
inputPricePerMillion: 1.0,
|
|
35
|
+
outputPricePerMillion: 4.0,
|
|
36
|
+
cacheWritePricePerMillion: 1.0,
|
|
37
|
+
cacheReadPricePerMillion: 0.1,
|
|
38
|
+
},
|
|
39
|
+
pricingVariants: {
|
|
40
|
+
fast: {
|
|
41
|
+
inputPricePerMillion: 3.0,
|
|
42
|
+
outputPricePerMillion: 12.0,
|
|
43
|
+
cacheWritePricePerMillion: 3.0,
|
|
44
|
+
cacheReadPricePerMillion: 0.3,
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Stub `fetch` to answer the registry document and refuse everything else.
|
|
52
|
+
* Returns the URLs fetched, for the "no other network" assertion.
|
|
53
|
+
*/
|
|
54
|
+
export function stubRegistryFetch() {
|
|
55
|
+
const urls = [];
|
|
56
|
+
vi.stubGlobal("fetch", vi.fn(async (input) => {
|
|
57
|
+
const url = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
|
|
58
|
+
urls.push(url);
|
|
59
|
+
if (!url.includes("/model-registry")) {
|
|
60
|
+
throw new Error(`hermetic run attempted a non-registry network call: ${url}`);
|
|
61
|
+
}
|
|
62
|
+
return { ok: true, status: 200, json: async () => REGISTRY_DOCUMENT };
|
|
63
|
+
}));
|
|
64
|
+
return { urls, restore: () => vi.unstubAllGlobals() };
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=model-registry-fixture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-registry-fixture.js","sourceRoot":"","sources":["../../src/__test-utils__/model-registry-fixture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE5B,2GAA2G;AAC3G,MAAM,CAAC,MAAM,aAAa,GAAG,cAAc,CAAC;AAE5C,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,MAAM,EAAE;QACN;YACE,EAAE,EAAE,aAAa;YACjB,WAAW,EAAE,iCAAiC;YAC9C,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,QAAQ;YACjB,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;YAC9B,OAAO,EAAE;gBACP,oBAAoB,EAAE,GAAG;gBACzB,qBAAqB,EAAE,GAAG;gBAC1B,yBAAyB,EAAE,GAAG;gBAC9B,wBAAwB,EAAE,GAAG;aAC9B;YACD,eAAe,EAAE;gBACf,IAAI,EAAE;oBACJ,oBAAoB,EAAE,GAAG;oBACzB,qBAAqB,EAAE,IAAI;oBAC3B,yBAAyB,EAAE,GAAG;oBAC9B,wBAAwB,EAAE,GAAG;iBAC9B;aACF;SACF;KACF;CACO,CAAC;AAEX;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,EAAE,CAAC,UAAU,CACX,OAAO,EACP,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,KAA6B,EAAE,EAAE;QAC5C,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;QACpG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,uDAAuD,GAAG,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,iBAAiB,EAAyB,CAAC;IAC/F,CAAC,CAAC,CACH,CAAC;IACF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,gBAAgB,EAAE,EAAE,CAAC;AACxD,CAAC"}
|