@stigmer/runner 3.0.9-dev.20260616060535 → 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.build-fingerprint +1 -1
- package/dist/__test-utils__/approval-contract/types.d.ts +174 -0
- package/dist/__test-utils__/approval-contract/types.js +24 -0
- package/dist/__test-utils__/approval-contract/types.js.map +1 -0
- package/dist/activities/call-agent-status.d.ts +19 -1
- package/dist/activities/call-agent-status.js +64 -5
- package/dist/activities/call-agent-status.js.map +1 -1
- package/dist/activities/call-llm.js +19 -53
- package/dist/activities/call-llm.js.map +1 -1
- package/dist/activities/classify-tool-approvals.d.ts +24 -0
- package/dist/activities/classify-tool-approvals.js +69 -17
- package/dist/activities/classify-tool-approvals.js.map +1 -1
- package/dist/activities/discover-mcp-server.d.ts +7 -0
- package/dist/activities/discover-mcp-server.js +11 -1
- package/dist/activities/discover-mcp-server.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.d.ts +140 -0
- package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.js +130 -0
- package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.js.map +1 -0
- package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.d.ts +18 -0
- package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.js +123 -0
- package/dist/activities/execute-cursor/__test-utils__/gateway-substrate.js.map +1 -0
- package/dist/activities/execute-cursor/approval-policy.d.ts +17 -61
- package/dist/activities/execute-cursor/approval-policy.js +8 -120
- package/dist/activities/execute-cursor/approval-policy.js.map +1 -1
- package/dist/activities/execute-cursor/approval-state.d.ts +219 -9
- package/dist/activities/execute-cursor/approval-state.js +233 -17
- package/dist/activities/execute-cursor/approval-state.js.map +1 -1
- package/dist/activities/execute-cursor/capture-flow.d.ts +127 -0
- package/dist/activities/execute-cursor/capture-flow.js +234 -0
- package/dist/activities/execute-cursor/capture-flow.js.map +1 -0
- package/dist/activities/execute-cursor/cas-observations.d.ts +96 -0
- package/dist/activities/execute-cursor/cas-observations.js +184 -0
- package/dist/activities/execute-cursor/cas-observations.js.map +1 -0
- package/dist/activities/execute-cursor/command-provenance.d.ts +62 -0
- package/dist/activities/execute-cursor/command-provenance.js +128 -0
- package/dist/activities/execute-cursor/command-provenance.js.map +1 -0
- package/dist/activities/execute-cursor/exact-apply.d.ts +110 -0
- package/dist/activities/execute-cursor/exact-apply.js +204 -0
- package/dist/activities/execute-cursor/exact-apply.js.map +1 -0
- package/dist/activities/execute-cursor/hook-script.d.ts +53 -24
- package/dist/activities/execute-cursor/hook-script.js +310 -47
- package/dist/activities/execute-cursor/hook-script.js.map +1 -1
- package/dist/activities/execute-cursor/index.d.ts +8 -1
- package/dist/activities/execute-cursor/index.js +500 -64
- package/dist/activities/execute-cursor/index.js.map +1 -1
- package/dist/activities/execute-cursor/message-translator.d.ts +258 -11
- package/dist/activities/execute-cursor/message-translator.js +836 -90
- package/dist/activities/execute-cursor/message-translator.js.map +1 -1
- package/dist/activities/execute-cursor/prompt-builder.d.ts +20 -23
- package/dist/activities/execute-cursor/prompt-builder.js +74 -15
- package/dist/activities/execute-cursor/prompt-builder.js.map +1 -1
- package/dist/activities/execute-cursor/workspace-setup.d.ts +17 -0
- package/dist/activities/execute-cursor/workspace-setup.js +212 -33
- package/dist/activities/execute-cursor/workspace-setup.js.map +1 -1
- package/dist/activities/execute-deep-agent/__test-utils__/gateway-substrate.d.ts +19 -0
- package/dist/activities/execute-deep-agent/__test-utils__/gateway-substrate.js +143 -0
- package/dist/activities/execute-deep-agent/__test-utils__/gateway-substrate.js.map +1 -0
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.d.ts +88 -0
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js +81 -0
- package/dist/activities/execute-deep-agent/__test-utils__/scripted-model.js.map +1 -0
- package/dist/activities/execute-deep-agent/approval-file-change.d.ts +47 -0
- package/dist/activities/execute-deep-agent/approval-file-change.js +68 -0
- package/dist/activities/execute-deep-agent/approval-file-change.js.map +1 -0
- package/dist/activities/execute-deep-agent/attachment-injector.d.ts +8 -1
- package/dist/activities/execute-deep-agent/attachment-injector.js +7 -7
- package/dist/activities/execute-deep-agent/attachment-injector.js.map +1 -1
- package/dist/activities/execute-deep-agent/cas-capture-backend.d.ts +42 -0
- package/dist/activities/execute-deep-agent/cas-capture-backend.js +47 -0
- package/dist/activities/execute-deep-agent/cas-capture-backend.js.map +1 -0
- package/dist/activities/execute-deep-agent/cas-capture-observer.d.ts +79 -0
- package/dist/activities/execute-deep-agent/cas-capture-observer.js +112 -0
- package/dist/activities/execute-deep-agent/cas-capture-observer.js.map +1 -0
- package/dist/activities/execute-deep-agent/hitl.d.ts +10 -0
- package/dist/activities/execute-deep-agent/hitl.js +5 -1
- package/dist/activities/execute-deep-agent/hitl.js.map +1 -1
- package/dist/activities/execute-deep-agent/index.d.ts +2 -1
- package/dist/activities/execute-deep-agent/index.js +370 -56
- package/dist/activities/execute-deep-agent/index.js.map +1 -1
- package/dist/activities/execute-deep-agent/inline-publisher.d.ts +7 -1
- package/dist/activities/execute-deep-agent/inline-publisher.js +23 -2
- package/dist/activities/execute-deep-agent/inline-publisher.js.map +1 -1
- package/dist/activities/execute-deep-agent/setup.d.ts +53 -2
- package/dist/activities/execute-deep-agent/setup.js +149 -92
- package/dist/activities/execute-deep-agent/setup.js.map +1 -1
- package/dist/activities/execute-deep-agent/stamp-flowed-rows.d.ts +36 -0
- package/dist/activities/execute-deep-agent/stamp-flowed-rows.js +56 -0
- package/dist/activities/execute-deep-agent/stamp-flowed-rows.js.map +1 -0
- package/dist/activities/execute-deep-agent/status-builder-shared.d.ts +34 -1
- package/dist/activities/execute-deep-agent/status-builder-shared.js +26 -25
- package/dist/activities/execute-deep-agent/status-builder-shared.js.map +1 -1
- package/dist/activities/execute-deep-agent/status-builder.d.ts +11 -5
- package/dist/activities/execute-deep-agent/status-builder.js +6 -2
- package/dist/activities/execute-deep-agent/status-builder.js.map +1 -1
- package/dist/activities/execute-deep-agent/streaming-side-effects.js +2 -19
- package/dist/activities/execute-deep-agent/streaming-side-effects.js.map +1 -1
- package/dist/activities/execute-deep-agent/streaming.js +3 -15
- package/dist/activities/execute-deep-agent/streaming.js.map +1 -1
- package/dist/activities/execute-deep-agent/subagent-transformer.d.ts +25 -7
- package/dist/activities/execute-deep-agent/subagent-transformer.js +23 -7
- package/dist/activities/execute-deep-agent/subagent-transformer.js.map +1 -1
- package/dist/activities/execute-deep-agent/subagent-wiring.d.ts +30 -3
- package/dist/activities/execute-deep-agent/subagent-wiring.js +29 -3
- package/dist/activities/execute-deep-agent/subagent-wiring.js.map +1 -1
- package/dist/activities/execute-deep-agent/v3-status-builder.js +6 -2
- package/dist/activities/execute-deep-agent/v3-status-builder.js.map +1 -1
- package/dist/claimcheck/payload-codec.js +9 -5
- package/dist/claimcheck/payload-codec.js.map +1 -1
- package/dist/client/stigmer-client.d.ts +2 -0
- package/dist/client/stigmer-client.js +2 -0
- package/dist/client/stigmer-client.js.map +1 -1
- package/dist/middleware/approval-gate.d.ts +85 -4
- package/dist/middleware/approval-gate.js +165 -38
- package/dist/middleware/approval-gate.js.map +1 -1
- package/dist/middleware/types.d.ts +2 -5
- package/dist/shared/activity-input.d.ts +43 -0
- package/dist/shared/activity-input.js +17 -0
- package/dist/shared/activity-input.js.map +1 -0
- package/dist/shared/approval-canonicalize.d.ts +19 -0
- package/dist/shared/approval-canonicalize.js +119 -0
- package/dist/shared/approval-canonicalize.js.map +1 -0
- package/dist/shared/approval-fingerprint.d.ts +106 -0
- package/dist/shared/approval-fingerprint.js +113 -0
- package/dist/shared/approval-fingerprint.js.map +1 -0
- package/dist/shared/approval-policy.d.ts +182 -12
- package/dist/shared/approval-policy.js +213 -27
- package/dist/shared/approval-policy.js.map +1 -1
- package/dist/shared/args-preview.d.ts +52 -0
- package/dist/shared/args-preview.js +93 -0
- package/dist/shared/args-preview.js.map +1 -0
- package/dist/shared/artifact-storage.d.ts +19 -1
- package/dist/shared/artifact-storage.js +48 -11
- package/dist/shared/artifact-storage.js.map +1 -1
- package/dist/shared/file-change.d.ts +44 -0
- package/dist/shared/file-change.js +57 -0
- package/dist/shared/file-change.js.map +1 -0
- package/dist/shared/file-tools.d.ts +107 -0
- package/dist/shared/file-tools.js +168 -0
- package/dist/shared/file-tools.js.map +1 -0
- package/dist/shared/filereview/capture.d.ts +202 -0
- package/dist/shared/filereview/capture.js +498 -0
- package/dist/shared/filereview/capture.js.map +1 -0
- package/dist/shared/filereview/cas-substrate.d.ts +190 -0
- package/dist/shared/filereview/cas-substrate.js +284 -0
- package/dist/shared/filereview/cas-substrate.js.map +1 -0
- package/dist/shared/filereview/digest.d.ts +40 -0
- package/dist/shared/filereview/digest.js +66 -0
- package/dist/shared/filereview/digest.js.map +1 -0
- package/dist/shared/filereview/events.d.ts +170 -0
- package/dist/shared/filereview/events.js +298 -0
- package/dist/shared/filereview/events.js.map +1 -0
- package/dist/shared/filereview/git-substrate.d.ts +175 -0
- package/dist/shared/filereview/git-substrate.js +439 -0
- package/dist/shared/filereview/git-substrate.js.map +1 -0
- package/dist/shared/filereview/index.d.ts +11 -0
- package/dist/shared/filereview/index.js +12 -0
- package/dist/shared/filereview/index.js.map +1 -0
- package/dist/shared/filereview/secret-paths.d.ts +63 -0
- package/dist/shared/filereview/secret-paths.js +105 -0
- package/dist/shared/filereview/secret-paths.js.map +1 -0
- package/dist/shared/fingerprint-secret.d.ts +26 -0
- package/dist/shared/fingerprint-secret.js +47 -0
- package/dist/shared/fingerprint-secret.js.map +1 -0
- package/dist/shared/model-client.d.ts +51 -0
- package/dist/shared/model-client.js +77 -0
- package/dist/shared/model-client.js.map +1 -0
- package/dist/shared/plan-artifact.js +0 -2
- package/dist/shared/plan-artifact.js.map +1 -1
- package/dist/shared/status-offload.d.ts +83 -9
- package/dist/shared/status-offload.js +399 -79
- package/dist/shared/status-offload.js.map +1 -1
- package/dist/shared/status.js +14 -1
- package/dist/shared/status.js.map +1 -1
- package/dist/shared/tool-kind.d.ts +19 -0
- package/dist/shared/tool-kind.js +13 -0
- package/dist/shared/tool-kind.js.map +1 -1
- package/dist/shared/tool-row.d.ts +88 -0
- package/dist/shared/tool-row.js +127 -0
- package/dist/shared/tool-row.js.map +1 -0
- package/dist/shared/workspace/platform-dir.d.ts +25 -0
- package/dist/shared/workspace/platform-dir.js +38 -2
- package/dist/shared/workspace/platform-dir.js.map +1 -1
- package/dist/workflows/call-agent-orchestrator.js +56 -7
- package/dist/workflows/call-agent-orchestrator.js.map +1 -1
- package/dist/workflows/connect-mcp-server.d.ts +50 -0
- package/dist/workflows/connect-mcp-server.js +136 -15
- package/dist/workflows/connect-mcp-server.js.map +1 -1
- package/dist/workflows/types.d.ts +8 -0
- package/package.json +2 -2
- package/src/__test-utils__/approval-contract/contract.ts +224 -0
- package/src/__test-utils__/approval-contract/types.ts +179 -0
- package/src/__test-utils__/fake-artifact-storage.ts +72 -0
- package/src/__tests__/approval-gateway-contract.test.ts +29 -0
- package/src/__tests__/claimcheck-codec.test.ts +16 -53
- package/src/__tests__/golden-e2e.test.ts +2 -0
- package/src/__tests__/runner-token-coordinator.test.ts +3 -3
- package/src/activities/__tests__/call-agent-status.test.ts +135 -0
- package/src/activities/__tests__/call-llm.test.ts +1 -1
- package/src/activities/__tests__/classify-tool-approvals.test.ts +208 -1
- package/src/activities/__tests__/discover-mcp-server.test.ts +30 -0
- package/src/activities/__tests__/workflow-event-activities.test.ts +2 -1
- package/src/activities/call-agent-status.ts +74 -4
- package/src/activities/call-llm.ts +18 -63
- package/src/activities/classify-tool-approvals.ts +101 -19
- package/src/activities/discover-mcp-server.ts +29 -1
- package/src/activities/execute-cursor/__test-utils__/cursor-hook-harness.ts +216 -0
- package/src/activities/execute-cursor/__test-utils__/gateway-substrate.ts +148 -0
- package/src/activities/execute-cursor/__tests__/approval-gate.test.ts +41 -9
- package/src/activities/execute-cursor/__tests__/approval-state.test.ts +292 -0
- package/src/activities/execute-cursor/__tests__/build-prompt.test.ts +68 -1
- package/src/activities/execute-cursor/__tests__/capture-flow.test.ts +1005 -0
- package/src/activities/execute-cursor/__tests__/cas-observations.test.ts +187 -0
- package/src/activities/execute-cursor/__tests__/coarse-fingerprint.test.ts +97 -0
- package/src/activities/execute-cursor/__tests__/command-provenance.test.ts +240 -0
- package/src/activities/execute-cursor/__tests__/deny-gate-exact-apply.test.ts +203 -0
- package/src/activities/execute-cursor/__tests__/exact-apply.test.ts +375 -0
- package/src/activities/execute-cursor/__tests__/hitl-ledger.test.ts +1294 -24
- package/src/activities/execute-cursor/__tests__/hitl-resume-history.test.ts +446 -0
- package/src/activities/execute-cursor/__tests__/hook-script.test.ts +384 -110
- package/src/activities/execute-cursor/__tests__/message-translator.test.ts +171 -25
- package/src/activities/execute-cursor/__tests__/sequential-gate-resume.test.ts +189 -0
- package/src/activities/execute-cursor/__tests__/tool-result-image.test.ts +44 -23
- package/src/activities/execute-cursor/__tests__/workspace-setup.test.ts +190 -10
- package/src/activities/execute-cursor/approval-policy.ts +28 -159
- package/src/activities/execute-cursor/approval-state.ts +366 -18
- package/src/activities/execute-cursor/capture-flow.ts +323 -0
- package/src/activities/execute-cursor/cas-observations.ts +204 -0
- package/src/activities/execute-cursor/command-provenance.ts +168 -0
- package/src/activities/execute-cursor/exact-apply.ts +253 -0
- package/src/activities/execute-cursor/hook-script.ts +317 -51
- package/src/activities/execute-cursor/index.ts +575 -67
- package/src/activities/execute-cursor/message-translator.ts +963 -89
- package/src/activities/execute-cursor/prompt-builder.ts +80 -14
- package/src/activities/execute-cursor/workspace-setup.ts +257 -42
- package/src/activities/execute-deep-agent/__test-utils__/gateway-substrate.ts +180 -0
- package/src/activities/execute-deep-agent/__test-utils__/scripted-model.ts +134 -0
- package/src/activities/execute-deep-agent/__tests__/approval-file-change.test.ts +84 -0
- package/src/activities/execute-deep-agent/__tests__/attachment-injector.test.ts +11 -24
- package/src/activities/execute-deep-agent/__tests__/cas-capture-backend.test.ts +64 -0
- package/src/activities/execute-deep-agent/__tests__/cas-capture-observer.test.ts +163 -0
- package/src/activities/execute-deep-agent/__tests__/hitl-integration.test.ts +8 -5
- package/src/activities/execute-deep-agent/__tests__/hitl-resume-approve-all.test.ts +342 -0
- package/src/activities/execute-deep-agent/__tests__/hitl-resume-history.test.ts +2 -5
- package/src/activities/execute-deep-agent/__tests__/inline-publisher.test.ts +31 -13
- package/src/activities/execute-deep-agent/__tests__/sequential-gate-resume.test.ts +349 -0
- package/src/activities/execute-deep-agent/__tests__/stamp-flowed-rows.test.ts +119 -0
- package/src/activities/execute-deep-agent/__tests__/status-builder.test.ts +12 -11
- package/src/activities/execute-deep-agent/__tests__/streaming-v3.test.ts +9 -9
- package/src/activities/execute-deep-agent/__tests__/subagent-approval-propagation.test.ts +160 -0
- package/src/activities/execute-deep-agent/__tests__/subagent-gitignored-capture.test.ts +213 -0
- package/src/activities/execute-deep-agent/__tests__/subagent-transformer.test.ts +3 -6
- package/src/activities/execute-deep-agent/__tests__/subagent-wiring.test.ts +84 -1
- package/src/activities/execute-deep-agent/__tests__/v3-status-builder.test.ts +4 -1
- package/src/activities/execute-deep-agent/approval-file-change.ts +80 -0
- package/src/activities/execute-deep-agent/attachment-injector.ts +20 -11
- package/src/activities/execute-deep-agent/cas-capture-backend.ts +66 -0
- package/src/activities/execute-deep-agent/cas-capture-observer.ts +125 -0
- package/src/activities/execute-deep-agent/hitl.ts +15 -1
- package/src/activities/execute-deep-agent/index.ts +434 -64
- package/src/activities/execute-deep-agent/inline-publisher.ts +27 -4
- package/src/activities/execute-deep-agent/setup.ts +223 -125
- package/src/activities/execute-deep-agent/stamp-flowed-rows.ts +64 -0
- package/src/activities/execute-deep-agent/status-builder-shared.ts +62 -23
- package/src/activities/execute-deep-agent/status-builder.ts +19 -7
- package/src/activities/execute-deep-agent/streaming-side-effects.ts +2 -16
- package/src/activities/execute-deep-agent/streaming.ts +3 -13
- package/src/activities/execute-deep-agent/subagent-transformer.ts +53 -13
- package/src/activities/execute-deep-agent/subagent-wiring.ts +50 -3
- package/src/activities/execute-deep-agent/v3-status-builder.ts +8 -2
- package/src/claimcheck/payload-codec.ts +8 -8
- package/src/client/stigmer-client.ts +9 -1
- package/src/middleware/__tests__/approval-gate.test.ts +488 -4
- package/src/middleware/approval-gate.ts +247 -38
- package/src/middleware/types.ts +5 -5
- package/src/shared/__tests__/activity-input.test.ts +78 -0
- package/src/shared/__tests__/approval-canonicalize.test.ts +106 -0
- package/src/shared/__tests__/approval-fingerprint.test.ts +115 -0
- package/src/shared/__tests__/approval-policy.test.ts +274 -40
- package/src/shared/__tests__/args-preview.test.ts +78 -0
- package/src/shared/__tests__/artifact-storage-extended.test.ts +62 -10
- package/src/shared/__tests__/artifact-storage.test.ts +123 -11
- package/src/shared/__tests__/file-change.test.ts +85 -0
- package/src/shared/__tests__/file-tools.test.ts +90 -0
- package/src/shared/__tests__/fingerprint-secret.test.ts +51 -0
- package/src/shared/__tests__/lease-scope-corpus.test.ts +56 -0
- package/src/shared/__tests__/model-client.test.ts +162 -0
- package/src/shared/__tests__/plan-artifact.test.ts +11 -26
- package/src/shared/__tests__/policy-source-corpus.test.ts +58 -0
- package/src/shared/__tests__/status-offload.test.ts +573 -16
- package/src/shared/__tests__/status.test.ts +4 -5
- package/src/shared/__tests__/tool-kind.test.ts +24 -1
- package/src/shared/__tests__/tool-row.test.ts +221 -0
- package/src/shared/activity-input.ts +57 -0
- package/src/shared/approval-canonicalize.ts +159 -0
- package/src/shared/approval-fingerprint.ts +148 -0
- package/src/shared/approval-policy.ts +303 -27
- package/src/shared/args-preview.ts +98 -0
- package/src/shared/artifact-storage.ts +62 -11
- package/src/shared/checkpointer/__tests__/http-saver.test.ts +1 -2
- package/src/shared/file-change.ts +64 -0
- package/src/shared/file-tools.ts +169 -0
- package/src/shared/filereview/__tests__/capture.test.ts +856 -0
- package/src/shared/filereview/__tests__/cas-substrate.test.ts +404 -0
- package/src/shared/filereview/__tests__/digest.test.ts +100 -0
- package/src/shared/filereview/__tests__/events.test.ts +245 -0
- package/src/shared/filereview/__tests__/git-substrate.test.ts +362 -0
- package/src/shared/filereview/__tests__/proxy-reconcile.test.ts +286 -0
- package/src/shared/filereview/__tests__/secret-paths.test.ts +121 -0
- package/src/shared/filereview/capture.ts +727 -0
- package/src/shared/filereview/cas-substrate.ts +401 -0
- package/src/shared/filereview/digest.ts +83 -0
- package/src/shared/filereview/events.ts +449 -0
- package/src/shared/filereview/git-substrate.ts +555 -0
- package/src/shared/filereview/index.ts +60 -0
- package/src/shared/filereview/secret-paths.ts +121 -0
- package/src/shared/fingerprint-secret.ts +53 -0
- package/src/shared/model-client.ts +122 -0
- package/src/shared/plan-artifact.ts +0 -2
- package/src/shared/status-offload.ts +433 -77
- package/src/shared/status.ts +13 -0
- package/src/shared/tool-kind.ts +33 -0
- package/src/shared/tool-row.ts +135 -0
- package/src/shared/workspace/platform-dir.ts +41 -2
- package/src/workflow-engine/__tests__/golden-execution.test.ts +35 -18
- package/src/workflow-engine/__tests__/tasks/try.test.ts +1 -1
- package/src/workflows/__tests__/connect-mcp-server.test.ts +304 -29
- package/src/workflows/call-agent-orchestrator.ts +53 -6
- package/src/workflows/connect-mcp-server.ts +179 -24
- package/src/workflows/types.ts +8 -0
|
@@ -18,11 +18,10 @@
|
|
|
18
18
|
* Output: ToolApprovalResult[] (only tools requiring approval)
|
|
19
19
|
*/
|
|
20
20
|
import { z } from "zod";
|
|
21
|
-
import { ChatOpenAI } from "@langchain/openai";
|
|
22
21
|
import { SystemMessage, HumanMessage } from "@langchain/core/messages";
|
|
23
22
|
import { activityStarted, activityFinished } from "../idle-watchdog.js";
|
|
24
23
|
import { getSummarizationModel } from "../shared/model-registry.js";
|
|
25
|
-
import {
|
|
24
|
+
import { buildChatModel } from "../shared/model-client.js";
|
|
26
25
|
const BATCH_SIZE = 40;
|
|
27
26
|
const MAX_TOKENS_PER_TOOL = 60;
|
|
28
27
|
const MIN_MAX_TOKENS = 4096;
|
|
@@ -50,9 +49,12 @@ safe (auto-approve) or sensitive (requires human approval before execution).
|
|
|
50
49
|
|
|
51
50
|
Classification rules:
|
|
52
51
|
|
|
53
|
-
1. READ-ONLY operations → requires_approval: false
|
|
54
|
-
Examples: search, list, get, query, read, fetch, describe, count
|
|
55
|
-
|
|
52
|
+
1. READ-ONLY / OBSERVATION operations → requires_approval: false
|
|
53
|
+
Examples: search, list, get, query, read, fetch, describe, count, view,
|
|
54
|
+
inspect, status, screenshot, snapshot, and "get state" style tools.
|
|
55
|
+
These only retrieve or observe data and have no side effects. When a tool
|
|
56
|
+
name begins with one of these verbs (e.g. get_app_state, list_apps), prefer
|
|
57
|
+
requires_approval: false unless its description clearly says it mutates.
|
|
56
58
|
|
|
57
59
|
2. CREATE or MODIFY operations → requires_approval: true
|
|
58
60
|
Examples: create, update, put, set, add, edit, modify, write, post, send
|
|
@@ -107,7 +109,15 @@ export async function classifyTools(input, options) {
|
|
|
107
109
|
batchIdx,
|
|
108
110
|
totalBatches: batches.length,
|
|
109
111
|
});
|
|
110
|
-
|
|
112
|
+
// Reconcile against the input batch: a tool the model omitted must fail
|
|
113
|
+
// closed, never slip through un-gated. Partial output is as dangerous as
|
|
114
|
+
// an outage for the missing tools.
|
|
115
|
+
const { reconciled, failedClosedCount } = reconcileBatchClassifications(batch, batchResult);
|
|
116
|
+
if (failedClosedCount > 0) {
|
|
117
|
+
console.warn(`[ClassifyToolApprovals] Batch ${batchIdx + 1}/${batches.length} for '${serverName}': ` +
|
|
118
|
+
`${failedClosedCount} tool(s) missing from classifier output — failing closed (requires_approval=true)`);
|
|
119
|
+
}
|
|
120
|
+
allApprovals.push(...reconciled);
|
|
111
121
|
}
|
|
112
122
|
catch (err) {
|
|
113
123
|
console.error(`[ClassifyToolApprovals] Batch ${batchIdx + 1}/${batches.length} failed ` +
|
|
@@ -115,6 +125,10 @@ export async function classifyTools(input, options) {
|
|
|
115
125
|
allApprovals.push(...fallbackApprovals(batch));
|
|
116
126
|
}
|
|
117
127
|
}
|
|
128
|
+
// The LLM classifier is the sole read-only authority: only tools it
|
|
129
|
+
// affirmatively cleared (requires_approval=false) are auto-approved. Tools it
|
|
130
|
+
// gated, omitted (reconciled to fail-closed), or that fell back on an outage
|
|
131
|
+
// all remain gated. No name-based relax runs here by design.
|
|
118
132
|
const approved = allApprovals.filter((a) => a.requires_approval);
|
|
119
133
|
console.log(`[ClassifyToolApprovals] Classification complete for '${serverName}': ` +
|
|
120
134
|
`${approved.length}/${allApprovals.length} tools require approval`);
|
|
@@ -123,19 +137,18 @@ export async function classifyTools(input, options) {
|
|
|
123
137
|
async function classifyBatch(params) {
|
|
124
138
|
const { batch, serverName, serverDescription, model, proxyEndpoint, stigmerToken, mcpServerId, batchIdx, totalBatches, } = params;
|
|
125
139
|
const maxTokens = Math.max(MIN_MAX_TOKENS, batch.length * MAX_TOKENS_PER_TOOL);
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
:
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
140
|
+
// Provider is inferred from the resolved economy model — for an Anthropic
|
|
141
|
+
// primary this routes to Claude, not the hardcoded OpenAI path it used to.
|
|
142
|
+
const { model: llm } = await buildChatModel({
|
|
143
|
+
modelName: model,
|
|
144
|
+
proxyEndpoint,
|
|
145
|
+
stigmerToken: stigmerToken ?? undefined,
|
|
146
|
+
headerScope: { mcpServerId: mcpServerId ?? undefined },
|
|
133
147
|
maxTokens,
|
|
134
|
-
configuration: {
|
|
135
|
-
baseURL: resolvedBaseUrl,
|
|
136
|
-
defaultHeaders: headers,
|
|
137
|
-
},
|
|
138
148
|
});
|
|
149
|
+
// Explicit type param: BaseChatModel.withStructuredOutput widens to
|
|
150
|
+
// Record<string, any>, unlike the concrete SDK overloads, so pin the schema's
|
|
151
|
+
// output type here.
|
|
139
152
|
const structuredLlm = llm.withStructuredOutput(ClassifyToolApprovalsOutputSchema);
|
|
140
153
|
const toolsPayload = buildToolsPayload(batch);
|
|
141
154
|
const userPrompt = `MCP Server: ${serverName}\n` +
|
|
@@ -159,7 +172,46 @@ async function classifyBatch(params) {
|
|
|
159
172
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
160
173
|
// Helpers
|
|
161
174
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
175
|
+
/**
|
|
176
|
+
* Reconcile a batch's LLM classifications against the tools that were actually
|
|
177
|
+
* sent. The canonical result is built from the INPUT batch, never the raw model
|
|
178
|
+
* output, so the classifier can never silently disarm a gate by omission:
|
|
179
|
+
*
|
|
180
|
+
* - A tool the model classified is kept as-is (its requires_approval + message).
|
|
181
|
+
* - A tool the model OMITTED fails closed (requires_approval=true) — a missing
|
|
182
|
+
* decision is treated exactly like an outage for that one tool.
|
|
183
|
+
* - A name the model returned that was never in the batch (a hallucinated or
|
|
184
|
+
* duplicated entry) is dropped — only real tools earn a policy.
|
|
185
|
+
*/
|
|
186
|
+
export function reconcileBatchClassifications(batch, llmResults) {
|
|
187
|
+
const byName = new Map();
|
|
188
|
+
for (const r of llmResults) {
|
|
189
|
+
if (r.tool_name)
|
|
190
|
+
byName.set(r.tool_name, r);
|
|
191
|
+
}
|
|
192
|
+
const reconciled = [];
|
|
193
|
+
let failedClosedCount = 0;
|
|
194
|
+
for (const tool of batch) {
|
|
195
|
+
const classified = byName.get(tool.name);
|
|
196
|
+
if (classified) {
|
|
197
|
+
reconciled.push(classified);
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
reconciled.push({
|
|
201
|
+
tool_name: tool.name,
|
|
202
|
+
requires_approval: true,
|
|
203
|
+
message: `Execute ${tool.name}`,
|
|
204
|
+
});
|
|
205
|
+
failedClosedCount++;
|
|
206
|
+
}
|
|
207
|
+
return { reconciled, failedClosedCount };
|
|
208
|
+
}
|
|
162
209
|
export function fallbackApprovals(tools) {
|
|
210
|
+
// Full fail-closed: when the classifier batch throws, every tool in it is
|
|
211
|
+
// gated. With no trusted classification we cannot safely auto-approve anything
|
|
212
|
+
// — a name is an untrusted signal — so the entire batch requires approval
|
|
213
|
+
// until a reconnect re-classifies it. The accepted tradeoff is that, during a
|
|
214
|
+
// rare classifier outage, benign read tools briefly prompt for approval.
|
|
163
215
|
return tools.map((tool) => ({
|
|
164
216
|
tool_name: tool.name,
|
|
165
217
|
requires_approval: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classify-tool-approvals.js","sourceRoot":"","sources":["../../src/activities/classify-tool-approvals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"classify-tool-approvals.js","sourceRoot":"","sources":["../../src/activities/classify-tool-approvals.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,11 @@ export interface DiscoveredToolResult {
|
|
|
29
29
|
name: string;
|
|
30
30
|
description: string;
|
|
31
31
|
inputSchema?: Record<string, unknown> | null;
|
|
32
|
+
annotations?: DiscoveredToolAnnotations | null;
|
|
33
|
+
}
|
|
34
|
+
export interface DiscoveredToolAnnotations {
|
|
35
|
+
readOnlyHint?: boolean;
|
|
36
|
+
destructiveHint?: boolean;
|
|
32
37
|
}
|
|
33
38
|
export interface DiscoveredResourceTemplateResult {
|
|
34
39
|
uriTemplate: string;
|
|
@@ -42,6 +47,7 @@ export interface DiscoverMcpServerOutput {
|
|
|
42
47
|
previousToolsFingerprint: string;
|
|
43
48
|
previousToolApprovals: ToolApprovalDict[];
|
|
44
49
|
newToolsFingerprint: string;
|
|
50
|
+
previousTools: DiscoveredToolResult[];
|
|
45
51
|
}
|
|
46
52
|
export interface ToolApprovalDict {
|
|
47
53
|
toolName: string;
|
|
@@ -52,6 +58,7 @@ export declare function toolsFingerprint(tools: DiscoveredToolResult[]): string;
|
|
|
52
58
|
interface PreviousState {
|
|
53
59
|
fingerprint: string;
|
|
54
60
|
toolApprovals: ToolApprovalDict[];
|
|
61
|
+
tools: DiscoveredToolResult[];
|
|
55
62
|
}
|
|
56
63
|
export declare function extractPreviousState(mcpServer: McpServer): PreviousState;
|
|
57
64
|
export declare function injectPlatformEnv(declaredEnvKeys: Set<string>, envVars: Record<string, string>): Record<string, string>;
|
|
@@ -47,7 +47,7 @@ export function toolsFingerprint(tools) {
|
|
|
47
47
|
export function extractPreviousState(mcpServer) {
|
|
48
48
|
const status = mcpServer.status;
|
|
49
49
|
if (!status)
|
|
50
|
-
return { fingerprint: "", toolApprovals: [] };
|
|
50
|
+
return { fingerprint: "", toolApprovals: [], tools: [] };
|
|
51
51
|
const caps = status.discoveredCapabilities;
|
|
52
52
|
const prevTools = [];
|
|
53
53
|
if (caps) {
|
|
@@ -74,6 +74,7 @@ export function extractPreviousState(mcpServer) {
|
|
|
74
74
|
return {
|
|
75
75
|
fingerprint: toolsFingerprint(prevTools),
|
|
76
76
|
toolApprovals,
|
|
77
|
+
tools: prevTools,
|
|
77
78
|
};
|
|
78
79
|
}
|
|
79
80
|
/**
|
|
@@ -145,6 +146,7 @@ export async function discoverMcpServer(input, deps) {
|
|
|
145
146
|
previousToolsFingerprint: previousState.fingerprint,
|
|
146
147
|
previousToolApprovals: previousState.toolApprovals,
|
|
147
148
|
newToolsFingerprint: newFp,
|
|
149
|
+
previousTools: previousState.tools,
|
|
148
150
|
};
|
|
149
151
|
}
|
|
150
152
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -196,6 +198,14 @@ async function connectAndDiscover(slug, connectionConfig) {
|
|
|
196
198
|
inputSchema: tool.inputSchema
|
|
197
199
|
? tool.inputSchema
|
|
198
200
|
: null,
|
|
201
|
+
// Capture only the two hints the tightener uses. Stored verbatim from
|
|
202
|
+
// the server (untrusted): used to tighten, never to relax.
|
|
203
|
+
annotations: tool.annotations
|
|
204
|
+
? {
|
|
205
|
+
readOnlyHint: tool.annotations.readOnlyHint,
|
|
206
|
+
destructiveHint: tool.annotations.destructiveHint,
|
|
207
|
+
}
|
|
208
|
+
: null,
|
|
199
209
|
});
|
|
200
210
|
}
|
|
201
211
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover-mcp-server.js","sourceRoot":"","sources":["../../src/activities/discover-mcp-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAI7D,MAAM,uBAAuB,GAAG,OAAO,CAAC;AAExC,MAAM,uBAAuB,GAA2B;IACtD,sBAAsB,EAAE,6BAA6B;CACtD,CAAC;
|
|
1
|
+
{"version":3,"file":"discover-mcp-server.js","sourceRoot":"","sources":["../../src/activities/discover-mcp-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test harness for the generated Cursor preToolUse bash hook.
|
|
3
|
+
*
|
|
4
|
+
* Runs the ACTUAL bash script the runner writes into the workspace, feeding it
|
|
5
|
+
* the REAL hook-input shapes captured from `@cursor/sdk`. It is the out-of-process
|
|
6
|
+
* deny-oracle's only honest test surface: write the runner-owned state file (with
|
|
7
|
+
* any approval grants), invoke the hook, and read back its allow/deny decision
|
|
8
|
+
* and the denial ledger.
|
|
9
|
+
*
|
|
10
|
+
* Extracted from `__tests__/hook-script.test.ts` so it is shared by both that
|
|
11
|
+
* behavior suite and the deny-oracle adapter in the gateway Contract Test Kit
|
|
12
|
+
* (`__test-utils__/gateway-substrate.ts`) — one harness, no drift.
|
|
13
|
+
*
|
|
14
|
+
* Each harness owns a throwaway workspace under the OS temp dir and self-cleans
|
|
15
|
+
* via `onTestFinished`, so it must be called from within a running test.
|
|
16
|
+
*/
|
|
17
|
+
import { type ApprovalGrant, type McpToolPolicyEntry } from "../approval-state.js";
|
|
18
|
+
import type { ApprovalCategory } from "../approval-policy.js";
|
|
19
|
+
import { type CasObservations } from "../cas-observations.js";
|
|
20
|
+
/**
|
|
21
|
+
* Whether `bash` is available on this machine. Hook tests must be skipped where
|
|
22
|
+
* it is not — use `const d = hasBash ? describe : describe.skip`.
|
|
23
|
+
*/
|
|
24
|
+
export declare const hasBash: boolean;
|
|
25
|
+
export interface CursorHookHarness {
|
|
26
|
+
/** The throwaway workspace root (git repo when capture mode is on). */
|
|
27
|
+
readonly root: string;
|
|
28
|
+
/** Run the hook against a single hook-input payload and report its decision. */
|
|
29
|
+
decide(input: object): {
|
|
30
|
+
permission: string;
|
|
31
|
+
raw: string;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* The denial ledger entries the hook has appended this turn. `input` is the
|
|
35
|
+
* base64(JSON(tool_input)) the hook captures (decode + JSON.parse to inspect).
|
|
36
|
+
*/
|
|
37
|
+
ledger(): Array<{
|
|
38
|
+
toolName: string;
|
|
39
|
+
token: string;
|
|
40
|
+
input?: string;
|
|
41
|
+
}>;
|
|
42
|
+
/** Truncate the denial ledger (a fresh turn). */
|
|
43
|
+
resetLedger(): void;
|
|
44
|
+
/**
|
|
45
|
+
* The cas-observations the hook staged this turn (captured gitignored writes +
|
|
46
|
+
* secret-blocked paths), read back through the real sidecar reader. Empty when
|
|
47
|
+
* captureIgnored is off / nothing was staged.
|
|
48
|
+
*/
|
|
49
|
+
observations(): Promise<CasObservations>;
|
|
50
|
+
}
|
|
51
|
+
export interface CursorHookHarnessOptions {
|
|
52
|
+
/** Pre-armed spec.auto_approve_all (the whole-run global bypass). */
|
|
53
|
+
autoApproveAll?: boolean;
|
|
54
|
+
/** Built-in categories with a run-lifetime scoped lease. */
|
|
55
|
+
leasedCategories?: ApprovalCategory[];
|
|
56
|
+
grants?: ApprovalGrant[];
|
|
57
|
+
mcpPolicies?: Record<string, McpToolPolicyEntry>;
|
|
58
|
+
/** Omit the state file to exercise the fail-closed (deny) path. */
|
|
59
|
+
noStateFile?: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Process the hook treats as "the runner". Defaults to this test process,
|
|
62
|
+
* which is an ancestor of the bash child `execFileSync` spawns — so the scope
|
|
63
|
+
* guard sees the call as the runner's own agent and applies the gate. Pass a
|
|
64
|
+
* non-ancestor PID to exercise the foreign-client path (issue #173).
|
|
65
|
+
*/
|
|
66
|
+
runnerPid?: number;
|
|
67
|
+
/**
|
|
68
|
+
* Capture mode (git workspaces): the hook ALLOWS write/edit/delete to flow,
|
|
69
|
+
* gating only gitignored paths, shell, and MCP. When set, the harness baked
|
|
70
|
+
* workspace root is the throwaway workspace so `git check-ignore` resolves.
|
|
71
|
+
*/
|
|
72
|
+
captureMode?: boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Initialize the throwaway workspace as a git repo with these gitignore
|
|
75
|
+
* patterns, so capture mode's `git check-ignore` has a real repo to consult.
|
|
76
|
+
*/
|
|
77
|
+
gitignored?: string[];
|
|
78
|
+
/**
|
|
79
|
+
* CAS capture of gitignored writes (deep-agent parity). When true, the hook
|
|
80
|
+
* stages a non-secret gitignored write's before-bytes into the cas-observations
|
|
81
|
+
* sidecar and ALLOWS it, and hard-blocks a secret-like gitignored write —
|
|
82
|
+
* instead of denying every gitignored write. Requires a git repo (set via
|
|
83
|
+
* {@link captureMode} or {@link gitignored}).
|
|
84
|
+
*/
|
|
85
|
+
captureIgnored?: boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Whether the workspace is a git tree (Slice 2c). Default true. When false the
|
|
88
|
+
* throwaway workspace is NOT git-initialized and the state's `gitWorkspace` flag
|
|
89
|
+
* is false, so the hook CAS-stages EVERY write (not only gitignored ones) and
|
|
90
|
+
* skips the git-tracked flow arm.
|
|
91
|
+
*/
|
|
92
|
+
gitWorkspace?: boolean;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Build a throwaway workspace, write the generated hook + (optionally) the
|
|
96
|
+
* approval state file, and return a driver for the real bash hook.
|
|
97
|
+
*/
|
|
98
|
+
export declare function setupCursorHookHarness(opts?: CursorHookHarnessOptions): CursorHookHarness;
|
|
99
|
+
export declare const hookWrite: (filePath: string, content?: string) => {
|
|
100
|
+
tool_name: string;
|
|
101
|
+
tool_input: {
|
|
102
|
+
file_path: string;
|
|
103
|
+
content: string;
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
export declare const hookEdit: (filePath: string, oldString?: string, newString?: string) => {
|
|
107
|
+
tool_name: string;
|
|
108
|
+
tool_input: {
|
|
109
|
+
file_path: string;
|
|
110
|
+
old_string: string;
|
|
111
|
+
new_string: string;
|
|
112
|
+
};
|
|
113
|
+
};
|
|
114
|
+
export declare const hookShell: (command: string) => {
|
|
115
|
+
tool_name: string;
|
|
116
|
+
tool_input: {
|
|
117
|
+
command: string;
|
|
118
|
+
cwd: string;
|
|
119
|
+
timeout: number;
|
|
120
|
+
};
|
|
121
|
+
};
|
|
122
|
+
export declare const hookDelete: (filePath: string) => {
|
|
123
|
+
tool_name: string;
|
|
124
|
+
tool_input: {
|
|
125
|
+
file_path: string;
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
export declare const hookRead: (filePath: string) => {
|
|
129
|
+
tool_name: string;
|
|
130
|
+
tool_input: {
|
|
131
|
+
file_path: string;
|
|
132
|
+
};
|
|
133
|
+
};
|
|
134
|
+
export declare const hookMcp: (name: string, input?: Record<string, unknown>) => {
|
|
135
|
+
tool_name: string;
|
|
136
|
+
tool_input: string;
|
|
137
|
+
mcp_server_name: string;
|
|
138
|
+
command: string;
|
|
139
|
+
hook_event_name: string;
|
|
140
|
+
};
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test harness for the generated Cursor preToolUse bash hook.
|
|
3
|
+
*
|
|
4
|
+
* Runs the ACTUAL bash script the runner writes into the workspace, feeding it
|
|
5
|
+
* the REAL hook-input shapes captured from `@cursor/sdk`. It is the out-of-process
|
|
6
|
+
* deny-oracle's only honest test surface: write the runner-owned state file (with
|
|
7
|
+
* any approval grants), invoke the hook, and read back its allow/deny decision
|
|
8
|
+
* and the denial ledger.
|
|
9
|
+
*
|
|
10
|
+
* Extracted from `__tests__/hook-script.test.ts` so it is shared by both that
|
|
11
|
+
* behavior suite and the deny-oracle adapter in the gateway Contract Test Kit
|
|
12
|
+
* (`__test-utils__/gateway-substrate.ts`) — one harness, no drift.
|
|
13
|
+
*
|
|
14
|
+
* Each harness owns a throwaway workspace under the OS temp dir and self-cleans
|
|
15
|
+
* via `onTestFinished`, so it must be called from within a running test.
|
|
16
|
+
*/
|
|
17
|
+
import { onTestFinished } from "vitest";
|
|
18
|
+
import { execFileSync, execSync } from "node:child_process";
|
|
19
|
+
import { mkdtempSync, mkdirSync, writeFileSync, rmSync, readFileSync, existsSync } from "node:fs";
|
|
20
|
+
import { tmpdir } from "node:os";
|
|
21
|
+
import { join } from "node:path";
|
|
22
|
+
import { generateHookScript } from "../hook-script.js";
|
|
23
|
+
import { buildApprovalState } from "../approval-state.js";
|
|
24
|
+
import { readCasObservations } from "../cas-observations.js";
|
|
25
|
+
/**
|
|
26
|
+
* Whether `bash` is available on this machine. Hook tests must be skipped where
|
|
27
|
+
* it is not — use `const d = hasBash ? describe : describe.skip`.
|
|
28
|
+
*/
|
|
29
|
+
export const hasBash = (() => {
|
|
30
|
+
try {
|
|
31
|
+
execSync("bash -c 'exit 0'", { stdio: "ignore" });
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
})();
|
|
38
|
+
/**
|
|
39
|
+
* Build a throwaway workspace, write the generated hook + (optionally) the
|
|
40
|
+
* approval state file, and return a driver for the real bash hook.
|
|
41
|
+
*/
|
|
42
|
+
export function setupCursorHookHarness(opts = {}) {
|
|
43
|
+
const ws = mkdtempSync(join(tmpdir(), "hook-script-"));
|
|
44
|
+
onTestFinished(() => rmSync(ws, { recursive: true, force: true }));
|
|
45
|
+
// Capture-mode tests need a real git repo so `git check-ignore` resolves. A
|
|
46
|
+
// non-git test (gitWorkspace:false) deliberately leaves the workspace un-inited
|
|
47
|
+
// so the hook's substrate matches the state's gitWorkspace flag.
|
|
48
|
+
if ((opts.captureMode || opts.gitignored) && opts.gitWorkspace !== false) {
|
|
49
|
+
execSync("git init -q", { cwd: ws });
|
|
50
|
+
if (opts.gitignored && opts.gitignored.length > 0) {
|
|
51
|
+
writeFileSync(join(ws, ".gitignore"), opts.gitignored.join("\n") + "\n", "utf-8");
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const dir = join(ws, ".cursor", "hooks");
|
|
55
|
+
mkdirSync(dir, { recursive: true });
|
|
56
|
+
const statePath = join(dir, "state.json");
|
|
57
|
+
const ledgerPath = join(dir, "denials.jsonl");
|
|
58
|
+
const pointerPath = join(dir, "active.json");
|
|
59
|
+
const scriptPath = join(dir, "hook.sh");
|
|
60
|
+
// The hook script is STABLE (no baked per-turn paths); it resolves the current
|
|
61
|
+
// turn's state/ledger/runner from the active-turn pointer it re-reads each call.
|
|
62
|
+
// The workspace root is baked so capture mode's gitignore check finds the repo.
|
|
63
|
+
writeFileSync(scriptPath, generateHookScript(pointerPath, ws), "utf-8");
|
|
64
|
+
writeFileSync(pointerPath, JSON.stringify({
|
|
65
|
+
stateFile: statePath,
|
|
66
|
+
ledgerFile: ledgerPath,
|
|
67
|
+
runnerPid: opts.runnerPid ?? process.pid,
|
|
68
|
+
}), "utf-8");
|
|
69
|
+
if (!opts.noStateFile) {
|
|
70
|
+
const policies = new Map(Object.entries(opts.mcpPolicies ?? {}).map(([name, p]) => [
|
|
71
|
+
`srv/${name}`,
|
|
72
|
+
{
|
|
73
|
+
toolName: name,
|
|
74
|
+
mcpServerSlug: "srv",
|
|
75
|
+
requiresApproval: p.requiresApproval,
|
|
76
|
+
approvalMessage: p.message ?? "",
|
|
77
|
+
source: "classifier_default",
|
|
78
|
+
},
|
|
79
|
+
]));
|
|
80
|
+
const state = buildApprovalState(policies, opts.autoApproveAll ?? false, new Set(opts.leasedCategories ?? []), opts.grants, opts.captureMode ?? false, opts.captureIgnored ?? false, opts.gitWorkspace ?? true);
|
|
81
|
+
writeFileSync(statePath, JSON.stringify(state), "utf-8");
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
root: ws,
|
|
85
|
+
decide(input) {
|
|
86
|
+
const raw = execFileSync("bash", [scriptPath], { input: JSON.stringify(input) }).toString();
|
|
87
|
+
const permission = raw.includes('"permission":"deny"')
|
|
88
|
+
? "deny"
|
|
89
|
+
: raw.includes('"permission":"allow"')
|
|
90
|
+
? "allow"
|
|
91
|
+
: "?";
|
|
92
|
+
return { permission, raw };
|
|
93
|
+
},
|
|
94
|
+
ledger() {
|
|
95
|
+
if (!existsSync(ledgerPath))
|
|
96
|
+
return [];
|
|
97
|
+
return readFileSync(ledgerPath, "utf-8")
|
|
98
|
+
.split("\n")
|
|
99
|
+
.filter(Boolean)
|
|
100
|
+
.map((l) => JSON.parse(l));
|
|
101
|
+
},
|
|
102
|
+
resetLedger() {
|
|
103
|
+
writeFileSync(ledgerPath, "", "utf-8");
|
|
104
|
+
},
|
|
105
|
+
// The sidecar lives beside the state/ledger files (its `dir` is the harness's
|
|
106
|
+
// hitlDir analog), exactly as the runner derives it from dirname(STATE_FILE).
|
|
107
|
+
observations() {
|
|
108
|
+
return readCasObservations(dir);
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
// Real preToolUse hook-input shapes (PascalCase name, file_path/command in
|
|
113
|
+
// tool_input). These omit hook_event_name on purpose: a payload with no event
|
|
114
|
+
// must still take the built-in arm (the script only diverts to the MCP arm on an
|
|
115
|
+
// explicit beforeMCPExecution).
|
|
116
|
+
export const hookWrite = (filePath, content = "x") => ({ tool_name: "Write", tool_input: { file_path: filePath, content } });
|
|
117
|
+
export const hookEdit = (filePath, oldString = "a", newString = "b") => ({ tool_name: "StrReplace", tool_input: { file_path: filePath, old_string: oldString, new_string: newString } });
|
|
118
|
+
export const hookShell = (command) => ({ tool_name: "Shell", tool_input: { command, cwd: "/x", timeout: 30000 } });
|
|
119
|
+
export const hookDelete = (filePath) => ({ tool_name: "Delete", tool_input: { file_path: filePath } });
|
|
120
|
+
export const hookRead = (filePath) => ({ tool_name: "Read", tool_input: { file_path: filePath } });
|
|
121
|
+
// Real beforeMCPExecution shape (captured live): bare tool_name, tool_input as a
|
|
122
|
+
// JSON STRING, server identity, and the hook_event_name discriminator.
|
|
123
|
+
export const hookMcp = (name, input = {}) => ({
|
|
124
|
+
tool_name: name,
|
|
125
|
+
tool_input: JSON.stringify(input),
|
|
126
|
+
mcp_server_name: "srv",
|
|
127
|
+
command: "npx -y srv mcp",
|
|
128
|
+
hook_event_name: "beforeMCPExecution",
|
|
129
|
+
});
|
|
130
|
+
//# sourceMappingURL=cursor-hook-harness.js.map
|
|
@@ -0,0 +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;AAEnF;;;GAGG;AACH,MAAM,CAAC,MAAM,OAAO,GAAY,CAAC,GAAG,EAAE;IACpC,IAAI,CAAC;QACH,QAAQ,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC,EAAE,CAAC;AAkEL;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAiC,EAAE;IACxE,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;IACvD,cAAc,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEnE,4EAA4E;IAC5E,gFAAgF;IAChF,iEAAiE;IACjE,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,YAAY,KAAK,KAAK,EAAE,CAAC;QACzE,QAAQ,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACzC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACxC,+EAA+E;IAC/E,iFAAiF;IACjF,gFAAgF;IAChF,aAAa,CAAC,UAAU,EAAE,kBAAkB,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IACxE,aAAa,CACX,WAAW,EACX,IAAI,CAAC,SAAS,CAAC;QACb,SAAS,EAAE,SAAS;QACpB,UAAU,EAAE,UAAU;QACtB,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG;KACzC,CAAC,EACF,OAAO,CACR,CAAC;IAEF,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,IAAI,GAAG,CACtB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YACxD,OAAO,IAAI,EAAE;YACb;gBACE,QAAQ,EAAE,IAAI;gBACd,aAAa,EAAE,KAAK;gBACpB,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;gBACpC,eAAe,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;gBAChC,MAAM,EAAE,oBAA6B;aACtC;SACF,CAAC,CACH,CAAC;QACF,MAAM,KAAK,GAAG,kBAAkB,CAC9B,QAAQ,EACR,IAAI,CAAC,cAAc,IAAI,KAAK,EAC5B,IAAI,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,EACpC,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,WAAW,IAAI,KAAK,EACzB,IAAI,CAAC,cAAc,IAAI,KAAK,EAC5B,IAAI,CAAC,YAAY,IAAI,IAAI,CAC1B,CAAC;QACF,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO;QACL,IAAI,EAAE,EAAE;QACR,MAAM,CAAC,KAAa;YAClB,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC5F,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,qBAAqB,CAAC;gBACpD,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,sBAAsB,CAAC;oBACpC,CAAC,CAAC,OAAO;oBACT,CAAC,CAAC,GAAG,CAAC;YACV,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;QAC7B,CAAC;QACD,MAAM;YACJ,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;gBAAE,OAAO,EAAE,CAAC;YACvC,OAAO,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC;iBACrC,KAAK,CAAC,IAAI,CAAC;iBACX,MAAM,CAAC,OAAO,CAAC;iBACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;QACD,WAAW;YACT,aAAa,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;QACD,8EAA8E;QAC9E,8EAA8E;QAC9E,YAAY;YACV,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAClC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,2EAA2E;AAC3E,8EAA8E;AAC9E,iFAAiF;AACjF,gCAAgC;AAChC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,QAAgB,EAAE,OAAO,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;AACrI,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAgB,EAAE,SAAS,GAAG,GAAG,EAAE,SAAS,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;AACjM,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;AAC3H,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC/G,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;AAE3G,iFAAiF;AACjF,uEAAuE;AACvE,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,QAAiC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7E,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;IACjC,eAAe,EAAE,KAAK;IACtB,OAAO,EAAE,gBAAgB;IACzB,eAAe,EAAE,oBAAoB;CACtC,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cursor deny-oracle adapter for the HITL gateway Contract Test Kit.
|
|
3
|
+
*
|
|
4
|
+
* Drives the REAL out-of-process gateway: the runner writes the approval state
|
|
5
|
+
* file (with any grants), then the generated bash preToolUse hook makes the
|
|
6
|
+
* allow/deny decision for the tool the agent would run inside cursor-agent. There
|
|
7
|
+
* is no in-process execution to observe, so `executed` means "the hook allowed
|
|
8
|
+
* it" and the substrate cannot count executions (`observesExecution: false`).
|
|
9
|
+
*
|
|
10
|
+
* Cross-taxonomy by construction: grants are minted from the STREAM-side identity
|
|
11
|
+
* (`edit`/`shell`/`delete`), while the hook is fed the HOOK-side payload
|
|
12
|
+
* (`Write`/`Shell`/`Delete`). So every approve drive exercises the category
|
|
13
|
+
* collapse that lets a stream-minted grant match a hook-named call. The grant
|
|
14
|
+
* token binds the exact resource, so this substrate enforces lease isolation
|
|
15
|
+
* (`enforcesExactResource: true`) and implements `authorizeAfterGrant`.
|
|
16
|
+
*/
|
|
17
|
+
import type { GatewaySubstrate } from "../../../__test-utils__/approval-contract/types.js";
|
|
18
|
+
export declare function createCursorSubstrate(): GatewaySubstrate;
|