@stigmer/runner 3.11.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 +2 -0
- package/dist/.build-fingerprint +1 -1
- package/dist/activities/discover-mcp-server.d.ts +7 -0
- package/dist/activities/discover-mcp-server.js +6 -4
- 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/error-classifier.d.ts +19 -0
- package/dist/activities/execute-cursor/error-classifier.js +34 -3
- package/dist/activities/execute-cursor/error-classifier.js.map +1 -1
- package/dist/activities/execute-cursor/index.d.ts +46 -10
- package/dist/activities/execute-cursor/index.js +126 -36
- package/dist/activities/execute-cursor/index.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 +33 -0
- package/dist/activities/execute-cursor/prompt-builder.js +37 -0
- 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-deep-agent/setup.js +16 -7
- 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.js +7 -1
- package/dist/activities/execute-deep-agent/subagent-transformer.js.map +1 -1
- package/dist/activities/execute-deep-agent/subagent-wiring.d.ts +17 -3
- package/dist/activities/execute-deep-agent/subagent-wiring.js +14 -2
- package/dist/activities/execute-deep-agent/subagent-wiring.js.map +1 -1
- package/dist/activities/hydrate-workflow-execution.js +8 -5
- 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/bootstrap.js +5 -0
- package/dist/bootstrap.js.map +1 -1
- package/dist/client/stigmer-client.d.ts +83 -26
- package/dist/client/stigmer-client.js +88 -24
- package/dist/client/stigmer-client.js.map +1 -1
- package/dist/encryption/config.d.ts +41 -9
- package/dist/encryption/config.js +63 -23
- package/dist/encryption/config.js.map +1 -1
- 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 +2 -1
- package/dist/payload-codecs.js +7 -3
- package/dist/payload-codecs.js.map +1 -1
- package/dist/runner-manager.js +17 -3
- package/dist/runner-manager.js.map +1 -1
- package/dist/runner.js +7 -3
- package/dist/runner.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/checkpointer/http-saver.d.ts +4 -20
- package/dist/shared/checkpointer/http-saver.js +15 -57
- package/dist/shared/checkpointer/http-saver.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/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 +51 -9
- package/dist/shared/http-retry.js +60 -9
- package/dist/shared/http-retry.js.map +1 -1
- package/dist/shared/mcp-manager.d.ts +8 -4
- package/dist/shared/mcp-manager.js +30 -4
- package/dist/shared/mcp-manager.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 +6 -0
- package/dist/shared/model-client.js +14 -3
- package/dist/shared/model-client.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 +7 -0
- package/dist/shared/plan-mode-permissions.js +7 -0
- package/dist/shared/plan-mode-permissions.js.map +1 -1
- 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/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/workflows/connect-mcp-server.js +2 -0
- package/dist/workflows/connect-mcp-server.js.map +1 -1
- package/dist/workflows/types.d.ts +8 -0
- package/package.json +3 -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__/encryption-codec.test.ts +53 -0
- package/src/__tests__/preflight.test.ts +15 -0
- package/src/activities/__tests__/discover-mcp-server.test.ts +39 -1
- package/src/activities/__tests__/error-classifier.test.ts +94 -2
- package/src/activities/__tests__/run-command.test.ts +221 -0
- package/src/activities/discover-mcp-server.ts +16 -2
- package/src/activities/emit-event.ts +65 -21
- package/src/activities/execute-cursor/__tests__/build-prompt.test.ts +111 -2
- package/src/activities/execute-cursor/__tests__/model-pricing.test.ts +62 -1
- package/src/activities/execute-cursor/__tests__/turn-recovery.test.ts +160 -0
- package/src/activities/execute-cursor/error-classifier.ts +40 -3
- package/src/activities/execute-cursor/index.ts +154 -38
- package/src/activities/execute-cursor/model-pricing-data.ts +22 -3
- package/src/activities/execute-cursor/prompt-builder.ts +51 -0
- package/src/activities/execute-cursor/turn-recovery.ts +208 -0
- package/src/activities/execute-deep-agent/__tests__/plan-mode-path-normalization.test.ts +174 -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 +22 -17
- package/src/activities/execute-deep-agent/setup.ts +16 -8
- package/src/activities/execute-deep-agent/shell-env.ts +8 -9
- package/src/activities/execute-deep-agent/subagent-transformer.ts +7 -1
- package/src/activities/execute-deep-agent/subagent-wiring.ts +26 -3
- package/src/activities/hydrate-workflow-execution.ts +8 -5
- package/src/activities/run-command.ts +25 -12
- package/src/activities/run-env.ts +79 -0
- package/src/bootstrap.ts +5 -0
- package/src/client/__tests__/stigmer-client.test.ts +104 -5
- package/src/client/stigmer-client.ts +128 -29
- package/src/encryption/config.ts +87 -23
- 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 +8 -2
- package/src/runner-manager.ts +21 -3
- package/src/runner.ts +7 -3
- package/src/shared/__tests__/artifact-storage.test.ts +145 -2
- package/src/shared/__tests__/conversation-catchup.test.ts +24 -0
- package/src/shared/__tests__/http-retry.test.ts +5 -4
- package/src/shared/__tests__/mcp-manager.test.ts +53 -13
- package/src/shared/__tests__/mcp-schema-sanitizer.test.ts +267 -0
- package/src/shared/__tests__/model-client.test.ts +46 -0
- package/src/shared/__tests__/model-pricing.test.ts +62 -2
- package/src/shared/__tests__/model-registry.test.ts +22 -0
- package/src/shared/artifact-storage.ts +75 -10
- package/src/shared/checkpointer/http-saver.ts +15 -60
- package/src/shared/conversation-catchup.ts +39 -6
- package/src/shared/grpc-retry.ts +5 -1
- package/src/shared/http-retry.ts +98 -9
- package/src/shared/mcp-manager.ts +35 -4
- package/src/shared/mcp-schema-sanitizer.ts +224 -0
- package/src/shared/model-client.ts +21 -3
- package/src/shared/model-pricing-data.ts +22 -3
- package/src/shared/model-registry.ts +7 -2
- package/src/shared/plan-mode-permissions.ts +7 -0
- package/src/shared/registry-endpoint.ts +27 -0
- package/src/shared/runner-credential-keys.ts +46 -0
- package/src/workflow-engine/__tests__/tasks/emit-event.test.ts +127 -49
- package/src/workflow-engine/resolve.ts +48 -2
- package/src/workflows/__tests__/connect-mcp-server.test.ts +25 -0
- package/src/workflows/connect-mcp-server.ts +2 -0
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-manager.js","sourceRoot":"","sources":["../../src/shared/mcp-manager.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"mcp-manager.js","sourceRoot":"","sources":["../../src/shared/mcp-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAI/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAEnE;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAA4B;IAE5B,MAAM,MAAM,GAA+B,EAAE,CAAC;IAE9C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,cAAc,KAAK,OAAO,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,SAAS;YAC9B,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxD,OAAO,CAAC,GAAG,CACT,iBAAiB,MAAM,CAAC,IAAI,qCAAqC;oBACjE,mEAAmE;oBACnE,2CAA2C,CAC5C,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG;gBACpB,SAAS,EAAE,OAAO;gBAClB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;gBACvB,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,GAAG,EAAE,MAAM,CAAC,GAAG;aAChB,CAAC;QACJ,CAAC;aAAM,IAAI,MAAM,CAAC,cAAc,KAAK,MAAM,IAAI,MAAM,CAAC,cAAc,KAAK,KAAK,EAAE,CAAC;YAC/E,IAAI,CAAC,MAAM,CAAC,GAAG;gBAAE,SAAS;YAC1B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG;gBACpB,SAAS,EAAE,MAAM;gBACjB,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAQD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAA4B;IAE5B,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAEpD,IAAI,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAC5C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;IAClD,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;IAC1D,MAAM,iBAAiB,GAAG,MAAM,MAAM,CAAC,qBAAqB,EAAE,CAAC;IAE/D,yEAAyE;IACzE,oEAAoE;IACpE,wEAAwE;IACxE,oEAAoE;IACpE,oEAAoE;IACpE,yEAAyE;IACzE,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACnE,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,eAAe,GAAG,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5D,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,OAAO,CAAC,IAAI,CACV,iBAAiB,IAAI,WAAW,IAAI,CAAC,IAAI,aAAa;oBACtD,GAAG,eAAe,CAAC,MAAM,wCAAwC;oBACjE,+DAA+D;oBAC/D,+CAA+C;oBAC/C,eAAe;yBACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACT,GAAG,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE;wBAC5C,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAClE;yBACA,IAAI,CAAC,IAAI,CAAC,CACd,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,yEAAyE;IACzE,wEAAwE;IACxE,yEAAyE;IACzE,uEAAuE;IACvE,sEAAsE;IACtE,MAAM,aAAa,GAAG,IAAI,GAAG,CAC3B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAC7C,CAAC;IACF,MAAM,aAAa,GAA4C,EAAE,CAAC;IAClE,MAAM,KAAK,GAA4B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACnE,MAAM,QAAQ,GAAG,yBAAyB,CACxC,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAC1C,CAAC;QACF,aAAa,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,CAAC,GAAG,CACT,mBAAmB,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,cAAc;QAClE,GAAG,KAAK,CAAC,MAAM,mBAAmB,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC;aAC5D,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;aAC1C,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unicode-flag regex sanitization for MCP tool input schemas (issue #420).
|
|
3
|
+
*
|
|
4
|
+
* Why this exists: real-world MCP servers ship JSON-schema `pattern` values
|
|
5
|
+
* that are legal as plain ECMAScript regexes but invalid under the unicode
|
|
6
|
+
* flag (PayPal's `^https\:\/\/` — `\:` is an invalid escape under /u).
|
|
7
|
+
* @langchain/core validates tool input on EVERY call with
|
|
8
|
+
* @cfworker/json-schema, which compiles patterns via `new RegExp(p, "u")`
|
|
9
|
+
* at exactly two uncaught sites: the `pattern` keyword and each
|
|
10
|
+
* `patternProperties` key. One bad vendor pattern therefore makes the tool
|
|
11
|
+
* permanently uncallable on the deep-agent path — every invocation dies
|
|
12
|
+
* with a cryptic SyntaxError before the tool is ever reached. (The third
|
|
13
|
+
* /u compile site, `format: "regex"`, validates instance values inside a
|
|
14
|
+
* try/catch and fails gracefully — not a crash surface.)
|
|
15
|
+
*
|
|
16
|
+
* The fix: at the deep-agent connect funnel (mcp-manager.ts
|
|
17
|
+
* connectMcpServers), drop every pattern that cannot compile under /u.
|
|
18
|
+
* Dropping is deliberate — rewriting to a /u-safe equivalent would need an
|
|
19
|
+
* Annex-B-aware regex transpiler, disproportionate machinery for what is
|
|
20
|
+
* best-effort client-side validation; the MCP server still validates its
|
|
21
|
+
* own inputs server-side. This mirrors the loosening posture of
|
|
22
|
+
* @langchain/mcp-adapters' own schema pipeline (dereferenceJsonSchema →
|
|
23
|
+
* simplifyJsonSchemaForLLM), which already normalizes schemas for this
|
|
24
|
+
* exact validator.
|
|
25
|
+
*
|
|
26
|
+
* THE INVARIANT: sanitization may only ever LOOSEN validation, never
|
|
27
|
+
* tighten it. Dropping a `patternProperties` entry naively would violate
|
|
28
|
+
* this — @cfworker marks pattern-matched keys as "evaluated" and routes
|
|
29
|
+
* unevaluated keys into the `additionalProperties` / `unevaluatedProperties`
|
|
30
|
+
* checks, so under `additionalProperties: false` the drop would flip a
|
|
31
|
+
* crash into a false REJECTION of valid inputs. Whenever a
|
|
32
|
+
* `patternProperties` entry is dropped, any restrictive
|
|
33
|
+
* `additionalProperties` / `unevaluatedProperties` at that schema level is
|
|
34
|
+
* therefore relaxed too.
|
|
35
|
+
*
|
|
36
|
+
* Scope: this sanitizer serves the EXECUTION path only. Discovery
|
|
37
|
+
* (activities/discover-mcp-server.ts) persists tool schemas verbatim from
|
|
38
|
+
* listTools — deliberately: the stored schema is the vendor's truth for
|
|
39
|
+
* display, and discovery never invokes tools, so it cannot hit the crash.
|
|
40
|
+
* Do not "extend" sanitization there.
|
|
41
|
+
*/
|
|
42
|
+
/** One dropped regex constraint, for the caller's log line. */
|
|
43
|
+
export interface DroppedPattern {
|
|
44
|
+
/** JSON-pointer-style path of the dropped constraint within the schema. */
|
|
45
|
+
location: string;
|
|
46
|
+
/** The pattern source that failed to compile under the unicode flag. */
|
|
47
|
+
pattern: string;
|
|
48
|
+
/**
|
|
49
|
+
* True when the pattern compiles WITHOUT the /u flag — vendor sloppiness
|
|
50
|
+
* (Annex B legacy syntax), the oss#420 class. False means the regex is
|
|
51
|
+
* broken outright; either way validation could only crash, so both drop.
|
|
52
|
+
*/
|
|
53
|
+
compilesWithoutUnicodeFlag: boolean;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Drop unicode-invalid regex patterns from a JSON schema, in place.
|
|
57
|
+
*
|
|
58
|
+
* Walks only schema positions (the recursion set is @cfworker's own
|
|
59
|
+
* validated-keyword list), so a property literally NAMED "pattern" under
|
|
60
|
+
* `properties` is never touched. The walker handles composition keywords
|
|
61
|
+
* (anyOf/allOf/oneOf/not/if-then-else) even though the adapter's
|
|
62
|
+
* simplifyJsonSchemaForLLM currently strips them, and carries a visited-set
|
|
63
|
+
* cycle guard even though the adapter's $ref inlining currently guarantees
|
|
64
|
+
* an acyclic result — correctness here must not depend on another
|
|
65
|
+
* package's internals holding across dependency bumps.
|
|
66
|
+
*
|
|
67
|
+
* Returns the dropped constraints (empty for clean schemas — the common
|
|
68
|
+
* case, which this walk leaves byte-identical).
|
|
69
|
+
*/
|
|
70
|
+
export declare function sanitizeSchemaPatterns(schema: unknown): DroppedPattern[];
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unicode-flag regex sanitization for MCP tool input schemas (issue #420).
|
|
3
|
+
*
|
|
4
|
+
* Why this exists: real-world MCP servers ship JSON-schema `pattern` values
|
|
5
|
+
* that are legal as plain ECMAScript regexes but invalid under the unicode
|
|
6
|
+
* flag (PayPal's `^https\:\/\/` — `\:` is an invalid escape under /u).
|
|
7
|
+
* @langchain/core validates tool input on EVERY call with
|
|
8
|
+
* @cfworker/json-schema, which compiles patterns via `new RegExp(p, "u")`
|
|
9
|
+
* at exactly two uncaught sites: the `pattern` keyword and each
|
|
10
|
+
* `patternProperties` key. One bad vendor pattern therefore makes the tool
|
|
11
|
+
* permanently uncallable on the deep-agent path — every invocation dies
|
|
12
|
+
* with a cryptic SyntaxError before the tool is ever reached. (The third
|
|
13
|
+
* /u compile site, `format: "regex"`, validates instance values inside a
|
|
14
|
+
* try/catch and fails gracefully — not a crash surface.)
|
|
15
|
+
*
|
|
16
|
+
* The fix: at the deep-agent connect funnel (mcp-manager.ts
|
|
17
|
+
* connectMcpServers), drop every pattern that cannot compile under /u.
|
|
18
|
+
* Dropping is deliberate — rewriting to a /u-safe equivalent would need an
|
|
19
|
+
* Annex-B-aware regex transpiler, disproportionate machinery for what is
|
|
20
|
+
* best-effort client-side validation; the MCP server still validates its
|
|
21
|
+
* own inputs server-side. This mirrors the loosening posture of
|
|
22
|
+
* @langchain/mcp-adapters' own schema pipeline (dereferenceJsonSchema →
|
|
23
|
+
* simplifyJsonSchemaForLLM), which already normalizes schemas for this
|
|
24
|
+
* exact validator.
|
|
25
|
+
*
|
|
26
|
+
* THE INVARIANT: sanitization may only ever LOOSEN validation, never
|
|
27
|
+
* tighten it. Dropping a `patternProperties` entry naively would violate
|
|
28
|
+
* this — @cfworker marks pattern-matched keys as "evaluated" and routes
|
|
29
|
+
* unevaluated keys into the `additionalProperties` / `unevaluatedProperties`
|
|
30
|
+
* checks, so under `additionalProperties: false` the drop would flip a
|
|
31
|
+
* crash into a false REJECTION of valid inputs. Whenever a
|
|
32
|
+
* `patternProperties` entry is dropped, any restrictive
|
|
33
|
+
* `additionalProperties` / `unevaluatedProperties` at that schema level is
|
|
34
|
+
* therefore relaxed too.
|
|
35
|
+
*
|
|
36
|
+
* Scope: this sanitizer serves the EXECUTION path only. Discovery
|
|
37
|
+
* (activities/discover-mcp-server.ts) persists tool schemas verbatim from
|
|
38
|
+
* listTools — deliberately: the stored schema is the vendor's truth for
|
|
39
|
+
* display, and discovery never invokes tools, so it cannot hit the crash.
|
|
40
|
+
* Do not "extend" sanitization there.
|
|
41
|
+
*/
|
|
42
|
+
/** Keywords whose value is a single subschema. */
|
|
43
|
+
const SINGLE_SCHEMA_KEYWORDS = [
|
|
44
|
+
"additionalProperties",
|
|
45
|
+
"unevaluatedProperties",
|
|
46
|
+
"propertyNames",
|
|
47
|
+
"items",
|
|
48
|
+
"additionalItems",
|
|
49
|
+
"unevaluatedItems",
|
|
50
|
+
"contains",
|
|
51
|
+
"not",
|
|
52
|
+
"if",
|
|
53
|
+
"then",
|
|
54
|
+
"else",
|
|
55
|
+
];
|
|
56
|
+
/** Keywords whose value is an array of subschemas. */
|
|
57
|
+
const SCHEMA_ARRAY_KEYWORDS = ["anyOf", "allOf", "oneOf", "prefixItems"];
|
|
58
|
+
/** Keywords whose value is an object mapping names to subschemas. */
|
|
59
|
+
const SCHEMA_MAP_KEYWORDS = [
|
|
60
|
+
"properties",
|
|
61
|
+
"patternProperties",
|
|
62
|
+
"dependentSchemas",
|
|
63
|
+
"$defs",
|
|
64
|
+
"definitions",
|
|
65
|
+
];
|
|
66
|
+
function compilesUnderUnicodeFlag(pattern) {
|
|
67
|
+
try {
|
|
68
|
+
new RegExp(pattern, "u");
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function compilesWithoutUnicodeFlag(pattern) {
|
|
76
|
+
try {
|
|
77
|
+
new RegExp(pattern);
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function isPlainObject(value) {
|
|
85
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
86
|
+
}
|
|
87
|
+
/** JSON-pointer token escaping (RFC 6901): `~` → `~0`, `/` → `~1`. */
|
|
88
|
+
function pointerToken(token) {
|
|
89
|
+
return token.replace(/~/g, "~0").replace(/\//g, "~1");
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Drop unicode-invalid regex patterns from a JSON schema, in place.
|
|
93
|
+
*
|
|
94
|
+
* Walks only schema positions (the recursion set is @cfworker's own
|
|
95
|
+
* validated-keyword list), so a property literally NAMED "pattern" under
|
|
96
|
+
* `properties` is never touched. The walker handles composition keywords
|
|
97
|
+
* (anyOf/allOf/oneOf/not/if-then-else) even though the adapter's
|
|
98
|
+
* simplifyJsonSchemaForLLM currently strips them, and carries a visited-set
|
|
99
|
+
* cycle guard even though the adapter's $ref inlining currently guarantees
|
|
100
|
+
* an acyclic result — correctness here must not depend on another
|
|
101
|
+
* package's internals holding across dependency bumps.
|
|
102
|
+
*
|
|
103
|
+
* Returns the dropped constraints (empty for clean schemas — the common
|
|
104
|
+
* case, which this walk leaves byte-identical).
|
|
105
|
+
*/
|
|
106
|
+
export function sanitizeSchemaPatterns(schema) {
|
|
107
|
+
const dropped = [];
|
|
108
|
+
if (!isPlainObject(schema))
|
|
109
|
+
return dropped;
|
|
110
|
+
walkSchema(schema, "", dropped, new Set());
|
|
111
|
+
return dropped;
|
|
112
|
+
}
|
|
113
|
+
function recordDrop(dropped, location, pattern) {
|
|
114
|
+
dropped.push({
|
|
115
|
+
location,
|
|
116
|
+
pattern,
|
|
117
|
+
compilesWithoutUnicodeFlag: compilesWithoutUnicodeFlag(pattern),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
function walkSchema(node, path, dropped, seen) {
|
|
121
|
+
if (seen.has(node))
|
|
122
|
+
return;
|
|
123
|
+
seen.add(node);
|
|
124
|
+
if (typeof node.pattern === "string" && !compilesUnderUnicodeFlag(node.pattern)) {
|
|
125
|
+
recordDrop(dropped, `${path}/pattern`, node.pattern);
|
|
126
|
+
delete node.pattern;
|
|
127
|
+
}
|
|
128
|
+
if (isPlainObject(node.patternProperties)) {
|
|
129
|
+
const patternProperties = node.patternProperties;
|
|
130
|
+
let droppedEntry = false;
|
|
131
|
+
for (const key of Object.keys(patternProperties)) {
|
|
132
|
+
if (compilesUnderUnicodeFlag(key))
|
|
133
|
+
continue;
|
|
134
|
+
recordDrop(dropped, `${path}/patternProperties/${pointerToken(key)}`, key);
|
|
135
|
+
delete patternProperties[key];
|
|
136
|
+
droppedEntry = true;
|
|
137
|
+
}
|
|
138
|
+
if (droppedEntry) {
|
|
139
|
+
// Never-tighten: keys the dropped pattern used to match would now
|
|
140
|
+
// fall through to these checks and could be falsely rejected.
|
|
141
|
+
if (node.additionalProperties !== undefined && node.additionalProperties !== true) {
|
|
142
|
+
delete node.additionalProperties;
|
|
143
|
+
}
|
|
144
|
+
if (node.unevaluatedProperties !== undefined && node.unevaluatedProperties !== true) {
|
|
145
|
+
delete node.unevaluatedProperties;
|
|
146
|
+
}
|
|
147
|
+
if (Object.keys(patternProperties).length === 0) {
|
|
148
|
+
delete node.patternProperties;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
for (const keyword of SINGLE_SCHEMA_KEYWORDS) {
|
|
153
|
+
const value = node[keyword];
|
|
154
|
+
if (isPlainObject(value)) {
|
|
155
|
+
walkSchema(value, `${path}/${keyword}`, dropped, seen);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
for (const keyword of SCHEMA_ARRAY_KEYWORDS) {
|
|
159
|
+
const value = node[keyword];
|
|
160
|
+
if (!Array.isArray(value))
|
|
161
|
+
continue;
|
|
162
|
+
value.forEach((entry, index) => {
|
|
163
|
+
if (isPlainObject(entry)) {
|
|
164
|
+
walkSchema(entry, `${path}/${keyword}/${index}`, dropped, seen);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
for (const keyword of SCHEMA_MAP_KEYWORDS) {
|
|
169
|
+
const value = node[keyword];
|
|
170
|
+
if (!isPlainObject(value))
|
|
171
|
+
continue;
|
|
172
|
+
for (const [name, entry] of Object.entries(value)) {
|
|
173
|
+
if (isPlainObject(entry)) {
|
|
174
|
+
walkSchema(entry, `${path}/${keyword}/${pointerToken(name)}`, dropped, seen);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Draft-07 `items` tuple form and `dependencies` schema form — both
|
|
179
|
+
// keywords are dual-shaped, so the typed loops above miss these arms.
|
|
180
|
+
if (Array.isArray(node.items)) {
|
|
181
|
+
node.items.forEach((entry, index) => {
|
|
182
|
+
if (isPlainObject(entry)) {
|
|
183
|
+
walkSchema(entry, `${path}/items/${index}`, dropped, seen);
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
if (isPlainObject(node.dependencies)) {
|
|
188
|
+
for (const [name, entry] of Object.entries(node.dependencies)) {
|
|
189
|
+
// Array-valued entries are dependentRequired (property names, not
|
|
190
|
+
// schemas) — only schema-valued entries are walked.
|
|
191
|
+
if (isPlainObject(entry)) {
|
|
192
|
+
walkSchema(entry, `${path}/dependencies/${pointerToken(name)}`, dropped, seen);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=mcp-schema-sanitizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-schema-sanitizer.js","sourceRoot":"","sources":["../../src/shared/mcp-schema-sanitizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,6 +34,12 @@ export interface BuildChatModelOptions {
|
|
|
34
34
|
* stays the caller's decision to avoid silently changing behavior.
|
|
35
35
|
*/
|
|
36
36
|
readonly maxTokens?: number;
|
|
37
|
+
/**
|
|
38
|
+
* Per-request bound. When omitted, defaults to the operator's
|
|
39
|
+
* STIGMER_LLM_REQUEST_TIMEOUT_MS — resolved HERE, not per caller, so no
|
|
40
|
+
* call site can drop the bound by forgetting to plumb it (the sub-agent
|
|
41
|
+
* factory did exactly that; stigmer/stigmer#468). An explicit value wins.
|
|
42
|
+
*/
|
|
37
43
|
readonly timeoutMs?: number;
|
|
38
44
|
readonly maxRetries?: number;
|
|
39
45
|
}
|
|
@@ -17,6 +17,16 @@ import { ChatOpenAI } from "@langchain/openai";
|
|
|
17
17
|
import { inferProvider, stripProviderPrefix, resolveProxyBaseUrl, buildProxyHeaders, } from "./llm-proxy.js";
|
|
18
18
|
import { resolveAnthropicBackend, checkVertexPrerequisites, checkBedrockPrerequisites, checkFoundryPrerequisites, toVertexModelId, toBedrockModelId, toFoundryDeploymentName, } from "./llm-backend.js";
|
|
19
19
|
import { resolveToApiModelId } from "./model-registry.js";
|
|
20
|
+
/**
|
|
21
|
+
* The operator's request-timeout bound. Only a positive integer means
|
|
22
|
+
* "bound the request" — unset, non-numeric, zero, and negative all
|
|
23
|
+
* normalize to no bound. Deployment-static env, read here the same way
|
|
24
|
+
* provider API keys are.
|
|
25
|
+
*/
|
|
26
|
+
function resolveDefaultTimeoutMs() {
|
|
27
|
+
const parsed = Number.parseInt(process.env.STIGMER_LLM_REQUEST_TIMEOUT_MS ?? "", 10);
|
|
28
|
+
return parsed > 0 ? parsed : undefined;
|
|
29
|
+
}
|
|
20
30
|
/**
|
|
21
31
|
* Build a configured chat model, resolving the registry id to a provider API
|
|
22
32
|
* id first. The resolution MUST precede provider inference and prefix
|
|
@@ -27,6 +37,7 @@ export async function buildChatModel(opts) {
|
|
|
27
37
|
const resolved = await resolveToApiModelId(opts.modelName);
|
|
28
38
|
const provider = inferProvider(resolved);
|
|
29
39
|
const apiModelId = stripProviderPrefix(resolved);
|
|
40
|
+
const timeoutMs = opts.timeoutMs ?? resolveDefaultTimeoutMs();
|
|
30
41
|
// Backend precedence by construction: a proxied call never consults the
|
|
31
42
|
// backend var — the proxy owns provider routing (the factories' preflight
|
|
32
43
|
// warns when both are configured). Selection is deployment-static and read
|
|
@@ -137,7 +148,7 @@ export async function buildChatModel(opts) {
|
|
|
137
148
|
temperature: opts.temperature ?? 0,
|
|
138
149
|
apiKey,
|
|
139
150
|
...(maxTokens ? { maxTokens } : {}),
|
|
140
|
-
...(
|
|
151
|
+
...(timeoutMs ? { maxRetries: opts.maxRetries ?? 0 } : {}),
|
|
141
152
|
};
|
|
142
153
|
// The request timeout lives in a different slot per wrapper: ChatOpenAI
|
|
143
154
|
// reads `timeout` as a constructor field, but ChatAnthropic ignores it
|
|
@@ -150,7 +161,7 @@ export async function buildChatModel(opts) {
|
|
|
150
161
|
// that is LangChain's own retry knob, distinct from the SDK-level
|
|
151
162
|
// maxRetries the factories receive.
|
|
152
163
|
const anthropicClientOptions = {
|
|
153
|
-
...(
|
|
164
|
+
...(timeoutMs ? { timeout: timeoutMs } : {}),
|
|
154
165
|
...(baseUrl ? { baseURL: baseUrl } : {}),
|
|
155
166
|
...(headers ? { defaultHeaders: headers } : {}),
|
|
156
167
|
};
|
|
@@ -164,7 +175,7 @@ export async function buildChatModel(opts) {
|
|
|
164
175
|
? new ChatOpenAI({
|
|
165
176
|
model: apiModelId,
|
|
166
177
|
...common,
|
|
167
|
-
...(
|
|
178
|
+
...(timeoutMs ? { timeout: timeoutMs } : {}),
|
|
168
179
|
...(baseUrl || headers
|
|
169
180
|
? {
|
|
170
181
|
configuration: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-client.js","sourceRoot":"","sources":["../../src/shared/model-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,GAElB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,EACzB,eAAe,EACf,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"model-client.js","sourceRoot":"","sources":["../../src/shared/model-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,3 +16,5 @@ export interface ModelPricing {
|
|
|
16
16
|
}
|
|
17
17
|
export declare const DEFAULT_PRICING: ModelPricing;
|
|
18
18
|
export declare function getPricingTable(): Promise<readonly ModelPricing[]>;
|
|
19
|
+
/** Exposed for testing — resets the in-memory cache. */
|
|
20
|
+
export declare function _resetPricingCache(): void;
|
|
@@ -5,8 +5,13 @@
|
|
|
5
5
|
* with pricing info, and caches the result. Falls back to conservative
|
|
6
6
|
* default pricing if the API is unreachable.
|
|
7
7
|
*/
|
|
8
|
-
import { resolveModelRegistryUrl, buildRegistryHeaders } from "./registry-endpoint.js";
|
|
8
|
+
import { resolveModelRegistryUrl, buildRegistryHeaders, REGISTRY_RETRY_POLICY, } from "./registry-endpoint.js";
|
|
9
|
+
import { fetchWithRetry } from "./http-retry.js";
|
|
9
10
|
const CACHE_TTL_MS = 3_600_000;
|
|
11
|
+
// Failed fetches are cached much shorter than successes (the model-registry.ts
|
|
12
|
+
// policy): a transient failure must not pin DEFAULT_PRICING — wrong rates for
|
|
13
|
+
// cost tracking — for a full hour.
|
|
14
|
+
const FAILURE_CACHE_TTL_MS = 60_000;
|
|
10
15
|
export const DEFAULT_PRICING = {
|
|
11
16
|
model: "unknown",
|
|
12
17
|
displayName: "Unknown",
|
|
@@ -37,7 +42,7 @@ function parsePricingTable(json) {
|
|
|
37
42
|
}));
|
|
38
43
|
}
|
|
39
44
|
async function fetchFromApi() {
|
|
40
|
-
const res = await
|
|
45
|
+
const res = await fetchWithRetry(resolveModelRegistryUrl(), { headers: buildRegistryHeaders() }, REGISTRY_RETRY_POLICY);
|
|
41
46
|
if (!res.ok)
|
|
42
47
|
throw new Error(`Model registry fetch failed: ${res.status}`);
|
|
43
48
|
const data = await res.json();
|
|
@@ -61,7 +66,7 @@ export async function getPricingTable() {
|
|
|
61
66
|
.catch((err) => {
|
|
62
67
|
console.warn(`Failed to fetch model registry, using default pricing: ${err}`);
|
|
63
68
|
const fallback = [DEFAULT_PRICING];
|
|
64
|
-
cache = { data: fallback, expiresAt: Date.now() +
|
|
69
|
+
cache = { data: fallback, expiresAt: Date.now() + FAILURE_CACHE_TTL_MS };
|
|
65
70
|
return fallback;
|
|
66
71
|
})
|
|
67
72
|
.finally(() => {
|
|
@@ -69,4 +74,9 @@ export async function getPricingTable() {
|
|
|
69
74
|
});
|
|
70
75
|
return inflightFetch;
|
|
71
76
|
}
|
|
77
|
+
/** Exposed for testing — resets the in-memory cache. */
|
|
78
|
+
export function _resetPricingCache() {
|
|
79
|
+
cache = null;
|
|
80
|
+
inflightFetch = null;
|
|
81
|
+
}
|
|
72
82
|
//# sourceMappingURL=model-pricing-data.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-pricing-data.js","sourceRoot":"","sources":["../../src/shared/model-pricing-data.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA0BH,OAAO,
|
|
1
|
+
{"version":3,"file":"model-pricing-data.js","sourceRoot":"","sources":["../../src/shared/model-pricing-data.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
* plus `capabilities` catalog metadata for per-model capability lookups
|
|
10
10
|
* (getModelVisionCapability).
|
|
11
11
|
*/
|
|
12
|
-
import { resolveModelRegistryUrl, buildRegistryHeaders } from "./registry-endpoint.js";
|
|
12
|
+
import { resolveModelRegistryUrl, buildRegistryHeaders, REGISTRY_RETRY_POLICY, } from "./registry-endpoint.js";
|
|
13
|
+
import { fetchWithRetry } from "./http-retry.js";
|
|
13
14
|
const CACHE_TTL_MS = 3_600_000;
|
|
14
15
|
// Failed fetches are cached much shorter than successes: a transient failure
|
|
15
16
|
// must not poison id -> apiModelId resolution (and thereby fail every llm_call
|
|
@@ -47,7 +48,7 @@ function parseVisionCapability(capabilities) {
|
|
|
47
48
|
}
|
|
48
49
|
async function fetchRegistry() {
|
|
49
50
|
const url = resolveModelRegistryUrl();
|
|
50
|
-
const res = await
|
|
51
|
+
const res = await fetchWithRetry(url, { headers: buildRegistryHeaders() }, REGISTRY_RETRY_POLICY);
|
|
51
52
|
if (!res.ok)
|
|
52
53
|
throw new Error(`Model registry fetch failed: ${res.status}`);
|
|
53
54
|
const data = await res.json();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-registry.js","sourceRoot":"","sources":["../../src/shared/model-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"model-registry.js","sourceRoot":"","sources":["../../src/shared/model-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,13 @@
|
|
|
16
16
|
* (issue #255). Kept as its own side-effect-free module so tests can pin the
|
|
17
17
|
* production rules without dragging in setup.ts's import graph.
|
|
18
18
|
*
|
|
19
|
+
* Rules travel with a companion: every graph that carries them also installs
|
|
20
|
+
* the path-normalization middleware (middleware/path-normalization.ts,
|
|
21
|
+
* issue #429), because deepagents' rule validation refuses workspace-relative
|
|
22
|
+
* paths outright — without the shim, prompt-compliant relative READS die in
|
|
23
|
+
* validation instead of just working. Both are derived from the same
|
|
24
|
+
* expression at each composition site so they cannot drift apart.
|
|
25
|
+
*
|
|
19
26
|
* Invariant: never combine these rules with a shell-capable (sandbox)
|
|
20
27
|
* backend — deepagents rejects that pairing at graph construction (see the
|
|
21
28
|
* cas-capture-backend.ts header). Plan mode guarantees it by construction:
|
|
@@ -16,6 +16,13 @@
|
|
|
16
16
|
* (issue #255). Kept as its own side-effect-free module so tests can pin the
|
|
17
17
|
* production rules without dragging in setup.ts's import graph.
|
|
18
18
|
*
|
|
19
|
+
* Rules travel with a companion: every graph that carries them also installs
|
|
20
|
+
* the path-normalization middleware (middleware/path-normalization.ts,
|
|
21
|
+
* issue #429), because deepagents' rule validation refuses workspace-relative
|
|
22
|
+
* paths outright — without the shim, prompt-compliant relative READS die in
|
|
23
|
+
* validation instead of just working. Both are derived from the same
|
|
24
|
+
* expression at each composition site so they cannot drift apart.
|
|
25
|
+
*
|
|
19
26
|
* Invariant: never combine these rules with a shell-capable (sandbox)
|
|
20
27
|
* backend — deepagents rejects that pairing at graph construction (see the
|
|
21
28
|
* cas-capture-backend.ts header). Plan mode guarantees it by construction:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-mode-permissions.js","sourceRoot":"","sources":["../../src/shared/plan-mode-permissions.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"plan-mode-permissions.js","sourceRoot":"","sources":["../../src/shared/plan-mode-permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAIH,MAAM,CAAC,MAAM,qBAAqB,GAA2B;IAC3D,EAAE,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;CACxD,CAAC"}
|
|
@@ -18,6 +18,26 @@
|
|
|
18
18
|
* control-plane origin that serves the registry, so falling back to the hosted
|
|
19
19
|
* API would only mask misconfiguration (and breaks offline/local use).
|
|
20
20
|
*/
|
|
21
|
+
import type { FetchRetryPolicy } from "./http-retry.js";
|
|
22
|
+
/**
|
|
23
|
+
* Shared retry policy for the three registry fetch clients (model-registry.ts
|
|
24
|
+
* and both model-pricing-data.ts modules) — stigmer/stigmer#468.
|
|
25
|
+
*
|
|
26
|
+
* The timeout is the load-bearing half: each consumer deduplicates callers
|
|
27
|
+
* through a single in-flight promise, so one hung fetch strands every
|
|
28
|
+
* concurrent caller behind it — model-registry.ts's sits in front of every
|
|
29
|
+
* LLM client build. 10 s (not the checkpointer's 30 s) because the response
|
|
30
|
+
* is a small JSON document and the callers degrade gracefully; what they must
|
|
31
|
+
* never do is wait forever.
|
|
32
|
+
*
|
|
33
|
+
* The retry half matters because the degrade is not free: a failed registry
|
|
34
|
+
* fetch is cached (60 s empty registry → unresolved model ids that 404 at the
|
|
35
|
+
* provider; pricing falls back to defaults), so a budget spanning a
|
|
36
|
+
* pod-restart reroute converts that poisoned window into ~1.75 s of backoff.
|
|
37
|
+
* Worst case fully bounded: ~31 s of cold-cache stall when the control plane
|
|
38
|
+
* is genuinely down, versus an infinite hang before #468.
|
|
39
|
+
*/
|
|
40
|
+
export declare const REGISTRY_RETRY_POLICY: FetchRetryPolicy;
|
|
21
41
|
/**
|
|
22
42
|
* Resolve the base URL (origin, no path) for model-registry and pricing
|
|
23
43
|
* fetches. See module doc for the tier order.
|
|
@@ -21,6 +21,31 @@
|
|
|
21
21
|
import { normalizeEndpoint } from "../config.js";
|
|
22
22
|
/** Default local stigmer-server origin — mirrors config.ts's local-mode default. */
|
|
23
23
|
const DEFAULT_LOCAL_BACKEND = "http://localhost:7234";
|
|
24
|
+
/**
|
|
25
|
+
* Shared retry policy for the three registry fetch clients (model-registry.ts
|
|
26
|
+
* and both model-pricing-data.ts modules) — stigmer/stigmer#468.
|
|
27
|
+
*
|
|
28
|
+
* The timeout is the load-bearing half: each consumer deduplicates callers
|
|
29
|
+
* through a single in-flight promise, so one hung fetch strands every
|
|
30
|
+
* concurrent caller behind it — model-registry.ts's sits in front of every
|
|
31
|
+
* LLM client build. 10 s (not the checkpointer's 30 s) because the response
|
|
32
|
+
* is a small JSON document and the callers degrade gracefully; what they must
|
|
33
|
+
* never do is wait forever.
|
|
34
|
+
*
|
|
35
|
+
* The retry half matters because the degrade is not free: a failed registry
|
|
36
|
+
* fetch is cached (60 s empty registry → unresolved model ids that 404 at the
|
|
37
|
+
* provider; pricing falls back to defaults), so a budget spanning a
|
|
38
|
+
* pod-restart reroute converts that poisoned window into ~1.75 s of backoff.
|
|
39
|
+
* Worst case fully bounded: ~31 s of cold-cache stall when the control plane
|
|
40
|
+
* is genuinely down, versus an infinite hang before #468.
|
|
41
|
+
*/
|
|
42
|
+
export const REGISTRY_RETRY_POLICY = {
|
|
43
|
+
label: "registry-endpoint",
|
|
44
|
+
baseDelayMs: 250,
|
|
45
|
+
backoffFactor: 2,
|
|
46
|
+
maxRetries: 3,
|
|
47
|
+
requestTimeoutMs: 10_000,
|
|
48
|
+
};
|
|
24
49
|
/**
|
|
25
50
|
* Resolve the base URL (origin, no path) for model-registry and pricing
|
|
26
51
|
* fetches. See module doc for the tier order.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry-endpoint.js","sourceRoot":"","sources":["../../src/shared/registry-endpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"registry-endpoint.js","sourceRoot":"","sources":["../../src/shared/registry-endpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGjD,oFAAoF;AACpF,MAAM,qBAAqB,GAAG,uBAAuB,CAAC;AAEtD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAqB;IACrD,KAAK,EAAE,mBAAmB;IAC1B,WAAW,EAAE,GAAG;IAChB,aAAa,EAAE,CAAC;IAChB,UAAU,EAAE,CAAC;IACb,gBAAgB,EAAE,MAAM;CACzB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACzE,MAAM,QAAQ,GAAG,GAAG,CAAC,qBAAqB,CAAC;IAC3C,IAAI,QAAQ;QAAE,OAAO,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAEjD,MAAM,aAAa,GAAG,GAAG,CAAC,sBAAsB,CAAC;IACjD,IAAI,aAAa;QAAE,OAAO,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAE3D,OAAO,iBAAiB,CAAC,GAAG,CAAC,wBAAwB,IAAI,qBAAqB,CAAC,CAAC;AAClF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACvE,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,kBAAkB,CAAC;IAC1D,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,uBAAuB,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC1E,OAAO,GAAG,sBAAsB,CAAC,GAAG,CAAC,0BAA0B,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Env var names of the runner's own credentials — the single source of truth
|
|
3
|
+
* for every surface that isolates agent-spawned processes from the runner's
|
|
4
|
+
* process env (issue #385).
|
|
5
|
+
*
|
|
6
|
+
* Inclusion rule: a name belongs here iff the runner reads it from its own
|
|
7
|
+
* `process.env` to authenticate the runner's own outbound calls. User-supplied
|
|
8
|
+
* credentials resolved from ExecutionContext (e.g. GITHUB_TOKEN, read only
|
|
9
|
+
* from mergedEnvVars) must NEVER be listed — the ExecutionContext overlay is
|
|
10
|
+
* their sanctioned delivery channel, and denying them here would break it.
|
|
11
|
+
*
|
|
12
|
+
* Consumers:
|
|
13
|
+
* - shell-env.ts: SHELL_ENV_DENYLIST for the native harness `execute` tool.
|
|
14
|
+
* - mcp-manager.test.ts: leak-tripwire canaries for MCP stdio subprocesses
|
|
15
|
+
* (that path passes NO runner env by construction; the test plants these
|
|
16
|
+
* names to prove none leak through).
|
|
17
|
+
*
|
|
18
|
+
* Ambient cloud-SDK chain vars (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,
|
|
19
|
+
* GOOGLE_APPLICATION_CREDENTIALS, ...) are deliberately absent: they are
|
|
20
|
+
* dual-use on local runners (operators expect agent shells to keep their
|
|
21
|
+
* ambient aws/gcloud auth), and on a local backend the shell can read the
|
|
22
|
+
* credential files off disk regardless (owner ruling on #385).
|
|
23
|
+
*/
|
|
24
|
+
export declare const RUNNER_CREDENTIAL_ENV_KEYS: readonly string[];
|