@stigmer/runner 3.14.1 → 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 +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,344 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Cursor harness as a `HarnessContractSubject` — the REAL `createCursorAdapter()`
|
|
3
|
+
* driven through the harness contract kit, with the kit's engine-neutral
|
|
4
|
+
* scenario vocabulary translated onto S0's scripted `@cursor/sdk` double.
|
|
5
|
+
*
|
|
6
|
+
* The sibling of `gateway-substrate.ts` (the Cursor side of the approval
|
|
7
|
+
* contract kit): the kit owns the invariants and the runtime stand-in, this
|
|
8
|
+
* module owns the ENGINE — what the next turn of a session's agent will do —
|
|
9
|
+
* and reports what the double observed. The adapter under test is the
|
|
10
|
+
* production one, untouched; it imports no `@temporalio/*` (the fence test
|
|
11
|
+
* pins that), which is what lets the kit run it outside any activity
|
|
12
|
+
* context.
|
|
13
|
+
*
|
|
14
|
+
* ── The engine is per session ───────────────────────────────────────────────
|
|
15
|
+
* One scripted agent per session, minted when the kit first arranges a turn
|
|
16
|
+
* for it and handed out by the double's `Agent.create` for THAT session (keyed
|
|
17
|
+
* by the SDK's `platform.workspaceRef`, computed the way the adapter computes
|
|
18
|
+
* it), then parked by the real session cache across turns exactly as in a live
|
|
19
|
+
* worker. Arranging a turn REPLACES the agent's next script, so a turn the
|
|
20
|
+
* adapter interrupts before its `send()` leaves no stale script for the
|
|
21
|
+
* session's next turn. Every session also gets the workspace directory the
|
|
22
|
+
* runtime's provisioner would give it (`<workspaceRootDir>/sessions/<id>`), so
|
|
23
|
+
* both halves of the kit gate in the same directory shape; the hook's
|
|
24
|
+
* active-turn pointer is per workspace, so concurrent sessions cannot repoint
|
|
25
|
+
* each other's hook.
|
|
26
|
+
*
|
|
27
|
+
* ── The translation, one rule per word ──────────────────────────────────────
|
|
28
|
+
* - `say(text)` → an `assistant` event. A first send opens with the
|
|
29
|
+
* `system/init` event; a resumed send does not (the
|
|
30
|
+
* `deny-and-retry` turn-2 script is the precedent).
|
|
31
|
+
* - `propose(id, a)` → the STREAM tool call (`edit` / `shell` / `delete`, the
|
|
32
|
+
* kits' shared translation in `cursor-hook-harness.ts`),
|
|
33
|
+
* an `effect` that runs the REAL preToolUse hook the
|
|
34
|
+
* adapter installed against the session's workspace,
|
|
35
|
+
* and the call's completion event. `executionCount(id)`
|
|
36
|
+
* is the hook's `allow` answers for `id` — the SDK
|
|
37
|
+
* executes a tool iff the hook allows it, so this is the
|
|
38
|
+
* safety-critical observable. WHETHER the call is
|
|
39
|
+
* emitted is decided from the kit's view and this
|
|
40
|
+
* subject's own memory, as the model and the SDK would
|
|
41
|
+
* decide it (see {@link CursorContractSubject.proposeSteps}).
|
|
42
|
+
* - `read(id, path)` → the `read` tool call, the REAL hook (which allows it —
|
|
43
|
+
* a read is never gated) and the completion; counted as
|
|
44
|
+
* run. The discrete event the adapter's loop flushes a
|
|
45
|
+
* persist on.
|
|
46
|
+
* - `usage(delta)` → a `turn-ended` delta; the adapter prices it.
|
|
47
|
+
* - `hang` → an `effect` parked on the run's own `cancelled`
|
|
48
|
+
* status, which the adapter's stop-signal listener
|
|
49
|
+
* (`turn-stream.ts` `cancelOnStop`) produces. Never a
|
|
50
|
+
* timer. Resolves `whenHanging`.
|
|
51
|
+
* - `fail(msg, s)` → `engine`: the run ends `{ status: "error" }` and
|
|
52
|
+
* `run.wait()` carries the message; `internal`: an
|
|
53
|
+
* `effect` throws mid-stream (the adapter's catch
|
|
54
|
+
* classifies it). `actionable` is refused as a test bug:
|
|
55
|
+
* only the unattributed-hook-block path produces that
|
|
56
|
+
* surface, and the kit's invariants do not ask for it.
|
|
57
|
+
* - `cancelled` → an `effect` calling `run.cancel()` from the SDK side
|
|
58
|
+
* (the `run-cancelled` golden's shape).
|
|
59
|
+
* Every script that does not end in `fail`, `cancelled` or `hang` closes with
|
|
60
|
+
* `finished({ result: <last say> })` so `run.wait()` has an answer.
|
|
61
|
+
*
|
|
62
|
+
* ── Two modelling decisions (S2 M4, Q-M4-4) ─────────────────────────────────
|
|
63
|
+
* A `propose` for an id this subject has already seen the hook ALLOW emits
|
|
64
|
+
* nothing: the real SDK does not re-run a completed tool on resume — the parked
|
|
65
|
+
* agent's conversation already holds the tool's result. A `propose` whose id
|
|
66
|
+
* carries a SKIP or REJECT decision emits nothing either: the resume prompt
|
|
67
|
+
* tells the model the user declined the action and an obedient model moves
|
|
68
|
+
* on. Both are what "the engine re-reaches the same call" and "the turn
|
|
69
|
+
* continues" MEAN for a deny-and-retry harness; neither hides anything from
|
|
70
|
+
* the safety observable, because a fresh identical command from a
|
|
71
|
+
* disobedient model IS a new gated act and Cursor re-gates it — the subject
|
|
72
|
+
* file proves that with {@link CursorContractSubject.forceReissue}.
|
|
73
|
+
*
|
|
74
|
+
* The completion event a `propose` emits is scripted from the answer the hook
|
|
75
|
+
* is EXPECTED to give (deny for an undecided proposal, allow for an approved
|
|
76
|
+
* re-issue); the hook's actual answer is recorded at effect time and any
|
|
77
|
+
* disagreement is kept in {@link CursorContractSubject.hookDisagreements} for
|
|
78
|
+
* the subject file to assert empty — a hook that allows an undecided action
|
|
79
|
+
* would show up there AND in `executionCount`, never be papered over.
|
|
80
|
+
*/
|
|
81
|
+
import { mkdirSync } from "node:fs";
|
|
82
|
+
import { join } from "node:path";
|
|
83
|
+
import { ApprovalAction, ServiceTier, ThinkingMode } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
84
|
+
import { createCursorAdapter } from "../adapter.js";
|
|
85
|
+
import { resolvePlatformOptions } from "../session-lifecycle.js";
|
|
86
|
+
import { hookInputFor, streamArgsFor, STREAM_NAME } from "./cursor-hook-harness.js";
|
|
87
|
+
import { FIXTURE, SDK_CATALOG, hermeticCursorConfig, runWorkspaceHook } from "./hermetic-cursor.js";
|
|
88
|
+
import { ScriptedCursorAgent, sdkEvents, step } from "./scripted-agent.js";
|
|
89
|
+
import { ScriptedCursorSdk, bindScriptedSdk } from "./scripted-sdk.js";
|
|
90
|
+
/** The user's message every kit turn asks; the prompt builder needs one and the kit has none to give. */
|
|
91
|
+
const KIT_USER_MESSAGE = "Do what the scenario says.";
|
|
92
|
+
/** What the double records the SDK "returning" for an allowed tool call. */
|
|
93
|
+
const ALLOWED_RESULT = "ok (kit)";
|
|
94
|
+
/** The error the SDK surfaces on a hook-denied call, as the goldens script it. */
|
|
95
|
+
const HOOK_BLOCKED_RESULT = "Blocked by hook";
|
|
96
|
+
/**
|
|
97
|
+
* Build the subject over one hermetic environment (the temp `HOME` the gate's
|
|
98
|
+
* per-session HITL artifacts land under, the temp workspace root). The
|
|
99
|
+
* environment is the caller's to create before and dispose after; the SDK
|
|
100
|
+
* double is bound for the module here, so a file holds one subject.
|
|
101
|
+
*/
|
|
102
|
+
export function createCursorContractSubject(env) {
|
|
103
|
+
return new CursorSubject(env);
|
|
104
|
+
}
|
|
105
|
+
class CursorSubject {
|
|
106
|
+
env;
|
|
107
|
+
name = "cursor";
|
|
108
|
+
harness = "cursor";
|
|
109
|
+
adapter;
|
|
110
|
+
config;
|
|
111
|
+
sdk;
|
|
112
|
+
hookDisagreements = [];
|
|
113
|
+
agents = new Map();
|
|
114
|
+
agentsByWorkspaceRef = new Map();
|
|
115
|
+
proposals = new Map();
|
|
116
|
+
forcedReissues = new Set();
|
|
117
|
+
hangWaiters = [];
|
|
118
|
+
mintCounter = 0;
|
|
119
|
+
constructor(env) {
|
|
120
|
+
this.env = env;
|
|
121
|
+
this.config = hermeticCursorConfig(env);
|
|
122
|
+
this.adapter = createCursorAdapter();
|
|
123
|
+
this.sdk = new ScriptedCursorSdk({
|
|
124
|
+
agents: [],
|
|
125
|
+
catalog: SDK_CATALOG,
|
|
126
|
+
agentForWorkspaceRef: (ref) => this.agentsByWorkspaceRef.get(ref),
|
|
127
|
+
});
|
|
128
|
+
bindScriptedSdk(this.sdk);
|
|
129
|
+
}
|
|
130
|
+
// ── HarnessContractSubject ────────────────────────────────────────────────
|
|
131
|
+
arrange(turn, view) {
|
|
132
|
+
const agent = this.agents.get(view.sessionId) ?? this.mintAgent(view.sessionId);
|
|
133
|
+
mkdirSync(this.workspaceRootOf(view.sessionId), { recursive: true });
|
|
134
|
+
agent.arrangeNextTurn(this.translate(turn, view, agent));
|
|
135
|
+
}
|
|
136
|
+
inputOverrides(view) {
|
|
137
|
+
return {
|
|
138
|
+
// The adapter validates the name against its catalog and prices against
|
|
139
|
+
// the registry fixture; both know exactly this model.
|
|
140
|
+
model: { requested: FIXTURE.model, serviceTier: ServiceTier.STANDARD, thinkingMode: ThinkingMode.DISABLED },
|
|
141
|
+
workspaceDir: this.workspaceRootOf(view.sessionId),
|
|
142
|
+
message: KIT_USER_MESSAGE,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
whenHanging() {
|
|
146
|
+
return new Promise((resolve) => this.hangWaiters.push(resolve));
|
|
147
|
+
}
|
|
148
|
+
executionCount(toolCallId) {
|
|
149
|
+
return this.proposals.get(toolCallId)?.allowed ?? 0;
|
|
150
|
+
}
|
|
151
|
+
// ── The subject file's observations ──────────────────────────────────────
|
|
152
|
+
agentFor(sessionId) {
|
|
153
|
+
return this.agents.get(sessionId);
|
|
154
|
+
}
|
|
155
|
+
forceReissue(toolCallId) {
|
|
156
|
+
this.forcedReissues.add(toolCallId);
|
|
157
|
+
}
|
|
158
|
+
// ── The engine ────────────────────────────────────────────────────────────
|
|
159
|
+
/** The directory the runtime's provisioner gives a session with no workspace entries (`session-root.ts`). */
|
|
160
|
+
workspaceRootOf(sessionId) {
|
|
161
|
+
return join(this.env.workspaceRootDir, "sessions", sessionId);
|
|
162
|
+
}
|
|
163
|
+
mintAgent(sessionId) {
|
|
164
|
+
const agent = new ScriptedCursorAgent({ agentId: `agent-kit-${++this.mintCounter}`, turns: [] });
|
|
165
|
+
this.agents.set(sessionId, agent);
|
|
166
|
+
// The adapter asks the SDK to create an agent for the session under this
|
|
167
|
+
// ref; the double answers with this agent.
|
|
168
|
+
const { workspaceRef } = resolvePlatformOptions(sessionId, this.config.workspaceRootDir);
|
|
169
|
+
this.agentsByWorkspaceRef.set(workspaceRef, agent);
|
|
170
|
+
return agent;
|
|
171
|
+
}
|
|
172
|
+
translate(turn, view, agent) {
|
|
173
|
+
const ev = sdkEvents(agent.agentId, agent.nextRunId);
|
|
174
|
+
const script = [];
|
|
175
|
+
if (agent.sends.length === 0)
|
|
176
|
+
script.push(step.event(ev.init()));
|
|
177
|
+
let lastSay = "";
|
|
178
|
+
let ended = false;
|
|
179
|
+
for (const s of turn) {
|
|
180
|
+
switch (s.kind) {
|
|
181
|
+
case "say":
|
|
182
|
+
script.push(step.event(ev.assistant(s.text)));
|
|
183
|
+
lastSay = s.text;
|
|
184
|
+
break;
|
|
185
|
+
case "propose":
|
|
186
|
+
script.push(...this.proposeSteps(s.toolCallId, s.action, view, ev));
|
|
187
|
+
break;
|
|
188
|
+
case "read":
|
|
189
|
+
script.push(...this.readSteps(s.toolCallId, s.path, view, ev));
|
|
190
|
+
break;
|
|
191
|
+
case "usage":
|
|
192
|
+
script.push(step.turnEnded({
|
|
193
|
+
inputTokens: s.delta.inputTokens,
|
|
194
|
+
outputTokens: s.delta.outputTokens,
|
|
195
|
+
cacheReadTokens: s.delta.cacheReadTokens,
|
|
196
|
+
cacheWriteTokens: s.delta.cacheWriteTokens,
|
|
197
|
+
}));
|
|
198
|
+
break;
|
|
199
|
+
case "hang":
|
|
200
|
+
script.push(step.effect("kit: hang until the adapter cancels the run", ({ run }) => this.park(run)));
|
|
201
|
+
ended = true;
|
|
202
|
+
break;
|
|
203
|
+
case "fail":
|
|
204
|
+
switch (s.surface) {
|
|
205
|
+
case "engine":
|
|
206
|
+
script.push(step.errored({ result: s.message }));
|
|
207
|
+
break;
|
|
208
|
+
case "internal":
|
|
209
|
+
script.push(step.effect("kit: the transport breaks mid-stream", () => {
|
|
210
|
+
throw new Error(s.message);
|
|
211
|
+
}));
|
|
212
|
+
break;
|
|
213
|
+
case "actionable":
|
|
214
|
+
throw new Error(`${this.name}: fail(..., "actionable") is not producible by this subject (only the unattributed hook block reaches that surface); test bug`);
|
|
215
|
+
default: {
|
|
216
|
+
const exhaustive = s.surface;
|
|
217
|
+
throw new Error(`${this.name}: unknown failure surface ${String(exhaustive)}`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
ended = true;
|
|
221
|
+
break;
|
|
222
|
+
case "cancelled":
|
|
223
|
+
script.push(step.effect("kit: the SDK cancels its own run", ({ run }) => run.cancel()));
|
|
224
|
+
ended = true;
|
|
225
|
+
break;
|
|
226
|
+
default: {
|
|
227
|
+
const exhaustive = s;
|
|
228
|
+
throw new Error(`${this.name}: unknown scenario step ${JSON.stringify(exhaustive)}`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
if (!ended)
|
|
233
|
+
script.push(step.finished({ result: lastSay, model: { id: FIXTURE.model, params: [] } }));
|
|
234
|
+
return script;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Whether the model emits the gated call this turn, and what the hook is
|
|
238
|
+
* expected to answer — one rule per case (see the header). `undefined`
|
|
239
|
+
* means "nothing is emitted".
|
|
240
|
+
*/
|
|
241
|
+
emissionFor(toolCallId, view) {
|
|
242
|
+
if (this.forcedReissues.delete(toolCallId)) {
|
|
243
|
+
// The disobedient model: emitted regardless; the hook decides on its own
|
|
244
|
+
// (a grant exists only for an APPROVE), so what to expect is the grant.
|
|
245
|
+
return { expectAllow: view.approvalDecisions.get(toolCallId) === ApprovalAction.APPROVE };
|
|
246
|
+
}
|
|
247
|
+
if ((this.proposals.get(toolCallId)?.allowed ?? 0) > 0)
|
|
248
|
+
return undefined;
|
|
249
|
+
const decision = view.approvalDecisions.get(toolCallId) ?? ApprovalAction.UNSPECIFIED;
|
|
250
|
+
switch (decision) {
|
|
251
|
+
case ApprovalAction.UNSPECIFIED:
|
|
252
|
+
return { expectAllow: false };
|
|
253
|
+
case ApprovalAction.APPROVE:
|
|
254
|
+
case ApprovalAction.APPROVE_ALL:
|
|
255
|
+
return { expectAllow: true };
|
|
256
|
+
case ApprovalAction.SKIP:
|
|
257
|
+
case ApprovalAction.REJECT:
|
|
258
|
+
return undefined;
|
|
259
|
+
default: {
|
|
260
|
+
const exhaustive = decision;
|
|
261
|
+
throw new Error(`${this.name}: unknown approval action ${String(exhaustive)}`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
proposeSteps(toolCallId, action, view, ev) {
|
|
266
|
+
const emission = this.emissionFor(toolCallId, view);
|
|
267
|
+
if (!emission)
|
|
268
|
+
return [];
|
|
269
|
+
if (action.kind === "read" || action.kind === "mcp") {
|
|
270
|
+
throw new Error(`${this.name}: propose(${action.kind}) is not a gated built-in on this harness; test bug`);
|
|
271
|
+
}
|
|
272
|
+
const gated = { ...action, kind: action.kind };
|
|
273
|
+
const memory = this.proposals.get(toolCallId) ?? { emitted: 0, allowed: 0 };
|
|
274
|
+
this.proposals.set(toolCallId, memory);
|
|
275
|
+
// The first emission carries the kit's id (the WAITING row the kit looks
|
|
276
|
+
// up); a re-issue carries a fresh call id, as the resumed SDK agent does,
|
|
277
|
+
// and the adapter reconciles it onto the committed row by identity.
|
|
278
|
+
const callId = memory.emitted === 0 ? toolCallId : `${toolCallId}#${memory.emitted}`;
|
|
279
|
+
memory.emitted += 1;
|
|
280
|
+
const name = STREAM_NAME[gated.kind];
|
|
281
|
+
const args = streamArgsFor(gated);
|
|
282
|
+
const workspaceRoot = this.workspaceRootOf(view.sessionId);
|
|
283
|
+
return [
|
|
284
|
+
step.event(ev.toolCall(callId, name, "running", args)),
|
|
285
|
+
step.effect(`kit: the real hook judges ${name} ${gated.resource}`, () => {
|
|
286
|
+
const { permission } = runWorkspaceHook(workspaceRoot, hookInputFor(gated));
|
|
287
|
+
if (permission === "allow")
|
|
288
|
+
memory.allowed += 1;
|
|
289
|
+
if ((permission === "allow") !== emission.expectAllow) {
|
|
290
|
+
this.hookDisagreements.push(`${toolCallId}: expected ${emission.expectAllow ? "allow" : "deny"}, hook answered ${permission}`);
|
|
291
|
+
}
|
|
292
|
+
}),
|
|
293
|
+
emission.expectAllow
|
|
294
|
+
? step.event(ev.toolCall(callId, name, "completed", args, ALLOWED_RESULT))
|
|
295
|
+
: step.event(ev.toolCall(callId, name, "error", args, HOOK_BLOCKED_RESULT)),
|
|
296
|
+
];
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* An ungated read: the stream tool call, the REAL hook (which allows every
|
|
300
|
+
* read — the gate's baked-in category set has no arm for it; asserted
|
|
301
|
+
* through the disagreement record like every other hook answer), and the
|
|
302
|
+
* completion with contents. The SDK executes what the hook allows, so the
|
|
303
|
+
* read counts as run.
|
|
304
|
+
*/
|
|
305
|
+
readSteps(toolCallId, path, view, ev) {
|
|
306
|
+
const memory = this.proposals.get(toolCallId) ?? { emitted: 0, allowed: 0 };
|
|
307
|
+
this.proposals.set(toolCallId, memory);
|
|
308
|
+
memory.emitted += 1;
|
|
309
|
+
const args = { path };
|
|
310
|
+
const workspaceRoot = this.workspaceRootOf(view.sessionId);
|
|
311
|
+
return [
|
|
312
|
+
step.event(ev.toolCall(toolCallId, "read", "running", args)),
|
|
313
|
+
step.effect(`kit: the real hook judges read ${path}`, () => {
|
|
314
|
+
const { permission } = runWorkspaceHook(workspaceRoot, hookInputFor({ kind: "read", resource: path }));
|
|
315
|
+
if (permission === "allow")
|
|
316
|
+
memory.allowed += 1;
|
|
317
|
+
else
|
|
318
|
+
this.hookDisagreements.push(`${toolCallId}: expected allow for a read, hook answered ${permission}`);
|
|
319
|
+
}),
|
|
320
|
+
step.event(ev.toolCall(toolCallId, "read", "completed", args, `contents of ${path}`)),
|
|
321
|
+
];
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Park until the adapter cancels the run — the real shape of "the engine
|
|
325
|
+
* makes no progress until told to stop": the adapter's stop-signal listener
|
|
326
|
+
* calls `run.cancel()`, the double's status flips, and its stream breaks at
|
|
327
|
+
* the next step.
|
|
328
|
+
*/
|
|
329
|
+
park(run) {
|
|
330
|
+
for (const waiter of this.hangWaiters.splice(0))
|
|
331
|
+
waiter();
|
|
332
|
+
if (run.status === "cancelled")
|
|
333
|
+
return Promise.resolve();
|
|
334
|
+
return new Promise((resolve) => {
|
|
335
|
+
const unsubscribe = run.onDidChangeStatus((status) => {
|
|
336
|
+
if (status !== "cancelled")
|
|
337
|
+
return;
|
|
338
|
+
unsubscribe();
|
|
339
|
+
resolve();
|
|
340
|
+
});
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=contract-subject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-subject.js","sourceRoot":"","sources":["../../../../src/activities/execute-cursor/__test-utils__/contract-subject.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+EG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,8DAA8D,CAAC;AAazH,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAwB,MAAM,0BAA0B,CAAC;AAC1G,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACpG,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,IAAI,EAAqC,MAAM,qBAAqB,CAAC;AAC9G,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEvE,yGAAyG;AACzG,MAAM,gBAAgB,GAAG,4BAA4B,CAAC;AAEtD,4EAA4E;AAC5E,MAAM,cAAc,GAAG,UAAU,CAAC;AAElC,kFAAkF;AAClF,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AA0B9C;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CAAC,GAAwB;IAClE,OAAO,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,aAAa;IAeY;IAdpB,IAAI,GAAG,QAAQ,CAAC;IAChB,OAAO,GAAG,QAAiB,CAAC;IAC5B,OAAO,CAAiB;IACxB,MAAM,CAAS;IACf,GAAG,CAAoB;IACvB,iBAAiB,GAAa,EAAE,CAAC;IAEzB,MAAM,GAAG,IAAI,GAAG,EAA+B,CAAC;IAChD,oBAAoB,GAAG,IAAI,GAAG,EAA+B,CAAC;IAC9D,SAAS,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC9C,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,WAAW,GAAsB,EAAE,CAAC;IAC7C,WAAW,GAAG,CAAC,CAAC;IAExB,YAA6B,GAAwB;QAAxB,QAAG,GAAH,GAAG,CAAqB;QACnD,IAAI,CAAC,MAAM,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,GAAG,mBAAmB,EAAE,CAAC;QACrC,IAAI,CAAC,GAAG,GAAG,IAAI,iBAAiB,CAAC;YAC/B,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,WAAW;YACpB,oBAAoB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC;SAClE,CAAC,CAAC;QACH,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,6EAA6E;IAE7E,OAAO,CAAC,IAAkB,EAAE,IAAgB;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChF,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,cAAc,CAAC,IAAgB;QAC7B,OAAO;YACL,wEAAwE;YACxE,sDAAsD;YACtD,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,YAAY,CAAC,QAAQ,EAAE;YAC3G,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC;YAClD,OAAO,EAAE,gBAAgB;SAC1B,CAAC;IACJ,CAAC;IAED,WAAW;QACT,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,cAAc,CAAC,UAAkB;QAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,4EAA4E;IAE5E,QAAQ,CAAC,SAAiB;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAED,YAAY,CAAC,UAAkB;QAC7B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IAED,6EAA6E;IAE7E,6GAA6G;IACrG,eAAe,CAAC,SAAiB;QACvC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAChE,CAAC;IAEO,SAAS,CAAC,SAAiB;QACjC,MAAM,KAAK,GAAG,IAAI,mBAAmB,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACjG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAClC,yEAAyE;QACzE,2CAA2C;QAC3C,MAAM,EAAE,YAAY,EAAE,GAAG,sBAAsB,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACzF,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QACnD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,SAAS,CAAC,IAAkB,EAAE,IAAgB,EAAE,KAA0B;QAChF,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAEjE,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;gBACf,KAAK,KAAK;oBACR,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAC9C,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC;oBACjB,MAAM;gBACR,KAAK,SAAS;oBACZ,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;oBACpE,MAAM;gBACR,KAAK,MAAM;oBACT,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;oBAC/D,MAAM;gBACR,KAAK,OAAO;oBACV,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,SAAS,CAAC;wBACb,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW;wBAChC,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY;wBAClC,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe;wBACxC,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB;qBAC3C,CAAC,CACH,CAAC;oBACF,MAAM;gBACR,KAAK,MAAM;oBACT,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,6CAA6C,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACrG,KAAK,GAAG,IAAI,CAAC;oBACb,MAAM;gBACR,KAAK,MAAM;oBACT,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;wBAClB,KAAK,QAAQ;4BACX,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;4BACjD,MAAM;wBACR,KAAK,UAAU;4BACb,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,MAAM,CAAC,sCAAsC,EAAE,GAAG,EAAE;gCACvD,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;4BAC7B,CAAC,CAAC,CACH,CAAC;4BACF,MAAM;wBACR,KAAK,YAAY;4BACf,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,+HAA+H,CAAC,CAAC;wBAC/J,OAAO,CAAC,CAAC,CAAC;4BACR,MAAM,UAAU,GAAU,CAAC,CAAC,OAAO,CAAC;4BACpC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,6BAA6B,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;wBACjF,CAAC;oBACH,CAAC;oBACD,KAAK,GAAG,IAAI,CAAC;oBACb,MAAM;gBACR,KAAK,WAAW;oBACd,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,kCAAkC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;oBACxF,KAAK,GAAG,IAAI,CAAC;oBACb,MAAM;gBACR,OAAO,CAAC,CAAC,CAAC;oBACR,MAAM,UAAU,GAAU,CAAC,CAAC;oBAC5B,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,2BAA2B,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;gBACvF,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACtG,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACK,WAAW,CAAC,UAAkB,EAAE,IAAgB;QACtD,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3C,yEAAyE;YACzE,wEAAwE;YACxE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,cAAc,CAAC,OAAO,EAAE,CAAC;QAC5F,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,cAAc,CAAC,WAAW,CAAC;QACtF,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,cAAc,CAAC,WAAW;gBAC7B,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;YAChC,KAAK,cAAc,CAAC,OAAO,CAAC;YAC5B,KAAK,cAAc,CAAC,WAAW;gBAC7B,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;YAC/B,KAAK,cAAc,CAAC,IAAI,CAAC;YACzB,KAAK,cAAc,CAAC,MAAM;gBACxB,OAAO,SAAS,CAAC;YACnB,OAAO,CAAC,CAAC,CAAC;gBACR,MAAM,UAAU,GAAU,QAAQ,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,6BAA6B,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,UAAkB,EAAE,MAAsB,EAAE,IAAgB,EAAE,EAAgC;QACjH,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,CAAC;QACzB,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,aAAa,MAAM,CAAC,IAAI,qDAAqD,CAAC,CAAC;QAC7G,CAAC;QACD,MAAM,KAAK,GAA+C,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QAC3F,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAC5E,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACvC,yEAAyE;QACzE,0EAA0E;QAC1E,oEAAoE;QACpE,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACrF,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;QACpB,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3D,OAAO;YACL,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YACtD,IAAI,CAAC,MAAM,CAAC,6BAA6B,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE;gBACtE,MAAM,EAAE,UAAU,EAAE,GAAG,gBAAgB,CAAC,aAAa,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC5E,IAAI,UAAU,KAAK,OAAO;oBAAE,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;gBAChD,IAAI,CAAC,UAAU,KAAK,OAAO,CAAC,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC;oBACtD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,UAAU,cAAc,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,mBAAmB,UAAU,EAAE,CAAC,CAAC;gBACjI,CAAC;YACH,CAAC,CAAC;YACF,QAAQ,CAAC,WAAW;gBAClB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;gBAC1E,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,CAAC,CAAC;SAC9E,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACK,SAAS,CAAC,UAAkB,EAAE,IAAY,EAAE,IAAgB,EAAE,EAAgC;QACpG,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAC5E,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;QACpB,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC;QACtB,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3D,OAAO;YACL,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YAC5D,IAAI,CAAC,MAAM,CAAC,kCAAkC,IAAI,EAAE,EAAE,GAAG,EAAE;gBACzD,MAAM,EAAE,UAAU,EAAE,GAAG,gBAAgB,CAAC,aAAa,EAAE,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBACvG,IAAI,UAAU,KAAK,OAAO;oBAAE,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;;oBAC3C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,UAAU,8CAA8C,UAAU,EAAE,CAAC,CAAC;YAC5G,CAAC,CAAC;YACF,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,IAAI,EAAE,CAAC,CAAC;SACtF,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACK,IAAI,CAAC,GAAgB;QAC3B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,MAAM,EAAE,CAAC;QAC1D,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QACzD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,WAAW,GAAG,GAAG,CAAC,iBAAiB,CAAC,CAAC,MAAM,EAAE,EAAE;gBACnD,IAAI,MAAM,KAAK,WAAW;oBAAE,OAAO;gBACnC,WAAW,EAAE,CAAC;gBACd,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
import { type ApprovalGrant, type McpToolPolicyEntry } from "../approval-state.js";
|
|
18
18
|
import type { ApprovalCategory } from "../approval-policy.js";
|
|
19
19
|
import { type CasObservations } from "../cas-observations.js";
|
|
20
|
+
import type { ProposedAction } from "../../../__test-utils__/approval-contract/types.js";
|
|
20
21
|
/**
|
|
21
22
|
* Whether `bash` is available on this machine. Hook tests must be skipped where
|
|
22
23
|
* it is not — use `const d = hasBash ? describe : describe.skip`.
|
|
@@ -154,3 +155,22 @@ export declare const hookMcp: (name: string, input?: Record<string, unknown>) =>
|
|
|
154
155
|
command: string;
|
|
155
156
|
hook_event_name: string;
|
|
156
157
|
};
|
|
158
|
+
/** Build the real preToolUse hook-input payload for an abstract action. */
|
|
159
|
+
export declare function hookInputFor(action: ProposedAction): object;
|
|
160
|
+
/** The gated built-in categories: the only action kinds a grant is ever minted for. */
|
|
161
|
+
export type GatedActionKind = "write" | "shell" | "delete";
|
|
162
|
+
/**
|
|
163
|
+
* Stream-side (SDK) tool name per gated category — deliberately the OTHER
|
|
164
|
+
* taxonomy from the hook input, so a grant minted from the stream matches a
|
|
165
|
+
* hook-named call only via the canonical category, not the raw name.
|
|
166
|
+
*/
|
|
167
|
+
export declare const STREAM_NAME: Record<GatedActionKind, string>;
|
|
168
|
+
/**
|
|
169
|
+
* The stream-side args of a gated action, mirroring {@link hookInputFor}: a
|
|
170
|
+
* write carries whole-file content (so its digest is content-exact and matches
|
|
171
|
+
* the hook's), a delete carries only a path, and a shell carries its command
|
|
172
|
+
* (the salient is already exact). The shapes the goldens' `edit` events use.
|
|
173
|
+
*/
|
|
174
|
+
export declare function streamArgsFor(action: ProposedAction & {
|
|
175
|
+
kind: GatedActionKind;
|
|
176
|
+
}): Record<string, unknown>;
|
|
@@ -127,4 +127,62 @@ export const hookMcp = (name, input = {}) => ({
|
|
|
127
127
|
command: "npx -y srv mcp",
|
|
128
128
|
hook_event_name: "beforeMCPExecution",
|
|
129
129
|
});
|
|
130
|
+
// ── The contract kits' abstract action, in both of Cursor's taxonomies ──────
|
|
131
|
+
//
|
|
132
|
+
// Both kits (`approval-contract`, `harness-contract`) speak of a side effect as
|
|
133
|
+
// a taxonomy-free `ProposedAction`; Cursor sees the same act twice, as the
|
|
134
|
+
// STREAM tool call the SDK emits (`edit` / `shell` / `delete`, lowercase) and
|
|
135
|
+
// as the HOOK payload the preToolUse script judges (`Write` / `Shell` /
|
|
136
|
+
// `Delete`). One translation here, so every Cursor-side substrate and subject
|
|
137
|
+
// exercises the same category collapse that lets a stream-minted grant match a
|
|
138
|
+
// hook-named call.
|
|
139
|
+
/** Build the real preToolUse hook-input payload for an abstract action. */
|
|
140
|
+
export function hookInputFor(action) {
|
|
141
|
+
switch (action.kind) {
|
|
142
|
+
case "write":
|
|
143
|
+
return hookWrite(action.resource, action.content ?? "x");
|
|
144
|
+
case "shell":
|
|
145
|
+
return hookShell(action.resource);
|
|
146
|
+
case "delete":
|
|
147
|
+
return hookDelete(action.resource);
|
|
148
|
+
case "read":
|
|
149
|
+
return hookRead(action.resource);
|
|
150
|
+
case "mcp":
|
|
151
|
+
return hookMcp(action.mcpToolName ?? "mcp_tool");
|
|
152
|
+
default: {
|
|
153
|
+
const exhaustive = action.kind;
|
|
154
|
+
throw new Error(`hookInputFor: unknown action kind ${String(exhaustive)}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Stream-side (SDK) tool name per gated category — deliberately the OTHER
|
|
160
|
+
* taxonomy from the hook input, so a grant minted from the stream matches a
|
|
161
|
+
* hook-named call only via the canonical category, not the raw name.
|
|
162
|
+
*/
|
|
163
|
+
export const STREAM_NAME = {
|
|
164
|
+
write: "edit",
|
|
165
|
+
shell: "shell",
|
|
166
|
+
delete: "delete",
|
|
167
|
+
};
|
|
168
|
+
/**
|
|
169
|
+
* The stream-side args of a gated action, mirroring {@link hookInputFor}: a
|
|
170
|
+
* write carries whole-file content (so its digest is content-exact and matches
|
|
171
|
+
* the hook's), a delete carries only a path, and a shell carries its command
|
|
172
|
+
* (the salient is already exact). The shapes the goldens' `edit` events use.
|
|
173
|
+
*/
|
|
174
|
+
export function streamArgsFor(action) {
|
|
175
|
+
switch (action.kind) {
|
|
176
|
+
case "shell":
|
|
177
|
+
return { command: action.resource };
|
|
178
|
+
case "delete":
|
|
179
|
+
return { path: action.resource };
|
|
180
|
+
case "write":
|
|
181
|
+
return { path: action.resource, content: action.content ?? "x" };
|
|
182
|
+
default: {
|
|
183
|
+
const exhaustive = action.kind;
|
|
184
|
+
throw new Error(`streamArgsFor: unknown gated kind ${String(exhaustive)}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
130
188
|
//# sourceMappingURL=cursor-hook-harness.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor-hook-harness.js","sourceRoot":"","sources":["../../../../src/activities/execute-cursor/__test-utils__/cursor-hook-harness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClG,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAA+C,MAAM,sBAAsB,CAAC;AAEvG,OAAO,EAAE,mBAAmB,EAAwB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"cursor-hook-harness.js","sourceRoot":"","sources":["../../../../src/activities/execute-cursor/__test-utils__/cursor-hook-harness.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,32 +14,9 @@
|
|
|
14
14
|
* token binds the exact resource, so this substrate enforces lease isolation
|
|
15
15
|
* (`enforcesExactResource: true`) and implements `authorizeAfterGrant`.
|
|
16
16
|
*/
|
|
17
|
-
import { setupCursorHookHarness, hasBash,
|
|
17
|
+
import { setupCursorHookHarness, hasBash, hookInputFor, streamArgsFor, STREAM_NAME } from "./cursor-hook-harness.js";
|
|
18
18
|
import { toolIdentity } from "../approval-state.js";
|
|
19
19
|
import { contentDigest } from "../../../shared/file-tools.js";
|
|
20
|
-
/** Build the real preToolUse hook-input payload for an abstract action. */
|
|
21
|
-
function hookInputFor(action) {
|
|
22
|
-
switch (action.kind) {
|
|
23
|
-
case "write":
|
|
24
|
-
return hookWrite(action.resource, action.content ?? "x");
|
|
25
|
-
case "shell":
|
|
26
|
-
return hookShell(action.resource);
|
|
27
|
-
case "delete":
|
|
28
|
-
return hookDelete(action.resource);
|
|
29
|
-
case "read":
|
|
30
|
-
return hookRead(action.resource);
|
|
31
|
-
case "mcp":
|
|
32
|
-
return hookMcp(action.mcpToolName ?? "mcp_tool");
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
// Stream-side (SDK) tool name per gated category — deliberately the OTHER
|
|
36
|
-
// taxonomy from the hook input, so a grant minted here matches a hook-named call
|
|
37
|
-
// only via the canonical category, not the raw name.
|
|
38
|
-
const STREAM_NAME = {
|
|
39
|
-
write: "edit",
|
|
40
|
-
shell: "shell",
|
|
41
|
-
delete: "delete",
|
|
42
|
-
};
|
|
43
20
|
/**
|
|
44
21
|
* Mint the approval grant for an action using its stream-side identity. Only the
|
|
45
22
|
* gated built-in categories are ever granted in the contract (read is never
|
|
@@ -50,14 +27,7 @@ function grantFor(action) {
|
|
|
50
27
|
throw new Error(`grantFor: ${action.kind} actions are not granted in the contract`);
|
|
51
28
|
}
|
|
52
29
|
const streamName = STREAM_NAME[action.kind];
|
|
53
|
-
|
|
54
|
-
// content-exact and matches the hook's), a delete carries only a path (no
|
|
55
|
-
// content), and a shell carries its command (the salient is already exact).
|
|
56
|
-
const args = action.kind === "shell"
|
|
57
|
-
? { command: action.resource }
|
|
58
|
-
: action.kind === "delete"
|
|
59
|
-
? { path: action.resource }
|
|
60
|
-
: { path: action.resource, content: action.content ?? "x" };
|
|
30
|
+
const args = streamArgsFor({ ...action, kind: action.kind });
|
|
61
31
|
const identity = toolIdentity(streamName, "", args);
|
|
62
32
|
return {
|
|
63
33
|
toolName: streamName,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway-substrate.js","sourceRoot":"","sources":["../../../../src/activities/execute-cursor/__test-utils__/gateway-substrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"gateway-substrate.js","sourceRoot":"","sources":["../../../../src/activities/execute-cursor/__test-utils__/gateway-substrate.ts"],"names":[],"mappings":"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"}
|