@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
package/dist/.build-fingerprint
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"hash":"
|
|
1
|
+
{"hash":"cdec4dda6bfadae6","builtAt":"2026-07-03T08:53:15.198Z","fileCount":229}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The substrate-agnostic seam for the HITL gateway Contract Test Kit.
|
|
3
|
+
*
|
|
4
|
+
* Stigmer enforces tool approval through two real substrates with very different
|
|
5
|
+
* mechanics:
|
|
6
|
+
* - the in-process deep-agent gate (a LangGraph middleware that IS the side
|
|
7
|
+
* effect), and
|
|
8
|
+
* - the out-of-process Cursor deny-oracle (a bash preToolUse hook that allows or
|
|
9
|
+
* denies a tool the agent runs inside cursor-agent).
|
|
10
|
+
*
|
|
11
|
+
* The safety invariants they must uphold are identical, so the contract describes
|
|
12
|
+
* them once and runs them against anything that implements {@link GatewaySubstrate}.
|
|
13
|
+
* A future substrate (e.g. the T04 TS server's runner) joins the safety net by
|
|
14
|
+
* implementing this one interface — it does not get to redefine the invariants.
|
|
15
|
+
*
|
|
16
|
+
* This seam intentionally does NOT carry raw, harness-specific tool names. The
|
|
17
|
+
* two substrates name the same operation differently (the Cursor hook says
|
|
18
|
+
* `Write`/`Shell`/`Delete`; the deep-agent stream says `edit`/`shell`/`delete`),
|
|
19
|
+
* so the contract speaks in the abstract {@link ProposedAction} and each adapter
|
|
20
|
+
* translates it into its own taxonomy. Keeping the contract taxonomy-free is what
|
|
21
|
+
* makes "both substrates agree on the same logical action" a meaningful assertion.
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* A logical action a model proposes, expressed independently of any harness
|
|
25
|
+
* taxonomy. Each adapter maps it to its substrate's concrete tool name and args.
|
|
26
|
+
*/
|
|
27
|
+
export interface ProposedAction {
|
|
28
|
+
/**
|
|
29
|
+
* The action's approval-relevant kind. `write`/`shell`/`delete` are the gated
|
|
30
|
+
* mutating categories; `read` is any non-mutating built-in; `mcp` is an
|
|
31
|
+
* MCP-server tool.
|
|
32
|
+
*/
|
|
33
|
+
readonly kind: "write" | "shell" | "delete" | "read" | "mcp";
|
|
34
|
+
/**
|
|
35
|
+
* The resource the action acts on — the absolute file path for file actions,
|
|
36
|
+
* the command string for shell. Empty for `mcp` (MCP identity is name-scoped).
|
|
37
|
+
* This is the "salient" value the exact-resource lease binds to.
|
|
38
|
+
*/
|
|
39
|
+
readonly resource: string;
|
|
40
|
+
/**
|
|
41
|
+
* The edit content for a `write` action — the body whose digest the
|
|
42
|
+
* content-exact grant binds to. Two `write`s to the same `resource` with
|
|
43
|
+
* DIFFERENT `content` are distinct identities (the sibling-isolation probe);
|
|
44
|
+
* omitted, a substrate uses a fixed placeholder. Ignored for non-write kinds.
|
|
45
|
+
*/
|
|
46
|
+
readonly content?: string;
|
|
47
|
+
/** MCP server slug — required for `kind: "mcp"`, ignored otherwise. */
|
|
48
|
+
readonly mcpServerSlug?: string;
|
|
49
|
+
/** MCP tool name — required for `kind: "mcp"`, ignored otherwise. */
|
|
50
|
+
readonly mcpToolName?: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The decision applied to a proposed action.
|
|
54
|
+
* - `none` — no decision yet: run the action up to the gate and stop (the
|
|
55
|
+
* "what happens with no backing authorization" probe).
|
|
56
|
+
* - `approve`— authorize THIS action.
|
|
57
|
+
* - `skip` / `reject` / `unknown` — every non-approving outcome; none may execute.
|
|
58
|
+
*/
|
|
59
|
+
export type GatewayDecision = "none" | "approve" | "skip" | "reject" | "unknown";
|
|
60
|
+
/**
|
|
61
|
+
* The observable result of putting one proposed action through a substrate.
|
|
62
|
+
*/
|
|
63
|
+
export interface GatewayOutcome {
|
|
64
|
+
/**
|
|
65
|
+
* Whether the side effect ran (or, for an out-of-process substrate, whether
|
|
66
|
+
* the substrate ALLOWED it to run). This is the safety-critical observable and
|
|
67
|
+
* is comparable across substrates.
|
|
68
|
+
*/
|
|
69
|
+
readonly executed: boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Whether the substrate withheld the action pending approval. Note the precise
|
|
72
|
+
* meaning is substrate-specific (the in-process gate "paused at an interrupt";
|
|
73
|
+
* the deny-oracle "denied this call"), so it is only compared across substrates
|
|
74
|
+
* for `none`-decision probes, where both mean "withheld".
|
|
75
|
+
*/
|
|
76
|
+
readonly gated: boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Exact number of times the side effect ran. Populated only when
|
|
79
|
+
* {@link SubstrateCapabilities.observesExecution} is true (an in-process
|
|
80
|
+
* substrate can count; an out-of-process one cannot observe execution at all).
|
|
81
|
+
*/
|
|
82
|
+
readonly executionCount?: number;
|
|
83
|
+
/**
|
|
84
|
+
* The authorization provenance the gate attached when it withheld the action —
|
|
85
|
+
* the PolicySource union string (e.g. "builtin_category", "agent_override").
|
|
86
|
+
* Populated only when {@link SubstrateCapabilities.surfacesGatePolicySource} is
|
|
87
|
+
* true; empty/undefined otherwise. Lets the contract assert every gated side
|
|
88
|
+
* effect is provenance-tagged.
|
|
89
|
+
*/
|
|
90
|
+
readonly policySource?: string;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Capability flags for invariants that legitimately differ by substrate, gated
|
|
94
|
+
* rather than forked — mirroring the conformance suite's `CapabilityFlags`.
|
|
95
|
+
*/
|
|
96
|
+
export interface SubstrateCapabilities {
|
|
97
|
+
/**
|
|
98
|
+
* True when the runner executes the tool in-process and can therefore observe
|
|
99
|
+
* (and count) the side effect directly. The deep-agent gate is in-process
|
|
100
|
+
* (`true`); the Cursor hook authorizes a tool that runs in another process
|
|
101
|
+
* (`false`, receipts are best-effort).
|
|
102
|
+
*/
|
|
103
|
+
readonly observesExecution: boolean;
|
|
104
|
+
/**
|
|
105
|
+
* True when an approval is bound to the exact resource it was granted for, so
|
|
106
|
+
* approving one resource never authorizes another. The Cursor grant token binds
|
|
107
|
+
* the resource (`true`); the deep-agent gate re-checks every distinct call and
|
|
108
|
+
* relies on checkpoint replay for sameness, so per-resource lease isolation is
|
|
109
|
+
* not a property of that gate (`false`).
|
|
110
|
+
*/
|
|
111
|
+
readonly enforcesExactResource: boolean;
|
|
112
|
+
/**
|
|
113
|
+
* True when an approval is bound to the exact CONTENT of the action, not just
|
|
114
|
+
* its resource — so approving one edit to a file never authorizes a DIFFERENT
|
|
115
|
+
* edit to the SAME file. The Cursor grant binds (category, path, contentDigest)
|
|
116
|
+
* (`true`); the deep-agent gate relies on checkpoint replay for sameness, so
|
|
117
|
+
* content isolation is not a property of that gate (`false`).
|
|
118
|
+
*/
|
|
119
|
+
readonly enforcesExactContent: boolean;
|
|
120
|
+
/**
|
|
121
|
+
* True when the substrate honors a run-lifetime CLASS lease: an APPROVE_ALL on
|
|
122
|
+
* one action auto-approves later actions of the SAME class (built-in category)
|
|
123
|
+
* for the rest of the run, while a DIFFERENT class stays gated. Both production
|
|
124
|
+
* substrates enforce this (the deep-agent gate clears leased categories; the
|
|
125
|
+
* Cursor hook reads `leasedCategories` from its state file), so both set `true`
|
|
126
|
+
* and implement {@link GatewaySubstrate.authorizeUnderClassLease}.
|
|
127
|
+
*/
|
|
128
|
+
readonly appliesRunLifetimeLease: boolean;
|
|
129
|
+
/**
|
|
130
|
+
* True when the substrate attaches authorization provenance
|
|
131
|
+
* (approval_policy_source) at the gate, so a withheld action's
|
|
132
|
+
* {@link GatewayOutcome.policySource} is populated. The deep-agent gate decides
|
|
133
|
+
* and stamps the source at interrupt time (`true`); the Cursor substrate's
|
|
134
|
+
* provenance is a reconstruction-time projection over the persisted tool call,
|
|
135
|
+
* not a property of the hook's deny decision, so it is `false` here and is
|
|
136
|
+
* covered instead by the message-translator and corpus suites.
|
|
137
|
+
*/
|
|
138
|
+
readonly surfacesGatePolicySource: boolean;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* A real enforcement substrate, wired to its production code. Adapters translate
|
|
142
|
+
* abstract actions/decisions into substrate-specific drives and report a uniform
|
|
143
|
+
* {@link GatewayOutcome}; they never reimplement enforcement logic.
|
|
144
|
+
*/
|
|
145
|
+
export interface GatewaySubstrate {
|
|
146
|
+
/** Stable substrate name, used in suite titles and diagnostics. */
|
|
147
|
+
readonly name: string;
|
|
148
|
+
/** Honest per-substrate capability flags. */
|
|
149
|
+
readonly capabilities: SubstrateCapabilities;
|
|
150
|
+
/**
|
|
151
|
+
* Whether this substrate can run in the current environment (e.g. the Cursor
|
|
152
|
+
* deny-oracle needs `bash`). The contract skips its suite when `false`.
|
|
153
|
+
*/
|
|
154
|
+
readonly available: boolean;
|
|
155
|
+
/**
|
|
156
|
+
* Put a single proposed action through the substrate under a decision and
|
|
157
|
+
* report what happened.
|
|
158
|
+
*/
|
|
159
|
+
authorize(action: ProposedAction, decision: GatewayDecision): Promise<GatewayOutcome>;
|
|
160
|
+
/**
|
|
161
|
+
* Approve `granted`, then probe `probe` against that standing authorization —
|
|
162
|
+
* the lease-isolation drive. Implemented only when
|
|
163
|
+
* {@link SubstrateCapabilities.enforcesExactResource} is true.
|
|
164
|
+
*/
|
|
165
|
+
authorizeAfterGrant?(granted: ProposedAction, probe: ProposedAction): Promise<GatewayOutcome>;
|
|
166
|
+
/**
|
|
167
|
+
* Grant a run-lifetime CLASS lease by choosing APPROVE_ALL on `leased`, then
|
|
168
|
+
* probe `probe` against that standing lease — the scoped-lease drive that
|
|
169
|
+
* proves "approving all of class A never auto-approves class B." `leased` must
|
|
170
|
+
* be a gated built-in (write/shell/delete). Implemented only when
|
|
171
|
+
* {@link SubstrateCapabilities.appliesRunLifetimeLease} is true.
|
|
172
|
+
*/
|
|
173
|
+
authorizeUnderClassLease?(leased: ProposedAction, probe: ProposedAction): Promise<GatewayOutcome>;
|
|
174
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The substrate-agnostic seam for the HITL gateway Contract Test Kit.
|
|
3
|
+
*
|
|
4
|
+
* Stigmer enforces tool approval through two real substrates with very different
|
|
5
|
+
* mechanics:
|
|
6
|
+
* - the in-process deep-agent gate (a LangGraph middleware that IS the side
|
|
7
|
+
* effect), and
|
|
8
|
+
* - the out-of-process Cursor deny-oracle (a bash preToolUse hook that allows or
|
|
9
|
+
* denies a tool the agent runs inside cursor-agent).
|
|
10
|
+
*
|
|
11
|
+
* The safety invariants they must uphold are identical, so the contract describes
|
|
12
|
+
* them once and runs them against anything that implements {@link GatewaySubstrate}.
|
|
13
|
+
* A future substrate (e.g. the T04 TS server's runner) joins the safety net by
|
|
14
|
+
* implementing this one interface — it does not get to redefine the invariants.
|
|
15
|
+
*
|
|
16
|
+
* This seam intentionally does NOT carry raw, harness-specific tool names. The
|
|
17
|
+
* two substrates name the same operation differently (the Cursor hook says
|
|
18
|
+
* `Write`/`Shell`/`Delete`; the deep-agent stream says `edit`/`shell`/`delete`),
|
|
19
|
+
* so the contract speaks in the abstract {@link ProposedAction} and each adapter
|
|
20
|
+
* translates it into its own taxonomy. Keeping the contract taxonomy-free is what
|
|
21
|
+
* makes "both substrates agree on the same logical action" a meaningful assertion.
|
|
22
|
+
*/
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/__test-utils__/approval-contract/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG"}
|
|
@@ -13,7 +13,23 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import type { ChildApprovalNotification } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/approval_pb";
|
|
15
15
|
export declare function updateWorkflowTaskApprovalStatus(executionId: string, _taskName: string, notification: ChildApprovalNotification): Promise<void>;
|
|
16
|
-
export declare function clearWorkflowApprovalStatus(executionId: string): Promise<void>;
|
|
16
|
+
export declare function clearWorkflowApprovalStatus(executionId: string, childExecutionId: string): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Surfaces (or clears) a child agent's file-review gate on the parent workflow.
|
|
19
|
+
*
|
|
20
|
+
* Reference-only: writes a single WorkflowPendingFileReview naming the child and
|
|
21
|
+
* the change_set ids it currently has AWAITING_REVIEW — never the diffs, which
|
|
22
|
+
* stay single-sourced on the child. Passing an empty changeSetIds clears this
|
|
23
|
+
* child's entry (per-child merge, so parallel siblings are never disturbed).
|
|
24
|
+
*/
|
|
25
|
+
export declare function updateWorkflowFileReviewStatus(executionId: string, childExecutionId: string, changeSetIds: string[]): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Reads the child agent execution and returns the ids of its change sets that
|
|
28
|
+
* are currently AWAITING_REVIEW. The gated child is non-terminal, so its last
|
|
29
|
+
* status write stored a populated file_change_sets projection; GET returns it
|
|
30
|
+
* (the same reason getAgentExecutionProgress reads status.messages).
|
|
31
|
+
*/
|
|
32
|
+
export declare function getAwaitingFileReviewChangeSetIds(childExecutionId: string): Promise<string[]>;
|
|
17
33
|
/**
|
|
18
34
|
* Queries the child AgentExecution for progress data that can be
|
|
19
35
|
* emitted as an `agent_call_progress` event on the parent workflow.
|
|
@@ -33,5 +49,7 @@ export declare function getAgentExecutionProgress(childExecutionId: string): Pro
|
|
|
33
49
|
export declare function createCallAgentStatusActivities(): {
|
|
34
50
|
UpdateWorkflowTaskApprovalStatus: typeof updateWorkflowTaskApprovalStatus;
|
|
35
51
|
ClearWorkflowApprovalStatus: typeof clearWorkflowApprovalStatus;
|
|
52
|
+
UpdateWorkflowFileReviewStatus: typeof updateWorkflowFileReviewStatus;
|
|
53
|
+
GetAwaitingFileReviewChangeSetIds: typeof getAwaitingFileReviewChangeSetIds;
|
|
36
54
|
GetAgentExecutionProgress: typeof getAgentExecutionProgress;
|
|
37
55
|
};
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
import { StigmerClient } from "../client/stigmer-client.js";
|
|
15
15
|
import { loadConfig } from "../config.js";
|
|
16
16
|
import { create } from "@bufbuild/protobuf";
|
|
17
|
-
import { WorkflowExecutionStatusSchema, WorkflowPendingApprovalSchema } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
|
|
18
|
-
import { ToolCallStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
17
|
+
import { WorkflowExecutionStatusSchema, WorkflowPendingApprovalSchema, WorkflowPendingFileReviewSchema } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
|
|
18
|
+
import { ToolCallStatus, FileChangeSetStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
19
19
|
function buildClient() {
|
|
20
20
|
const config = loadConfig();
|
|
21
21
|
return new StigmerClient({
|
|
@@ -26,29 +26,86 @@ function buildClient() {
|
|
|
26
26
|
export async function updateWorkflowTaskApprovalStatus(executionId, _taskName, notification) {
|
|
27
27
|
if (!executionId)
|
|
28
28
|
return;
|
|
29
|
+
const childExecId = notification.executionId;
|
|
29
30
|
const client = buildClient();
|
|
30
31
|
const pendingApprovals = (notification.pendingApprovals ?? []).map((approval) => create(WorkflowPendingApprovalSchema, {
|
|
31
32
|
approval,
|
|
32
|
-
childAgentExecutionId:
|
|
33
|
+
childAgentExecutionId: childExecId,
|
|
33
34
|
}));
|
|
34
35
|
const status = create(WorkflowExecutionStatusSchema, {
|
|
35
36
|
pendingApprovals,
|
|
36
37
|
});
|
|
38
|
+
// Per-child merge scoped to this child: the write replaces only this child's
|
|
39
|
+
// approvals and preserves every parallel sibling's entries.
|
|
37
40
|
await client.updateWorkflowExecutionStatus(executionId, status, {
|
|
38
41
|
updatePendingApprovals: true,
|
|
42
|
+
pendingUpdateChildAgentExecutionId: childExecId,
|
|
39
43
|
});
|
|
40
44
|
}
|
|
41
|
-
export async function clearWorkflowApprovalStatus(executionId) {
|
|
42
|
-
if (!executionId)
|
|
45
|
+
export async function clearWorkflowApprovalStatus(executionId, childExecutionId) {
|
|
46
|
+
if (!executionId || !childExecutionId)
|
|
43
47
|
return;
|
|
44
48
|
const client = buildClient();
|
|
45
49
|
const status = create(WorkflowExecutionStatusSchema, {
|
|
46
50
|
pendingApprovals: [],
|
|
47
51
|
});
|
|
52
|
+
// Scoped clear: empty list for this child clears only its approvals; sibling
|
|
53
|
+
// children still awaiting approval are untouched.
|
|
48
54
|
await client.updateWorkflowExecutionStatus(executionId, status, {
|
|
49
55
|
updatePendingApprovals: true,
|
|
56
|
+
pendingUpdateChildAgentExecutionId: childExecutionId,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Surfaces (or clears) a child agent's file-review gate on the parent workflow.
|
|
61
|
+
*
|
|
62
|
+
* Reference-only: writes a single WorkflowPendingFileReview naming the child and
|
|
63
|
+
* the change_set ids it currently has AWAITING_REVIEW — never the diffs, which
|
|
64
|
+
* stay single-sourced on the child. Passing an empty changeSetIds clears this
|
|
65
|
+
* child's entry (per-child merge, so parallel siblings are never disturbed).
|
|
66
|
+
*/
|
|
67
|
+
export async function updateWorkflowFileReviewStatus(executionId, childExecutionId, changeSetIds) {
|
|
68
|
+
if (!executionId || !childExecutionId)
|
|
69
|
+
return;
|
|
70
|
+
const client = buildClient();
|
|
71
|
+
const pendingFileReviews = changeSetIds.length > 0
|
|
72
|
+
? [
|
|
73
|
+
create(WorkflowPendingFileReviewSchema, {
|
|
74
|
+
childAgentExecutionId: childExecutionId,
|
|
75
|
+
changeSetId: changeSetIds,
|
|
76
|
+
}),
|
|
77
|
+
]
|
|
78
|
+
: [];
|
|
79
|
+
const status = create(WorkflowExecutionStatusSchema, {
|
|
80
|
+
pendingFileReviews,
|
|
81
|
+
});
|
|
82
|
+
await client.updateWorkflowExecutionStatus(executionId, status, {
|
|
83
|
+
updatePendingFileReviews: true,
|
|
84
|
+
pendingUpdateChildAgentExecutionId: childExecutionId,
|
|
50
85
|
});
|
|
51
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Reads the child agent execution and returns the ids of its change sets that
|
|
89
|
+
* are currently AWAITING_REVIEW. The gated child is non-terminal, so its last
|
|
90
|
+
* status write stored a populated file_change_sets projection; GET returns it
|
|
91
|
+
* (the same reason getAgentExecutionProgress reads status.messages).
|
|
92
|
+
*/
|
|
93
|
+
export async function getAwaitingFileReviewChangeSetIds(childExecutionId) {
|
|
94
|
+
if (!childExecutionId)
|
|
95
|
+
return [];
|
|
96
|
+
try {
|
|
97
|
+
const client = buildClient();
|
|
98
|
+
const execution = await client.getExecution(childExecutionId);
|
|
99
|
+
const changeSets = execution?.status?.fileChangeSets ?? [];
|
|
100
|
+
return changeSets
|
|
101
|
+
.filter((cs) => cs.status === FileChangeSetStatus.AWAITING_REVIEW)
|
|
102
|
+
.map((cs) => cs.id);
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
console.warn("Failed to fetch child file-review state (non-fatal):", String(err));
|
|
106
|
+
return [];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
52
109
|
export async function getAgentExecutionProgress(childExecutionId) {
|
|
53
110
|
if (!childExecutionId)
|
|
54
111
|
return null;
|
|
@@ -85,6 +142,8 @@ export function createCallAgentStatusActivities() {
|
|
|
85
142
|
return {
|
|
86
143
|
UpdateWorkflowTaskApprovalStatus: updateWorkflowTaskApprovalStatus,
|
|
87
144
|
ClearWorkflowApprovalStatus: clearWorkflowApprovalStatus,
|
|
145
|
+
UpdateWorkflowFileReviewStatus: updateWorkflowFileReviewStatus,
|
|
146
|
+
GetAwaitingFileReviewChangeSetIds: getAwaitingFileReviewChangeSetIds,
|
|
88
147
|
GetAgentExecutionProgress: getAgentExecutionProgress,
|
|
89
148
|
};
|
|
90
149
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call-agent-status.js","sourceRoot":"","sources":["../../src/activities/call-agent-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,6BAA6B,EAAE,6BAA6B,EAAE,MAAM,gEAAgE,CAAC;
|
|
1
|
+
{"version":3,"file":"call-agent-status.js","sourceRoot":"","sources":["../../src/activities/call-agent-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,6BAA6B,EAAE,6BAA6B,EAAE,+BAA+B,EAAE,MAAM,gEAAgE,CAAC;AAE/K,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,8DAA8D,CAAC;AAEnH,SAAS,WAAW;IAClB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,IAAI,aAAa,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC,sBAAsB;QACvC,KAAK,EAAE,MAAM,CAAC,YAAY;KAC3B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,WAAmB,EACnB,SAAiB,EACjB,YAAuC;IAEvC,IAAI,CAAC,WAAW;QAAE,OAAO;IAEzB,MAAM,WAAW,GAAG,YAAY,CAAC,WAAW,CAAC;IAC7C,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAC7B,MAAM,gBAAgB,GAAG,CAAC,YAAY,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,GAAG,CAChE,CAAC,QAAQ,EAAE,EAAE,CACX,MAAM,CAAC,6BAA6B,EAAE;QACpC,QAAQ;QACR,qBAAqB,EAAE,WAAW;KACnC,CAAC,CACL,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,CAAC,6BAA6B,EAAE;QACnD,gBAAgB;KACjB,CAAC,CAAC;IAEH,6EAA6E;IAC7E,4DAA4D;IAC5D,MAAM,MAAM,CAAC,6BAA6B,CAAC,WAAW,EAAE,MAAM,EAAE;QAC9D,sBAAsB,EAAE,IAAI;QAC5B,kCAAkC,EAAE,WAAW;KAChD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,WAAmB,EACnB,gBAAwB;IAExB,IAAI,CAAC,WAAW,IAAI,CAAC,gBAAgB;QAAE,OAAO;IAE9C,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,6BAA6B,EAAE;QACnD,gBAAgB,EAAE,EAAE;KACrB,CAAC,CAAC;IAEH,6EAA6E;IAC7E,kDAAkD;IAClD,MAAM,MAAM,CAAC,6BAA6B,CAAC,WAAW,EAAE,MAAM,EAAE;QAC9D,sBAAsB,EAAE,IAAI;QAC5B,kCAAkC,EAAE,gBAAgB;KACrD,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,WAAmB,EACnB,gBAAwB,EACxB,YAAsB;IAEtB,IAAI,CAAC,WAAW,IAAI,CAAC,gBAAgB;QAAE,OAAO;IAE9C,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAC7B,MAAM,kBAAkB,GACtB,YAAY,CAAC,MAAM,GAAG,CAAC;QACrB,CAAC,CAAC;YACE,MAAM,CAAC,+BAA+B,EAAE;gBACtC,qBAAqB,EAAE,gBAAgB;gBACvC,WAAW,EAAE,YAAY;aAC1B,CAAC;SACH;QACH,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,MAAM,GAAG,MAAM,CAAC,6BAA6B,EAAE;QACnD,kBAAkB;KACnB,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,6BAA6B,CAAC,WAAW,EAAE,MAAM,EAAE;QAC9D,wBAAwB,EAAE,IAAI;QAC9B,kCAAkC,EAAE,gBAAgB;KACrD,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iCAAiC,CACrD,gBAAwB;IAExB,IAAI,CAAC,gBAAgB;QAAE,OAAO,EAAE,CAAC;IAEjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;QAC9D,MAAM,UAAU,GAAG,SAAS,EAAE,MAAM,EAAE,cAAc,IAAI,EAAE,CAAC;QAC3D,OAAO,UAAU;aACd,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,mBAAmB,CAAC,eAAe,CAAC;aACjE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,sDAAsD,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAClF,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAkBD,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,gBAAwB;IAExB,IAAI,CAAC,gBAAgB;QAAE,OAAO,IAAI,CAAC;IAEnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,SAAS,EAAE,MAAM,CAAC;QACjC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;QACvC,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC;QAEtC,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,IAAI,eAAe,GAAG,EAAE,CAAC;QACzB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;YAClC,cAAc,IAAI,KAAK,CAAC,MAAM,CAAC;YAC/B,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;gBACvB,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,MAAM,KAAK,cAAc,CAAC,iBAAiB,EAAE,CAAC;oBAC9D,eAAe,GAAG,EAAE,CAAC,IAAI,CAAC;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;QACpC,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,EAAE,WAAW,IAAI,CAAC,CAAC,CAAC;QAEvD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;QAEhC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IAC/F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,uDAAuD,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACnF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,+BAA+B;IAC7C,OAAO;QACL,gCAAgC,EAAE,gCAAgC;QAClE,2BAA2B,EAAE,2BAA2B;QACxD,8BAA8B,EAAE,8BAA8B;QAC9D,iCAAiC,EAAE,iCAAiC;QACpE,yBAAyB,EAAE,yBAAyB;KACrD,CAAC;AACJ,CAAC"}
|
|
@@ -15,53 +15,14 @@
|
|
|
15
15
|
* Input: (config: LlmCallConfig, runtimeEnv: Record<string, unknown>, executionId: string)
|
|
16
16
|
* Output: LlmCallResult
|
|
17
17
|
*/
|
|
18
|
-
import { ChatAnthropic } from "@langchain/anthropic";
|
|
19
|
-
import { ChatOpenAI } from "@langchain/openai";
|
|
20
18
|
import { HumanMessage, SystemMessage } from "@langchain/core/messages";
|
|
21
19
|
import { z } from "zod";
|
|
22
20
|
import { ApplicationFailure } from "@temporalio/activity";
|
|
23
21
|
import { jsonSchemaToZod } from "../shared/json-schema-to-zod.js";
|
|
24
|
-
import { inferProvider, stripProviderPrefix,
|
|
22
|
+
import { inferProvider, stripProviderPrefix, } from "../shared/llm-proxy.js";
|
|
25
23
|
import { computeLlmCostMicros, ensureLoaded as ensurePricingLoaded } from "../shared/model-pricing.js";
|
|
26
24
|
import { resolveToApiModelId } from "../shared/model-registry.js";
|
|
27
|
-
|
|
28
|
-
if (provider === "openai") {
|
|
29
|
-
const apiKey = baseUrl
|
|
30
|
-
? (headers?.Authorization?.replace("Bearer ", "") ?? "proxy-managed")
|
|
31
|
-
: (process.env.OPENAI_API_KEY ?? "");
|
|
32
|
-
return new ChatOpenAI({
|
|
33
|
-
model: modelId,
|
|
34
|
-
temperature: config.temperature ?? 0,
|
|
35
|
-
maxTokens: config.max_tokens,
|
|
36
|
-
...(baseUrl || headers
|
|
37
|
-
? {
|
|
38
|
-
configuration: {
|
|
39
|
-
...(baseUrl ? { baseURL: baseUrl } : {}),
|
|
40
|
-
...(headers ? { defaultHeaders: headers } : {}),
|
|
41
|
-
},
|
|
42
|
-
}
|
|
43
|
-
: {}),
|
|
44
|
-
apiKey,
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
const apiKey = baseUrl
|
|
48
|
-
? (headers?.Authorization?.replace("Bearer ", "") ?? "proxy-managed")
|
|
49
|
-
: (process.env.ANTHROPIC_API_KEY ?? "");
|
|
50
|
-
return new ChatAnthropic({
|
|
51
|
-
model: modelId,
|
|
52
|
-
temperature: config.temperature ?? 0,
|
|
53
|
-
maxTokens: config.max_tokens ?? 4096,
|
|
54
|
-
...(baseUrl || headers
|
|
55
|
-
? {
|
|
56
|
-
clientOptions: {
|
|
57
|
-
...(baseUrl ? { baseURL: baseUrl } : {}),
|
|
58
|
-
...(headers ? { defaultHeaders: headers } : {}),
|
|
59
|
-
},
|
|
60
|
-
}
|
|
61
|
-
: {}),
|
|
62
|
-
apiKey,
|
|
63
|
-
});
|
|
64
|
-
}
|
|
25
|
+
import { buildChatModel } from "../shared/model-client.js";
|
|
65
26
|
/**
|
|
66
27
|
* Stream a chat model invocation and collect the response.
|
|
67
28
|
*
|
|
@@ -171,25 +132,30 @@ export async function callLlmAction(config, runtimeEnv, executionId) {
|
|
|
171
132
|
const proxyActive = !!(proxyEndpoint && stigmerToken);
|
|
172
133
|
console.log(`[call-llm] model=${modelId} provider=${provider} proxy=${proxyActive} ` +
|
|
173
134
|
`structured=${!!config.response_schema} execution=${executionId}`);
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
}
|
|
180
|
-
else if (provider === "openai") {
|
|
181
|
-
if (!process.env.OPENAI_API_KEY) {
|
|
135
|
+
// Direct mode (no proxy) requires the provider's own API key. Validated here
|
|
136
|
+
// rather than in buildChatModel so the shared module stays free of Temporal
|
|
137
|
+
// failure types.
|
|
138
|
+
if (!proxyActive) {
|
|
139
|
+
if (provider === "openai" && !process.env.OPENAI_API_KEY) {
|
|
182
140
|
throw ApplicationFailure.nonRetryable(`OPENAI_API_KEY is not set and no proxy is configured. ` +
|
|
183
141
|
`Set the API key in your environment or connect to a Stigmer Cloud deployment.`, "LLM_MISSING_API_KEY");
|
|
184
142
|
}
|
|
185
|
-
|
|
186
|
-
else {
|
|
187
|
-
if (!process.env.ANTHROPIC_API_KEY) {
|
|
143
|
+
if (provider === "anthropic" && !process.env.ANTHROPIC_API_KEY) {
|
|
188
144
|
throw ApplicationFailure.nonRetryable(`ANTHROPIC_API_KEY is not set and no proxy is configured. ` +
|
|
189
145
|
`Set the API key in your environment or connect to a Stigmer Cloud deployment.`, "LLM_MISSING_API_KEY");
|
|
190
146
|
}
|
|
191
147
|
}
|
|
192
|
-
|
|
148
|
+
// Anthropic requires an explicit maxTokens; preserve the 4096 default here
|
|
149
|
+
// (buildChatModel intentionally imposes none). resolvedModel is already an
|
|
150
|
+
// API id, so buildChatModel's resolve step is a no-op for it.
|
|
151
|
+
const { model } = await buildChatModel({
|
|
152
|
+
modelName: resolvedModel,
|
|
153
|
+
proxyEndpoint: proxyActive ? proxyEndpoint : undefined,
|
|
154
|
+
stigmerToken: proxyActive ? stigmerToken : undefined,
|
|
155
|
+
headerScope: { workflowExecutionId: executionId },
|
|
156
|
+
temperature: config.temperature,
|
|
157
|
+
maxTokens: provider === "anthropic" ? (config.max_tokens ?? 4096) : config.max_tokens,
|
|
158
|
+
});
|
|
193
159
|
const messages = [];
|
|
194
160
|
if (config.system_prompt) {
|
|
195
161
|
messages.push(new SystemMessage(config.system_prompt));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call-llm.js","sourceRoot":"","sources":["../../src/activities/call-llm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"call-llm.js","sourceRoot":"","sources":["../../src/activities/call-llm.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,6 +33,15 @@ export interface ToolApprovalResult {
|
|
|
33
33
|
tool_name: string;
|
|
34
34
|
requires_approval: boolean;
|
|
35
35
|
message: string;
|
|
36
|
+
/**
|
|
37
|
+
* True when the connect-time fail-closed tightener force-gated this tool from
|
|
38
|
+
* its destructiveHint annotation (see applyDestructiveHintTightener), not the
|
|
39
|
+
* classifier. Persisted on ToolApprovalPolicy.from_destructive_hint so the
|
|
40
|
+
* runner attributes the gate to the annotation
|
|
41
|
+
* (ApprovalPolicySource.ANNOTATION_DESTRUCTIVE_TIGHTEN) instead of the
|
|
42
|
+
* classifier default. Absent/false on classifier and human-pinned entries.
|
|
43
|
+
*/
|
|
44
|
+
from_destructive_hint?: boolean;
|
|
36
45
|
}
|
|
37
46
|
export interface ClassifyToolsOptions {
|
|
38
47
|
proxyEndpoint: string;
|
|
@@ -40,6 +49,21 @@ export interface ClassifyToolsOptions {
|
|
|
40
49
|
primaryModel: string;
|
|
41
50
|
}
|
|
42
51
|
export declare function classifyTools(input: ClassifyToolApprovalsInput, options: ClassifyToolsOptions): Promise<ToolApprovalResult[]>;
|
|
52
|
+
/**
|
|
53
|
+
* Reconcile a batch's LLM classifications against the tools that were actually
|
|
54
|
+
* sent. The canonical result is built from the INPUT batch, never the raw model
|
|
55
|
+
* output, so the classifier can never silently disarm a gate by omission:
|
|
56
|
+
*
|
|
57
|
+
* - A tool the model classified is kept as-is (its requires_approval + message).
|
|
58
|
+
* - A tool the model OMITTED fails closed (requires_approval=true) — a missing
|
|
59
|
+
* decision is treated exactly like an outage for that one tool.
|
|
60
|
+
* - A name the model returned that was never in the batch (a hallucinated or
|
|
61
|
+
* duplicated entry) is dropped — only real tools earn a policy.
|
|
62
|
+
*/
|
|
63
|
+
export declare function reconcileBatchClassifications(batch: ToolDescriptor[], llmResults: ToolApprovalResult[]): {
|
|
64
|
+
reconciled: ToolApprovalResult[];
|
|
65
|
+
failedClosedCount: number;
|
|
66
|
+
};
|
|
43
67
|
export declare function fallbackApprovals(tools: ToolDescriptor[]): ToolApprovalResult[];
|
|
44
68
|
export declare function buildToolsPayload(tools: ToolDescriptor[]): string;
|
|
45
69
|
export declare function createClassifyToolApprovalsActivities(config: Config): {
|