@stigmer/runner 3.10.0 → 3.11.1-dev.20260812192248
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/README.md +14 -1
- package/dist/.build-fingerprint +1 -1
- package/dist/activities/call-llm.js +9 -10
- package/dist/activities/call-llm.js.map +1 -1
- package/dist/activities/classify-tool-approvals.d.ts +2 -1
- package/dist/activities/classify-tool-approvals.js +28 -2
- package/dist/activities/classify-tool-approvals.js.map +1 -1
- package/dist/activities/discover-mcp-server.d.ts +39 -0
- package/dist/activities/discover-mcp-server.js +165 -28
- package/dist/activities/discover-mcp-server.js.map +1 -1
- package/dist/activities/emit-event.d.ts +14 -2
- package/dist/activities/emit-event.js +52 -17
- package/dist/activities/emit-event.js.map +1 -1
- package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.d.ts +8 -0
- package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.js +1 -1
- package/dist/activities/execute-cursor/__test-utils__/cursor-hook-harness.js.map +1 -1
- package/dist/activities/execute-cursor/approval-state.d.ts +28 -2
- package/dist/activities/execute-cursor/approval-state.js +7 -1
- package/dist/activities/execute-cursor/approval-state.js.map +1 -1
- package/dist/activities/execute-cursor/attachment-resolver.d.ts +14 -0
- package/dist/activities/execute-cursor/attachment-resolver.js +18 -4
- package/dist/activities/execute-cursor/attachment-resolver.js.map +1 -1
- package/dist/activities/execute-cursor/blueprint-resolver.d.ts +1 -9
- package/dist/activities/execute-cursor/blueprint-resolver.js +6 -22
- package/dist/activities/execute-cursor/blueprint-resolver.js.map +1 -1
- package/dist/activities/execute-cursor/env-resolver.js +3 -1
- package/dist/activities/execute-cursor/env-resolver.js.map +1 -1
- package/dist/activities/execute-cursor/error-classifier.d.ts +59 -3
- package/dist/activities/execute-cursor/error-classifier.js +115 -6
- package/dist/activities/execute-cursor/error-classifier.js.map +1 -1
- package/dist/activities/execute-cursor/extract-structured-output.d.ts +29 -0
- package/dist/activities/execute-cursor/extract-structured-output.js +58 -0
- package/dist/activities/execute-cursor/extract-structured-output.js.map +1 -0
- package/dist/activities/execute-cursor/hook-script.d.ts +14 -3
- package/dist/activities/execute-cursor/hook-script.js +72 -10
- package/dist/activities/execute-cursor/hook-script.js.map +1 -1
- package/dist/activities/execute-cursor/index.d.ts +51 -11
- package/dist/activities/execute-cursor/index.js +177 -93
- package/dist/activities/execute-cursor/index.js.map +1 -1
- package/dist/activities/execute-cursor/mcp-resolver.d.ts +24 -1
- package/dist/activities/execute-cursor/mcp-resolver.js +5 -2
- package/dist/activities/execute-cursor/mcp-resolver.js.map +1 -1
- package/dist/activities/execute-cursor/model-pricing-data.d.ts +2 -0
- package/dist/activities/execute-cursor/model-pricing-data.js +13 -3
- package/dist/activities/execute-cursor/model-pricing-data.js.map +1 -1
- package/dist/activities/execute-cursor/prompt-builder.d.ts +51 -4
- package/dist/activities/execute-cursor/prompt-builder.js +49 -7
- package/dist/activities/execute-cursor/prompt-builder.js.map +1 -1
- package/dist/activities/execute-cursor/turn-recovery.d.ts +52 -0
- package/dist/activities/execute-cursor/turn-recovery.js +193 -0
- package/dist/activities/execute-cursor/turn-recovery.js.map +1 -0
- package/dist/activities/execute-cursor/turn-stream.js +4 -1
- package/dist/activities/execute-cursor/turn-stream.js.map +1 -1
- package/dist/activities/execute-deep-agent/attachment-injector.d.ts +18 -1
- package/dist/activities/execute-deep-agent/attachment-injector.js +68 -23
- package/dist/activities/execute-deep-agent/attachment-injector.js.map +1 -1
- package/dist/activities/execute-deep-agent/environment.js +3 -1
- package/dist/activities/execute-deep-agent/environment.js.map +1 -1
- package/dist/activities/execute-deep-agent/index.js +15 -0
- package/dist/activities/execute-deep-agent/index.js.map +1 -1
- package/dist/activities/execute-deep-agent/prompt-builder.d.ts +7 -7
- package/dist/activities/execute-deep-agent/prompt-builder.js +8 -2
- package/dist/activities/execute-deep-agent/prompt-builder.js.map +1 -1
- package/dist/activities/execute-deep-agent/setup.d.ts +10 -0
- package/dist/activities/execute-deep-agent/setup.js +65 -24
- package/dist/activities/execute-deep-agent/setup.js.map +1 -1
- package/dist/activities/execute-deep-agent/shell-env.d.ts +5 -1
- package/dist/activities/execute-deep-agent/shell-env.js +7 -9
- package/dist/activities/execute-deep-agent/shell-env.js.map +1 -1
- package/dist/activities/execute-deep-agent/subagent-transformer.d.ts +18 -1
- package/dist/activities/execute-deep-agent/subagent-transformer.js +15 -2
- package/dist/activities/execute-deep-agent/subagent-transformer.js.map +1 -1
- package/dist/activities/execute-deep-agent/subagent-wiring.d.ts +27 -6
- package/dist/activities/execute-deep-agent/subagent-wiring.js +26 -5
- package/dist/activities/execute-deep-agent/subagent-wiring.js.map +1 -1
- package/dist/activities/hydrate-workflow-execution.js +8 -3
- package/dist/activities/hydrate-workflow-execution.js.map +1 -1
- package/dist/activities/run-command.d.ts +5 -2
- package/dist/activities/run-command.js +22 -10
- package/dist/activities/run-command.js.map +1 -1
- package/dist/activities/run-env.d.ts +40 -0
- package/dist/activities/run-env.js +66 -0
- package/dist/activities/run-env.js.map +1 -0
- package/dist/activities/workflow-event-activities.d.ts +28 -10
- package/dist/activities/workflow-event-activities.js +87 -58
- package/dist/activities/workflow-event-activities.js.map +1 -1
- package/dist/bootstrap.js +5 -0
- package/dist/bootstrap.js.map +1 -1
- package/dist/claimcheck/payload-codec.js +21 -1
- package/dist/claimcheck/payload-codec.js.map +1 -1
- package/dist/client/stigmer-client.d.ts +83 -21
- package/dist/client/stigmer-client.js +106 -29
- package/dist/client/stigmer-client.js.map +1 -1
- package/dist/encryption/config.d.ts +64 -0
- package/dist/encryption/config.js +108 -0
- package/dist/encryption/config.js.map +1 -0
- package/dist/encryption/index.d.ts +3 -0
- package/dist/encryption/index.js +3 -0
- package/dist/encryption/index.js.map +1 -0
- package/dist/encryption/payload-codec.d.ts +41 -0
- package/dist/encryption/payload-codec.js +130 -0
- package/dist/encryption/payload-codec.js.map +1 -0
- package/dist/middleware/index.d.ts +3 -0
- package/dist/middleware/index.js +7 -0
- package/dist/middleware/index.js.map +1 -1
- package/dist/middleware/path-normalization.d.ts +57 -0
- package/dist/middleware/path-normalization.js +109 -0
- package/dist/middleware/path-normalization.js.map +1 -0
- package/dist/middleware/types.d.ts +8 -0
- package/dist/payload-codecs.d.ts +17 -0
- package/dist/payload-codecs.js +42 -0
- package/dist/payload-codecs.js.map +1 -0
- package/dist/preflight.d.ts +31 -0
- package/dist/preflight.js +43 -0
- package/dist/preflight.js.map +1 -1
- package/dist/runner-manager.js +21 -17
- package/dist/runner-manager.js.map +1 -1
- package/dist/runner.js +11 -18
- package/dist/runner.js.map +1 -1
- package/dist/shared/approval-policy.d.ts +9 -3
- package/dist/shared/approval-policy.js +15 -6
- package/dist/shared/approval-policy.js.map +1 -1
- package/dist/shared/artifact-storage.d.ts +23 -1
- package/dist/shared/artifact-storage.js +51 -10
- package/dist/shared/artifact-storage.js.map +1 -1
- package/dist/shared/attachment-naming.d.ts +53 -0
- package/dist/shared/attachment-naming.js +59 -0
- package/dist/shared/attachment-naming.js.map +1 -0
- package/dist/shared/caller-identity.d.ts +23 -2
- package/dist/shared/caller-identity.js +36 -5
- package/dist/shared/caller-identity.js.map +1 -1
- package/dist/shared/channel-attachment.js +1 -0
- package/dist/shared/channel-attachment.js.map +1 -1
- package/dist/shared/checkpointer/http-saver.d.ts +26 -1
- package/dist/shared/checkpointer/http-saver.js +54 -8
- package/dist/shared/checkpointer/http-saver.js.map +1 -1
- package/dist/shared/conversation-attachment.js +1 -0
- package/dist/shared/conversation-attachment.js.map +1 -1
- package/dist/shared/conversation-catchup.d.ts +9 -2
- package/dist/shared/conversation-catchup.js +39 -6
- package/dist/shared/conversation-catchup.js.map +1 -1
- package/dist/shared/datastore-attachment.d.ts +50 -7
- package/dist/shared/datastore-attachment.js +93 -11
- package/dist/shared/datastore-attachment.js.map +1 -1
- package/dist/shared/grpc-retry.d.ts +5 -1
- package/dist/shared/grpc-retry.js +5 -1
- package/dist/shared/grpc-retry.js.map +1 -1
- package/dist/shared/http-retry.d.ts +85 -0
- package/dist/shared/http-retry.js +101 -0
- package/dist/shared/http-retry.js.map +1 -0
- package/dist/shared/llm-backend.d.ts +275 -0
- package/dist/shared/llm-backend.js +425 -0
- package/dist/shared/llm-backend.js.map +1 -0
- package/dist/shared/llm-proxy.d.ts +8 -0
- package/dist/shared/llm-proxy.js +15 -0
- package/dist/shared/llm-proxy.js.map +1 -1
- package/dist/shared/mcp-enabled-tools.d.ts +57 -0
- package/dist/shared/mcp-enabled-tools.js +86 -0
- package/dist/shared/mcp-enabled-tools.js.map +1 -0
- package/dist/shared/mcp-manager.d.ts +11 -5
- package/dist/shared/mcp-manager.js +47 -8
- package/dist/shared/mcp-manager.js.map +1 -1
- package/dist/shared/mcp-resolver.d.ts +39 -2
- package/dist/shared/mcp-resolver.js +38 -2
- package/dist/shared/mcp-resolver.js.map +1 -1
- package/dist/shared/mcp-schema-sanitizer.d.ts +70 -0
- package/dist/shared/mcp-schema-sanitizer.js +197 -0
- package/dist/shared/mcp-schema-sanitizer.js.map +1 -0
- package/dist/shared/model-client.d.ts +18 -5
- package/dist/shared/model-client.js +149 -18
- package/dist/shared/model-client.js.map +1 -1
- package/dist/shared/model-error.js +198 -5
- package/dist/shared/model-error.js.map +1 -1
- package/dist/shared/model-pricing-data.d.ts +2 -0
- package/dist/shared/model-pricing-data.js +13 -3
- package/dist/shared/model-pricing-data.js.map +1 -1
- package/dist/shared/model-registry.js +3 -2
- package/dist/shared/model-registry.js.map +1 -1
- package/dist/shared/plan-mode-permissions.d.ts +33 -0
- package/dist/shared/plan-mode-permissions.js +35 -0
- package/dist/shared/plan-mode-permissions.js.map +1 -0
- package/dist/shared/registry-endpoint.d.ts +20 -0
- package/dist/shared/registry-endpoint.js +25 -0
- package/dist/shared/registry-endpoint.js.map +1 -1
- package/dist/shared/runner-credential-keys.d.ts +24 -0
- package/dist/shared/runner-credential-keys.js +47 -0
- package/dist/shared/runner-credential-keys.js.map +1 -0
- package/dist/worker.d.ts +2 -1
- package/dist/worker.js +2 -4
- package/dist/worker.js.map +1 -1
- package/dist/workflow-engine/resolve.d.ts +19 -1
- package/dist/workflow-engine/resolve.js +37 -2
- package/dist/workflow-engine/resolve.js.map +1 -1
- package/dist/workflow-engine/types.d.ts +18 -0
- package/dist/workflow-engine/types.js.map +1 -1
- package/dist/workflows/call-agent-orchestrator.d.ts +9 -0
- package/dist/workflows/call-agent-orchestrator.js +1 -0
- package/dist/workflows/call-agent-orchestrator.js.map +1 -1
- package/dist/workflows/connect-mcp-server.js +9 -0
- package/dist/workflows/connect-mcp-server.js.map +1 -1
- package/dist/workflows/engine-core.js +23 -2
- package/dist/workflows/engine-core.js.map +1 -1
- package/dist/workflows/execute-from-execution.d.ts +1 -1
- package/dist/workflows/execute-from-execution.js +11 -1
- package/dist/workflows/execute-from-execution.js.map +1 -1
- package/dist/workflows/types.d.ts +8 -0
- package/package.json +9 -4
- package/src/__test-utils__/__tests__/vitest-global-setup.test.ts +37 -0
- package/src/__test-utils__/vitest-global-setup.ts +50 -0
- package/src/__tests__/bootstrap.test.ts +43 -0
- package/src/__tests__/claimcheck-codec.test.ts +36 -0
- package/src/__tests__/encryption-codec.test.ts +287 -0
- package/src/__tests__/fixtures/encrypted-payload-fixture.json +15 -0
- package/src/__tests__/history-encryption-e2e.test.ts +243 -0
- package/src/__tests__/preflight.test.ts +65 -2
- package/src/activities/__tests__/call-llm.test.ts +75 -0
- package/src/activities/__tests__/classify-tool-approvals.test.ts +117 -1
- package/src/activities/__tests__/discover-mcp-server.hang.test.ts +103 -0
- package/src/activities/__tests__/discover-mcp-server.test.ts +242 -1
- package/src/activities/__tests__/error-classifier.test.ts +94 -2
- package/src/activities/__tests__/run-command.test.ts +221 -0
- package/src/activities/__tests__/workflow-event-activities.test.ts +107 -8
- package/src/activities/call-llm.ts +9 -16
- package/src/activities/classify-tool-approvals.ts +34 -4
- package/src/activities/discover-mcp-server.ts +203 -31
- package/src/activities/emit-event.ts +65 -21
- package/src/activities/execute-cursor/__test-utils__/cursor-hook-harness.ts +9 -0
- package/src/activities/execute-cursor/__tests__/approval-gate.test.ts +14 -0
- package/src/activities/execute-cursor/__tests__/attachment-resolver.test.ts +53 -0
- package/src/activities/execute-cursor/__tests__/build-prompt.test.ts +151 -16
- package/src/activities/execute-cursor/__tests__/error-classifier-extraction.test.ts +208 -0
- package/src/activities/execute-cursor/__tests__/extract-structured-output.test.ts +120 -0
- package/src/activities/execute-cursor/__tests__/hook-script.test.ts +93 -0
- package/src/activities/execute-cursor/__tests__/mcp-resolver.test.ts +125 -0
- package/src/activities/execute-cursor/__tests__/model-pricing.test.ts +62 -1
- package/src/activities/execute-cursor/__tests__/prompt-builder-delegation.test.ts +1 -1
- package/src/activities/execute-cursor/__tests__/turn-recovery.test.ts +160 -0
- package/src/activities/execute-cursor/__tests__/turn-stream.test.ts +13 -0
- package/src/activities/execute-cursor/approval-state.ts +30 -1
- package/src/activities/execute-cursor/attachment-resolver.ts +31 -3
- package/src/activities/execute-cursor/blueprint-resolver.ts +7 -27
- package/src/activities/execute-cursor/env-resolver.ts +3 -1
- package/src/activities/execute-cursor/error-classifier.ts +131 -7
- package/src/activities/execute-cursor/extract-structured-output.ts +72 -0
- package/src/activities/execute-cursor/hook-script.ts +74 -10
- package/src/activities/execute-cursor/index.ts +209 -109
- package/src/activities/execute-cursor/mcp-resolver.ts +36 -2
- package/src/activities/execute-cursor/model-pricing-data.ts +22 -3
- package/src/activities/execute-cursor/prompt-builder.ts +85 -9
- package/src/activities/execute-cursor/turn-recovery.ts +208 -0
- package/src/activities/execute-cursor/turn-stream.ts +5 -2
- package/src/activities/execute-deep-agent/__tests__/attachment-injector.test.ts +110 -8
- package/src/activities/execute-deep-agent/__tests__/datastore-degradation.test.ts +104 -0
- package/src/activities/execute-deep-agent/__tests__/hitl-reject.test.ts +2 -0
- package/src/activities/execute-deep-agent/__tests__/hitl-resume-approve-all.test.ts +1 -0
- package/src/activities/execute-deep-agent/__tests__/hitl-resume-history.test.ts +1 -0
- package/src/activities/execute-deep-agent/__tests__/plan-mode-path-normalization.test.ts +174 -0
- package/src/activities/execute-deep-agent/__tests__/prompt-builder.test.ts +34 -5
- package/src/activities/execute-deep-agent/__tests__/sequential-gate-resume.test.ts +1 -0
- package/src/activities/execute-deep-agent/__tests__/shell-env.test.ts +24 -10
- package/src/activities/execute-deep-agent/__tests__/subagent-plan-mode-permissions.test.ts +178 -0
- package/src/activities/execute-deep-agent/__tests__/subagent-wiring.test.ts +12 -7
- package/src/activities/execute-deep-agent/attachment-injector.ts +94 -30
- package/src/activities/execute-deep-agent/environment.ts +3 -1
- package/src/activities/execute-deep-agent/index.ts +20 -0
- package/src/activities/execute-deep-agent/prompt-builder.ts +20 -10
- package/src/activities/execute-deep-agent/setup.ts +85 -29
- package/src/activities/execute-deep-agent/shell-env.ts +8 -9
- package/src/activities/execute-deep-agent/subagent-transformer.ts +30 -2
- package/src/activities/execute-deep-agent/subagent-wiring.ts +39 -6
- package/src/activities/hydrate-workflow-execution.ts +8 -3
- package/src/activities/run-command.ts +25 -12
- package/src/activities/run-env.ts +79 -0
- package/src/activities/workflow-event-activities.ts +96 -69
- package/src/bootstrap.ts +5 -0
- package/src/claimcheck/payload-codec.ts +33 -1
- package/src/client/__tests__/stigmer-client.test.ts +110 -11
- package/src/client/stigmer-client.ts +150 -37
- package/src/encryption/config.ts +155 -0
- package/src/encryption/index.ts +3 -0
- package/src/encryption/payload-codec.ts +152 -0
- package/src/middleware/__tests__/path-normalization.test.ts +140 -0
- package/src/middleware/index.ts +8 -0
- package/src/middleware/path-normalization.ts +125 -0
- package/src/middleware/types.ts +11 -0
- package/src/payload-codecs.ts +62 -0
- package/src/preflight.ts +45 -0
- package/src/runner-manager.ts +26 -26
- package/src/runner.ts +12 -27
- package/src/shared/__tests__/approval-policy.test.ts +82 -39
- package/src/shared/__tests__/artifact-storage.test.ts +145 -2
- package/src/shared/__tests__/attachment-naming.test.ts +159 -0
- package/src/shared/__tests__/bedrock-adapter.test.ts +213 -0
- package/src/shared/__tests__/bedrock-seam.test.ts +390 -0
- package/src/shared/__tests__/caller-identity.test.ts +25 -0
- package/src/shared/__tests__/channel-attachment.test.ts +1 -1
- package/src/shared/__tests__/connect-backfill.test.ts +1 -0
- package/src/shared/__tests__/conversation-attachment.test.ts +1 -1
- package/src/shared/__tests__/conversation-catchup.test.ts +24 -0
- package/src/shared/__tests__/datastore-attachment.test.ts +129 -1
- package/src/shared/__tests__/foundry-adapter.test.ts +276 -0
- package/src/shared/__tests__/foundry-seam.test.ts +482 -0
- package/src/shared/__tests__/http-retry.test.ts +68 -0
- package/src/shared/__tests__/llm-backend.test.ts +616 -0
- package/src/shared/__tests__/mcp-enabled-tools.test.ts +86 -0
- package/src/shared/__tests__/mcp-manager.test.ts +137 -15
- package/src/shared/__tests__/mcp-resolver.test.ts +146 -3
- package/src/shared/__tests__/mcp-schema-sanitizer.test.ts +267 -0
- package/src/shared/__tests__/model-client.test.ts +200 -0
- package/src/shared/__tests__/model-error.test.ts +289 -1
- package/src/shared/__tests__/model-pricing.test.ts +62 -2
- package/src/shared/__tests__/model-registry.test.ts +22 -0
- package/src/shared/__tests__/synthesized-attachment.test.ts +1 -0
- package/src/shared/__tests__/vertex-adapter.test.ts +169 -0
- package/src/shared/__tests__/vertex-seam.test.ts +295 -0
- package/src/shared/approval-policy.ts +14 -7
- package/src/shared/artifact-storage.ts +75 -10
- package/src/shared/attachment-naming.ts +78 -0
- package/src/shared/caller-identity.ts +40 -5
- package/src/shared/channel-attachment.ts +1 -0
- package/src/shared/checkpointer/__tests__/http-saver.test.ts +196 -1
- package/src/shared/checkpointer/http-saver.ts +71 -8
- package/src/shared/conversation-attachment.ts +1 -0
- package/src/shared/conversation-catchup.ts +39 -6
- package/src/shared/datastore-attachment.ts +106 -11
- package/src/shared/grpc-retry.ts +5 -1
- package/src/shared/http-retry.ts +139 -0
- package/src/shared/llm-backend.ts +544 -0
- package/src/shared/llm-proxy.ts +15 -0
- package/src/shared/mcp-enabled-tools.ts +105 -0
- package/src/shared/mcp-manager.ts +56 -8
- package/src/shared/mcp-resolver.ts +73 -2
- package/src/shared/mcp-schema-sanitizer.ts +224 -0
- package/src/shared/model-client.ts +179 -19
- package/src/shared/model-error.ts +222 -4
- package/src/shared/model-pricing-data.ts +22 -3
- package/src/shared/model-registry.ts +7 -2
- package/src/shared/plan-mode-permissions.ts +37 -0
- package/src/shared/registry-endpoint.ts +27 -0
- package/src/shared/runner-credential-keys.ts +46 -0
- package/src/worker.ts +4 -5
- package/src/workflow-engine/__tests__/tasks/emit-event.test.ts +127 -49
- package/src/workflow-engine/resolve.ts +48 -2
- package/src/workflow-engine/types.ts +18 -0
- package/src/workflows/__tests__/connect-mcp-server.test.ts +25 -0
- package/src/workflows/__tests__/execute-serverless-workflow.test.ts +68 -2
- package/src/workflows/call-agent-orchestrator.ts +10 -0
- package/src/workflows/connect-mcp-server.ts +9 -0
- package/src/workflows/engine-core.ts +23 -2
- package/src/workflows/execute-from-execution.ts +12 -2
- package/src/workflows/types.ts +8 -0
- package/dist/activities/execute-cursor/mcp-config.d.ts +0 -30
- package/dist/activities/execute-cursor/mcp-config.js +0 -39
- package/dist/activities/execute-cursor/mcp-config.js.map +0 -1
- package/src/activities/execute-cursor/mcp-config.ts +0 -66
|
@@ -13,11 +13,17 @@
|
|
|
13
13
|
* The runner never holds R2/S3 credentials — in cloud mode it calls the proxy
|
|
14
14
|
* to obtain a presigned upload URL, then PUTs content over plain HTTPS.
|
|
15
15
|
*
|
|
16
|
+
* Every proxy-backend request rides the shared bounded-backoff loop
|
|
17
|
+
* (http-retry.ts) with a per-request abort timeout, so a momentary
|
|
18
|
+
* stigmer-service interruption is retried and a hung connection cannot
|
|
19
|
+
* stall an agent turn unboundedly (stigmer/stigmer#468).
|
|
20
|
+
*
|
|
16
21
|
* DD-6: No direct R2 backend. Local + Proxy only.
|
|
17
22
|
*/
|
|
18
23
|
import { mkdir, writeFile, readFile, access, rm } from "node:fs/promises";
|
|
19
24
|
import { dirname, join, resolve, sep } from "node:path";
|
|
20
25
|
import { homedir } from "node:os";
|
|
26
|
+
import { fetchWithRetry } from "./http-retry.js";
|
|
21
27
|
// ── Local Backend ────────────────────────────────────────────────────
|
|
22
28
|
export class LocalArtifactStorage {
|
|
23
29
|
basePath;
|
|
@@ -81,13 +87,45 @@ export class LocalArtifactStorage {
|
|
|
81
87
|
return full;
|
|
82
88
|
}
|
|
83
89
|
}
|
|
84
|
-
|
|
90
|
+
/**
|
|
91
|
+
* Default transient-retry policy (stigmer/stigmer#468): the checkpointer's
|
|
92
|
+
* budget — sized to span a pod-restart reroute, ~7.75 s of delays across
|
|
93
|
+
* 5 retries. Retrying is safe at every site: the presign POSTs are
|
|
94
|
+
* idempotent mints, the PUT re-sends identical bytes to the same key (a
|
|
95
|
+
* keyed overwrite), and the GETs are reads.
|
|
96
|
+
*/
|
|
97
|
+
const DEFAULT_RETRY = {
|
|
98
|
+
baseDelayMs: 250,
|
|
99
|
+
backoffFactor: 2,
|
|
100
|
+
maxRetries: 5,
|
|
101
|
+
requestTimeoutMs: 30_000,
|
|
102
|
+
transferTimeoutMs: 120_000,
|
|
103
|
+
};
|
|
85
104
|
export class ProxyArtifactStorage {
|
|
86
105
|
baseUrl;
|
|
87
106
|
authTokenSource;
|
|
88
|
-
|
|
107
|
+
/** Governs the proxy presign calls and the exists probe. */
|
|
108
|
+
requestPolicy;
|
|
109
|
+
/** Governs the presigned R2 transfers; same budget, wider timeout. */
|
|
110
|
+
transferPolicy;
|
|
111
|
+
constructor(proxyEndpoint, authToken, options = {}) {
|
|
89
112
|
this.baseUrl = `${proxyEndpoint.replace(/\/+$/, "")}/v1/proxy/artifacts`;
|
|
90
113
|
this.authTokenSource = authToken;
|
|
114
|
+
const shared = {
|
|
115
|
+
label: "ProxyArtifactStorage",
|
|
116
|
+
baseDelayMs: options.baseDelayMs ?? DEFAULT_RETRY.baseDelayMs,
|
|
117
|
+
backoffFactor: options.backoffFactor ?? DEFAULT_RETRY.backoffFactor,
|
|
118
|
+
maxRetries: options.maxRetries ?? DEFAULT_RETRY.maxRetries,
|
|
119
|
+
delayFn: options.delayFn,
|
|
120
|
+
};
|
|
121
|
+
this.requestPolicy = {
|
|
122
|
+
...shared,
|
|
123
|
+
requestTimeoutMs: options.requestTimeoutMs ?? DEFAULT_RETRY.requestTimeoutMs,
|
|
124
|
+
};
|
|
125
|
+
this.transferPolicy = {
|
|
126
|
+
...shared,
|
|
127
|
+
requestTimeoutMs: options.transferTimeoutMs ?? DEFAULT_RETRY.transferTimeoutMs,
|
|
128
|
+
};
|
|
91
129
|
}
|
|
92
130
|
/**
|
|
93
131
|
* Resolve the credential per call rather than pinning the boot token: a
|
|
@@ -102,14 +140,14 @@ export class ProxyArtifactStorage {
|
|
|
102
140
|
}
|
|
103
141
|
async upload(key, content, contentType) {
|
|
104
142
|
const ct = contentType ?? "application/octet-stream";
|
|
105
|
-
const presignResp = await
|
|
143
|
+
const presignResp = await fetchWithRetry(`${this.baseUrl}/presigned-upload-url`, {
|
|
106
144
|
method: "POST",
|
|
107
145
|
headers: {
|
|
108
146
|
"Authorization": `Bearer ${this.authToken}`,
|
|
109
147
|
"Content-Type": "application/json",
|
|
110
148
|
},
|
|
111
149
|
body: JSON.stringify({ key, content_type: ct }),
|
|
112
|
-
});
|
|
150
|
+
}, this.requestPolicy);
|
|
113
151
|
if (!presignResp.ok) {
|
|
114
152
|
throw new Error(`Failed to get presigned upload URL (HTTP ${presignResp.status}): ` +
|
|
115
153
|
await presignResp.text());
|
|
@@ -138,11 +176,14 @@ export class ProxyArtifactStorage {
|
|
|
138
176
|
if (!contentTypeSigned) {
|
|
139
177
|
uploadHeaders["Content-Type"] = ct;
|
|
140
178
|
}
|
|
141
|
-
|
|
179
|
+
// Retrying the PUT alone (not the presign+PUT pair) is deliberate: the
|
|
180
|
+
// retry budget's few seconds of delays sit far inside presign validity,
|
|
181
|
+
// and re-sending the same Buffer to the same key is a keyed overwrite.
|
|
182
|
+
const putResp = await fetchWithRetry(data.url, {
|
|
142
183
|
method: "PUT",
|
|
143
184
|
headers: uploadHeaders,
|
|
144
185
|
body: content,
|
|
145
|
-
});
|
|
186
|
+
}, this.transferPolicy);
|
|
146
187
|
if (!putResp.ok) {
|
|
147
188
|
throw new Error(`Presigned upload failed (HTTP ${putResp.status}): ` +
|
|
148
189
|
await putResp.text());
|
|
@@ -150,14 +191,14 @@ export class ProxyArtifactStorage {
|
|
|
150
191
|
return key;
|
|
151
192
|
}
|
|
152
193
|
async getDownloadUrl(key) {
|
|
153
|
-
const resp = await
|
|
194
|
+
const resp = await fetchWithRetry(`${this.baseUrl}/presigned-download-url`, {
|
|
154
195
|
method: "POST",
|
|
155
196
|
headers: {
|
|
156
197
|
"Authorization": `Bearer ${this.authToken}`,
|
|
157
198
|
"Content-Type": "application/json",
|
|
158
199
|
},
|
|
159
200
|
body: JSON.stringify({ key }),
|
|
160
|
-
});
|
|
201
|
+
}, this.requestPolicy);
|
|
161
202
|
if (!resp.ok) {
|
|
162
203
|
throw new Error(`Failed to get presigned download URL (HTTP ${resp.status}): ` +
|
|
163
204
|
await resp.text());
|
|
@@ -167,7 +208,7 @@ export class ProxyArtifactStorage {
|
|
|
167
208
|
}
|
|
168
209
|
async download(key) {
|
|
169
210
|
const url = await this.getDownloadUrl(key);
|
|
170
|
-
const resp = await
|
|
211
|
+
const resp = await fetchWithRetry(url, undefined, this.transferPolicy);
|
|
171
212
|
if (!resp.ok) {
|
|
172
213
|
throw new Error(`Artifact download failed (HTTP ${resp.status}) for key '${key}': ` +
|
|
173
214
|
await resp.text());
|
|
@@ -191,7 +232,7 @@ export class ProxyArtifactStorage {
|
|
|
191
232
|
// addressed CAS blob dedup) then re-uploads, which is idempotent.
|
|
192
233
|
return false;
|
|
193
234
|
}
|
|
194
|
-
const resp = await
|
|
235
|
+
const resp = await fetchWithRetry(url, { headers: { Range: "bytes=0-0" } }, this.requestPolicy);
|
|
195
236
|
await resp.arrayBuffer().catch(() => undefined); // drain the <=1-byte body
|
|
196
237
|
if (resp.status === 404)
|
|
197
238
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-storage.js","sourceRoot":"","sources":["../../src/shared/artifact-storage.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"artifact-storage.js","sourceRoot":"","sources":["../../src/shared/artifact-storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC,OAAO,EAAE,cAAc,EAAyB,MAAM,iBAAiB,CAAC;AAuBxE,wEAAwE;AAExE,MAAM,OAAO,oBAAoB;IACd,QAAQ,CAAS;IACjB,YAAY,CAAS;IAEtC,YAAY,QAAgB,EAAE,YAAoB;QAChD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,OAAe,EAAE,YAAqB;QAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,GAAW;QAC9B,OAAO,GAAG,IAAI,CAAC,YAAY,IAAI,GAAG,EAAE,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAW;QACxB,2EAA2E;QAC3E,4EAA4E;QAC5E,iEAAiE;QACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC;YACH,OAAO,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChE,mEAAmE;YACnE,yEAAyE;YACzE,2EAA2E;YAC3E,MAAM,IAAI,KAAK,CACb,+BAA+B,GAAG,gCAAgC,IAAI,CAAC,QAAQ,MAAM,MAAM,IAAI;gBAC/F,6FAA6F;gBAC7F,wCAAwC,CACzC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACK,iBAAiB,CAAC,GAAW;QACnC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACzC,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CACb,gBAAgB,GAAG,8CAA8C,CAClE,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAiBD;;;;;;GAMG;AACH,MAAM,aAAa,GAAG;IACpB,WAAW,EAAE,GAAG;IAChB,aAAa,EAAE,CAAC;IAChB,UAAU,EAAE,CAAC;IACb,gBAAgB,EAAE,MAAM;IACxB,iBAAiB,EAAE,OAAO;CAClB,CAAC;AAEX,MAAM,OAAO,oBAAoB;IACd,OAAO,CAAS;IAChB,eAAe,CAAuB;IACvD,4DAA4D;IAC3C,aAAa,CAAmB;IACjD,sEAAsE;IACrD,cAAc,CAAmB;IAElD,YACE,aAAqB,EACrB,SAA+B,EAC/B,UAAuC,EAAE;QAEzC,IAAI,CAAC,OAAO,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,qBAAqB,CAAC;QACzE,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QACjC,MAAM,MAAM,GAAG;YACb,KAAK,EAAE,sBAAsB;YAC7B,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,aAAa,CAAC,WAAW;YAC7D,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,aAAa,CAAC,aAAa;YACnE,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,aAAa,CAAC,UAAU;YAC1D,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC;QACF,IAAI,CAAC,aAAa,GAAG;YACnB,GAAG,MAAM;YACT,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,aAAa,CAAC,gBAAgB;SAC7E,CAAC;QACF,IAAI,CAAC,cAAc,GAAG;YACpB,GAAG,MAAM;YACT,gBAAgB,EAAE,OAAO,CAAC,iBAAiB,IAAI,aAAa,CAAC,iBAAiB;SAC/E,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,IAAY,SAAS;QACnB,OAAO,OAAO,IAAI,CAAC,eAAe,KAAK,QAAQ;YAC7C,CAAC,CAAC,IAAI,CAAC,eAAe;YACtB,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,OAAe,EAAE,WAAoB;QAC7D,MAAM,EAAE,GAAG,WAAW,IAAI,0BAA0B,CAAC;QAErD,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,GAAG,IAAI,CAAC,OAAO,uBAAuB,EAAE;YAC/E,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE;gBAC3C,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;SAChD,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACvB,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,4CAA4C,WAAW,CAAC,MAAM,KAAK;gBACnE,MAAM,WAAW,CAAC,IAAI,EAAE,CACzB,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,IAAI,EAAuD,CAAC;QAE3F,yEAAyE;QACzE,4EAA4E;QAC5E,6EAA6E;QAC7E,0DAA0D;QAC1D,yEAAyE;QACzE,6EAA6E;QAC7E,4EAA4E;QAC5E,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QACzC,MAAM,aAAa,GAA2B,EAAE,CAAC;QACjD,IAAI,iBAAiB,GAAG,KAAK,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YAC1D,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM;gBAAE,SAAS;YAC5C,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,cAAc;gBAAE,iBAAiB,GAAG,IAAI,CAAC;YACpE,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC9B,CAAC;QACD,2EAA2E;QAC3E,4EAA4E;QAC5E,kCAAkC;QAClC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,aAAa,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC;QACrC,CAAC;QAED,uEAAuE;QACvE,wEAAwE;QACxE,uEAAuE;QACvE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE;YAC7C,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,aAAa;YACtB,IAAI,EAAE,OAAO;SACd,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACxB,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CACb,iCAAiC,OAAO,CAAC,MAAM,KAAK;gBACpD,MAAM,OAAO,CAAC,IAAI,EAAE,CACrB,CAAC;QACJ,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,GAAW;QAC9B,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,GAAG,IAAI,CAAC,OAAO,yBAAyB,EAAE;YAC1E,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE;gBAC3C,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;SAC9B,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,8CAA8C,IAAI,CAAC,MAAM,KAAK;gBAC9D,MAAM,IAAI,CAAC,IAAI,EAAE,CAClB,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAqB,CAAC;QAClD,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAW;QACxB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACvE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,kCAAkC,IAAI,CAAC,MAAM,cAAc,GAAG,KAAK;gBACnE,MAAM,IAAI,CAAC,IAAI,EAAE,CAClB,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,8EAA8E;QAC9E,6EAA6E;QAC7E,+EAA+E;QAC/E,yEAAyE;QACzE,uEAAuE;QACvE,4EAA4E;QAC5E,4EAA4E;QAC5E,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,yEAAyE;YACzE,kEAAkE;YAClE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,GAAG,EACH,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EACnC,IAAI,CAAC,aAAa,CACnB,CAAC;QACF,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,0BAA0B;QAC3E,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC;QACtC,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QACnF,8EAA8E;QAC9E,uEAAuE;QACvE,MAAM,IAAI,KAAK,CACb,yCAAyC,IAAI,CAAC,MAAM,cAAc,GAAG,GAAG,CACzE,CAAC;IACJ,CAAC;CACF;AAkBD;;;;;;;GAOG;AACH,SAAS,wBAAwB;IAC/B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,OAAO,IAAI;QACT,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC;QAC7C,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,MAAc;IACtD,4EAA4E;IAC5E,+EAA+E;IAC/E,wEAAwE;IACxE,0EAA0E;IAC1E,qCAAqC;IACrC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAClD,MAAM,IAAI,GACR,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC/B,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC/B,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAE3C,OAAO;QACL,IAAI;QACJ,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,wBAAwB,EAAE;QACxE,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,uBAAuB;QAC9E,aAAa,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;QACvE,sEAAsE;QACtE,yDAAyD;QACzD,cAAc,EAAE,IAAI,KAAK,OAAO;YAC9B,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC;YACzD,CAAC,CAAC,IAAI;KACT,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAA0B;IAC9D,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,WAAW,GAAG,OAAO,GAAG,CAAC,cAAc,KAAK,QAAQ;YACxD,CAAC,CAAC,GAAG,CAAC,cAAc;YACpB,CAAC,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC;QAChC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,IAAI,oBAAoB,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,cAAe,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,IAAI,oBAAoB,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;AACpE,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACjD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,gBAAgB,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC9E,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,MAAM,SAAS,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC/B,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,GAA0B,EAC1B,GAA4B;IAE5B,IAAI,OAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,OAAO,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,0EAA0E;YAC1E,kDAAkD,GAAG,CAAC,WAAW,IAAI;YACrE,QAAQ,GAAG,CAAC,IAAI,WAAW,GAAG,EAAE,CACjC,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QACxE,OAAO,CAAC,IAAI,CACV,4EAA4E;YAC5E,6EAA6E;YAC7E,wBAAwB,GAAG,CAAC,WAAW,UAAU,GAAG,CAAC,SAAS,IAAI;YAClE,mFAAmF;YACnF,iEAAiE,CAClE,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Naming policy for execution attachments — the single owner of the rule that
|
|
3
|
+
* resolves duplicate attachment filenames (issue #364).
|
|
4
|
+
*
|
|
5
|
+
* Both harnesses materialize attachments into the platform inputs namespace
|
|
6
|
+
* keyed by filename, so two attachments carrying the same name contend for
|
|
7
|
+
* one on-disk path. Before this module existed each harness had an accidental
|
|
8
|
+
* answer: the deep-agent injector failed the whole execution on the collision
|
|
9
|
+
* and the Cursor resolver silently overwrote the earlier file. The platform
|
|
10
|
+
* answer is neither — a duplicate is mechanically renamed (`report.pdf`,
|
|
11
|
+
* `report-2.pdf`, ...) and the rename is disclosed to the agent through the
|
|
12
|
+
* input-files prompt section, so no execution is ever burned over a
|
|
13
|
+
* resolvable name and no user file silently vanishes.
|
|
14
|
+
*
|
|
15
|
+
* The `stem-2.ext` semantics deliberately mirror the React SDK composer's
|
|
16
|
+
* client-side rename (sdk/react/src/attachment/attachment-utils.ts,
|
|
17
|
+
* `uniquifyFilename` — kept in sync by hand, the packages share no
|
|
18
|
+
* dependency), so a user sees the same rename shape whether the client or the
|
|
19
|
+
* runner performed it.
|
|
20
|
+
*
|
|
21
|
+
* Scope: this module owns NAMES only. What constitutes a collision is the
|
|
22
|
+
* caller's business — the deep-agent injector keys on full mount paths
|
|
23
|
+
* (explicit `mountPath` values participate), the Cursor resolver keys on bare
|
|
24
|
+
* filenames under `inputs/`. Callers that consider a collision a user
|
|
25
|
+
* contradiction (two attachments explicitly pinning the same mount path)
|
|
26
|
+
* keep rejecting; only mechanically derived names are renamed.
|
|
27
|
+
*/
|
|
28
|
+
/** The outcome of allocating a unique name for one attachment. */
|
|
29
|
+
export interface AllocatedName {
|
|
30
|
+
/** The final name — unchanged when it was free, `stem-N.ext` otherwise. */
|
|
31
|
+
readonly name: string;
|
|
32
|
+
/**
|
|
33
|
+
* The original requested name, present only when a rename happened — the
|
|
34
|
+
* disclosure payload the prompt builders render so the agent can still
|
|
35
|
+
* connect "the two report.pdfs" in the user's message to distinct files.
|
|
36
|
+
*/
|
|
37
|
+
readonly renamedFrom?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Returns `name` unchanged when it is not in `taken`, otherwise the first
|
|
41
|
+
* free `stem-2.ext`, `stem-3.ext`, … variant.
|
|
42
|
+
*
|
|
43
|
+
* Byte-for-byte twin of the React SDK's `uniquifyFilename`
|
|
44
|
+
* (sdk/react/src/attachment/attachment-utils.ts) so client-side and
|
|
45
|
+
* runner-side renames are indistinguishable to the user.
|
|
46
|
+
*/
|
|
47
|
+
export declare function uniquifyFilename(name: string, taken: ReadonlySet<string>): string;
|
|
48
|
+
/**
|
|
49
|
+
* Allocate a unique name against `taken`, claiming the result in the set so
|
|
50
|
+
* sequential allocations see each other. Returns the disclosure payload
|
|
51
|
+
* (`renamedFrom`) when the name had to change.
|
|
52
|
+
*/
|
|
53
|
+
export declare function allocateUniqueName(name: string, taken: Set<string>): AllocatedName;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Naming policy for execution attachments — the single owner of the rule that
|
|
3
|
+
* resolves duplicate attachment filenames (issue #364).
|
|
4
|
+
*
|
|
5
|
+
* Both harnesses materialize attachments into the platform inputs namespace
|
|
6
|
+
* keyed by filename, so two attachments carrying the same name contend for
|
|
7
|
+
* one on-disk path. Before this module existed each harness had an accidental
|
|
8
|
+
* answer: the deep-agent injector failed the whole execution on the collision
|
|
9
|
+
* and the Cursor resolver silently overwrote the earlier file. The platform
|
|
10
|
+
* answer is neither — a duplicate is mechanically renamed (`report.pdf`,
|
|
11
|
+
* `report-2.pdf`, ...) and the rename is disclosed to the agent through the
|
|
12
|
+
* input-files prompt section, so no execution is ever burned over a
|
|
13
|
+
* resolvable name and no user file silently vanishes.
|
|
14
|
+
*
|
|
15
|
+
* The `stem-2.ext` semantics deliberately mirror the React SDK composer's
|
|
16
|
+
* client-side rename (sdk/react/src/attachment/attachment-utils.ts,
|
|
17
|
+
* `uniquifyFilename` — kept in sync by hand, the packages share no
|
|
18
|
+
* dependency), so a user sees the same rename shape whether the client or the
|
|
19
|
+
* runner performed it.
|
|
20
|
+
*
|
|
21
|
+
* Scope: this module owns NAMES only. What constitutes a collision is the
|
|
22
|
+
* caller's business — the deep-agent injector keys on full mount paths
|
|
23
|
+
* (explicit `mountPath` values participate), the Cursor resolver keys on bare
|
|
24
|
+
* filenames under `inputs/`. Callers that consider a collision a user
|
|
25
|
+
* contradiction (two attachments explicitly pinning the same mount path)
|
|
26
|
+
* keep rejecting; only mechanically derived names are renamed.
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* Returns `name` unchanged when it is not in `taken`, otherwise the first
|
|
30
|
+
* free `stem-2.ext`, `stem-3.ext`, … variant.
|
|
31
|
+
*
|
|
32
|
+
* Byte-for-byte twin of the React SDK's `uniquifyFilename`
|
|
33
|
+
* (sdk/react/src/attachment/attachment-utils.ts) so client-side and
|
|
34
|
+
* runner-side renames are indistinguishable to the user.
|
|
35
|
+
*/
|
|
36
|
+
export function uniquifyFilename(name, taken) {
|
|
37
|
+
if (!taken.has(name))
|
|
38
|
+
return name;
|
|
39
|
+
const dotIndex = name.lastIndexOf(".");
|
|
40
|
+
// A leading dot (".env") is a hidden-file prefix, not an extension.
|
|
41
|
+
const stem = dotIndex > 0 ? name.slice(0, dotIndex) : name;
|
|
42
|
+
const ext = dotIndex > 0 ? name.slice(dotIndex) : "";
|
|
43
|
+
for (let n = 2;; n++) {
|
|
44
|
+
const candidate = `${stem}-${n}${ext}`;
|
|
45
|
+
if (!taken.has(candidate))
|
|
46
|
+
return candidate;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Allocate a unique name against `taken`, claiming the result in the set so
|
|
51
|
+
* sequential allocations see each other. Returns the disclosure payload
|
|
52
|
+
* (`renamedFrom`) when the name had to change.
|
|
53
|
+
*/
|
|
54
|
+
export function allocateUniqueName(name, taken) {
|
|
55
|
+
const unique = uniquifyFilename(name, taken);
|
|
56
|
+
taken.add(unique);
|
|
57
|
+
return unique === name ? { name: unique } : { name: unique, renamedFrom: name };
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=attachment-naming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment-naming.js","sourceRoot":"","sources":["../../src/shared/attachment-naming.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAcH;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,KAA0B;IAE1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,oEAAoE;IACpE,MAAM,IAAI,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3D,MAAM,GAAG,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAErD,KAAK,IAAI,CAAC,GAAG,CAAC,GAAI,CAAC,EAAE,EAAE,CAAC;QACtB,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IAC9C,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAY,EACZ,KAAkB;IAElB,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7C,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClB,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAClF,CAAC"}
|
|
@@ -10,8 +10,10 @@
|
|
|
10
10
|
* 2. The session creator (`stigmer_user`) from the Session resource's
|
|
11
11
|
* audit actor — console/CLI sessions have no channel sender, but the
|
|
12
12
|
* platform knows exactly who created the session.
|
|
13
|
-
* 3. The anonymous sentinel — discovery (no session exists)
|
|
14
|
-
* with no readable creator
|
|
13
|
+
* 3. The anonymous sentinel — discovery (no session exists), sessions
|
|
14
|
+
* with no readable creator, and sessions whose creator is the
|
|
15
|
+
* backend's "system" audit placeholder (not a principal — see
|
|
16
|
+
* SYSTEM_CREATOR_SENTINEL). Consumers must treat anonymous as a
|
|
15
17
|
* first-class caller: answer tools/list, refuse tool calls.
|
|
16
18
|
*
|
|
17
19
|
* Injection is opt-in by construction: the values enter the env map used
|
|
@@ -46,6 +48,19 @@ export declare const STIGMER_USER_KIND = "stigmer_user";
|
|
|
46
48
|
* before the server's tools are ever classified.
|
|
47
49
|
*/
|
|
48
50
|
export declare const ANONYMOUS_KIND = "anonymous";
|
|
51
|
+
/**
|
|
52
|
+
* Audit-actor id that backends stamp when NO caller identity exists —
|
|
53
|
+
* the OSS server writes it on every create (no local auth), and the
|
|
54
|
+
* cloud's AuditActorBuilder falls back to it for caller-less internal
|
|
55
|
+
* writes. It names "nobody in particular": unrelated sessions from
|
|
56
|
+
* unrelated people all carry it, so presenting it as a caller identity
|
|
57
|
+
* would make the one string a grantable value that silently covers ALL
|
|
58
|
+
* such traffic in an MCP server's binding sheet. A creator matching this
|
|
59
|
+
* sentinel (and carrying no email) is therefore unresolvable and falls
|
|
60
|
+
* to anonymous — the deny-by-default the docs guide already promises
|
|
61
|
+
* for self-hosted backends.
|
|
62
|
+
*/
|
|
63
|
+
export declare const SYSTEM_CREATOR_SENTINEL = "system";
|
|
49
64
|
/** The resolved caller identity. */
|
|
50
65
|
export interface CallerIdentity {
|
|
51
66
|
kind: string;
|
|
@@ -66,6 +81,12 @@ export declare function anonymousCallerIdentity(): CallerIdentity;
|
|
|
66
81
|
* humans, and the audit actor's `id` field is historically mixed
|
|
67
82
|
* (identity-account id vs email — see the proto's own @internal note).
|
|
68
83
|
* Binding matchers should compare emails case-insensitively.
|
|
84
|
+
*
|
|
85
|
+
* A creator with no email whose id is the "system" audit placeholder is
|
|
86
|
+
* NOT a principal (see SYSTEM_CREATOR_SENTINEL) and resolves to
|
|
87
|
+
* anonymous. Email-first is deliberate here too: a real account that
|
|
88
|
+
* merely has "system" somewhere in its id is never demoted, because its
|
|
89
|
+
* email wins before the sentinel check runs.
|
|
69
90
|
*/
|
|
70
91
|
export declare function resolveCallerIdentity(sessionMetadata: Record<string, string> | undefined, creator?: SessionCreatorActor): CallerIdentity;
|
|
71
92
|
/**
|
|
@@ -10,8 +10,10 @@
|
|
|
10
10
|
* 2. The session creator (`stigmer_user`) from the Session resource's
|
|
11
11
|
* audit actor — console/CLI sessions have no channel sender, but the
|
|
12
12
|
* platform knows exactly who created the session.
|
|
13
|
-
* 3. The anonymous sentinel — discovery (no session exists)
|
|
14
|
-
* with no readable creator
|
|
13
|
+
* 3. The anonymous sentinel — discovery (no session exists), sessions
|
|
14
|
+
* with no readable creator, and sessions whose creator is the
|
|
15
|
+
* backend's "system" audit placeholder (not a principal — see
|
|
16
|
+
* SYSTEM_CREATOR_SENTINEL). Consumers must treat anonymous as a
|
|
15
17
|
* first-class caller: answer tools/list, refuse tool calls.
|
|
16
18
|
*
|
|
17
19
|
* Injection is opt-in by construction: the values enter the env map used
|
|
@@ -47,6 +49,19 @@ export const STIGMER_USER_KIND = "stigmer_user";
|
|
|
47
49
|
* before the server's tools are ever classified.
|
|
48
50
|
*/
|
|
49
51
|
export const ANONYMOUS_KIND = "anonymous";
|
|
52
|
+
/**
|
|
53
|
+
* Audit-actor id that backends stamp when NO caller identity exists —
|
|
54
|
+
* the OSS server writes it on every create (no local auth), and the
|
|
55
|
+
* cloud's AuditActorBuilder falls back to it for caller-less internal
|
|
56
|
+
* writes. It names "nobody in particular": unrelated sessions from
|
|
57
|
+
* unrelated people all carry it, so presenting it as a caller identity
|
|
58
|
+
* would make the one string a grantable value that silently covers ALL
|
|
59
|
+
* such traffic in an MCP server's binding sheet. A creator matching this
|
|
60
|
+
* sentinel (and carrying no email) is therefore unresolvable and falls
|
|
61
|
+
* to anonymous — the deny-by-default the docs guide already promises
|
|
62
|
+
* for self-hosted backends.
|
|
63
|
+
*/
|
|
64
|
+
export const SYSTEM_CREATOR_SENTINEL = "system";
|
|
50
65
|
/** The identity injected when no session context exists (discovery). */
|
|
51
66
|
export function anonymousCallerIdentity() {
|
|
52
67
|
return { kind: ANONYMOUS_KIND, value: "" };
|
|
@@ -59,6 +74,12 @@ export function anonymousCallerIdentity() {
|
|
|
59
74
|
* humans, and the audit actor's `id` field is historically mixed
|
|
60
75
|
* (identity-account id vs email — see the proto's own @internal note).
|
|
61
76
|
* Binding matchers should compare emails case-insensitively.
|
|
77
|
+
*
|
|
78
|
+
* A creator with no email whose id is the "system" audit placeholder is
|
|
79
|
+
* NOT a principal (see SYSTEM_CREATOR_SENTINEL) and resolves to
|
|
80
|
+
* anonymous. Email-first is deliberate here too: a real account that
|
|
81
|
+
* merely has "system" somewhere in its id is never demoted, because its
|
|
82
|
+
* email wins before the sentinel check runs.
|
|
62
83
|
*/
|
|
63
84
|
export function resolveCallerIdentity(sessionMetadata, creator) {
|
|
64
85
|
const sender = readSenderIdentity(sessionMetadata);
|
|
@@ -66,10 +87,20 @@ export function resolveCallerIdentity(sessionMetadata, creator) {
|
|
|
66
87
|
return { kind: sender.kind, value: sender.value };
|
|
67
88
|
}
|
|
68
89
|
const email = creator?.email?.trim();
|
|
90
|
+
if (email) {
|
|
91
|
+
return { kind: STIGMER_USER_KIND, value: email };
|
|
92
|
+
}
|
|
69
93
|
const id = creator?.id?.trim();
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
94
|
+
if (id === SYSTEM_CREATOR_SENTINEL) {
|
|
95
|
+
// Operator tripwire: identity-gated MCP tools will refuse this
|
|
96
|
+
// session; the fix is real caller attribution, never a "system" grant.
|
|
97
|
+
console.info(`Session creator is the "${SYSTEM_CREATOR_SENTINEL}" audit placeholder ` +
|
|
98
|
+
`(no email) — not a resolvable principal; presenting the anonymous ` +
|
|
99
|
+
`caller identity to MCP servers`);
|
|
100
|
+
return anonymousCallerIdentity();
|
|
101
|
+
}
|
|
102
|
+
if (id) {
|
|
103
|
+
return { kind: STIGMER_USER_KIND, value: id };
|
|
73
104
|
}
|
|
74
105
|
return anonymousCallerIdentity();
|
|
75
106
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"caller-identity.js","sourceRoot":"","sources":["../../src/shared/caller-identity.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"caller-identity.js","sourceRoot":"","sources":["../../src/shared/caller-identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -104,6 +104,7 @@ export function synthesizeChannelAttachment(channels, options) {
|
|
|
104
104
|
slug: CHANNEL_ATTACHMENT_SLUG,
|
|
105
105
|
toolApprovals: [],
|
|
106
106
|
pinnedToolApprovals: [],
|
|
107
|
+
toolApprovalOverrides: [],
|
|
107
108
|
discoveredCapabilitiesEmpty: false,
|
|
108
109
|
};
|
|
109
110
|
if (options.bridgeEndpoint !== null && options.bridgeEndpoint !== "") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel-attachment.js","sourceRoot":"","sources":["../../src/shared/channel-attachment.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAOzD,OAAO,EAAE,UAAU,EAAqC,MAAM,6BAA6B,CAAC;AAE5F;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,kBAAkB,CAAC;AAE1D,gFAAgF;AAChF,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAQvC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,MAAqB,EACrB,gBAAoC;IAEpC,IAAI,QAA4B,CAAC;IACjC,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;IAClE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,mBAAmB,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;QAClD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,+DAA+D;IAC/D,qEAAqE;IACrE,oEAAoE;IACpE,mBAAmB;IACnB,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAChD,IAAI,CAAC;YACH,OAAO;gBACL,OAAO;gBACP,SAAS,EAAE,MAAM,MAAM,CAAC,oBAAoB,CAAC,OAAO,CAAC,OAAO,EAAE,gBAAgB,CAAC;aAChF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,mBAAmB,CAAC,iBAAiB,OAAO,CAAC,OAAO,GAAG,EAAE,GAAG,CAAC,CAAC;YAC9D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QACpC,CAAC;IACH,CAAC,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CACzC,QAAgC,EAChC,OAAqC;IAErC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,mEAAmE;IACnE,MAAM,IAAI,GAAG;QACX,IAAI,EAAE,uBAAuB;QAC7B,aAAa,EAAE,EAAE;QACjB,mBAAmB,EAAE,EAAE;QACvB,2BAA2B,EAAE,KAAK;KACnC,CAAC;IAEF,IAAI,OAAO,CAAC,cAAc,KAAK,IAAI,IAAI,OAAO,CAAC,cAAc,KAAK,EAAE,EAAE,CAAC;QACrE,OAAO;YACL,GAAG,IAAI;YACP,cAAc,EAAE,MAAM;YACtB,GAAG,EAAE,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,cAAc;YAChE,OAAO,EAAE,OAAO,CAAC,UAAU,KAAK,IAAI,IAAI,OAAO,CAAC,UAAU,KAAK,EAAE;gBAC/D,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,UAAU,EAAE,EAAE;gBACnD,CAAC,CAAC,SAAS;SACd,CAAC;IACJ,CAAC;IAED,OAAO;QACL,GAAG,IAAI;QACP,cAAc,EAAE,OAAO;QACvB,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,CAAC,YAAY,CAAC;QACpB,GAAG,EAAE;YACH,kBAAkB,EAAE,UAAU;YAC9B,sBAAsB,EAAE,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC;SAC5D;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,6BAA6B,CAAC,QAAgC;IAC5E,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,MAAM,GAAG,oBAAoB,CAAC;IAElC,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,KAAK,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC9C,iEAAiE;QACjE,qEAAqE;QACrE,MAAM,QAAQ,GAAG,SAAS;aACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,KAAK,EAAE,CAAC;aACzC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAExF,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QACpD,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1C,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;QACtB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC3B,MAAM,UAAU,GAAG,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;gBAC5C,CAAC,CAAC,iBAAiB,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAChD,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,MAAM,GAAG,CAAC,CAAC,YAAY,KAAK,OAAO;gBACvC,CAAC,CAAC,yDAAyD;gBAC3D,CAAC,CAAC,EAAE,CAAC;YACP,OAAO;gBACL,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,QAAQ,IAAI,UAAU,GAAG,MAAM,EAAE;gBACrE,QAAQ,CAAC,CAAC,QAAQ,GAAG;aACtB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;QACH,aAAa,CAAC,IAAI,CAAC,CAAC,YAAY,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACjG,CAAC;IAED,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,GAAG,CAAC;QACzB,CAAC,CAAC,CAAC,IAAI,QAAQ,0BAA0B,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;QAChF,CAAC,CAAC,EAAE,CAAC;IACP,OAAO;QACL,+BAA+B;QAC/B,yEAAyE;QACzE,0EAA0E;QAC1E,2EAA2E;QAC3E,gEAAgE;QAChE,EAAE;QACF,GAAG,aAAa;QAChB,GAAG,MAAM;QACT,gCAAgC;KACjC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,IAAY,EAAE,GAAY;IACrD,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,QAAQ,GACZ,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,aAAa;QAC9B,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,kBAAkB;QACnC,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC;IAC/B,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,wBAAwB,IAAI,gCAAgC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1F,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CACV,wBAAwB,IAAI,+CAA+C,EAAE,CAAC,OAAO,EAAE,CACxF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"channel-attachment.js","sourceRoot":"","sources":["../../src/shared/channel-attachment.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,14 +13,39 @@
|
|
|
13
13
|
*
|
|
14
14
|
* The Java proxy calls Document.parse(json) which handles $binary
|
|
15
15
|
* natively, and doc.toJson() emits the same format on reads.
|
|
16
|
+
*
|
|
17
|
+
* Every request runs through the shared bounded-backoff loop
|
|
18
|
+
* (http-retry.ts's fetchWithRetry, with this saver's policy: transient
|
|
19
|
+
* classification + a per-request abort timeout). That loop is the ONLY
|
|
20
|
+
* retry layer between an agent execution and its checkpoints — the deep
|
|
21
|
+
* agent activity is deliberately non-retryable at the Temporal level
|
|
22
|
+
* (maximumAttempts: 1; replaying a whole agent run is not safe), so before
|
|
23
|
+
* this existed a single dropped request killed the execution
|
|
24
|
+
* (stigmer/stigmer-cloud#188). Retrying puts is safe by server contract:
|
|
25
|
+
* CheckpointStore documents putCheckpoint/putWrite as keyed save-or-replace
|
|
26
|
+
* upserts. Budget exhaustion still fails loudly — checkpoints are not
|
|
27
|
+
* lossy-tolerable (unlike status updates, see status.ts), and silently
|
|
28
|
+
* dropping one would corrupt resume state.
|
|
16
29
|
*/
|
|
17
30
|
import type { RunnableConfig } from "@langchain/core/runnables";
|
|
18
31
|
import { BaseCheckpointSaver, type Checkpoint, type CheckpointListOptions, type CheckpointTuple, type ChannelVersions } from "@langchain/langgraph-checkpoint";
|
|
19
32
|
import type { CheckpointMetadata, PendingWrite } from "@langchain/langgraph-checkpoint";
|
|
33
|
+
import type { RetryOptions } from "../grpc-retry.js";
|
|
34
|
+
/** Retry policy plus the per-request bound; every field is defaulted. */
|
|
35
|
+
export interface HttpCheckpointSaverOptions extends RetryOptions {
|
|
36
|
+
/**
|
|
37
|
+
* Milliseconds before an in-flight request is aborted and the attempt is
|
|
38
|
+
* classified retryable. Without it a hung connection (the realistic
|
|
39
|
+
* unplanned-pod-kill symptom) stalls forever and the retry never engages.
|
|
40
|
+
*/
|
|
41
|
+
readonly requestTimeoutMs?: number;
|
|
42
|
+
}
|
|
20
43
|
export declare class HttpCheckpointSaver extends BaseCheckpointSaver {
|
|
21
44
|
private readonly baseUrl;
|
|
22
45
|
private readonly headers;
|
|
23
|
-
|
|
46
|
+
private readonly retryPolicy;
|
|
47
|
+
constructor(proxyEndpoint: string, authToken: string, options?: HttpCheckpointSaverOptions);
|
|
48
|
+
private fetchWithRetry;
|
|
24
49
|
private serializeTyped;
|
|
25
50
|
private deserializeTyped;
|
|
26
51
|
getTuple(config: RunnableConfig): Promise<CheckpointTuple | undefined>;
|
|
@@ -13,8 +13,22 @@
|
|
|
13
13
|
*
|
|
14
14
|
* The Java proxy calls Document.parse(json) which handles $binary
|
|
15
15
|
* natively, and doc.toJson() emits the same format on reads.
|
|
16
|
+
*
|
|
17
|
+
* Every request runs through the shared bounded-backoff loop
|
|
18
|
+
* (http-retry.ts's fetchWithRetry, with this saver's policy: transient
|
|
19
|
+
* classification + a per-request abort timeout). That loop is the ONLY
|
|
20
|
+
* retry layer between an agent execution and its checkpoints — the deep
|
|
21
|
+
* agent activity is deliberately non-retryable at the Temporal level
|
|
22
|
+
* (maximumAttempts: 1; replaying a whole agent run is not safe), so before
|
|
23
|
+
* this existed a single dropped request killed the execution
|
|
24
|
+
* (stigmer/stigmer-cloud#188). Retrying puts is safe by server contract:
|
|
25
|
+
* CheckpointStore documents putCheckpoint/putWrite as keyed save-or-replace
|
|
26
|
+
* upserts. Budget exhaustion still fails loudly — checkpoints are not
|
|
27
|
+
* lossy-tolerable (unlike status updates, see status.ts), and silently
|
|
28
|
+
* dropping one would corrupt resume state.
|
|
16
29
|
*/
|
|
17
30
|
import { BaseCheckpointSaver, } from "@langchain/langgraph-checkpoint";
|
|
31
|
+
import { fetchWithRetry } from "../http-retry.js";
|
|
18
32
|
function encodeB64(data) {
|
|
19
33
|
if (typeof Buffer !== "undefined") {
|
|
20
34
|
return Buffer.from(data).toString("base64");
|
|
@@ -54,16 +68,42 @@ function configCheckpointId(config) {
|
|
|
54
68
|
function configOrg(config) {
|
|
55
69
|
return config.configurable?.org;
|
|
56
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* Default transient-retry policy. Wider than status.ts's DEFAULT_PERSIST_RETRY
|
|
73
|
+
* (3 retries, ~700 ms) on purpose: a dropped status update is lossy-tolerable,
|
|
74
|
+
* a dropped checkpoint kills the execution, so the budget here is sized to
|
|
75
|
+
* span a pod-restart reroute (~7.75 s of delays across 5 retries). Worst case
|
|
76
|
+
* with every attempt hanging — 6 x 30 s + delays, ~3.7 min — stays well inside
|
|
77
|
+
* the deep-agent activity's 1 h startToCloseTimeout (no heartbeatTimeout).
|
|
78
|
+
*/
|
|
79
|
+
const DEFAULT_RETRY = {
|
|
80
|
+
baseDelayMs: 250,
|
|
81
|
+
backoffFactor: 2,
|
|
82
|
+
maxRetries: 5,
|
|
83
|
+
requestTimeoutMs: 30_000,
|
|
84
|
+
};
|
|
57
85
|
export class HttpCheckpointSaver extends BaseCheckpointSaver {
|
|
58
86
|
baseUrl;
|
|
59
87
|
headers;
|
|
60
|
-
|
|
88
|
+
retryPolicy;
|
|
89
|
+
constructor(proxyEndpoint, authToken, options = {}) {
|
|
61
90
|
super();
|
|
62
91
|
this.baseUrl = `${proxyEndpoint.replace(/\/+$/, "")}/v1/proxy/checkpoints`;
|
|
63
92
|
this.headers = {
|
|
64
93
|
Authorization: `Bearer ${authToken}`,
|
|
65
94
|
"Content-Type": "application/json",
|
|
66
95
|
};
|
|
96
|
+
this.retryPolicy = {
|
|
97
|
+
label: "HttpCheckpointSaver",
|
|
98
|
+
baseDelayMs: options.baseDelayMs ?? DEFAULT_RETRY.baseDelayMs,
|
|
99
|
+
backoffFactor: options.backoffFactor ?? DEFAULT_RETRY.backoffFactor,
|
|
100
|
+
maxRetries: options.maxRetries ?? DEFAULT_RETRY.maxRetries,
|
|
101
|
+
requestTimeoutMs: options.requestTimeoutMs ?? DEFAULT_RETRY.requestTimeoutMs,
|
|
102
|
+
delayFn: options.delayFn,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
fetchWithRetry(url, init) {
|
|
106
|
+
return fetchWithRetry(url, init, this.retryPolicy);
|
|
67
107
|
}
|
|
68
108
|
async serializeTyped(obj) {
|
|
69
109
|
const [typeTag, payload] = await this.serde.dumpsTyped(obj);
|
|
@@ -84,7 +124,7 @@ export class HttpCheckpointSaver extends BaseCheckpointSaver {
|
|
|
84
124
|
if (checkpointId) {
|
|
85
125
|
params.set("checkpoint_id", checkpointId);
|
|
86
126
|
}
|
|
87
|
-
const resp = await
|
|
127
|
+
const resp = await this.fetchWithRetry(`${this.baseUrl}/checkpoint?${params}`, {
|
|
88
128
|
headers: this.headers,
|
|
89
129
|
});
|
|
90
130
|
if (resp.status === 404)
|
|
@@ -108,7 +148,7 @@ export class HttpCheckpointSaver extends BaseCheckpointSaver {
|
|
|
108
148
|
if (beforeId) {
|
|
109
149
|
params.set("before", beforeId);
|
|
110
150
|
}
|
|
111
|
-
const resp = await
|
|
151
|
+
const resp = await this.fetchWithRetry(`${this.baseUrl}/checkpoints?${params}`, {
|
|
112
152
|
headers: this.headers,
|
|
113
153
|
});
|
|
114
154
|
if (!resp.ok) {
|
|
@@ -138,7 +178,7 @@ export class HttpCheckpointSaver extends BaseCheckpointSaver {
|
|
|
138
178
|
const orgId = configOrg(config);
|
|
139
179
|
if (orgId)
|
|
140
180
|
doc.org_id = orgId;
|
|
141
|
-
const resp = await
|
|
181
|
+
const resp = await this.fetchWithRetry(`${this.baseUrl}/checkpoint`, {
|
|
142
182
|
method: "PUT",
|
|
143
183
|
headers: this.headers,
|
|
144
184
|
body: JSON.stringify(doc),
|
|
@@ -156,7 +196,7 @@ export class HttpCheckpointSaver extends BaseCheckpointSaver {
|
|
|
156
196
|
}
|
|
157
197
|
async deleteThread(threadId) {
|
|
158
198
|
const params = new URLSearchParams({ thread_id: threadId });
|
|
159
|
-
const resp = await
|
|
199
|
+
const resp = await this.fetchWithRetry(`${this.baseUrl}/thread?${params}`, {
|
|
160
200
|
method: "DELETE",
|
|
161
201
|
headers: this.headers,
|
|
162
202
|
});
|
|
@@ -185,7 +225,7 @@ export class HttpCheckpointSaver extends BaseCheckpointSaver {
|
|
|
185
225
|
doc.org_id = orgId;
|
|
186
226
|
return doc;
|
|
187
227
|
}));
|
|
188
|
-
const resp = await
|
|
228
|
+
const resp = await this.fetchWithRetry(`${this.baseUrl}/writes`, {
|
|
189
229
|
method: "PUT",
|
|
190
230
|
headers: this.headers,
|
|
191
231
|
body: JSON.stringify({ writes: docs }),
|
|
@@ -211,12 +251,18 @@ export class HttpCheckpointSaver extends BaseCheckpointSaver {
|
|
|
211
251
|
},
|
|
212
252
|
};
|
|
213
253
|
}
|
|
214
|
-
const writesResp = await
|
|
254
|
+
const writesResp = await this.fetchWithRetry(`${this.baseUrl}/writes?${new URLSearchParams({
|
|
215
255
|
thread_id: threadId,
|
|
216
256
|
checkpoint_ns: checkpointNs,
|
|
217
257
|
checkpoint_id: doc.checkpoint_id,
|
|
218
258
|
})}`, { headers: this.headers });
|
|
219
|
-
|
|
259
|
+
// Fail loudly, never degrade: this used to map ANY non-ok response to "no
|
|
260
|
+
// pending writes", which silently stripped resume state on a transient
|
|
261
|
+
// 500 — a checkpoint would load without the writes recorded against it.
|
|
262
|
+
if (!writesResp.ok) {
|
|
263
|
+
throw new Error(`Checkpoint writes GET failed: ${writesResp.status} ${writesResp.statusText}`);
|
|
264
|
+
}
|
|
265
|
+
const pendingWrites = await this.parseWrites((await writesResp.json()));
|
|
220
266
|
return {
|
|
221
267
|
config: {
|
|
222
268
|
configurable: {
|