@stigmer/runner 3.0.9-dev.20260615153829 → 3.1.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__/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 +16 -3
- package/dist/activities/execute-deep-agent/hitl.js +11 -3
- 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 +393 -33
- 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 +17 -5
- package/dist/activities/execute-deep-agent/status-builder.js +44 -3
- 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 +32 -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 +284 -0
- package/src/activities/execute-deep-agent/__tests__/hitl.test.ts +14 -36
- 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 +91 -10
- 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 +23 -7
- package/src/activities/execute-deep-agent/index.ts +463 -40
- 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 +63 -8
- 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 +36 -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
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The secret-safety gate for CAS capture (design doc 12).
|
|
3
|
+
*
|
|
4
|
+
* The git substrate never captures gitignored paths, which was an accidental
|
|
5
|
+
* safety property: `.gitignore` is where projects keep secrets (`.env`, private
|
|
6
|
+
* keys, credentials). The CAS substrate's whole purpose is to start capturing
|
|
7
|
+
* ignored / non-git paths — so, done naively, it would write secret bytes into
|
|
8
|
+
* durable artifact storage. This module is the fail-closed gate that prevents
|
|
9
|
+
* that: a path classified secret-like is BLOCKED from capture (authored as
|
|
10
|
+
* DIFF_UNREVIEWABLE instead) and its bytes never leave the workspace.
|
|
11
|
+
*
|
|
12
|
+
* Scope discipline (design doc 12 D2): this is deliberately a small, explicit,
|
|
13
|
+
* deterministic matcher — NOT the Phase-4 `sensitivity` taxonomy, NOT ML. It is
|
|
14
|
+
* a pure function over the path, so the cross-edition corpus can lock it (a path
|
|
15
|
+
* either blocks or captures, identically everywhere). The matcher errs toward
|
|
16
|
+
* blocking: a path only needs to LOOK secret-like to be withheld, because the
|
|
17
|
+
* cost of withholding a non-secret (it stays on the deny-gate, as today) is far
|
|
18
|
+
* lower than the cost of persisting a real secret.
|
|
19
|
+
*
|
|
20
|
+
* @since File-Change HITL Redesign (Phase 3 — CAS / DD-E)
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Basename patterns that mark a file secret-like. Matched case-insensitively
|
|
25
|
+
* against the final path segment. Kept as an explicit, reviewable list — adding
|
|
26
|
+
* a pattern is a deliberate, corpus-locked change, never a heuristic guess.
|
|
27
|
+
*/
|
|
28
|
+
export const SECRET_BASENAME_PATTERNS: readonly RegExp[] = [
|
|
29
|
+
/^\.env(\..+)?$/, // .env, .env.local, .env.production, ...
|
|
30
|
+
/^\.npmrc$/,
|
|
31
|
+
/^\.netrc$/,
|
|
32
|
+
/^\.pgpass$/,
|
|
33
|
+
/^\.htpasswd$/,
|
|
34
|
+
/^credentials(\.[A-Za-z0-9]+)?$/, // credentials, credentials.json, ...
|
|
35
|
+
/^secrets?(\.[A-Za-z0-9]+)?$/, // secret / secrets / secrets.yaml, ...
|
|
36
|
+
/^id_(rsa|dsa|ecdsa|ed25519)$/, // private SSH keys (no .pub)
|
|
37
|
+
/.*\.(pem|key|pfx|p12|keystore|jks|asc|ppk)$/,
|
|
38
|
+
/.*\.tfstate(\.backup)?$/, // terraform state embeds secrets
|
|
39
|
+
/.*\.tfvars$/,
|
|
40
|
+
/.*\.(kdbx)$/, // password databases
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Path-fragment patterns that mark a file secret-like by WHERE it lives, matched
|
|
45
|
+
* against the normalized (forward-slash) full path. Covers credential stores
|
|
46
|
+
* whose basenames alone are ambiguous.
|
|
47
|
+
*/
|
|
48
|
+
export const SECRET_PATH_PATTERNS: readonly RegExp[] = [
|
|
49
|
+
/(^|\/)\.ssh\//, // ~/.ssh/* and repo-local .ssh/*
|
|
50
|
+
/(^|\/)\.aws\/credentials$/,
|
|
51
|
+
/(^|\/)\.gnupg\//,
|
|
52
|
+
/(^|\/)\.docker\/config\.json$/,
|
|
53
|
+
/(^|\/)\.kube\/config$/,
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
/** The final path segment (basename), for both `/` and `\` separators. */
|
|
57
|
+
function basename(path: string): string {
|
|
58
|
+
const normalized = path.replace(/\\/g, "/");
|
|
59
|
+
const idx = normalized.lastIndexOf("/");
|
|
60
|
+
return idx >= 0 ? normalized.slice(idx + 1) : normalized;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Whether a path is secret-like and must NOT be captured into the durable CAS
|
|
65
|
+
* store. Fail-closed: an empty/unknown path is treated as secret-like (withheld)
|
|
66
|
+
* rather than captured.
|
|
67
|
+
*/
|
|
68
|
+
export function isSecretLikePath(path: string): boolean {
|
|
69
|
+
if (!path) return true;
|
|
70
|
+
const normalized = path.replace(/\\/g, "/");
|
|
71
|
+
const base = basename(normalized).toLowerCase();
|
|
72
|
+
|
|
73
|
+
for (const re of SECRET_BASENAME_PATTERNS) {
|
|
74
|
+
if (re.test(base)) return true;
|
|
75
|
+
}
|
|
76
|
+
const lowerPath = normalized.toLowerCase();
|
|
77
|
+
for (const re of SECRET_PATH_PATTERNS) {
|
|
78
|
+
if (re.test(lowerPath)) return true;
|
|
79
|
+
}
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** How the turn's observed gitignored paths split under the secret gate. */
|
|
84
|
+
export interface CasSecretPartition {
|
|
85
|
+
/** Paths safe to capture into durable CAS (their bytes may be persisted). */
|
|
86
|
+
readonly capturablePaths: readonly string[];
|
|
87
|
+
/**
|
|
88
|
+
* Paths withheld from capture — authored as content-less DIFF_UNREVIEWABLE.
|
|
89
|
+
* The union of the gate's up-front blocks and any observed secret-like path.
|
|
90
|
+
*/
|
|
91
|
+
readonly unreviewablePaths: readonly string[];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Split a turn's observed gitignored paths into capturable vs withheld — the
|
|
96
|
+
* single source of truth for "which ignored bytes may reach durable storage".
|
|
97
|
+
*
|
|
98
|
+
* `unreviewablePaths = gateBlockedPaths ∪ { p ∈ observed : isSecretLikePath(p) }`
|
|
99
|
+
* and `capturablePaths = { p ∈ observed : ¬isSecretLikePath(p) }`. The
|
|
100
|
+
* `isSecretLikePath` re-check over `observed` is the fail-closed backstop that
|
|
101
|
+
* holds **even under the global bypass** (`spec.auto_approve_all`): there the
|
|
102
|
+
* approval gate is not installed, so `gateBlockedPaths` is empty and this
|
|
103
|
+
* re-check is the only thing keeping a secret's bytes out of CAS. Order is
|
|
104
|
+
* preserved (gate blocks first, then observed order) and duplicates are folded,
|
|
105
|
+
* so the result is deterministic for the cross-edition corpus.
|
|
106
|
+
*/
|
|
107
|
+
export function partitionIgnoredPathsBySecret(
|
|
108
|
+
observedPaths: Iterable<string>,
|
|
109
|
+
gateBlockedPaths: ReadonlySet<string>,
|
|
110
|
+
): CasSecretPartition {
|
|
111
|
+
const unreviewable = new Set<string>(gateBlockedPaths);
|
|
112
|
+
const capturablePaths: string[] = [];
|
|
113
|
+
for (const path of observedPaths) {
|
|
114
|
+
if (isSecretLikePath(path)) {
|
|
115
|
+
unreviewable.add(path);
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
capturablePaths.push(path);
|
|
119
|
+
}
|
|
120
|
+
return { capturablePaths, unreviewablePaths: [...unreviewable] };
|
|
121
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runner-held master secret for HITL approval fingerprints (Phase 2).
|
|
3
|
+
*
|
|
4
|
+
* The per-execution fingerprint key is derived from this secret + `execution_id`
|
|
5
|
+
* (see {@link file://./approval-fingerprint.ts} `deriveExecutionFingerprintKey`).
|
|
6
|
+
* Source precedence:
|
|
7
|
+
*
|
|
8
|
+
* 1. `STIGMER_RUNNER_HITL_SECRET` env var (UTF-8), when set — the only way to get
|
|
9
|
+
* a key that is STABLE across runner processes/replicas. Required once a lease
|
|
10
|
+
* becomes a cross-process bearer token (Phase 7); optional today.
|
|
11
|
+
* 2. A per-process random secret generated once at first use — sufficient for
|
|
12
|
+
* Phase 2 because the fingerprint is recompute-and-compare WITHIN one runner
|
|
13
|
+
* process for a given execution: the deep-agent gateway runs in-process, and
|
|
14
|
+
* the Cursor key is written to and read from the per-session state file by the
|
|
15
|
+
* same process. A process restart re-keys, which can only *re-ask* a pending
|
|
16
|
+
* approval (fail-safe), never silently mis-authorize.
|
|
17
|
+
*
|
|
18
|
+
* The secret is never logged. The value is memoized so the per-process fallback
|
|
19
|
+
* stays stable for the lifetime of the process.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import { randomBytes, type BinaryLike } from "node:crypto";
|
|
23
|
+
|
|
24
|
+
const ENV_VAR = "STIGMER_RUNNER_HITL_SECRET";
|
|
25
|
+
|
|
26
|
+
let cached: Buffer | undefined;
|
|
27
|
+
let warned = false;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Return the runner's HITL master secret (env-configured, else a stable
|
|
31
|
+
* per-process random fallback). Memoized.
|
|
32
|
+
*/
|
|
33
|
+
export function getRunnerHitlMasterSecret(): BinaryLike {
|
|
34
|
+
if (cached) return cached;
|
|
35
|
+
|
|
36
|
+
const fromEnv = process.env[ENV_VAR];
|
|
37
|
+
if (fromEnv && fromEnv.length > 0) {
|
|
38
|
+
cached = Buffer.from(fromEnv, "utf-8");
|
|
39
|
+
return cached;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
cached = randomBytes(32);
|
|
43
|
+
if (!warned) {
|
|
44
|
+
warned = true;
|
|
45
|
+
console.warn(
|
|
46
|
+
`[hitl-gateway] ${ENV_VAR} is not set; using a per-process random ` +
|
|
47
|
+
"fingerprint secret. Fingerprints are stable within this process only — " +
|
|
48
|
+
`set ${ENV_VAR} for a key stable across runner restarts/replicas ` +
|
|
49
|
+
"(required in Phase 7).",
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
return cached;
|
|
53
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single construction point for LangChain chat models in the runner.
|
|
3
|
+
*
|
|
4
|
+
* This is the only place that translates a Stigmer registry model ID
|
|
5
|
+
* (dot-notation, e.g. "claude-haiku-4.5") into the provider's API model ID
|
|
6
|
+
* (e.g. "claude-haiku-4-5-20251001") before a client is built — so no
|
|
7
|
+
* activity can bypass the translation and 404 the provider.
|
|
8
|
+
*
|
|
9
|
+
* Layering: `llm-proxy.ts` stays pure routing utilities (no LangChain
|
|
10
|
+
* dependency); this module is the LangChain-aware layer above it that owns
|
|
11
|
+
* the resolve -> infer-provider -> strip-prefix -> proxy-wire -> construct
|
|
12
|
+
* sequence that used to be copy-pasted across every LLM activity.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { ChatAnthropic } from "@langchain/anthropic";
|
|
16
|
+
import { ChatOpenAI } from "@langchain/openai";
|
|
17
|
+
import type { BaseChatModel } from "@langchain/core/language_models/chat_models";
|
|
18
|
+
|
|
19
|
+
import {
|
|
20
|
+
inferProvider,
|
|
21
|
+
stripProviderPrefix,
|
|
22
|
+
resolveProxyBaseUrl,
|
|
23
|
+
buildProxyHeaders,
|
|
24
|
+
type LlmProvider,
|
|
25
|
+
} from "./llm-proxy.js";
|
|
26
|
+
import { resolveToApiModelId } from "./model-registry.js";
|
|
27
|
+
|
|
28
|
+
export interface BuildChatModelOptions {
|
|
29
|
+
/** Registry id ("claude-haiku-4.5"), "provider:model", or a provider API id. */
|
|
30
|
+
readonly modelName: string;
|
|
31
|
+
/** When set, requests route through the Stigmer proxy at the provider path. */
|
|
32
|
+
readonly proxyEndpoint?: string;
|
|
33
|
+
readonly stigmerToken?: string;
|
|
34
|
+
/** Scope headers for proxy FGA/billing attribution. */
|
|
35
|
+
readonly headerScope?: {
|
|
36
|
+
executionId?: string;
|
|
37
|
+
mcpServerId?: string;
|
|
38
|
+
workflowExecutionId?: string;
|
|
39
|
+
};
|
|
40
|
+
/** Defaults to 0. */
|
|
41
|
+
readonly temperature?: number;
|
|
42
|
+
/**
|
|
43
|
+
* Pass-through only; intentionally no default. Anthropic requires a value,
|
|
44
|
+
* but callers differ (setup omits it, call-llm uses 4096), so the default
|
|
45
|
+
* stays the caller's decision to avoid silently changing behavior.
|
|
46
|
+
*/
|
|
47
|
+
readonly maxTokens?: number;
|
|
48
|
+
readonly timeoutMs?: number;
|
|
49
|
+
readonly maxRetries?: number;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface BuiltChatModel {
|
|
53
|
+
readonly model: BaseChatModel;
|
|
54
|
+
readonly provider: LlmProvider;
|
|
55
|
+
/** The resolved id actually handed to the provider. */
|
|
56
|
+
readonly apiModelId: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Build a configured chat model, resolving the registry id to a provider API
|
|
61
|
+
* id first. The resolution MUST precede provider inference and prefix
|
|
62
|
+
* stripping — that ordering is the invariant each per-site copy kept dropping,
|
|
63
|
+
* surfacing as `404 model: claude-haiku-4.5` at the provider.
|
|
64
|
+
*/
|
|
65
|
+
export async function buildChatModel(opts: BuildChatModelOptions): Promise<BuiltChatModel> {
|
|
66
|
+
const resolved = await resolveToApiModelId(opts.modelName);
|
|
67
|
+
const provider = inferProvider(resolved);
|
|
68
|
+
const apiModelId = stripProviderPrefix(resolved);
|
|
69
|
+
|
|
70
|
+
const baseUrl = opts.proxyEndpoint
|
|
71
|
+
? resolveProxyBaseUrl(opts.proxyEndpoint, provider)
|
|
72
|
+
: undefined;
|
|
73
|
+
const headers = opts.proxyEndpoint && opts.stigmerToken
|
|
74
|
+
? buildProxyHeaders(opts.stigmerToken, opts.headerScope ?? {})
|
|
75
|
+
: undefined;
|
|
76
|
+
|
|
77
|
+
// Proxy mode authenticates with the Stigmer token; direct mode falls back to
|
|
78
|
+
// the provider's own env-var key.
|
|
79
|
+
const apiKey = opts.proxyEndpoint
|
|
80
|
+
? (opts.stigmerToken ?? "proxy-managed")
|
|
81
|
+
: provider === "openai"
|
|
82
|
+
? (process.env.OPENAI_API_KEY ?? "")
|
|
83
|
+
: (process.env.ANTHROPIC_API_KEY ?? "");
|
|
84
|
+
|
|
85
|
+
const common = {
|
|
86
|
+
temperature: opts.temperature ?? 0,
|
|
87
|
+
apiKey,
|
|
88
|
+
...(opts.maxTokens ? { maxTokens: opts.maxTokens } : {}),
|
|
89
|
+
...(opts.timeoutMs ? { maxRetries: opts.maxRetries ?? 0, timeout: opts.timeoutMs } : {}),
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
// The two SDKs name the transport-override block differently (OpenAI:
|
|
93
|
+
// `configuration`, Anthropic: `clientOptions`) — encapsulating that here is
|
|
94
|
+
// the whole point, since the shape mismatch is where bugs used to hide.
|
|
95
|
+
const model: BaseChatModel = provider === "openai"
|
|
96
|
+
? new ChatOpenAI({
|
|
97
|
+
model: apiModelId,
|
|
98
|
+
...common,
|
|
99
|
+
...(baseUrl || headers
|
|
100
|
+
? {
|
|
101
|
+
configuration: {
|
|
102
|
+
...(baseUrl ? { baseURL: baseUrl } : {}),
|
|
103
|
+
...(headers ? { defaultHeaders: headers } : {}),
|
|
104
|
+
},
|
|
105
|
+
}
|
|
106
|
+
: {}),
|
|
107
|
+
})
|
|
108
|
+
: new ChatAnthropic({
|
|
109
|
+
model: apiModelId,
|
|
110
|
+
...common,
|
|
111
|
+
...(baseUrl || headers
|
|
112
|
+
? {
|
|
113
|
+
clientOptions: {
|
|
114
|
+
...(baseUrl ? { baseURL: baseUrl } : {}),
|
|
115
|
+
...(headers ? { defaultHeaders: headers } : {}),
|
|
116
|
+
},
|
|
117
|
+
}
|
|
118
|
+
: {}),
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
return { model, provider, apiModelId };
|
|
122
|
+
}
|
|
@@ -87,7 +87,6 @@ export async function publishPlanArtifact(opts: {
|
|
|
87
87
|
const storageKey = `artifacts/${executionId}/${PLAN_ARTIFACT_NAME}`;
|
|
88
88
|
|
|
89
89
|
await artifactStorage.upload(storageKey, content, "text/markdown");
|
|
90
|
-
const downloadUrl = await artifactStorage.getDownloadUrl(storageKey);
|
|
91
90
|
|
|
92
91
|
const artifact = create(ExecutionArtifactSchema, {
|
|
93
92
|
name: PLAN_ARTIFACT_NAME,
|
|
@@ -95,7 +94,6 @@ export async function publishPlanArtifact(opts: {
|
|
|
95
94
|
kind: ExecutionArtifactKind.FILE,
|
|
96
95
|
sizeBytes: BigInt(content.length),
|
|
97
96
|
storageKey,
|
|
98
|
-
downloadUrl,
|
|
99
97
|
createdAt: utcTimestamp(),
|
|
100
98
|
contentHash,
|
|
101
99
|
});
|