@salesforce/sfdx-agent-harness-claude 0.46.0 → 0.48.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +8 -1
- package/dist/claude-harness-factory.d.ts +11 -0
- package/dist/claude-harness-factory.js +2 -2
- package/dist/claude-harness-factory.js.map +1 -1
- package/dist/claude-harness.d.ts +3 -1
- package/dist/claude-harness.js +29 -5
- package/dist/claude-harness.js.map +1 -1
- package/dist/claude-query-options-builder.d.ts +11 -1
- package/dist/claude-query-options-builder.js +17 -1
- package/dist/claude-query-options-builder.js.map +1 -1
- package/dist/mcp-client-factory.d.ts +13 -14
- package/dist/mcp-client-factory.js +17 -16
- package/dist/mcp-client-factory.js.map +1 -1
- package/dist/mcp-error-classifier.d.ts +4 -2
- package/dist/mcp-error-classifier.js +12 -4
- package/dist/mcp-error-classifier.js.map +1 -1
- package/dist/test/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
|
@@ -12,11 +12,13 @@
|
|
|
12
12
|
*
|
|
13
13
|
* **Auth-header handling differs by transport:**
|
|
14
14
|
*
|
|
15
|
-
* - **HTTP transport** —
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* `
|
|
19
|
-
*
|
|
15
|
+
* - **HTTP transport** — a runtime OAuth provider takes ownership of the
|
|
16
|
+
* server's auth and gets the bare proxy-aware fetch. Otherwise, when
|
|
17
|
+
* `orgJwt` is provided, the transport gets a custom `fetch` that re-resolves
|
|
18
|
+
* headers via `resolveMcpServerHeaders` per request. JWT rotation flows
|
|
19
|
+
* through the existing `DynamicJSONWebToken` plumbing automatically; no
|
|
20
|
+
* reconnect needed. Mirrors Mastra's pattern
|
|
21
|
+
* (`packages/sfdx-agent-harness-mastra/src/mcp-config-mapper.ts:74`).
|
|
20
22
|
*
|
|
21
23
|
* - **stdio transport** — `MCPStdioServerConfig.env` is forwarded verbatim
|
|
22
24
|
* to the spawned child process at construction. The MCP SDK's
|
|
@@ -70,25 +72,18 @@ export function hasEnabledServers(config) {
|
|
|
70
72
|
* connect promise, which is the same pattern Mastra uses to keep the
|
|
71
73
|
* `started < failed` timestamp ordering honest.
|
|
72
74
|
*/
|
|
73
|
-
export function buildMcpClients(config, orgJwt,
|
|
74
|
-
/**
|
|
75
|
-
* Inner fetch the HTTP transport's auth wrapper delegates to. Defaults
|
|
76
|
-
* to `globalThis.fetch`; the harness factory threads a proxy-aware fetch
|
|
77
|
-
* here so remote MCP transports honor `HTTPS_PROXY` without `globalThis`
|
|
78
|
-
* mutation. Stdio transports ignore it (they're child processes).
|
|
79
|
-
*/
|
|
80
|
-
innerFetch = globalThis.fetch) {
|
|
75
|
+
export function buildMcpClients(config, orgJwt, options = {}) {
|
|
81
76
|
const result = new Map();
|
|
82
77
|
for (const [name, serverConfig] of Object.entries(config)) {
|
|
83
78
|
if (serverConfig.enabled === false)
|
|
84
79
|
continue;
|
|
85
|
-
const transport = buildTransport(serverConfig, orgJwt, innerFetch);
|
|
80
|
+
const transport = buildTransport(serverConfig, orgJwt, options.providers?.[name], options.innerFetch ?? globalThis.fetch);
|
|
86
81
|
const client = new Client({ name: CLIENT_NAME, version: CLIENT_VERSION });
|
|
87
82
|
result.set(name, { client, transport });
|
|
88
83
|
}
|
|
89
84
|
return result;
|
|
90
85
|
}
|
|
91
|
-
function buildTransport(serverConfig, orgJwt, innerFetch) {
|
|
86
|
+
function buildTransport(serverConfig, orgJwt, provider, innerFetch) {
|
|
92
87
|
if (serverConfig.type === 'stdio') {
|
|
93
88
|
return new StdioClientTransport({
|
|
94
89
|
command: serverConfig.command,
|
|
@@ -101,9 +96,15 @@ function buildTransport(serverConfig, orgJwt, innerFetch) {
|
|
|
101
96
|
}
|
|
102
97
|
if (serverConfig.type === 'remote') {
|
|
103
98
|
const url = serverConfig.url instanceof URL ? serverConfig.url : new URL(serverConfig.url);
|
|
99
|
+
const transportFetch = provider
|
|
100
|
+
? innerFetch
|
|
101
|
+
: orgJwt
|
|
102
|
+
? createAuthFetch(serverConfig.url, orgJwt, innerFetch, serverConfig.headers)
|
|
103
|
+
: undefined;
|
|
104
104
|
return new StreamableHTTPClientTransport(url, {
|
|
105
105
|
...(serverConfig.headers !== undefined && { requestInit: { headers: serverConfig.headers } }),
|
|
106
|
-
...(
|
|
106
|
+
...(provider !== undefined && { authProvider: provider }),
|
|
107
|
+
...(transportFetch && { fetch: transportFetch }),
|
|
107
108
|
...(serverConfig.reconnectionOptions !== undefined && {
|
|
108
109
|
reconnectionOptions: {
|
|
109
110
|
...DEFAULT_RECONNECTION_OPTIONS,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-client-factory.js","sourceRoot":"","sources":["../src/mcp-client-factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH
|
|
1
|
+
{"version":3,"file":"mcp-client-factory.js","sourceRoot":"","sources":["../src/mcp-client-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,11 +17,13 @@ export declare function sanitizeMcpErrorMessage(err: unknown): string;
|
|
|
17
17
|
*
|
|
18
18
|
* 1. `DOMException` `AbortError` and Node's `code === 'ABORT_ERR'` map to
|
|
19
19
|
* `'aborted'` regardless of the `.message`.
|
|
20
|
-
* 2. MCP
|
|
20
|
+
* 2. MCP SDK `UnauthorizedError` maps to `'oauth-required'` so the host can
|
|
21
|
+
* complete consumer-owned authorization before reconnecting.
|
|
22
|
+
* 3. MCP-shaped errors (an `Error` carrying a numeric `code`, see
|
|
21
23
|
* {@link isMcpErrorLike}) match by code: a positive code in `[100, 599]` is
|
|
22
24
|
* an HTTP status (see {@link categoryForHttpStatus}); a negative code is a
|
|
23
25
|
* JSON-RPC 2.0 error (`-32001` etc.).
|
|
24
|
-
*
|
|
26
|
+
* 4. Free-form `.message` text is matched against substrings the underlying
|
|
25
27
|
* transports surface (`401`, `403`, `5xx`, `ECONNREFUSED`, etc.). This is
|
|
26
28
|
* intentionally a small lookup — categories are stable, message shapes
|
|
27
29
|
* are not, so the heuristic stays narrow and falls back to `'unknown'`.
|
|
@@ -23,6 +23,9 @@ import { getErrorMessage, isAbortError } from '@salesforce/agentic-common';
|
|
|
23
23
|
function isMcpErrorLike(err) {
|
|
24
24
|
return err instanceof Error && typeof err.code === 'number';
|
|
25
25
|
}
|
|
26
|
+
function isOAuthRequiredError(err) {
|
|
27
|
+
return err instanceof Error && err.constructor.name === 'UnauthorizedError';
|
|
28
|
+
}
|
|
26
29
|
/**
|
|
27
30
|
* Strip V8 stack frames (" at <frame>") and any framing that arrived inside
|
|
28
31
|
* the message string. The result is a single, human-readable summary line safe
|
|
@@ -73,11 +76,13 @@ function categoryForHttpStatus(status) {
|
|
|
73
76
|
*
|
|
74
77
|
* 1. `DOMException` `AbortError` and Node's `code === 'ABORT_ERR'` map to
|
|
75
78
|
* `'aborted'` regardless of the `.message`.
|
|
76
|
-
* 2. MCP
|
|
79
|
+
* 2. MCP SDK `UnauthorizedError` maps to `'oauth-required'` so the host can
|
|
80
|
+
* complete consumer-owned authorization before reconnecting.
|
|
81
|
+
* 3. MCP-shaped errors (an `Error` carrying a numeric `code`, see
|
|
77
82
|
* {@link isMcpErrorLike}) match by code: a positive code in `[100, 599]` is
|
|
78
83
|
* an HTTP status (see {@link categoryForHttpStatus}); a negative code is a
|
|
79
84
|
* JSON-RPC 2.0 error (`-32001` etc.).
|
|
80
|
-
*
|
|
85
|
+
* 4. Free-form `.message` text is matched against substrings the underlying
|
|
81
86
|
* transports surface (`401`, `403`, `5xx`, `ECONNREFUSED`, etc.). This is
|
|
82
87
|
* intentionally a small lookup — categories are stable, message shapes
|
|
83
88
|
* are not, so the heuristic stays narrow and falls back to `'unknown'`.
|
|
@@ -85,6 +90,8 @@ function categoryForHttpStatus(status) {
|
|
|
85
90
|
export function classifyMcpError(err) {
|
|
86
91
|
if (isAbortError(err))
|
|
87
92
|
return 'aborted';
|
|
93
|
+
if (isOAuthRequiredError(err))
|
|
94
|
+
return 'oauth-required';
|
|
88
95
|
if (isMcpErrorLike(err)) {
|
|
89
96
|
// HTTP status (positive, 100–599) before the JSON-RPC switch — the two
|
|
90
97
|
// code spaces are disjoint (JSON-RPC codes are negative), so an HTTP
|
|
@@ -124,8 +131,8 @@ export function classifyMcpError(err) {
|
|
|
124
131
|
}
|
|
125
132
|
/**
|
|
126
133
|
* Whether the SDK considers the failure transient (worth a retry via
|
|
127
|
-
* `Agent.reconnectMcpServer`
|
|
128
|
-
* permanent protocol violations are non-retriable; everything else is retriable
|
|
134
|
+
* `Agent.reconnectMcpServer`). Aborted operations and
|
|
135
|
+
* permanent protocol violations and interactive OAuth requirements are non-retriable; everything else is retriable
|
|
129
136
|
* by default — failing-open here is correct because the consumer always has
|
|
130
137
|
* the option to ignore the hint.
|
|
131
138
|
*/
|
|
@@ -134,6 +141,7 @@ function isCategoryRetriable(category) {
|
|
|
134
141
|
case 'aborted':
|
|
135
142
|
case 'protocol-error':
|
|
136
143
|
case 'config-error':
|
|
144
|
+
case 'oauth-required':
|
|
137
145
|
return false;
|
|
138
146
|
default:
|
|
139
147
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-error-classifier.js","sourceRoot":"","sources":["../src/mcp-error-classifier.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE3E;;;;;;;;;;;;;;;;GAgBG;AACH,SAAS,cAAc,CAAC,GAAY;IAChC,OAAO,GAAG,YAAY,KAAK,IAAI,OAAQ,GAA0B,CAAC,IAAI,KAAK,QAAQ,CAAC;AACxF,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAY;IAChD,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjC,yEAAyE;IACzE,0EAA0E;IAC1E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC;IACL,CAAC;IACD,wEAAwE;IACxE,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAClC,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,qBAAqB,CAAC,MAAc;IACzC,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,UAAU,CAAC;IACtC,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,UAAU,CAAC;IACtC,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,IAAI,GAAG;QAAE,OAAO,UAAU,CAAC;IACtD,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,IAAI,GAAG;QAAE,OAAO,UAAU,CAAC;IACtD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"mcp-error-classifier.js","sourceRoot":"","sources":["../src/mcp-error-classifier.ts"],"names":[],"mappings":"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"}
|