@adcp/sdk 13.0.4 → 13.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/adcp-grade.js +4 -3
- package/bin/adcp.js +18 -0
- package/dist/lib/conformance/invariants/uniformError.d.ts.map +1 -1
- package/dist/lib/conformance/invariants/uniformError.js +21 -0
- package/dist/lib/conformance/invariants/uniformError.js.map +1 -1
- package/dist/lib/conformance/invariants/uniformError.mjs +22 -1
- package/dist/lib/conformance/invariants/uniformError.mjs.map +1 -1
- package/dist/lib/core/AgentClient.d.mts +1 -1
- package/dist/lib/core/AgentClient.d.ts +1 -1
- package/dist/lib/core/AgentClient.d.ts.map +1 -1
- package/dist/lib/core/AgentClient.js +1 -1
- package/dist/lib/core/AgentClient.js.map +1 -1
- package/dist/lib/core/AgentClient.mjs +1 -1
- package/dist/lib/core/AgentClient.mjs.map +1 -1
- package/dist/lib/core/SingleAgentClient.d.mts +1 -1
- package/dist/lib/core/SingleAgentClient.d.ts +1 -1
- package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
- package/dist/lib/core/SingleAgentClient.js +88 -48
- package/dist/lib/core/SingleAgentClient.js.map +1 -1
- package/dist/lib/core/SingleAgentClient.mjs +88 -48
- package/dist/lib/core/SingleAgentClient.mjs.map +1 -1
- package/dist/lib/core/TaskExecutor.d.ts.map +1 -1
- package/dist/lib/core/TaskExecutor.js +8 -4
- package/dist/lib/core/TaskExecutor.js.map +1 -1
- package/dist/lib/core/TaskExecutor.mjs +8 -4
- package/dist/lib/core/TaskExecutor.mjs.map +1 -1
- package/dist/lib/index.d.mts +1 -1
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/index.mjs.map +1 -1
- package/dist/lib/net/agent-transport-fetch.d.mts +15 -0
- package/dist/lib/net/agent-transport-fetch.d.ts +15 -0
- package/dist/lib/net/agent-transport-fetch.d.ts.map +1 -1
- package/dist/lib/net/agent-transport-fetch.js +37 -2
- package/dist/lib/net/agent-transport-fetch.js.map +1 -1
- package/dist/lib/net/agent-transport-fetch.mjs +37 -2
- package/dist/lib/net/agent-transport-fetch.mjs.map +1 -1
- package/dist/lib/net/credential-headers.d.mts +1 -0
- package/dist/lib/net/credential-headers.d.ts +2 -0
- package/dist/lib/net/credential-headers.d.ts.map +1 -0
- package/dist/lib/net/credential-headers.js +34 -0
- package/dist/lib/net/credential-headers.js.map +1 -0
- package/dist/lib/net/credential-headers.mjs +10 -0
- package/dist/lib/net/credential-headers.mjs.map +1 -0
- package/dist/lib/protocols/a2a-native-v1.d.mts +18 -0
- package/dist/lib/protocols/a2a-native-v1.d.ts +19 -0
- package/dist/lib/protocols/a2a-native-v1.d.ts.map +1 -0
- package/dist/lib/protocols/a2a-native-v1.js +183 -0
- package/dist/lib/protocols/a2a-native-v1.js.map +1 -0
- package/dist/lib/protocols/a2a-native-v1.mjs +167 -0
- package/dist/lib/protocols/a2a-native-v1.mjs.map +1 -0
- package/dist/lib/protocols/a2a-push-notification.d.mts +13 -0
- package/dist/lib/protocols/a2a-push-notification.d.ts +14 -0
- package/dist/lib/protocols/a2a-push-notification.d.ts.map +1 -0
- package/dist/lib/protocols/a2a-push-notification.js +42 -0
- package/dist/lib/protocols/a2a-push-notification.js.map +1 -0
- package/dist/lib/protocols/a2a-push-notification.mjs +23 -0
- package/dist/lib/protocols/a2a-push-notification.mjs.map +1 -0
- package/dist/lib/protocols/a2a.d.mts +15 -5
- package/dist/lib/protocols/a2a.d.ts +15 -5
- package/dist/lib/protocols/a2a.d.ts.map +1 -1
- package/dist/lib/protocols/a2a.js +102 -13
- package/dist/lib/protocols/a2a.js.map +1 -1
- package/dist/lib/protocols/a2a.mjs +90 -12
- package/dist/lib/protocols/a2a.mjs.map +1 -1
- package/dist/lib/protocols/index.d.mts +3 -0
- package/dist/lib/protocols/index.d.ts +3 -0
- package/dist/lib/protocols/index.d.ts.map +1 -1
- package/dist/lib/protocols/index.js +18 -6
- package/dist/lib/protocols/index.js.map +1 -1
- package/dist/lib/protocols/index.mjs +18 -6
- package/dist/lib/protocols/index.mjs.map +1 -1
- package/dist/lib/protocols/mcp-modern.d.ts.map +1 -1
- package/dist/lib/protocols/mcp-modern.js +3 -1
- package/dist/lib/protocols/mcp-modern.js.map +1 -1
- package/dist/lib/protocols/mcp-modern.mjs +3 -1
- package/dist/lib/protocols/mcp-modern.mjs.map +1 -1
- package/dist/lib/protocols/mcp-tasks.d.ts.map +1 -1
- package/dist/lib/protocols/mcp-tasks.js +2 -1
- package/dist/lib/protocols/mcp-tasks.js.map +1 -1
- package/dist/lib/protocols/mcp-tasks.mjs +2 -1
- package/dist/lib/protocols/mcp-tasks.mjs.map +1 -1
- package/dist/lib/protocols/mcp.d.mts +8 -5
- package/dist/lib/protocols/mcp.d.ts +8 -5
- package/dist/lib/protocols/mcp.d.ts.map +1 -1
- package/dist/lib/protocols/mcp.js +12 -4
- package/dist/lib/protocols/mcp.js.map +1 -1
- package/dist/lib/protocols/mcp.mjs +12 -4
- package/dist/lib/protocols/mcp.mjs.map +1 -1
- package/dist/lib/protocols/rawResponseCapture.d.mts +9 -1
- package/dist/lib/protocols/rawResponseCapture.d.ts +9 -1
- package/dist/lib/protocols/rawResponseCapture.d.ts.map +1 -1
- package/dist/lib/protocols/rawResponseCapture.js +153 -10
- package/dist/lib/protocols/rawResponseCapture.js.map +1 -1
- package/dist/lib/protocols/rawResponseCapture.mjs +153 -10
- package/dist/lib/protocols/rawResponseCapture.mjs.map +1 -1
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/signing/agent-fetch.d.mts +3 -1
- package/dist/lib/signing/agent-fetch.d.ts +3 -1
- package/dist/lib/signing/agent-fetch.d.ts.map +1 -1
- package/dist/lib/signing/agent-fetch.js +4 -2
- package/dist/lib/signing/agent-fetch.js.map +1 -1
- package/dist/lib/signing/agent-fetch.mjs +4 -2
- package/dist/lib/signing/agent-fetch.mjs.map +1 -1
- package/dist/lib/signing/protocol-methods.d.mts +24 -0
- package/dist/lib/signing/protocol-methods.d.ts +25 -0
- package/dist/lib/signing/protocol-methods.d.ts.map +1 -0
- package/dist/lib/signing/protocol-methods.js +51 -0
- package/dist/lib/signing/protocol-methods.js.map +1 -0
- package/dist/lib/signing/protocol-methods.mjs +25 -0
- package/dist/lib/signing/protocol-methods.mjs.map +1 -0
- package/dist/lib/signing/types.d.mts +2 -0
- package/dist/lib/signing/types.d.ts +2 -0
- package/dist/lib/signing/types.d.ts.map +1 -1
- package/dist/lib/signing/types.js.map +1 -1
- package/dist/lib/signing/types.mjs.map +1 -1
- package/dist/lib/signing/verifier.d.ts.map +1 -1
- package/dist/lib/signing/verifier.js +6 -2
- package/dist/lib/signing/verifier.js.map +1 -1
- package/dist/lib/signing/verifier.mjs +6 -2
- package/dist/lib/signing/verifier.mjs.map +1 -1
- package/dist/lib/testing/client.d.ts.map +1 -1
- package/dist/lib/testing/client.js +4 -1
- package/dist/lib/testing/client.js.map +1 -1
- package/dist/lib/testing/client.mjs +4 -1
- package/dist/lib/testing/client.mjs.map +1 -1
- package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
- package/dist/lib/testing/compliance/comply.js +3 -0
- package/dist/lib/testing/compliance/comply.js.map +1 -1
- package/dist/lib/testing/compliance/comply.mjs +3 -0
- package/dist/lib/testing/compliance/comply.mjs.map +1 -1
- package/dist/lib/testing/storyboard/agent-routing.d.mts +3 -1
- package/dist/lib/testing/storyboard/agent-routing.d.ts +3 -1
- package/dist/lib/testing/storyboard/agent-routing.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/agent-routing.js +5 -2
- package/dist/lib/testing/storyboard/agent-routing.js.map +1 -1
- package/dist/lib/testing/storyboard/agent-routing.mjs +4 -2
- package/dist/lib/testing/storyboard/agent-routing.mjs.map +1 -1
- package/dist/lib/testing/storyboard/compliance.d.mts +1 -1
- package/dist/lib/testing/storyboard/compliance.d.ts +1 -1
- package/dist/lib/testing/storyboard/compliance.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/compliance.js +4 -1
- package/dist/lib/testing/storyboard/compliance.js.map +1 -1
- package/dist/lib/testing/storyboard/compliance.mjs +4 -1
- package/dist/lib/testing/storyboard/compliance.mjs.map +1 -1
- package/dist/lib/testing/storyboard/native-a2a-compliance.d.mts +7 -0
- package/dist/lib/testing/storyboard/native-a2a-compliance.d.ts +8 -0
- package/dist/lib/testing/storyboard/native-a2a-compliance.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/native-a2a-compliance.js +45 -0
- package/dist/lib/testing/storyboard/native-a2a-compliance.js.map +1 -0
- package/dist/lib/testing/storyboard/native-a2a-compliance.mjs +21 -0
- package/dist/lib/testing/storyboard/native-a2a-compliance.mjs.map +1 -0
- package/dist/lib/testing/storyboard/probes.d.mts +2 -0
- package/dist/lib/testing/storyboard/probes.d.ts +2 -0
- package/dist/lib/testing/storyboard/probes.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/probes.js +3 -2
- package/dist/lib/testing/storyboard/probes.js.map +1 -1
- package/dist/lib/testing/storyboard/probes.mjs +3 -2
- package/dist/lib/testing/storyboard/probes.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/a2a-dispatch.d.mts +31 -0
- package/dist/lib/testing/storyboard/request-signing/a2a-dispatch.d.ts +32 -0
- package/dist/lib/testing/storyboard/request-signing/a2a-dispatch.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/request-signing/a2a-dispatch.js +279 -0
- package/dist/lib/testing/storyboard/request-signing/a2a-dispatch.js.map +1 -0
- package/dist/lib/testing/storyboard/request-signing/a2a-dispatch.mjs +244 -0
- package/dist/lib/testing/storyboard/request-signing/a2a-dispatch.mjs.map +1 -0
- package/dist/lib/testing/storyboard/request-signing/builder.d.mts +4 -1
- package/dist/lib/testing/storyboard/request-signing/builder.d.ts +4 -1
- package/dist/lib/testing/storyboard/request-signing/builder.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/builder.js +19 -0
- package/dist/lib/testing/storyboard/request-signing/builder.js.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/builder.mjs +19 -0
- package/dist/lib/testing/storyboard/request-signing/builder.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/grader.d.mts +5 -6
- package/dist/lib/testing/storyboard/request-signing/grader.d.ts +5 -6
- package/dist/lib/testing/storyboard/request-signing/grader.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/grader.js +82 -13
- package/dist/lib/testing/storyboard/request-signing/grader.js.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/grader.mjs +86 -13
- package/dist/lib/testing/storyboard/request-signing/grader.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/index.d.mts +1 -0
- package/dist/lib/testing/storyboard/request-signing/index.d.ts +1 -0
- package/dist/lib/testing/storyboard/request-signing/index.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/index.js +7 -0
- package/dist/lib/testing/storyboard/request-signing/index.js.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/index.mjs +8 -0
- package/dist/lib/testing/storyboard/request-signing/index.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/probe-dispatch.d.mts +2 -2
- package/dist/lib/testing/storyboard/request-signing/probe-dispatch.d.ts +2 -2
- package/dist/lib/testing/storyboard/request-signing/probe-dispatch.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/probe-dispatch.js +6 -5
- package/dist/lib/testing/storyboard/request-signing/probe-dispatch.js.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs +6 -5
- package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/types.d.mts +1 -0
- package/dist/lib/testing/storyboard/request-signing/types.d.ts +1 -0
- package/dist/lib/testing/storyboard/request-signing/types.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/types.js.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/types.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/vector-loader.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/vector-loader.js +1 -0
- package/dist/lib/testing/storyboard/request-signing/vector-loader.js.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs +1 -0
- package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.mts +28 -1
- package/dist/lib/testing/storyboard/runner.d.ts +28 -1
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +251 -55
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.mjs +255 -60
- package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
- package/dist/lib/testing/storyboard/types.d.mts +4 -2
- package/dist/lib/testing/storyboard/types.d.ts +4 -2
- package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/types.js +1 -0
- package/dist/lib/testing/storyboard/types.js.map +1 -1
- package/dist/lib/testing/storyboard/types.mjs +1 -0
- package/dist/lib/testing/storyboard/types.mjs.map +1 -1
- package/dist/lib/testing/storyboard/validations.d.mts +1 -1
- package/dist/lib/testing/storyboard/validations.d.ts +1 -1
- package/dist/lib/testing/storyboard/validations.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/validations.js +97 -22
- package/dist/lib/testing/storyboard/validations.js.map +1 -1
- package/dist/lib/testing/storyboard/validations.mjs +98 -22
- package/dist/lib/testing/storyboard/validations.mjs.map +1 -1
- package/dist/lib/version.d.mts +3 -3
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/dist/lib/version.js.map +1 -1
- package/dist/lib/version.mjs +3 -3
- package/dist/lib/version.mjs.map +1 -1
- package/docs/guides/BUILD-AN-AGENT.md +1 -1
- package/docs/llms.txt +5 -3
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/protocols/index.ts"],"sourcesContent":["import { fileURLToPath as __adcpFileURLToPath } from 'node:url';\nimport { dirname as __adcpDirname } from 'node:path';\nimport { createRequire as __adcpCreateRequire } from 'node:module';\nconst __dirname = __adcpDirname(__adcpFileURLToPath(import.meta.url));\nconst require = __adcpCreateRequire(import.meta.url);\n// Unified Protocol Interface for AdCP\nexport {\n callMCPTool,\n callMCPToolWithOAuth,\n connectMCP,\n closeMCPConnections,\n closeOAuthConnections,\n UnauthorizedError,\n} from './mcp';\n\nimport { closeMCPConnections } from './mcp';\nimport { closeCurrentMCPConnectionScope, withMCPConnectionScope } from './mcp-scope';\nimport { closeA2AConnections } from './a2a';\n\n/**\n * Close protocol connections for the given protocol.\n * MCP closes persistent HTTP transports; A2A clears the agent-card client cache.\n */\nexport async function closeConnections(protocol: 'mcp' | 'a2a' = 'mcp'): Promise<void> {\n if (protocol === 'mcp') {\n await closeMCPConnections();\n } else {\n closeA2AConnections();\n }\n}\n\n/** Close only the current runner's MCP scope; fall back to legacy global cleanup. */\nexport async function closeScopedConnections(protocol: 'mcp' | 'a2a' = 'mcp'): Promise<void> {\n if (protocol === 'mcp') {\n if (!(await closeCurrentMCPConnectionScope())) await closeMCPConnections();\n } else {\n closeA2AConnections();\n }\n}\n\nexport { withMCPConnectionScope };\nexport type { MCPCallOptions, MCPConnectionResult } from './mcp';\nexport { callA2ATool } from './a2a';\nexport { DEFAULT_REQUEST_TIMEOUT_MS } from './abort';\nexport {\n callMCPToolWithTasks,\n getMCPTaskStatus,\n getMCPTaskResult,\n listMCPTasks,\n cancelMCPTask,\n mapMCPTaskStatus,\n serverSupportsTasks,\n} from './mcp-tasks';\n\nimport { callMCPToolWithTasks, callMCPToolWithClient } from './mcp-tasks';\nimport { callMCPToolWithOAuth } from './mcp';\nimport { callA2ATool } from './a2a';\nimport type { AgentConfig, DebugLogEntry } from '../types';\nimport type { PushNotificationConfig } from '../types/tools.generated';\nimport { getAuthToken } from '../auth';\nimport {\n discoverAuthorizationRequirements,\n NeedsAuthorizationError,\n getAgentStorage,\n ensureClientCredentialsTokens,\n} from '../auth/oauth';\nimport { getNonInteractiveOAuthProvider } from '../auth/oauth/provider-cache';\nimport { is401Error } from '../errors';\nimport { isLikelyPrivateUrl } from '../net';\nimport { validateAgentUrl } from '../validation';\nimport { withSpan } from '../observability/tracing';\nimport { ADCP_MAJOR_VERSION, ADCP_VERSION, parseAdcpMajorVersion } from '../version';\nimport { ConfigurationError } from '../errors';\nimport { resolveBundleKey, toReleasePrecisionWire, validateAdcpVersionWire } from '../validation/schema-loader';\nimport { buildAgentSigningContext, CAPABILITY_OP, ensureCapabilityLoaded } from '../signing/client';\nimport { withResponseSizeLimit } from './responseSizeLimit';\nimport {\n withTransportDiagnostics,\n type TransportActivityHandler as TransportActivityHandlerFn,\n} from './transportDiagnostics';\n\nexport {\n sanitizeTransportHeaders,\n sanitizeTransportUrl,\n withTransportDiagnostics,\n wrapFetchWithTransportDiagnostics,\n} from './transportDiagnostics';\nexport type { TransportActivity, TransportActivityContext, TransportActivityHandler } from './transportDiagnostics';\n\nexport type VersionEnvelopeMode = 'auto' | 'none' | 'major-only';\n\n/**\n * Derive the wire-level `adcp_major_version` integer from a caller-supplied\n * pin. Returns the SDK default when no pin is provided; throws on a pin\n * that doesn't parse so misuse surfaces at the factory boundary instead\n * of silently emitting the SDK's major.\n *\n * Throws `ConfigurationError` (not a plain `Error`) so a typo'd pin\n * surfaces with the same error class as the construction-time gate in\n * `resolveAdcpVersion` — one shape for all pin-misuse paths.\n */\nfunction resolveWireMajor(adcpVersion: string | undefined): number {\n if (adcpVersion === undefined) return ADCP_MAJOR_VERSION;\n const parsed = parseAdcpMajorVersion(adcpVersion);\n if (!Number.isFinite(parsed)) {\n throw new ConfigurationError(\n `adcpVersion ${JSON.stringify(adcpVersion)} is not a valid AdCP version. ` +\n `Expected a semver string (e.g. '3.0.1', '3.1.0-beta.1') or a legacy alias (e.g. 'v3').`,\n 'adcpVersion'\n );\n }\n return parsed;\n}\n\n/**\n * Returns true when the AdCP release that `bundleKey` identifies declares the\n * top-level `adcp_version` envelope field. The field landed in AdCP 3.1 per\n * spec PR `adcontextprotocol/adcp#3493` — 3.0 (any patch / prerelease) does\n * not carry it; 3.1+ does. Used to gate dual-emit on the wire so a 3.0-pinned\n * client doesn't emit a field its target schema doesn't define.\n */\nexport function bundleSupportsAdcpVersionField(bundleKey: string): boolean {\n const major = parseAdcpMajorVersion(bundleKey);\n if (!Number.isFinite(major)) return false;\n if (major < 3) return false;\n if (major > 3) return true;\n // Major 3 — only 3.1+ has the field. Bundle key shape is normalized by\n // `resolveBundleKey`: `'3.0'` / `'3.1'` for stable; `'3.0.0-beta.1'` /\n // `'3.1.0-beta.1'` for prereleases. Match the minor.\n const minorMatch = bundleKey.match(/^\\d+\\.(\\d+)/);\n if (!minorMatch) return false;\n return parseInt(minorMatch[1]!, 10) >= 1;\n}\n\n/**\n * Build the wire-level version envelope to merge into outgoing request args.\n *\n * Per AdCP 3.1 (spec PR `adcontextprotocol/adcp#3493`), 3.1+ requests carry\n * BOTH the integer `adcp_major_version` (deprecated through 3.x, removed in\n * 4.0) AND the release-precision string `adcp_version`. 3.0 schemas don't\n * define the string field, so a 3.0-pinned client emits the integer only —\n * matches the 3.0 spec exactly.\n *\n * Wire string is release-precision (MAJOR.MINOR with optional prerelease tag),\n * per `core/version-envelope.json`'s pattern `^\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?$`.\n * Full-semver bundle keys (`'3.1.0-beta.1'`) are collapsed via\n * `toReleasePrecisionWire` to `'3.1-beta.1'` before emit — meta-field shapes\n * are explicitly NOT valid wire values per the envelope schema's own\n * normalization rule.\n *\n * Returns `{}` for v2 callers (predates the major-version field entirely).\n */\nfunction buildVersionEnvelope(\n adcpVersion: string | undefined,\n serverVersion: 'v2' | 'v3' | undefined\n): Record<string, unknown> {\n if (serverVersion === 'v2') return {};\n const wireMajor = resolveWireMajor(adcpVersion);\n const bundleKey = resolveBundleKey(adcpVersion ?? ADCP_VERSION);\n if (!bundleSupportsAdcpVersionField(bundleKey)) {\n return { adcp_major_version: wireMajor };\n }\n const wireValue = toReleasePrecisionWire(bundleKey);\n // Defensive postcondition — should never throw in well-formed code, but\n // if a future refactor breaks the normalization the error message tells\n // the developer to call `toReleasePrecisionWire` instead of silently\n // emitting a non-spec wire string.\n validateAdcpVersionWire(wireValue);\n return { adcp_major_version: wireMajor, adcp_version: wireValue };\n}\n\nlet hasWarnedAboutV2PushNotificationSecret = false;\n\n/**\n * Warn once when an async webhook registration is suppressed for a v2 seller.\n *\n * v2.5's `push-notification-config.json` requires `authentication`, and unlike\n * 3.x it has no RFC 9421 selector semantics — so omitting the block produces a\n * schema-invalid request rather than choosing a signing mode. Without a\n * configured secret there is no honest value to send, and the previous\n * behaviour (a hardcoded placeholder credential) told the seller the channel\n * was authenticated by a constant published in this package.\n */\nfunction warnV2PushNotificationNeedsSecret(): void {\n if (hasWarnedAboutV2PushNotificationSecret) return;\n hasWarnedAboutV2PushNotificationSecret = true;\n console.warn(\n '[adcp] Suppressing push_notification_config for a v2 seller: AdCP 2.5 requires an ' +\n '`authentication` block and no `webhookSecret` is configured. Set `webhookSecret` to register ' +\n 'async task-status webhooks with this agent, or move the agent to an AdCP 3.x pin, where the ' +\n 'RFC 9421 webhook profile needs no shared secret.'\n );\n}\n\nfunction buildVersionEnvelopeForMode(\n mode: VersionEnvelopeMode,\n adcpVersion: string | undefined,\n serverVersion: 'v2' | 'v3' | undefined\n): Record<string, unknown> {\n if (mode === 'none' || serverVersion === 'v2') return {};\n if (mode === 'major-only') return { adcp_major_version: resolveWireMajor(adcpVersion) };\n return buildVersionEnvelope(adcpVersion, serverVersion);\n}\n\n/**\n * Merge the wire-level version envelope into a caller-supplied args object.\n * Caller args win: an explicit `adcp_major_version` / `adcp_version` in\n * `args` (e.g. a conformance harness probing `VERSION_UNSUPPORTED`) passes\n * through unchanged. The envelope only fills fields the caller didn't set.\n *\n * Single chokepoint for all four wire-injection sites so a future refactor\n * can't silently flip the spread order on one branch and leave the others\n * intact. Stale dual-field drift is caught at the server boundary by\n * `createAdcpServer`'s field-disagreement check (spec PR\n * `adcontextprotocol/adcp#3493`).\n *\n * @internal\n */\nexport function applyVersionEnvelope(\n args: Record<string, unknown>,\n envelope: Record<string, unknown>\n): Record<string, unknown> {\n return { ...envelope, ...args };\n}\n\n/**\n * Transport-level safeguards applied to a call.\n *\n * Wired into the SDK's internal fetch chain via AsyncLocalStorage, so the\n * cap takes effect even when the underlying transport's connection cache\n * reuses a fetch that was created on an earlier call with different limits.\n */\nexport interface TransportOptions {\n /**\n * Maximum response body size (in octets) the SDK will read before aborting\n * with `ResponseTooLargeError`. When unset, the SDK does not impose a cap —\n * matches the underlying MCP / A2A transport defaults.\n *\n * Set this when crawling **untrusted** agents (registries, federated\n * discovery layers, monitoring tools) to prevent a hostile vendor from\n * buffering a large reply before any application-layer schema validation\n * runs. Counted across response chunks; pre-cancels when `Content-Length`\n * exceeds the cap. Applies to A2A agent-card discovery\n * (`/.well-known/agent.json`) on the same call as well.\n *\n * Per-call override (`TaskOptions.transport.maxResponseBytes`) beats the\n * value set on the client constructor (`SingleAgentClientConfig.transport`).\n *\n * @remarks\n * **Safe to set on all calls.** SSE responses (`text/event-stream`) are\n * passed through unchanged — a single tool call legitimately emits N status\n * frames + a final result, bounded by protocol-level framing rather than\n * cumulative byte counts. The cap applies to one-shot JSON responses\n * (`get_adcp_capabilities`, agent-card lookup, tool result payloads on\n * non-streaming transports) where the body is bounded by definition.\n *\n * @remarks\n * **Hostile-peer note:** A peer can opt itself out of this cap by responding\n * with `Content-Type: text/event-stream`. SSE is bypassed because cumulative\n * event-frame bytes are unbounded by spec — MCP and A2A both stream tool\n * responses this way. The MCP/A2A SDKs consume SSE incrementally and frame\n * termination bounds memory in practice, so this is not a memory-bomb risk\n * for well-formed transports. Adopters relying on `maxResponseBytes` as a\n * hostile-server defense should treat it as best-effort for non-SSE\n * responses only.\n *\n * @remarks\n * Future hardening knobs (DNS-rebind defense, scheme allow-list, request\n * timeout overrides) will land here as additional fields. When `trustedFetchFn`\n * is supplied, the SDK composes it inside its signing, capture, size-limit,\n * timeout, and diagnostics wrappers so callers do not have to reproduce\n * that non-obvious ordering themselves.\n */\n maxResponseBytes?: number;\n /**\n * Scoped fetch implementation for all outbound HTTP performed on behalf of\n * this client or call, including endpoint/card discovery, tool listing,\n * OAuth discovery and token refresh, and MCP/A2A tool requests.\n *\n * The function is runtime-only configuration and is never serialized into\n * agent records, storyboard artifacts, or compliance output. When unset,\n * the SDK uses the global `fetch` implementation.\n *\n * Supplying this function makes it the trusted network boundary: the SDK\n * still validates URL schemes, redirect behavior, timeouts, and body limits,\n * but delegates DNS resolution and address policy to the implementation.\n * It must prevent DNS rebinding and unsafe private-address access itself (for\n * example with an egress proxy or its own DNS pinning).\n */\n trustedFetchFn?: typeof fetch;\n /**\n * @deprecated Rename to `trustedFetchFn`. Supplying this legacy alias is\n * treated as an explicit assertion that the implementation pins DNS.\n */\n fetchFn?: typeof fetch;\n /**\n * Permit this client to connect to private DNS answers. Localhost and an\n * initial private IP literal are allowed automatically only on their exact\n * origin; use this for private-DNS enterprise agents.\n */\n allowPrivateIp?: boolean;\n /**\n * Timeout in milliseconds for bounded one-shot transport requests such as\n * A2A agent-card discovery and MCP read-path probes. Defaults to 60 seconds\n * for A2A discovery so an unresponsive card endpoint cannot hang forever.\n * Set to `0` to disable the SDK-imposed discovery timeout.\n */\n requestTimeoutMs?: number;\n}\n\nlet warnedLegacyTransportFetch = false;\n\n/** @internal Normalize the pre-GA fetch hook rename without silently dropping JS callers. */\nexport function normalizeTransportOptions(transport?: TransportOptions): TransportOptions | undefined {\n if (!transport?.fetchFn) return transport;\n if (transport.trustedFetchFn && transport.trustedFetchFn !== transport.fetchFn) {\n throw new TypeError('TransportOptions cannot set different fetchFn and trustedFetchFn implementations');\n }\n if (!warnedLegacyTransportFetch) {\n warnedLegacyTransportFetch = true;\n console.warn(\n '[adcp] TransportOptions.fetchFn is deprecated; rename it to trustedFetchFn. ' +\n 'Custom fetch implementations must provide connect-time DNS pinning.'\n );\n }\n return { ...transport, trustedFetchFn: transport.trustedFetchFn ?? transport.fetchFn };\n}\n\n/**\n * Options for {@link ProtocolClient.callTool}. All fields are optional.\n *\n * `webhookUrl` / `webhookSecret` / `webhookToken` are for ASYNC TASK STATUS\n * notifications (push_notification_config). For reporting webhooks\n * (reporting_webhook), include them directly in `args` — they stay in skill\n * parameters and are sent verbatim to the agent.\n */\nexport interface CallToolOptions {\n /** Debug log array. Mutated in place by the protocol layer. */\n debugLogs?: DebugLogEntry[];\n /** URL for async task status notifications. */\n webhookUrl?: string;\n /** HMAC-SHA256 secret for push_notification_config authentication. */\n webhookSecret?: string;\n /** Bearer token for push_notification_config validation. */\n webhookToken?: string;\n /** Pinned protocol generation when the agent advertises both v2 and v3. */\n serverVersion?: 'v2' | 'v3';\n /** A2A session continuity (contextId carries conversation, taskId resumes a task). */\n session?: { contextId?: string; taskId?: string };\n /**\n * AdCP version pin from the calling client/server instance. Sets the\n * wire-level `adcp_major_version` field per-call instead of from the\n * SDK-pinned `ADCP_MAJOR_VERSION` constant. Default falls back to the\n * constant so call sites that don't plumb a per-instance version keep\n * their existing behavior. An explicit `adcp_major_version` /\n * `adcp_version` in `args` overrides this — conformance harnesses use\n * that path to probe seller version negotiation.\n */\n adcpVersion?: string;\n /**\n * Optional wire-only version override. Schema selection and client\n * construction can remain pinned to `adcpVersion`; the request envelope is\n * emitted for this release-precision line.\n */\n wireAdcpVersion?: string;\n /**\n * Controls whether the SDK injects AdCP version envelope fields into the\n * outgoing request. Defaults to `auto`. 3.0 pins emit only the legacy\n * `adcp_major_version`; 3.1+ pins emit both the legacy major and exact\n * `adcp_version` marker. `major-only` forces the legacy integer marker\n * without the 3.1 string marker for strict pre-3.1 peers discovered at\n * runtime.\n */\n versionEnvelope?: VersionEnvelopeMode;\n /**\n * Transport-level safeguards (size caps, etc.). Per-call override of any\n * matching field on the client constructor's `transport` option.\n */\n transport?: TransportOptions;\n /** Caller-owned cancellation signal for the in-flight protocol call. */\n signal?: AbortSignal;\n /** Transport-level diagnostics callback for outbound HTTP requests. */\n onTransportActivity?: TransportActivityHandlerFn;\n /**\n * Correlation metadata attached to transport diagnostics events emitted\n * while this protocol call is active.\n */\n transportActivityContext?: {\n operationId?: string;\n taskId?: string;\n contextId?: string;\n idempotencyKey?: string;\n };\n}\n\n/**\n * Universal protocol client - automatically routes to the correct protocol implementation\n */\nexport class ProtocolClient {\n /**\n * Call a tool on an agent using the appropriate protocol.\n *\n * @param agent - Agent configuration\n * @param toolName - Name of the tool/skill to call\n * @param args - Tool arguments (includes reporting_webhook if needed - NOT removed)\n * @param options - Optional call-level configuration. See {@link CallToolOptions}.\n */\n static async callTool(\n agent: AgentConfig,\n toolName: string,\n args: Record<string, unknown>,\n options: CallToolOptions = {}\n ): Promise<unknown> {\n const {\n debugLogs = [],\n webhookUrl,\n webhookSecret,\n webhookToken,\n serverVersion,\n session,\n adcpVersion,\n wireAdcpVersion,\n versionEnvelope: versionEnvelopeMode = 'auto',\n transport: requestedTransport,\n signal,\n onTransportActivity,\n transportActivityContext,\n } = options;\n const transport = normalizeTransportOptions(requestedTransport);\n // Per-instance version envelope. Throws on unparseable pins via\n // `resolveWireMajor`; construction-time `resolveAdcpVersion` is the\n // primary gate but this is the failsafe for callers reaching\n // `ProtocolClient.callTool` directly (test harnesses, the in-process\n // MCP path). Returns `{ adcp_major_version }` for 3.0 pins and\n // `{ adcp_major_version, adcp_version }` for 3.1+ pins.\n const versionEnvelope = buildVersionEnvelopeForMode(\n versionEnvelopeMode,\n wireAdcpVersion ?? adcpVersion,\n serverVersion\n );\n // Enter the response-size-limit ALS slot once for this call. The slot is\n // read by `wrapFetchWithSizeLimit` in both protocol transports, so the\n // cap applies regardless of which path (MCP / A2A / OAuth refresh) the\n // call ends up taking. No-op when the cap is unset or non-positive.\n return withResponseSizeLimit(transport?.maxResponseBytes, () =>\n withTransportDiagnostics(\n {\n agentId: agent.id,\n protocol: agent.protocol,\n tool: toolName,\n taskType: toolName,\n ...transportActivityContext,\n onTransportActivity,\n },\n () =>\n withSpan(\n `adcp.${agent.protocol}.call_tool`,\n {\n 'adcp.agent_id': agent.id,\n 'adcp.protocol': agent.protocol,\n 'adcp.tool': toolName,\n 'http.url': agent.agent_uri,\n },\n async () => {\n // In-process MCP path: pre-connected client, no HTTP transport.\n // Idempotency injection, schema validation, and governance middleware all\n // still apply (they run in SingleAgentClient above this call). We skip\n // URL validation, OAuth refresh, and signing — none apply in-process.\n if (agent.protocol === 'mcp' && agent._inProcessMcpClient) {\n const inProcArgs = applyVersionEnvelope(args, versionEnvelope);\n return callMCPToolWithClient(agent._inProcessMcpClient, toolName, inProcArgs, debugLogs, {\n ...(signal && { signal }),\n ...(transport?.requestTimeoutMs !== undefined && { requestTimeoutMs: transport.requestTimeoutMs }),\n });\n }\n\n validateAgentUrl(agent.agent_uri);\n\n // OAuth 2.0 client credentials (RFC 6749 §4.4): re-exchange the\n // secret for a fresh access token whenever the cached one is within\n // its expiration skew. Runs before every call so mid-session expiry\n // can't leave the caller with a stale bearer. No-op if the agent\n // doesn't declare client credentials. Cheap on warm cache (single\n // `Date.now()` compare); a single POST to the token endpoint on miss.\n //\n // `allowPrivateIp` inherits the trust the caller already placed in\n // `agent.agent_uri` — if they're making a call to a private-IP agent,\n // they've authorized this process to talk to private-IP hosts, so\n // the token endpoint on the same network is reachable too. Public\n // agent URLs with private-IP token endpoints still require an\n // explicit opt-in via the library API.\n if (agent.oauth_client_credentials) {\n const ccStorage = getAgentStorage(agent);\n const allowPrivateIp = transport?.allowPrivateIp ?? isLikelyPrivateUrl(agent.agent_uri);\n await ensureClientCredentialsTokens(agent, {\n storage: ccStorage,\n allowPrivateIp,\n fetch: transport?.trustedFetchFn,\n signal,\n });\n }\n\n const authToken = getAuthToken(agent);\n\n // RFC 9421 signing context. Built once per call and passed through\n // to each protocol-layer entry (`callMCPToolWithTasks`, `callA2ATool`,\n // `callMCPToolWithOAuth`) — those entries seed `signingContextStorage`\n // (AsyncLocalStorage) so the internal transport helpers read it\n // without an explicit parameter. Keep the explicit arg here: it's the\n // ALS seed, not incidental plumbing. `get_adcp_capabilities` is\n // exempt from signing (it's the discovery call itself) and also\n // triggers cache priming for any other op on agents with\n // `request_signing` configured.\n const signingContext = buildAgentSigningContext(agent);\n if (signingContext && toolName !== CAPABILITY_OP) {\n await ensureCapabilityLoaded(agent, signingContext, primeArgs =>\n ProtocolClient.callTool(agent, CAPABILITY_OP, primeArgs, {\n debugLogs,\n serverVersion,\n adcpVersion,\n ...(versionEnvelopeMode !== 'auto' && { versionEnvelope: versionEnvelopeMode }),\n transport,\n signal,\n ...(transport?.requestTimeoutMs !== undefined && { requestTimeoutMs: transport.requestTimeoutMs }),\n onTransportActivity,\n transportActivityContext,\n })\n );\n }\n\n // Inject the version envelope on every request so sellers can validate\n // compatibility. Skip for v2 servers — they don't recognise the\n // version fields and strict-schema agents reject them. The envelope\n // shape is per-pin: 3.0 pins get the integer `adcp_major_version`\n // alone; 3.1+ pins get both that and the release-precision string\n // `adcp_version` (`'3.1'` / `'3.1.0-beta.1'`) per spec PR\n // `adcontextprotocol/adcp#3493`.\n const argsWithVersion = applyVersionEnvelope(args, versionEnvelope);\n\n // Build push_notification_config for ASYNC TASK STATUS notifications\n // (NOT for reporting_webhook - that stays in args)\n // Schema: https://adcontextprotocol.org/schemas/v1/core/push-notification-config.json\n // `authentication` is a scheme SELECTOR, not a fallback: from AdCP\n // 3.0 on, push-notification-config.json makes its presence opt the\n // seller into legacy HMAC-SHA256 and its absence select the RFC\n // 9421 webhook profile, with `required: [\"url\"]` only. Emitting it\n // with a placeholder credential would therefore downgrade every\n // webhook to legacy HMAC keyed by a constant that ships in this\n // file, so the block is omitted unless a real secret backs it.\n //\n // v2.5 predates the selector: there `required` is\n // `[\"url\", \"authentication\"]` and there is no 9421 path, so an\n // omitted block is schema-invalid rather than a mode selection.\n // With no secret there is nothing honest to send a v2 seller, so\n // suppress the registration instead of fabricating a credential.\n const pushNotificationConfig: PushNotificationConfig | undefined = (():\n | PushNotificationConfig\n | undefined => {\n if (!webhookUrl) return undefined;\n if (webhookSecret) {\n return {\n url: webhookUrl,\n ...(webhookToken && { token: webhookToken }),\n authentication: {\n schemes: ['HMAC-SHA256' as const],\n credentials: webhookSecret,\n },\n };\n }\n if (serverVersion === 'v2') {\n warnV2PushNotificationNeedsSecret();\n return undefined;\n }\n return {\n url: webhookUrl,\n ...(webhookToken && { token: webhookToken }),\n };\n })();\n\n if (agent.protocol === 'mcp') {\n // For MCP, include push_notification_config in tool arguments (MCP spec)\n const argsWithWebhook = pushNotificationConfig\n ? { ...argsWithVersion, push_notification_config: pushNotificationConfig }\n : argsWithVersion;\n\n // If the agent config carries authorization-code OAuth tokens,\n // route through the OAuth provider path so the MCP SDK can refresh\n // on 401 instead of hard-failing. Excludes client-credentials\n // agents: they have a cached access token but no refresh_token,\n // and their refresh path is a secret re-exchange (handled above),\n // not the SDK's refresh_token grant.\n if (agent.oauth_tokens && !agent.oauth_client_credentials) {\n const authProvider = getNonInteractiveOAuthProvider(agent, {\n agentHint: agent.id,\n storage: getAgentStorage(agent),\n allowHttp: isLikelyPrivateUrl(agent.agent_uri),\n });\n try {\n return await callMCPToolWithOAuth({\n agentUrl: agent.agent_uri,\n toolName,\n args: argsWithWebhook,\n authProvider,\n debugLogs,\n customHeaders: agent.headers,\n signingContext,\n signal,\n requestTimeoutMs: transport?.requestTimeoutMs,\n fetchFn: transport?.trustedFetchFn,\n allowPrivateIp: transport?.allowPrivateIp,\n });\n } catch (err) {\n // Refresh failed or server rejected the refreshed token — walk the\n // discovery chain so the caller can distinguish \"re-auth needed\"\n // from other failure modes.\n await rethrowAsNeedsAuthorization(\n err,\n agent.agent_uri,\n transport?.trustedFetchFn,\n signal,\n transport?.allowPrivateIp\n );\n throw err;\n }\n }\n\n // Use callMCPToolWithTasks which auto-detects server tasks capability\n // and falls back to standard callTool when tasks are not supported\n try {\n return await callMCPToolWithTasks(\n agent.agent_uri,\n toolName,\n argsWithWebhook,\n authToken,\n debugLogs,\n agent.headers,\n {\n ...(signingContext && { signingContext }),\n ...(signal && { signal }),\n ...(transport?.requestTimeoutMs !== undefined && {\n requestTimeoutMs: transport.requestTimeoutMs,\n }),\n ...(transport?.trustedFetchFn && { fetchFn: transport.trustedFetchFn }),\n ...(transport?.allowPrivateIp !== undefined && { allowPrivateIp: transport.allowPrivateIp }),\n }\n );\n } catch (err) {\n // Client-credentials agents: on 401, the AS may have rotated\n // something out-of-band. Force a fresh exchange and retry once\n // before surfacing the error. Bounded (single retry) so we don't\n // loop if the credentials are genuinely wrong.\n if (agent.oauth_client_credentials && is401Error(err)) {\n const ccStorage = getAgentStorage(agent);\n const allowPrivateIp = transport?.allowPrivateIp ?? isLikelyPrivateUrl(agent.agent_uri);\n await ensureClientCredentialsTokens(agent, {\n storage: ccStorage,\n force: true,\n allowPrivateIp,\n fetch: transport?.trustedFetchFn,\n signal,\n });\n const retryAuthToken = agent.oauth_tokens?.access_token ?? authToken;\n try {\n return await callMCPToolWithTasks(\n agent.agent_uri,\n toolName,\n argsWithWebhook,\n retryAuthToken,\n debugLogs,\n agent.headers,\n {\n ...(signingContext && { signingContext }),\n ...(signal && { signal }),\n ...(transport?.requestTimeoutMs !== undefined && {\n requestTimeoutMs: transport.requestTimeoutMs,\n }),\n ...(transport?.trustedFetchFn && { fetchFn: transport.trustedFetchFn }),\n ...(transport?.allowPrivateIp !== undefined && {\n allowPrivateIp: transport.allowPrivateIp,\n }),\n }\n );\n } catch (retryErr) {\n await rethrowAsNeedsAuthorization(\n retryErr,\n agent.agent_uri,\n transport?.trustedFetchFn,\n signal,\n transport?.allowPrivateIp\n );\n throw retryErr;\n }\n }\n await rethrowAsNeedsAuthorization(\n err,\n agent.agent_uri,\n transport?.trustedFetchFn,\n signal,\n transport?.allowPrivateIp\n );\n throw err;\n }\n } else if (agent.protocol === 'a2a') {\n // For A2A, pass pushNotificationConfig separately (not in skill parameters)\n try {\n return await callA2ATool(\n agent.agent_uri,\n toolName,\n argsWithVersion,\n authToken,\n debugLogs,\n pushNotificationConfig,\n agent.headers,\n signingContext,\n session,\n signal,\n transport?.requestTimeoutMs,\n transport?.trustedFetchFn,\n transport?.allowPrivateIp\n );\n } catch (err) {\n // Same single-retry-on-401 for client-credentials agents as the\n // MCP path above. Kept symmetric so A2A CC agents aren't a\n // second-class experience — including the NeedsAuthorizationError\n // rewrap on a retry that still 401s.\n if (agent.oauth_client_credentials && is401Error(err)) {\n const ccStorage = getAgentStorage(agent);\n const allowPrivateIp = transport?.allowPrivateIp ?? isLikelyPrivateUrl(agent.agent_uri);\n await ensureClientCredentialsTokens(agent, {\n storage: ccStorage,\n force: true,\n allowPrivateIp,\n fetch: transport?.trustedFetchFn,\n signal,\n });\n const retryAuthToken = agent.oauth_tokens?.access_token ?? authToken;\n try {\n return await callA2ATool(\n agent.agent_uri,\n toolName,\n argsWithVersion,\n retryAuthToken,\n debugLogs,\n pushNotificationConfig,\n agent.headers,\n signingContext,\n session,\n signal,\n transport?.requestTimeoutMs,\n transport?.trustedFetchFn,\n transport?.allowPrivateIp\n );\n } catch (retryErr) {\n await rethrowAsNeedsAuthorization(\n retryErr,\n agent.agent_uri,\n transport?.trustedFetchFn,\n signal,\n transport?.allowPrivateIp\n );\n throw retryErr;\n }\n }\n await rethrowAsNeedsAuthorization(\n err,\n agent.agent_uri,\n transport?.trustedFetchFn,\n signal,\n transport?.allowPrivateIp\n );\n throw err;\n }\n } else {\n throw new Error(`Unsupported protocol: ${agent.protocol}`);\n }\n }\n )\n )\n );\n }\n}\n\n/**\n * If `err` looks like a 401 from the MCP transport, probe the agent for a\n * Bearer challenge and throw a {@link NeedsAuthorizationError} carrying\n * walked discovery metadata. If the error isn't a 401 or we can't build a\n * requirements record, return silently so the caller re-throws the original.\n *\n * Keeping this off the hot path: we only probe on error, and the probe is\n * a single unauthenticated `tools/list` POST — no retries, no DNS rebind.\n */\nasync function rethrowAsNeedsAuthorization(\n err: unknown,\n agentUrl: string,\n fetchFn?: typeof fetch,\n signal?: AbortSignal,\n configuredAllowPrivateIp?: boolean\n): Promise<void> {\n if (err instanceof NeedsAuthorizationError) throw err;\n if (!is401Error(err)) return;\n\n // If the caller has already connected to the agent URL, they've implicitly\n // trusted it — inherit that trust for the discovery probe so loopback /\n // private-IP development agents work the same way as public ones.\n const allowPrivateIp = configuredAllowPrivateIp ?? isLikelyPrivateUrl(agentUrl);\n\n // discoverAuthorizationRequirements internally catches network failures and\n // returns null rather than throwing — anything that escapes is a genuine\n // bug we want to surface rather than mask the 401 with.\n const requirements = await discoverAuthorizationRequirements(agentUrl, { allowPrivateIp, fetchFn, signal });\n if (requirements) {\n throw new NeedsAuthorizationError(requirements);\n }\n // No requirements walked; let the caller re-throw the original error.\n}\n\n/**\n * Simple factory functions for protocol-specific clients.\n *\n * Both factories accept a `transport` argument that flows through to the\n * size-cap surface so callers reaching the factory exports honor the same\n * `maxResponseBytes` contract as `ProtocolClient.callTool`. Without it,\n * the factories would silently bypass the cap, which the public API\n * (`TransportOptions`) implies they honor.\n */\nexport const createMCPClient = (\n agentUrl: string,\n authToken?: string,\n headers?: Record<string, string>,\n serverVersion?: 'v2' | 'v3',\n adcpVersion?: string,\n transport?: TransportOptions,\n versionEnvelopeMode: VersionEnvelopeMode = 'auto'\n) => {\n transport = normalizeTransportOptions(transport);\n // Validate the pin at factory time so a typo surfaces here rather than at\n // first call. `buildVersionEnvelope` throws via `resolveWireMajor` on bad\n // input — call it once to surface, then close over the envelope.\n const versionEnvelope = buildVersionEnvelopeForMode(versionEnvelopeMode, adcpVersion, serverVersion);\n return {\n callTool: (toolName: string, args: Record<string, unknown>, debugLogs?: DebugLogEntry[]) =>\n withResponseSizeLimit(transport?.maxResponseBytes, () =>\n callMCPToolWithTasks(\n agentUrl,\n toolName,\n applyVersionEnvelope(args, versionEnvelope),\n authToken,\n debugLogs,\n headers,\n {\n ...(transport?.requestTimeoutMs !== undefined && { requestTimeoutMs: transport.requestTimeoutMs }),\n ...(transport?.trustedFetchFn && { fetchFn: transport.trustedFetchFn }),\n ...(transport?.allowPrivateIp !== undefined && { allowPrivateIp: transport.allowPrivateIp }),\n }\n )\n ),\n };\n};\n\nexport const createA2AClient = (\n agentUrl: string,\n authToken?: string,\n headers?: Record<string, string>,\n serverVersion?: 'v2' | 'v3',\n adcpVersion?: string,\n transport?: TransportOptions,\n versionEnvelopeMode: VersionEnvelopeMode = 'auto'\n) => {\n transport = normalizeTransportOptions(transport);\n const versionEnvelope = buildVersionEnvelopeForMode(versionEnvelopeMode, adcpVersion, serverVersion);\n return {\n callTool: (toolName: string, parameters: Record<string, unknown>, debugLogs?: DebugLogEntry[]) =>\n withResponseSizeLimit(transport?.maxResponseBytes, () =>\n callA2ATool(\n agentUrl,\n toolName,\n applyVersionEnvelope(parameters, versionEnvelope),\n authToken,\n debugLogs,\n undefined,\n headers,\n undefined,\n undefined,\n undefined,\n transport?.requestTimeoutMs,\n transport?.trustedFetchFn,\n transport?.allowPrivateIp\n )\n ),\n };\n};\n"],"mappings":"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","names":["require","closeMCPConnections","callMCPToolWithTasks","callMCPToolWithOAuth","callA2ATool","withTransportDiagnostics"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/protocols/index.ts"],"sourcesContent":["import { fileURLToPath as __adcpFileURLToPath } from 'node:url';\nimport { dirname as __adcpDirname } from 'node:path';\nimport { createRequire as __adcpCreateRequire } from 'node:module';\nconst __dirname = __adcpDirname(__adcpFileURLToPath(import.meta.url));\nconst require = __adcpCreateRequire(import.meta.url);\n// Unified Protocol Interface for AdCP\nexport {\n callMCPTool,\n callMCPToolWithOAuth,\n connectMCP,\n closeMCPConnections,\n closeOAuthConnections,\n UnauthorizedError,\n} from './mcp';\n\nimport { closeMCPConnections } from './mcp';\nimport { closeCurrentMCPConnectionScope, withMCPConnectionScope } from './mcp-scope';\nimport { closeA2AConnections } from './a2a';\n\n/**\n * Close protocol connections for the given protocol.\n * MCP closes persistent HTTP transports; A2A clears the agent-card client cache.\n */\nexport async function closeConnections(protocol: 'mcp' | 'a2a' = 'mcp'): Promise<void> {\n if (protocol === 'mcp') {\n await closeMCPConnections();\n } else {\n closeA2AConnections();\n }\n}\n\n/** Close only the current runner's MCP scope; fall back to legacy global cleanup. */\nexport async function closeScopedConnections(protocol: 'mcp' | 'a2a' = 'mcp'): Promise<void> {\n if (protocol === 'mcp') {\n if (!(await closeCurrentMCPConnectionScope())) await closeMCPConnections();\n } else {\n closeA2AConnections();\n }\n}\n\nexport { withMCPConnectionScope };\nexport type { MCPCallOptions, MCPConnectionResult } from './mcp';\nexport { callA2ATool } from './a2a';\nexport { DEFAULT_REQUEST_TIMEOUT_MS } from './abort';\nexport {\n callMCPToolWithTasks,\n getMCPTaskStatus,\n getMCPTaskResult,\n listMCPTasks,\n cancelMCPTask,\n mapMCPTaskStatus,\n serverSupportsTasks,\n} from './mcp-tasks';\n\nimport { callMCPToolWithTasks, callMCPToolWithClient } from './mcp-tasks';\nimport { callMCPToolWithOAuth } from './mcp';\nimport { callA2ATool } from './a2a';\nimport type { AgentConfig, DebugLogEntry } from '../types';\nimport type { PushNotificationConfig } from '../types/tools.generated';\nimport { getAuthToken } from '../auth';\nimport {\n discoverAuthorizationRequirements,\n NeedsAuthorizationError,\n getAgentStorage,\n ensureClientCredentialsTokens,\n} from '../auth/oauth';\nimport { getNonInteractiveOAuthProvider } from '../auth/oauth/provider-cache';\nimport { is401Error } from '../errors';\nimport { isLikelyPrivateUrl } from '../net';\nimport { validateAgentUrl } from '../validation';\nimport { withSpan } from '../observability/tracing';\nimport { ADCP_MAJOR_VERSION, ADCP_VERSION, parseAdcpMajorVersion } from '../version';\nimport { ConfigurationError } from '../errors';\nimport { resolveBundleKey, toReleasePrecisionWire, validateAdcpVersionWire } from '../validation/schema-loader';\nimport { buildAgentSigningContext, CAPABILITY_OP, ensureCapabilityLoaded } from '../signing/client';\nimport { withResponseSizeLimit } from './responseSizeLimit';\nimport {\n withTransportDiagnostics,\n type TransportActivityHandler as TransportActivityHandlerFn,\n} from './transportDiagnostics';\n\nexport {\n sanitizeTransportHeaders,\n sanitizeTransportUrl,\n withTransportDiagnostics,\n wrapFetchWithTransportDiagnostics,\n} from './transportDiagnostics';\nexport type { TransportActivity, TransportActivityContext, TransportActivityHandler } from './transportDiagnostics';\n\nexport type VersionEnvelopeMode = 'auto' | 'none' | 'major-only';\n\n/**\n * Derive the wire-level `adcp_major_version` integer from a caller-supplied\n * pin. Returns the SDK default when no pin is provided; throws on a pin\n * that doesn't parse so misuse surfaces at the factory boundary instead\n * of silently emitting the SDK's major.\n *\n * Throws `ConfigurationError` (not a plain `Error`) so a typo'd pin\n * surfaces with the same error class as the construction-time gate in\n * `resolveAdcpVersion` — one shape for all pin-misuse paths.\n */\nfunction resolveWireMajor(adcpVersion: string | undefined): number {\n if (adcpVersion === undefined) return ADCP_MAJOR_VERSION;\n const parsed = parseAdcpMajorVersion(adcpVersion);\n if (!Number.isFinite(parsed)) {\n throw new ConfigurationError(\n `adcpVersion ${JSON.stringify(adcpVersion)} is not a valid AdCP version. ` +\n `Expected a semver string (e.g. '3.0.1', '3.1.0-beta.1') or a legacy alias (e.g. 'v3').`,\n 'adcpVersion'\n );\n }\n return parsed;\n}\n\n/**\n * Returns true when the AdCP release that `bundleKey` identifies declares the\n * top-level `adcp_version` envelope field. The field landed in AdCP 3.1 per\n * spec PR `adcontextprotocol/adcp#3493` — 3.0 (any patch / prerelease) does\n * not carry it; 3.1+ does. Used to gate dual-emit on the wire so a 3.0-pinned\n * client doesn't emit a field its target schema doesn't define.\n */\nexport function bundleSupportsAdcpVersionField(bundleKey: string): boolean {\n const major = parseAdcpMajorVersion(bundleKey);\n if (!Number.isFinite(major)) return false;\n if (major < 3) return false;\n if (major > 3) return true;\n // Major 3 — only 3.1+ has the field. Bundle key shape is normalized by\n // `resolveBundleKey`: `'3.0'` / `'3.1'` for stable; `'3.0.0-beta.1'` /\n // `'3.1.0-beta.1'` for prereleases. Match the minor.\n const minorMatch = bundleKey.match(/^\\d+\\.(\\d+)/);\n if (!minorMatch) return false;\n return parseInt(minorMatch[1]!, 10) >= 1;\n}\n\n/**\n * Build the wire-level version envelope to merge into outgoing request args.\n *\n * Per AdCP 3.1 (spec PR `adcontextprotocol/adcp#3493`), 3.1+ requests carry\n * BOTH the integer `adcp_major_version` (deprecated through 3.x, removed in\n * 4.0) AND the release-precision string `adcp_version`. 3.0 schemas don't\n * define the string field, so a 3.0-pinned client emits the integer only —\n * matches the 3.0 spec exactly.\n *\n * Wire string is release-precision (MAJOR.MINOR with optional prerelease tag),\n * per `core/version-envelope.json`'s pattern `^\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?$`.\n * Full-semver bundle keys (`'3.1.0-beta.1'`) are collapsed via\n * `toReleasePrecisionWire` to `'3.1-beta.1'` before emit — meta-field shapes\n * are explicitly NOT valid wire values per the envelope schema's own\n * normalization rule.\n *\n * Returns `{}` for v2 callers (predates the major-version field entirely).\n */\nfunction buildVersionEnvelope(\n adcpVersion: string | undefined,\n serverVersion: 'v2' | 'v3' | undefined\n): Record<string, unknown> {\n if (serverVersion === 'v2') return {};\n const wireMajor = resolveWireMajor(adcpVersion);\n const bundleKey = resolveBundleKey(adcpVersion ?? ADCP_VERSION);\n if (!bundleSupportsAdcpVersionField(bundleKey)) {\n return { adcp_major_version: wireMajor };\n }\n const wireValue = toReleasePrecisionWire(bundleKey);\n // Defensive postcondition — should never throw in well-formed code, but\n // if a future refactor breaks the normalization the error message tells\n // the developer to call `toReleasePrecisionWire` instead of silently\n // emitting a non-spec wire string.\n validateAdcpVersionWire(wireValue);\n return { adcp_major_version: wireMajor, adcp_version: wireValue };\n}\n\nlet hasWarnedAboutV2PushNotificationSecret = false;\n\n/**\n * Warn once when an async webhook registration is suppressed for a v2 seller.\n *\n * v2.5's `push-notification-config.json` requires `authentication`, and unlike\n * 3.x it has no RFC 9421 selector semantics — so omitting the block produces a\n * schema-invalid request rather than choosing a signing mode. Without a\n * configured secret there is no honest value to send, and the previous\n * behaviour (a hardcoded placeholder credential) told the seller the channel\n * was authenticated by a constant published in this package.\n */\nfunction warnV2PushNotificationNeedsSecret(): void {\n if (hasWarnedAboutV2PushNotificationSecret) return;\n hasWarnedAboutV2PushNotificationSecret = true;\n console.warn(\n '[adcp] Suppressing push_notification_config for a v2 seller: AdCP 2.5 requires an ' +\n '`authentication` block and no `webhookSecret` is configured. Set `webhookSecret` to register ' +\n 'async task-status webhooks with this agent, or move the agent to an AdCP 3.x pin, where the ' +\n 'RFC 9421 webhook profile needs no shared secret.'\n );\n}\n\nfunction buildVersionEnvelopeForMode(\n mode: VersionEnvelopeMode,\n adcpVersion: string | undefined,\n serverVersion: 'v2' | 'v3' | undefined\n): Record<string, unknown> {\n if (mode === 'none' || serverVersion === 'v2') return {};\n if (mode === 'major-only') return { adcp_major_version: resolveWireMajor(adcpVersion) };\n return buildVersionEnvelope(adcpVersion, serverVersion);\n}\n\n/**\n * Merge the wire-level version envelope into a caller-supplied args object.\n * Caller args win: an explicit `adcp_major_version` / `adcp_version` in\n * `args` (e.g. a conformance harness probing `VERSION_UNSUPPORTED`) passes\n * through unchanged. The envelope only fills fields the caller didn't set.\n *\n * Single chokepoint for all four wire-injection sites so a future refactor\n * can't silently flip the spread order on one branch and leave the others\n * intact. Stale dual-field drift is caught at the server boundary by\n * `createAdcpServer`'s field-disagreement check (spec PR\n * `adcontextprotocol/adcp#3493`).\n *\n * @internal\n */\nexport function applyVersionEnvelope(\n args: Record<string, unknown>,\n envelope: Record<string, unknown>\n): Record<string, unknown> {\n return { ...envelope, ...args };\n}\n\n/**\n * Transport-level safeguards applied to a call.\n *\n * Wired into the SDK's internal fetch chain via AsyncLocalStorage, so the\n * cap takes effect even when the underlying transport's connection cache\n * reuses a fetch that was created on an earlier call with different limits.\n */\nexport interface TransportOptions {\n /**\n * Maximum response body size (in octets) the SDK will read before aborting\n * with `ResponseTooLargeError`. When unset, the SDK does not impose a cap —\n * matches the underlying MCP / A2A transport defaults.\n *\n * Set this when crawling **untrusted** agents (registries, federated\n * discovery layers, monitoring tools) to prevent a hostile vendor from\n * buffering a large reply before any application-layer schema validation\n * runs. Counted across response chunks; pre-cancels when `Content-Length`\n * exceeds the cap. Applies to A2A agent-card discovery\n * (`/.well-known/agent.json`) on the same call as well.\n *\n * Per-call override (`TaskOptions.transport.maxResponseBytes`) beats the\n * value set on the client constructor (`SingleAgentClientConfig.transport`).\n *\n * @remarks\n * **Safe to set on all calls.** SSE responses (`text/event-stream`) are\n * passed through unchanged — a single tool call legitimately emits N status\n * frames + a final result, bounded by protocol-level framing rather than\n * cumulative byte counts. The cap applies to one-shot JSON responses\n * (`get_adcp_capabilities`, agent-card lookup, tool result payloads on\n * non-streaming transports) where the body is bounded by definition.\n *\n * @remarks\n * **Hostile-peer note:** A peer can opt itself out of this cap by responding\n * with `Content-Type: text/event-stream`. SSE is bypassed because cumulative\n * event-frame bytes are unbounded by spec — MCP and A2A both stream tool\n * responses this way. The MCP/A2A SDKs consume SSE incrementally and frame\n * termination bounds memory in practice, so this is not a memory-bomb risk\n * for well-formed transports. Adopters relying on `maxResponseBytes` as a\n * hostile-server defense should treat it as best-effort for non-SSE\n * responses only.\n *\n * @remarks\n * Future hardening knobs (DNS-rebind defense, scheme allow-list, request\n * timeout overrides) will land here as additional fields. When `trustedFetchFn`\n * is supplied, the SDK composes it inside its signing, capture, size-limit,\n * timeout, and diagnostics wrappers so callers do not have to reproduce\n * that non-obvious ordering themselves.\n */\n maxResponseBytes?: number;\n /**\n * Scoped fetch implementation for all outbound HTTP performed on behalf of\n * this client or call, including endpoint/card discovery, tool listing,\n * OAuth discovery and token refresh, and MCP/A2A tool requests.\n *\n * The function is runtime-only configuration and is never serialized into\n * agent records, storyboard artifacts, or compliance output. When unset,\n * the SDK uses the global `fetch` implementation.\n *\n * Supplying this function makes it the trusted network boundary: the SDK\n * still validates URL schemes, redirect behavior, timeouts, and body limits,\n * but delegates DNS resolution and address policy to the implementation.\n * It must prevent DNS rebinding and unsafe private-address access itself (for\n * example with an egress proxy or its own DNS pinning).\n */\n trustedFetchFn?: typeof fetch;\n /**\n * @deprecated Rename to `trustedFetchFn`. Supplying this legacy alias is\n * treated as an explicit assertion that the implementation pins DNS.\n */\n fetchFn?: typeof fetch;\n /**\n * Permit this client to connect to private DNS answers. Localhost and an\n * initial private IP literal are allowed automatically only on their exact\n * origin; use this for private-DNS enterprise agents.\n */\n allowPrivateIp?: boolean;\n /**\n * Timeout in milliseconds for bounded one-shot transport requests such as\n * A2A agent-card discovery and MCP read-path probes. Defaults to 60 seconds\n * for A2A discovery so an unresponsive card endpoint cannot hang forever.\n * Set to `0` to disable the SDK-imposed discovery timeout.\n */\n requestTimeoutMs?: number;\n /** A2A-only compatibility policy. Compliance uses `{ enabled: false }` for native 1.0 grading. */\n legacyCompat?: import('./a2a').A2ALegacyCompatOptions;\n}\n\nlet warnedLegacyTransportFetch = false;\n\n/** @internal Normalize the pre-GA fetch hook rename without silently dropping JS callers. */\nexport function normalizeTransportOptions(transport?: TransportOptions): TransportOptions | undefined {\n if (!transport?.fetchFn) return transport;\n if (transport.trustedFetchFn && transport.trustedFetchFn !== transport.fetchFn) {\n throw new TypeError('TransportOptions cannot set different fetchFn and trustedFetchFn implementations');\n }\n if (!warnedLegacyTransportFetch) {\n warnedLegacyTransportFetch = true;\n console.warn(\n '[adcp] TransportOptions.fetchFn is deprecated; rename it to trustedFetchFn. ' +\n 'Custom fetch implementations must provide connect-time DNS pinning.'\n );\n }\n return { ...transport, trustedFetchFn: transport.trustedFetchFn ?? transport.fetchFn };\n}\n\n/**\n * Options for {@link ProtocolClient.callTool}. All fields are optional.\n *\n * `webhookUrl` / `webhookSecret` / `webhookToken` are for ASYNC TASK STATUS\n * notifications (push_notification_config). For reporting webhooks\n * (reporting_webhook), include them directly in `args` — they stay in skill\n * parameters and are sent verbatim to the agent.\n */\nexport interface CallToolOptions {\n /** Debug log array. Mutated in place by the protocol layer. */\n debugLogs?: DebugLogEntry[];\n /** URL for async task status notifications. */\n webhookUrl?: string;\n /** HMAC-SHA256 secret for push_notification_config authentication. */\n webhookSecret?: string;\n /** Bearer token for push_notification_config validation. */\n webhookToken?: string;\n /** Pinned protocol generation when the agent advertises both v2 and v3. */\n serverVersion?: 'v2' | 'v3';\n /** A2A session continuity (contextId carries conversation, taskId resumes a task). */\n session?: { contextId?: string; taskId?: string };\n /**\n * AdCP version pin from the calling client/server instance. Sets the\n * wire-level `adcp_major_version` field per-call instead of from the\n * SDK-pinned `ADCP_MAJOR_VERSION` constant. Default falls back to the\n * constant so call sites that don't plumb a per-instance version keep\n * their existing behavior. An explicit `adcp_major_version` /\n * `adcp_version` in `args` overrides this — conformance harnesses use\n * that path to probe seller version negotiation.\n */\n adcpVersion?: string;\n /**\n * Optional wire-only version override. Schema selection and client\n * construction can remain pinned to `adcpVersion`; the request envelope is\n * emitted for this release-precision line.\n */\n wireAdcpVersion?: string;\n /**\n * Controls whether the SDK injects AdCP version envelope fields into the\n * outgoing request. Defaults to `auto`. 3.0 pins emit only the legacy\n * `adcp_major_version`; 3.1+ pins emit both the legacy major and exact\n * `adcp_version` marker. `major-only` forces the legacy integer marker\n * without the 3.1 string marker for strict pre-3.1 peers discovered at\n * runtime.\n */\n versionEnvelope?: VersionEnvelopeMode;\n /**\n * Transport-level safeguards (size caps, etc.). Per-call override of any\n * matching field on the client constructor's `transport` option.\n */\n transport?: TransportOptions;\n /** Caller-owned cancellation signal for the in-flight protocol call. */\n signal?: AbortSignal;\n /** Transport-level diagnostics callback for outbound HTTP requests. */\n onTransportActivity?: TransportActivityHandlerFn;\n /**\n * Correlation metadata attached to transport diagnostics events emitted\n * while this protocol call is active.\n */\n transportActivityContext?: {\n operationId?: string;\n taskId?: string;\n contextId?: string;\n idempotencyKey?: string;\n };\n}\n\n/**\n * Universal protocol client - automatically routes to the correct protocol implementation\n */\nexport class ProtocolClient {\n /**\n * Call a tool on an agent using the appropriate protocol.\n *\n * @param agent - Agent configuration\n * @param toolName - Name of the tool/skill to call\n * @param args - Tool arguments (includes reporting_webhook if needed - NOT removed)\n * @param options - Optional call-level configuration. See {@link CallToolOptions}.\n */\n static async callTool(\n agent: AgentConfig,\n toolName: string,\n args: Record<string, unknown>,\n options: CallToolOptions = {}\n ): Promise<unknown> {\n const {\n debugLogs = [],\n webhookUrl,\n webhookSecret,\n webhookToken,\n serverVersion,\n session,\n adcpVersion,\n wireAdcpVersion,\n versionEnvelope: versionEnvelopeMode = 'auto',\n transport: requestedTransport,\n signal,\n onTransportActivity,\n transportActivityContext,\n } = options;\n const transport = normalizeTransportOptions(requestedTransport);\n // Per-instance version envelope. Throws on unparseable pins via\n // `resolveWireMajor`; construction-time `resolveAdcpVersion` is the\n // primary gate but this is the failsafe for callers reaching\n // `ProtocolClient.callTool` directly (test harnesses, the in-process\n // MCP path). Returns `{ adcp_major_version }` for 3.0 pins and\n // `{ adcp_major_version, adcp_version }` for 3.1+ pins.\n const versionEnvelope = buildVersionEnvelopeForMode(\n versionEnvelopeMode,\n wireAdcpVersion ?? adcpVersion,\n serverVersion\n );\n // Enter the response-size-limit ALS slot once for this call. The slot is\n // read by `wrapFetchWithSizeLimit` in both protocol transports, so the\n // cap applies regardless of which path (MCP / A2A / OAuth refresh) the\n // call ends up taking. No-op when the cap is unset or non-positive.\n return withResponseSizeLimit(transport?.maxResponseBytes, () =>\n withTransportDiagnostics(\n {\n agentId: agent.id,\n protocol: agent.protocol,\n tool: toolName,\n taskType: toolName,\n ...transportActivityContext,\n onTransportActivity,\n },\n () =>\n withSpan(\n `adcp.${agent.protocol}.call_tool`,\n {\n 'adcp.agent_id': agent.id,\n 'adcp.protocol': agent.protocol,\n 'adcp.tool': toolName,\n 'http.url': agent.agent_uri,\n },\n async () => {\n // In-process MCP path: pre-connected client, no HTTP transport.\n // Idempotency injection, schema validation, and governance middleware all\n // still apply (they run in SingleAgentClient above this call). We skip\n // URL validation, OAuth refresh, and signing — none apply in-process.\n if (agent.protocol === 'mcp' && agent._inProcessMcpClient) {\n const inProcArgs = applyVersionEnvelope(args, versionEnvelope);\n return callMCPToolWithClient(agent._inProcessMcpClient, toolName, inProcArgs, debugLogs, {\n ...(signal && { signal }),\n ...(transport?.requestTimeoutMs !== undefined && { requestTimeoutMs: transport.requestTimeoutMs }),\n });\n }\n\n validateAgentUrl(agent.agent_uri);\n\n // OAuth 2.0 client credentials (RFC 6749 §4.4): re-exchange the\n // secret for a fresh access token whenever the cached one is within\n // its expiration skew. Runs before every call so mid-session expiry\n // can't leave the caller with a stale bearer. No-op if the agent\n // doesn't declare client credentials. Cheap on warm cache (single\n // `Date.now()` compare); a single POST to the token endpoint on miss.\n //\n // `allowPrivateIp` inherits the trust the caller already placed in\n // `agent.agent_uri` — if they're making a call to a private-IP agent,\n // they've authorized this process to talk to private-IP hosts, so\n // the token endpoint on the same network is reachable too. Public\n // agent URLs with private-IP token endpoints still require an\n // explicit opt-in via the library API.\n if (agent.oauth_client_credentials) {\n const ccStorage = getAgentStorage(agent);\n const allowPrivateIp = transport?.allowPrivateIp ?? isLikelyPrivateUrl(agent.agent_uri);\n await ensureClientCredentialsTokens(agent, {\n storage: ccStorage,\n allowPrivateIp,\n fetch: transport?.trustedFetchFn,\n signal,\n });\n }\n\n const authToken = getAuthToken(agent);\n\n // RFC 9421 signing context. Built once per call and passed through\n // to each protocol-layer entry (`callMCPToolWithTasks`, `callA2ATool`,\n // `callMCPToolWithOAuth`) — those entries seed `signingContextStorage`\n // (AsyncLocalStorage) so the internal transport helpers read it\n // without an explicit parameter. Keep the explicit arg here: it's the\n // ALS seed, not incidental plumbing. `get_adcp_capabilities` is\n // exempt from signing (it's the discovery call itself) and also\n // triggers cache priming for any other op on agents with\n // `request_signing` configured.\n const signingContext = buildAgentSigningContext(agent);\n if (signingContext && toolName !== CAPABILITY_OP) {\n await ensureCapabilityLoaded(agent, signingContext, primeArgs =>\n ProtocolClient.callTool(agent, CAPABILITY_OP, primeArgs, {\n debugLogs,\n serverVersion,\n adcpVersion,\n ...(versionEnvelopeMode !== 'auto' && { versionEnvelope: versionEnvelopeMode }),\n transport,\n signal,\n ...(transport?.requestTimeoutMs !== undefined && { requestTimeoutMs: transport.requestTimeoutMs }),\n onTransportActivity,\n transportActivityContext,\n })\n );\n }\n\n // Inject the version envelope on every request so sellers can validate\n // compatibility. Skip for v2 servers — they don't recognise the\n // version fields and strict-schema agents reject them. The envelope\n // shape is per-pin: 3.0 pins get the integer `adcp_major_version`\n // alone; 3.1+ pins get both that and the release-precision string\n // `adcp_version` (`'3.1'` / `'3.1.0-beta.1'`) per spec PR\n // `adcontextprotocol/adcp#3493`.\n const argsWithVersion = applyVersionEnvelope(args, versionEnvelope);\n\n // Build push_notification_config for ASYNC TASK STATUS notifications\n // (NOT for reporting_webhook - that stays in args)\n // Schema: https://adcontextprotocol.org/schemas/v1/core/push-notification-config.json\n // `authentication` is a scheme SELECTOR, not a fallback: from AdCP\n // 3.0 on, push-notification-config.json makes its presence opt the\n // seller into legacy HMAC-SHA256 and its absence select the RFC\n // 9421 webhook profile, with `required: [\"url\"]` only. Emitting it\n // with a placeholder credential would therefore downgrade every\n // webhook to legacy HMAC keyed by a constant that ships in this\n // file, so the block is omitted unless a real secret backs it.\n //\n // v2.5 predates the selector: there `required` is\n // `[\"url\", \"authentication\"]` and there is no 9421 path, so an\n // omitted block is schema-invalid rather than a mode selection.\n // With no secret there is nothing honest to send a v2 seller, so\n // suppress the registration instead of fabricating a credential.\n const generatedPushNotificationConfig: PushNotificationConfig | undefined = (():\n | PushNotificationConfig\n | undefined => {\n if (!webhookUrl) return undefined;\n if (webhookSecret) {\n return {\n url: webhookUrl,\n ...(transportActivityContext?.operationId && {\n operation_id: transportActivityContext.operationId,\n }),\n ...(webhookToken && { token: webhookToken }),\n authentication: {\n schemes: ['HMAC-SHA256' as const],\n credentials: webhookSecret,\n },\n };\n }\n if (serverVersion === 'v2') {\n warnV2PushNotificationNeedsSecret();\n return undefined;\n }\n return {\n url: webhookUrl,\n ...(transportActivityContext?.operationId && {\n operation_id: transportActivityContext.operationId,\n }),\n ...(webhookToken && { token: webhookToken }),\n };\n })();\n const explicitNativePushNotificationConfig =\n transport?.legacyCompat?.enabled === false &&\n argsWithVersion.push_notification_config !== null &&\n typeof argsWithVersion.push_notification_config === 'object' &&\n !Array.isArray(argsWithVersion.push_notification_config)\n ? (argsWithVersion.push_notification_config as PushNotificationConfig)\n : undefined;\n const pushNotificationConfig = generatedPushNotificationConfig ?? explicitNativePushNotificationConfig;\n\n if (agent.protocol === 'mcp') {\n // For MCP, include push_notification_config in tool arguments (MCP spec)\n const argsWithWebhook = pushNotificationConfig\n ? { ...argsWithVersion, push_notification_config: pushNotificationConfig }\n : argsWithVersion;\n\n // If the agent config carries authorization-code OAuth tokens,\n // route through the OAuth provider path so the MCP SDK can refresh\n // on 401 instead of hard-failing. Excludes client-credentials\n // agents: they have a cached access token but no refresh_token,\n // and their refresh path is a secret re-exchange (handled above),\n // not the SDK's refresh_token grant.\n if (agent.oauth_tokens && !agent.oauth_client_credentials) {\n const authProvider = getNonInteractiveOAuthProvider(agent, {\n agentHint: agent.id,\n storage: getAgentStorage(agent),\n allowHttp: isLikelyPrivateUrl(agent.agent_uri),\n });\n try {\n return await callMCPToolWithOAuth({\n agentUrl: agent.agent_uri,\n toolName,\n args: argsWithWebhook,\n authProvider,\n debugLogs,\n customHeaders: agent.headers,\n signingContext,\n signal,\n requestTimeoutMs: transport?.requestTimeoutMs,\n fetchFn: transport?.trustedFetchFn,\n allowPrivateIp: transport?.allowPrivateIp,\n });\n } catch (err) {\n // Refresh failed or server rejected the refreshed token — walk the\n // discovery chain so the caller can distinguish \"re-auth needed\"\n // from other failure modes.\n await rethrowAsNeedsAuthorization(\n err,\n agent.agent_uri,\n transport?.trustedFetchFn,\n signal,\n transport?.allowPrivateIp\n );\n throw err;\n }\n }\n\n // Use callMCPToolWithTasks which auto-detects server tasks capability\n // and falls back to standard callTool when tasks are not supported\n try {\n return await callMCPToolWithTasks(\n agent.agent_uri,\n toolName,\n argsWithWebhook,\n authToken,\n debugLogs,\n agent.headers,\n {\n ...(signingContext && { signingContext }),\n ...(signal && { signal }),\n ...(transport?.requestTimeoutMs !== undefined && {\n requestTimeoutMs: transport.requestTimeoutMs,\n }),\n ...(transport?.trustedFetchFn && { fetchFn: transport.trustedFetchFn }),\n ...(transport?.allowPrivateIp !== undefined && { allowPrivateIp: transport.allowPrivateIp }),\n }\n );\n } catch (err) {\n // Client-credentials agents: on 401, the AS may have rotated\n // something out-of-band. Force a fresh exchange and retry once\n // before surfacing the error. Bounded (single retry) so we don't\n // loop if the credentials are genuinely wrong.\n if (agent.oauth_client_credentials && is401Error(err)) {\n const ccStorage = getAgentStorage(agent);\n const allowPrivateIp = transport?.allowPrivateIp ?? isLikelyPrivateUrl(agent.agent_uri);\n await ensureClientCredentialsTokens(agent, {\n storage: ccStorage,\n force: true,\n allowPrivateIp,\n fetch: transport?.trustedFetchFn,\n signal,\n });\n const retryAuthToken = agent.oauth_tokens?.access_token ?? authToken;\n try {\n return await callMCPToolWithTasks(\n agent.agent_uri,\n toolName,\n argsWithWebhook,\n retryAuthToken,\n debugLogs,\n agent.headers,\n {\n ...(signingContext && { signingContext }),\n ...(signal && { signal }),\n ...(transport?.requestTimeoutMs !== undefined && {\n requestTimeoutMs: transport.requestTimeoutMs,\n }),\n ...(transport?.trustedFetchFn && { fetchFn: transport.trustedFetchFn }),\n ...(transport?.allowPrivateIp !== undefined && {\n allowPrivateIp: transport.allowPrivateIp,\n }),\n }\n );\n } catch (retryErr) {\n await rethrowAsNeedsAuthorization(\n retryErr,\n agent.agent_uri,\n transport?.trustedFetchFn,\n signal,\n transport?.allowPrivateIp\n );\n throw retryErr;\n }\n }\n await rethrowAsNeedsAuthorization(\n err,\n agent.agent_uri,\n transport?.trustedFetchFn,\n signal,\n transport?.allowPrivateIp\n );\n throw err;\n }\n } else if (agent.protocol === 'a2a') {\n // Native A2A has two distinct registration surfaces. The\n // official protocol configuration gets the representable\n // transport fields, while the complete AdCP application\n // object (including operation_id) remains in skill input.\n // Preserve the stable 0.3 wire shape outside native mode.\n const a2aParameters =\n transport?.legacyCompat?.enabled === false && pushNotificationConfig\n ? { ...argsWithVersion, push_notification_config: pushNotificationConfig }\n : argsWithVersion;\n try {\n return await callA2ATool(\n agent.agent_uri,\n toolName,\n a2aParameters,\n authToken,\n debugLogs,\n pushNotificationConfig,\n agent.headers,\n signingContext,\n session,\n signal,\n transport?.requestTimeoutMs,\n transport?.trustedFetchFn,\n transport?.allowPrivateIp,\n transport?.legacyCompat\n );\n } catch (err) {\n // Same single-retry-on-401 for client-credentials agents as the\n // MCP path above. Kept symmetric so A2A CC agents aren't a\n // second-class experience — including the NeedsAuthorizationError\n // rewrap on a retry that still 401s.\n if (agent.oauth_client_credentials && is401Error(err)) {\n const ccStorage = getAgentStorage(agent);\n const allowPrivateIp = transport?.allowPrivateIp ?? isLikelyPrivateUrl(agent.agent_uri);\n await ensureClientCredentialsTokens(agent, {\n storage: ccStorage,\n force: true,\n allowPrivateIp,\n fetch: transport?.trustedFetchFn,\n signal,\n });\n const retryAuthToken = agent.oauth_tokens?.access_token ?? authToken;\n try {\n return await callA2ATool(\n agent.agent_uri,\n toolName,\n a2aParameters,\n retryAuthToken,\n debugLogs,\n pushNotificationConfig,\n agent.headers,\n signingContext,\n session,\n signal,\n transport?.requestTimeoutMs,\n transport?.trustedFetchFn,\n transport?.allowPrivateIp,\n transport?.legacyCompat\n );\n } catch (retryErr) {\n await rethrowAsNeedsAuthorization(\n retryErr,\n agent.agent_uri,\n transport?.trustedFetchFn,\n signal,\n transport?.allowPrivateIp\n );\n throw retryErr;\n }\n }\n await rethrowAsNeedsAuthorization(\n err,\n agent.agent_uri,\n transport?.trustedFetchFn,\n signal,\n transport?.allowPrivateIp\n );\n throw err;\n }\n } else {\n throw new Error(`Unsupported protocol: ${agent.protocol}`);\n }\n }\n )\n )\n );\n }\n}\n\n/**\n * If `err` looks like a 401 from the MCP transport, probe the agent for a\n * Bearer challenge and throw a {@link NeedsAuthorizationError} carrying\n * walked discovery metadata. If the error isn't a 401 or we can't build a\n * requirements record, return silently so the caller re-throws the original.\n *\n * Keeping this off the hot path: we only probe on error, and the probe is\n * a single unauthenticated `tools/list` POST — no retries, no DNS rebind.\n */\nasync function rethrowAsNeedsAuthorization(\n err: unknown,\n agentUrl: string,\n fetchFn?: typeof fetch,\n signal?: AbortSignal,\n configuredAllowPrivateIp?: boolean\n): Promise<void> {\n if (err instanceof NeedsAuthorizationError) throw err;\n if (!is401Error(err)) return;\n\n // If the caller has already connected to the agent URL, they've implicitly\n // trusted it — inherit that trust for the discovery probe so loopback /\n // private-IP development agents work the same way as public ones.\n const allowPrivateIp = configuredAllowPrivateIp ?? isLikelyPrivateUrl(agentUrl);\n\n // discoverAuthorizationRequirements internally catches network failures and\n // returns null rather than throwing — anything that escapes is a genuine\n // bug we want to surface rather than mask the 401 with.\n const requirements = await discoverAuthorizationRequirements(agentUrl, { allowPrivateIp, fetchFn, signal });\n if (requirements) {\n throw new NeedsAuthorizationError(requirements);\n }\n // No requirements walked; let the caller re-throw the original error.\n}\n\n/**\n * Simple factory functions for protocol-specific clients.\n *\n * Both factories accept a `transport` argument that flows through to the\n * size-cap surface so callers reaching the factory exports honor the same\n * `maxResponseBytes` contract as `ProtocolClient.callTool`. Without it,\n * the factories would silently bypass the cap, which the public API\n * (`TransportOptions`) implies they honor.\n */\nexport const createMCPClient = (\n agentUrl: string,\n authToken?: string,\n headers?: Record<string, string>,\n serverVersion?: 'v2' | 'v3',\n adcpVersion?: string,\n transport?: TransportOptions,\n versionEnvelopeMode: VersionEnvelopeMode = 'auto'\n) => {\n transport = normalizeTransportOptions(transport);\n // Validate the pin at factory time so a typo surfaces here rather than at\n // first call. `buildVersionEnvelope` throws via `resolveWireMajor` on bad\n // input — call it once to surface, then close over the envelope.\n const versionEnvelope = buildVersionEnvelopeForMode(versionEnvelopeMode, adcpVersion, serverVersion);\n return {\n callTool: (toolName: string, args: Record<string, unknown>, debugLogs?: DebugLogEntry[]) =>\n withResponseSizeLimit(transport?.maxResponseBytes, () =>\n callMCPToolWithTasks(\n agentUrl,\n toolName,\n applyVersionEnvelope(args, versionEnvelope),\n authToken,\n debugLogs,\n headers,\n {\n ...(transport?.requestTimeoutMs !== undefined && { requestTimeoutMs: transport.requestTimeoutMs }),\n ...(transport?.trustedFetchFn && { fetchFn: transport.trustedFetchFn }),\n ...(transport?.allowPrivateIp !== undefined && { allowPrivateIp: transport.allowPrivateIp }),\n }\n )\n ),\n };\n};\n\nexport const createA2AClient = (\n agentUrl: string,\n authToken?: string,\n headers?: Record<string, string>,\n serverVersion?: 'v2' | 'v3',\n adcpVersion?: string,\n transport?: TransportOptions,\n versionEnvelopeMode: VersionEnvelopeMode = 'auto'\n) => {\n transport = normalizeTransportOptions(transport);\n const versionEnvelope = buildVersionEnvelopeForMode(versionEnvelopeMode, adcpVersion, serverVersion);\n return {\n callTool: (toolName: string, parameters: Record<string, unknown>, debugLogs?: DebugLogEntry[]) =>\n withResponseSizeLimit(transport?.maxResponseBytes, () =>\n callA2ATool(\n agentUrl,\n toolName,\n applyVersionEnvelope(parameters, versionEnvelope),\n authToken,\n debugLogs,\n undefined,\n headers,\n undefined,\n undefined,\n undefined,\n transport?.requestTimeoutMs,\n transport?.trustedFetchFn,\n transport?.allowPrivateIp,\n transport?.legacyCompat\n )\n ),\n };\n};\n\nexport type { A2ALegacyCompatOptions } from './a2a';\n"],"mappings":"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","names":["require","closeMCPConnections","callMCPToolWithTasks","callMCPToolWithOAuth","callA2ATool","withTransportDiagnostics"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-modern.d.ts","sourceRoot":"","sources":["../../../src/lib/protocols/mcp-modern.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAQL,KAAK,IAAI,EACV,MAAM,8BAA8B,CAAC;AAYtC,OAAO,EAAiD,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC5G,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAYnD,KAAK,gBAAgB,GAAG;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAAE,OAAO,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAClG,MAAM,MAAM,oBAAoB,GAAG;IAAE,OAAO,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAAC;AAEzF,MAAM,WAAW,0BAA0B;IACzC,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,8EAA8E;IAC9E,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"mcp-modern.d.ts","sourceRoot":"","sources":["../../../src/lib/protocols/mcp-modern.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAQL,KAAK,IAAI,EACV,MAAM,8BAA8B,CAAC;AAYtC,OAAO,EAAiD,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC5G,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAYnD,KAAK,gBAAgB,GAAG;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAAE,OAAO,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAClG,MAAM,MAAM,oBAAoB,GAAG;IAAE,OAAO,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAAC;AAEzF,MAAM,WAAW,0BAA0B;IACzC,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,8EAA8E;IAC9E,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAqhBD;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,GAAE,aAAa,EAAO,EAC/B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACtC,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,gBAAgB,CAAC,CAsB3B;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACtC,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAA;CAAE,CAAC,CAwC5D;AAED,kGAAkG;AAClG,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACtC,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,oBAAoB,CAAC,CA2D/B;AAED,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoB/D"}
|
|
@@ -223,7 +223,9 @@ async function createNegotiatedClient(cacheKey, options, authHeaders, useCachedD
|
|
|
223
223
|
const clientRequestTimeoutMs = (0, import_abort.resolveClientRequestTimeoutMs)(options.requestTimeoutMs);
|
|
224
224
|
const rawNetworkFetch = (0, import_agent_transport_fetch.createAgentTransportFetch)(options.agentUrl, {
|
|
225
225
|
trustedFetchFn: options.fetchFn,
|
|
226
|
-
allowPrivateIp: options.allowPrivateIp
|
|
226
|
+
allowPrivateIp: options.allowPrivateIp,
|
|
227
|
+
originBoundHeaders: Object.keys(options.customHeaders ?? {}),
|
|
228
|
+
crossOriginCredentialPolicy: "strip"
|
|
227
229
|
});
|
|
228
230
|
const networkFetch = (input, init) => (0, import_abort.withAbortSignal)([init?.signal], requestTimeoutMs, (signal) => rawNetworkFetch(input, { ...init, signal }));
|
|
229
231
|
const diagnosticFetch = (0, import_transportDiagnostics.wrapFetchWithTransportDiagnostics)((0, import_responseSizeLimit.wrapFetchWithSizeLimit)(networkFetch));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/protocols/mcp-modern.ts"],"sourcesContent":["/**\n * MCP 2026-07-28 client path.\n *\n * The v2 SDK removed the experimental 2025 Tasks interception API. During the\n * migration window we therefore negotiate with the v2 client first and use it\n * only when the peer selects the modern protocol era. Legacy peers fall back\n * to mcp-tasks.ts, which keeps the existing v1 Tasks behavior intact.\n */\n\nimport {\n Client,\n SdkError,\n SdkErrorCode,\n StreamableHTTPClientTransport,\n type DiscoverResult,\n type OAuthClientProvider as ModernOAuthClientProvider,\n type PriorDiscovery,\n type Tool,\n} from '@modelcontextprotocol/client';\nimport { createHmac } from 'node:crypto';\nimport { createMCPRequestHeaders } from '../auth';\nimport { is401Error } from '../errors';\nimport { withSpan, injectTraceHeaders } from '../observability/tracing';\nimport {\n currentMCPConnectionScopeKey,\n isMCPConnectionScopeCacheKeyActive,\n registerMCPConnectionScopeCleanup,\n registerMCPConnectionScopePending,\n} from './mcp-scope';\nimport { terminateSessionBestEffort } from './session-termination';\nimport { buildAgentSigningFetch, signingContextStorage, type AgentSigningContext } from '../signing/client';\nimport type { DebugLogEntry } from '../types/adcp';\nimport {\n isAbortOrTimeoutError,\n resolveClientRequestTimeoutMs,\n resolveRequestTimeoutMs,\n withAbortSignal,\n} from './abort';\nimport { wrapFetchWithCapture } from './rawResponseCapture';\nimport { wrapFetchWithSizeLimit } from './responseSizeLimit';\nimport { wrapFetchWithTransportDiagnostics } from './transportDiagnostics';\nimport { createAgentTransportFetch } from '../net/agent-transport-fetch';\n\ntype CallToolResponse = {\n isError?: boolean;\n content?: Array<{ type: string; text?: string }>;\n [key: string]: unknown;\n};\n\nexport type ModernMCPAttempt = { handled: false } | { handled: true; response: CallToolResponse };\nexport type ModernMCPListAttempt = { handled: false } | { handled: true; tools: Tool[] };\n\nexport interface ModernMCPConnectionOptions {\n signingContext?: AgentSigningContext;\n authProvider?: object;\n signal?: AbortSignal;\n requestTimeoutMs?: number;\n fetchFn?: typeof fetch;\n allowPrivateIp?: boolean;\n /** Use the v2 SDK's negotiated legacy client instead of handing off to v1. */\n handleLegacy?: boolean;\n}\n\ninterface ModernConnectionOptions {\n agentUrl: string;\n authToken?: string;\n customHeaders?: Record<string, string>;\n debugLogs: DebugLogEntry[];\n signingContext?: AgentSigningContext;\n authProvider?: object;\n signal?: AbortSignal;\n requestTimeoutMs?: number;\n fetchFn?: typeof fetch;\n allowPrivateIp?: boolean;\n handleLegacy?: boolean;\n}\n\nconst modernConnections = new Map<string, Client>();\nconst legacyConnectionExpiresAt = new Map<string, number>();\nconst pendingModernConnections = new Map<string, Promise<Client>>();\nconst modernTransports = new WeakMap<Client, StreamableHTTPClientTransport>();\nconst knownLegacyConnections = new Map<string, number>();\nconst modernDiscoveries = new Map<string, { discover: DiscoverResult; expiresAt: number }>();\nconst clientsUsingCachedDiscovery = new WeakSet<Client>();\nconst MAX_CACHED_CONNECTIONS = 20;\nconst LEGACY_CLASSIFICATION_TTL_MS = 5 * 60 * 1000;\nconst MODERN_DISCOVERY_TTL_MS = 5 * 60 * 1000;\nconst modernOAuthProviderIds = new WeakMap<object, string>();\nconst modernFetchFnIds = new WeakMap<typeof fetch, string>();\nconst modernSignalIds = new WeakMap<AbortSignal, string>();\nlet nextModernOAuthProviderId = 0;\nlet nextModernFetchFnId = 0;\nlet nextModernSignalId = 0;\nlet connectionGeneration = 0;\n\nasync function closeModernClient(client: Client, terminateSession = true): Promise<void> {\n const transport = modernTransports.get(client);\n modernTransports.delete(client);\n if (terminateSession && transport?.sessionId) {\n await terminateSessionBestEffort(transport);\n }\n await client.close();\n}\n\nfunction cacheDisambiguator(value: string): string {\n return createHmac('sha256', '').update(value).digest('hex');\n}\n\nfunction buildAuthHeaders(\n authToken: string | undefined,\n customHeaders: Record<string, string> | undefined,\n authProvider?: object\n): Record<string, string> {\n const filteredHeaders =\n authProvider || authToken\n ? Object.fromEntries(\n Object.entries(customHeaders ?? {}).filter(keyValue => {\n const key = keyValue[0].toLowerCase();\n return key !== 'authorization' && key !== 'x-adcp-auth';\n })\n )\n : customHeaders;\n return createMCPRequestHeaders(filteredHeaders, authProvider ? undefined : authToken);\n}\n\nfunction oauthProviderCacheKey(provider: object | undefined): string | undefined {\n if (!provider) return undefined;\n let key = modernOAuthProviderIds.get(provider);\n if (!key) {\n key = `oauth-provider:${++nextModernOAuthProviderId}`;\n modernOAuthProviderIds.set(provider, key);\n }\n return key;\n}\n\nfunction fetchFnCacheKey(fetchFn: typeof fetch | undefined): string | undefined {\n if (!fetchFn) return undefined;\n let key = modernFetchFnIds.get(fetchFn);\n if (!key) {\n key = `fetch:${++nextModernFetchFnId}`;\n modernFetchFnIds.set(fetchFn, key);\n }\n return key;\n}\n\nfunction signalCacheKey(signal: AbortSignal | undefined): string | undefined {\n if (!signal) return undefined;\n let key = modernSignalIds.get(signal);\n if (!key) {\n key = `signal:${++nextModernSignalId}`;\n modernSignalIds.set(signal, key);\n }\n return key;\n}\n\nfunction connectionCacheKey(\n agentUrl: string,\n headers: Record<string, string>,\n signingCacheKey?: string,\n authProvider?: object,\n fetchFn?: typeof fetch,\n signal?: AbortSignal,\n requestTimeoutMs?: number,\n handleLegacy?: boolean,\n allowPrivateIp?: boolean\n): string {\n const normalizedHeaders = Object.entries(headers)\n .map(([key, value]) => [key.toLowerCase(), value] as const)\n .sort(([left], [right]) => left.localeCompare(right));\n const parts = [agentUrl, `headers:${cacheDisambiguator(JSON.stringify(normalizedHeaders))}`];\n if (signingCacheKey) parts.push(signingCacheKey);\n const providerKey = oauthProviderCacheKey(authProvider);\n if (providerKey) parts.push(providerKey);\n const fetchKey = fetchFnCacheKey(fetchFn);\n if (fetchKey) parts.push(fetchKey);\n const signalKey = signalCacheKey(signal);\n if (signalKey) parts.push(signalKey);\n if (requestTimeoutMs !== undefined) parts.push(`timeout:${requestTimeoutMs}`);\n if (handleLegacy !== undefined) parts.push(`handle-legacy:${handleLegacy}`);\n if (allowPrivateIp !== undefined) parts.push(`allow-private-ip:${allowPrivateIp}`);\n const scopeKey = currentMCPConnectionScopeKey();\n if (scopeKey) parts.push(scopeKey);\n return parts.join('::');\n}\n\nfunction isKnownLegacy(cacheKey: string): boolean {\n const classifiedAt = knownLegacyConnections.get(cacheKey);\n if (classifiedAt === undefined) return false;\n if (Date.now() - classifiedAt > LEGACY_CLASSIFICATION_TTL_MS) {\n knownLegacyConnections.delete(cacheKey);\n return false;\n }\n knownLegacyConnections.delete(cacheKey);\n knownLegacyConnections.set(cacheKey, classifiedAt);\n return true;\n}\n\nfunction markKnownLegacy(cacheKey: string): void {\n modernDiscoveries.delete(cacheKey);\n knownLegacyConnections.delete(cacheKey);\n knownLegacyConnections.set(cacheKey, Date.now());\n while (knownLegacyConnections.size > MAX_CACHED_CONNECTIONS) {\n const oldest = knownLegacyConnections.keys().next().value;\n if (!oldest) break;\n knownLegacyConnections.delete(oldest);\n }\n}\n\nfunction getCachedModernDiscovery(cacheKey: string): PriorDiscovery | undefined {\n const cached = modernDiscoveries.get(cacheKey);\n if (!cached) return undefined;\n if (cached.expiresAt <= Date.now()) {\n modernDiscoveries.delete(cacheKey);\n return undefined;\n }\n modernDiscoveries.delete(cacheKey);\n modernDiscoveries.set(cacheKey, cached);\n return { kind: 'modern', discover: cached.discover };\n}\n\nfunction cacheModernDiscovery(cacheKey: string, discover: DiscoverResult): void {\n modernDiscoveries.delete(cacheKey);\n modernDiscoveries.set(cacheKey, {\n discover,\n expiresAt: Date.now() + MODERN_DISCOVERY_TTL_MS,\n });\n while (modernDiscoveries.size > MAX_CACHED_CONNECTIONS) {\n const oldest = modernDiscoveries.keys().next().value;\n if (!oldest) break;\n modernDiscoveries.delete(oldest);\n }\n}\n\nfunction httpStatusOf(error: unknown, depth = 0): number | undefined {\n if (!error || typeof error !== 'object' || depth > 4) return undefined;\n const candidate = error as { status?: unknown; code?: unknown; cause?: unknown; response?: { status?: unknown } };\n if (typeof candidate.status === 'number') return candidate.status;\n if (typeof candidate.response?.status === 'number') return candidate.response.status;\n if (typeof candidate.code === 'number' && candidate.code >= 100 && candidate.code <= 599) return candidate.code;\n return httpStatusOf(candidate.cause, depth + 1);\n}\n\nfunction isLegacyEraNegotiationFailure(error: unknown, status = httpStatusOf(error)): boolean {\n // Stable MCP SDK v2 uses EraNegotiationFailed for HTTP 5xx responses so\n // callers preserve infrastructure failures instead of treating them as\n // evidence of a legacy endpoint. Only status-less negotiation failures\n // (for example a malformed legacy response) retain the v1 fallback.\n return status === undefined && SdkError.isInstance(error) && error.code === SdkErrorCode.EraNegotiationFailed;\n}\n\nfunction withPerRequestTraceHeaders(fetchImpl: typeof fetch): typeof fetch {\n return (input, init) => {\n const headers = new Headers(input instanceof Request ? input.headers : undefined);\n new Headers(init?.headers).forEach((value, key) => headers.set(key, value));\n for (const [key, value] of Object.entries(injectTraceHeaders())) headers.set(key, value);\n return fetchImpl(input, { ...init, headers });\n };\n}\n\nfunction getCachedConnection(cacheKey: string): Client | undefined {\n const client = modernConnections.get(cacheKey);\n if (client) {\n const legacyExpiry = legacyConnectionExpiresAt.get(cacheKey);\n if (legacyExpiry !== undefined && legacyExpiry <= Date.now()) {\n modernConnections.delete(cacheKey);\n legacyConnectionExpiresAt.delete(cacheKey);\n void closeModernClient(client).catch(() => {});\n return undefined;\n }\n modernConnections.delete(cacheKey);\n modernConnections.set(cacheKey, client);\n }\n return client;\n}\n\nfunction evictLeastRecentlyUsed(): void {\n if (modernConnections.size <= MAX_CACHED_CONNECTIONS) return;\n const oldestKey = [...modernConnections.keys()].find(key => !isMCPConnectionScopeCacheKeyActive(key));\n if (!oldestKey) return;\n const client = modernConnections.get(oldestKey);\n modernConnections.delete(oldestKey);\n legacyConnectionExpiresAt.delete(oldestKey);\n if (client) void closeModernClient(client).catch(() => {});\n}\n\n/**\n * Did this connect fail because the era-negotiation probe was answered with\n * `401`/`403`? That is the one probe outcome the MCP client classifies as\n * terminal instead of falling back to the legacy era.\n */\nfunction isNegotiationAuthFailure(error: unknown): boolean {\n return is401Error(error) || httpStatusOf(error) === 403;\n}\n\n/**\n * Were we already presenting a static credential on the probe?\n *\n * This is the line between \"the server is challenging us to authenticate\" and\n * \"the server refused this method\". With no credential, a `401` is a real\n * challenge and the caller wants it: `discoverMCPEndpoint` walks the\n * `WWW-Authenticate` / RFC 9728 chain and reports how to authenticate. With an\n * OAuth provider, a `401` is the provider's cue to refresh, so it must reach\n * the OAuth machinery untouched. Only a static token/header credential that the\n * server rejected *on the probe alone* tells us nothing about the credential,\n * and that is the case worth retrying on the legacy transport.\n */\nfunction presentedStaticCredential(authHeaders: Record<string, string>, authProvider?: object): boolean {\n if (authProvider) return false;\n return Object.keys(authHeaders).some(key => {\n const lower = key.toLowerCase();\n return lower === 'authorization' || lower === 'x-adcp-auth';\n });\n}\n\nasync function createNegotiatedClient(\n cacheKey: string,\n options: ModernConnectionOptions,\n authHeaders: Record<string, string>,\n useCachedDiscovery = true,\n /**\n * Skip the `server/discover` probe and `initialize` straight into the legacy\n * era. Set only on the retry after a negotiation-time 401/403 — see the catch\n * block below.\n */\n skipProbe = false\n): Promise<Client> {\n const generation = connectionGeneration;\n const requestTimeoutMs = resolveRequestTimeoutMs(options.requestTimeoutMs);\n const clientRequestTimeoutMs = resolveClientRequestTimeoutMs(options.requestTimeoutMs);\n const rawNetworkFetch = createAgentTransportFetch(options.agentUrl, {\n trustedFetchFn: options.fetchFn,\n allowPrivateIp: options.allowPrivateIp,\n });\n const networkFetch: typeof fetch = (input, init) =>\n withAbortSignal<Response>([init?.signal], requestTimeoutMs, signal => rawNetworkFetch(input, { ...init, signal }));\n const diagnosticFetch = wrapFetchWithTransportDiagnostics(wrapFetchWithSizeLimit(networkFetch));\n const signedFetch: typeof fetch = options.signingContext\n ? (buildAgentSigningFetch({\n upstream: diagnosticFetch,\n signing: options.signingContext.signing,\n getCapability: options.signingContext.getCapability,\n }) as typeof fetch)\n : diagnosticFetch;\n const transport = new StreamableHTTPClientTransport(new URL(options.agentUrl), {\n requestInit: { headers: authHeaders, redirect: 'manual' },\n fetch: wrapFetchWithCapture(withPerRequestTraceHeaders(signedFetch)),\n ...(options.authProvider && {\n authProvider: options.authProvider as ModernOAuthClientProvider,\n }),\n });\n const client = new Client(\n { name: 'AdCP-Client', version: '1.0.0' },\n {\n versionNegotiation: {\n mode: 'auto',\n ...(clientRequestTimeoutMs !== undefined && { probe: { timeoutMs: clientRequestTimeoutMs } }),\n },\n }\n );\n\n const prior = skipProbe\n ? ({ kind: 'legacy' } as const)\n : useCachedDiscovery\n ? getCachedModernDiscovery(cacheKey)\n : undefined;\n try {\n await client.connect(transport, {\n ...(options.signal && { signal: options.signal }),\n ...(clientRequestTimeoutMs !== undefined && { timeout: clientRequestTimeoutMs }),\n ...(prior && { prior }),\n });\n modernTransports.set(client, transport);\n if (prior && !skipProbe) clientsUsingCachedDiscovery.add(client);\n if (!prior) {\n const discover = client.getDiscoverResult();\n if (generation === connectionGeneration) {\n if (client.getProtocolEra() === 'modern' && discover) cacheModernDiscovery(cacheKey, discover);\n else modernDiscoveries.delete(cacheKey);\n }\n }\n return client;\n } catch (error) {\n if (prior && !skipProbe) modernDiscoveries.delete(cacheKey);\n try {\n await closeModernClient(client, false);\n } catch {\n /* ignore close errors */\n }\n // `!skipProbe` keeps the explicit-legacy retry terminal. Re-probing here is\n // only meaningful when `prior` was a *cached modern* discovery that has gone\n // stale — dropping the cache and negotiating afresh can then succeed. On the\n // `skipProbe` retry `prior` is the synthetic `{ kind: 'legacy' }`: there is\n // no stale cache to discard, and recursing would reset `skipProbe` to its\n // default and re-enter the probe→legacy retry below a second time.\n //\n // Reachability: server-driven failures on this path surface as\n // `SdkHttpError` (measured: a 5xx legacy `initialize` gives\n // `CLIENT_HTTP_NOT_IMPLEMENTED`, a malformed body\n // `CLIENT_HTTP_UNEXPECTED_CONTENT`), so no server can drive the cycle today.\n // But `EraNegotiationFailed` is not unreachable under `prior`: the client\n // raises it from `_legacyHandshake` when `supportedProtocolVersions` offers\n // no pre-2026-07-28 version, and for an unrecognized `prior` shape. Those\n // depend on client construction and the library's error taxonomy — both of\n // which moved under us in the 2.0.0-beta.4 -> 2.0.0 bump. The guard makes\n // the bound independent of them.\n if (prior && !skipProbe && SdkError.isInstance(error) && error.code === SdkErrorCode.EraNegotiationFailed) {\n return createNegotiatedClient(cacheKey, options, authHeaders, false);\n }\n // Era negotiation is meant to be automatic: `mode: 'auto'` documents that\n // \"definitive legacy signals (and anything unrecognized) fall back to the\n // plain legacy `initialize` handshake\". 401/403 are the sole exception in\n // the MCP client's classifier (`classifyHttpError`), which is right when we\n // hold no credential — then a 401 IS the server's challenge and the caller\n // needs it — and wrong when we already presented one the server accepts on\n // other methods. In that case the refusal is a verdict on\n // `server/discover`, not on the credential, and the automatic fallback\n // should have run. Do it here: skip the probe and `initialize` directly,\n // the escape hatch the SDK documents for a server known to be legacy. If\n // the credential really is bad, that connect fails on its own and surfaces\n // the server's 401.\n if (isNegotiationAuthFailure(error) && !skipProbe && presentedStaticCredential(authHeaders, options.authProvider)) {\n return createNegotiatedClient(cacheKey, options, authHeaders, useCachedDiscovery, true);\n }\n throw error;\n }\n}\n\nasync function getOrCreateModernConnection(\n cacheKey: string,\n options: ModernConnectionOptions,\n authHeaders: Record<string, string>\n): Promise<Client> {\n const cached = getCachedConnection(cacheKey);\n if (cached) return cached;\n\n const pending = pendingModernConnections.get(cacheKey);\n if (pending) return pending;\n\n const generation = connectionGeneration;\n const promise = createNegotiatedClient(cacheKey, options, authHeaders)\n .then(async client => {\n if (\n (client.getProtocolEra() === 'modern' || options.handleLegacy === true) &&\n generation === connectionGeneration\n ) {\n modernConnections.set(cacheKey, client);\n registerMCPConnectionScopeCleanup('modern', cacheKey, async () => {\n if (modernConnections.get(cacheKey) !== client) return;\n modernConnections.delete(cacheKey);\n legacyConnectionExpiresAt.delete(cacheKey);\n modernDiscoveries.delete(cacheKey);\n await closeModernClient(client);\n });\n if (client.getProtocolEra() === 'legacy') {\n legacyConnectionExpiresAt.set(cacheKey, Date.now() + LEGACY_CLASSIFICATION_TTL_MS);\n } else {\n legacyConnectionExpiresAt.delete(cacheKey);\n }\n evictLeastRecentlyUsed();\n } else if (generation !== connectionGeneration) {\n await closeModernClient(client).catch(() => {});\n throw new Error('MCP connection completed after connection teardown');\n }\n return client;\n })\n .finally(() => {\n if (pendingModernConnections.get(cacheKey) === promise) pendingModernConnections.delete(cacheKey);\n });\n pendingModernConnections.set(cacheKey, promise);\n registerMCPConnectionScopePending(promise);\n return promise;\n}\n\nasync function callOnModernClient(\n client: Client,\n toolName: string,\n args: Record<string, unknown>,\n signal?: AbortSignal,\n requestTimeoutMs?: number\n): Promise<CallToolResponse> {\n const resolvedRequestTimeoutMs = resolveClientRequestTimeoutMs(requestTimeoutMs);\n return (await client.callTool(\n { name: toolName, arguments: args },\n {\n ...(signal && { signal }),\n ...(resolvedRequestTimeoutMs !== undefined && { timeout: resolvedRequestTimeoutMs }),\n }\n )) as CallToolResponse;\n}\n\nasync function attemptModernCall(\n options: ModernConnectionOptions,\n toolName: string,\n args: Record<string, unknown>\n): Promise<ModernMCPAttempt> {\n const authHeaders = buildAuthHeaders(options.authToken, options.customHeaders, options.authProvider);\n const cacheKey = connectionCacheKey(\n options.agentUrl,\n authHeaders,\n options.signingContext?.cacheKey,\n options.authProvider,\n options.fetchFn,\n options.signal,\n options.requestTimeoutMs,\n options.handleLegacy,\n options.allowPrivateIp\n );\n if (isKnownLegacy(cacheKey)) return { handled: false };\n\n const guardedConnection =\n options.signal !== undefined || options.requestTimeoutMs !== undefined || options.fetchFn !== undefined;\n const oneShot = guardedConnection && currentMCPConnectionScopeKey() === undefined;\n let client: Client;\n let callSucceeded = false;\n try {\n client = oneShot\n ? await createNegotiatedClient(cacheKey, options, authHeaders)\n : await getOrCreateModernConnection(cacheKey, options, authHeaders);\n } catch (error) {\n const status = httpStatusOf(error);\n if (status === 404 || status === 405) {\n markKnownLegacy(cacheKey);\n options.debugLogs.push({\n type: 'info',\n message: `MCP: Modern Streamable HTTP is unavailable (HTTP ${status}); preserving the v1 transport path`,\n timestamp: new Date().toISOString(),\n });\n return { handled: false };\n }\n if (isLegacyEraNegotiationFailure(error, status)) {\n markKnownLegacy(cacheKey);\n options.debugLogs.push({\n type: 'info',\n message: `MCP: Era negotiation failed for ${toolName}; preserving the v1 transport path`,\n timestamp: new Date().toISOString(),\n });\n return { handled: false };\n }\n throw error;\n }\n\n if (client.getProtocolEra() !== 'modern') {\n if (options.handleLegacy === true) {\n options.debugLogs.push({\n type: 'info',\n message: `MCP: v2 client selected the legacy protocol era for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n } else {\n markKnownLegacy(cacheKey);\n try {\n await closeModernClient(client);\n } catch {\n /* ignore close errors */\n }\n options.debugLogs.push({\n type: 'info',\n message: `MCP: Server selected the legacy protocol era for ${toolName}; preserving the v1 Tasks path`,\n timestamp: new Date().toISOString(),\n });\n return { handled: false };\n }\n }\n\n options.debugLogs.push({\n type: 'success',\n message: `MCP: Negotiated protocol ${client.getNegotiatedProtocolVersion()} for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n\n try {\n const response = await callOnModernClient(client, toolName, args, options.signal, options.requestTimeoutMs);\n callSucceeded = true;\n return { handled: true, response };\n } catch (error) {\n // A tool request may have reached the server even when its response was\n // lost. Never replay automatically: mutating AdCP tools depend on the\n // caller's explicit idempotency policy, not transport guesswork.\n modernConnections.delete(cacheKey);\n legacyConnectionExpiresAt.delete(cacheKey);\n modernDiscoveries.delete(cacheKey);\n try {\n await closeModernClient(client, !isAbortOrTimeoutError(error));\n } catch {\n /* ignore close errors */\n }\n throw error;\n } finally {\n if (oneShot && client && callSucceeded) await closeModernClient(client).catch(() => {});\n }\n}\n\n/**\n * Try a tool call using the MCP 2026-07-28 protocol era.\n *\n * `handled: false` means the caller must use the existing v1 client. This is\n * deliberately a result rather than an exception because legacy negotiation\n * is normal during the transition window.\n */\nexport async function tryCallModernMCPTool(\n agentUrl: string,\n toolName: string,\n args: Record<string, unknown>,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n customHeaders?: Record<string, string>,\n options: ModernMCPConnectionOptions = {}\n): Promise<ModernMCPAttempt> {\n return withSpan('adcp.mcp.negotiate', { 'adcp.tool': toolName, 'http.url': agentUrl }, () =>\n signingContextStorage.run(options.signingContext, () =>\n attemptModernCall(\n {\n agentUrl,\n authToken,\n customHeaders,\n debugLogs,\n signingContext: options.signingContext,\n authProvider: options.authProvider,\n signal: options.signal,\n requestTimeoutMs: options.requestTimeoutMs,\n fetchFn: options.fetchFn,\n allowPrivateIp: options.allowPrivateIp,\n handleLegacy: options.handleLegacy,\n },\n toolName,\n args\n )\n )\n );\n}\n\n/**\n * Probe an endpoint with the official v2 client's auto negotiation.\n * `connected: false` lets endpoint discovery retain its v1 SSE fallback.\n */\nexport async function probeModernMCPConnection(\n agentUrl: string,\n authToken?: string,\n customHeaders?: Record<string, string>,\n options: ModernMCPConnectionOptions = {}\n): Promise<{ connected: boolean; era?: 'legacy' | 'modern' }> {\n const connectionOptions: ModernConnectionOptions = {\n agentUrl,\n authToken,\n customHeaders,\n debugLogs: [],\n signingContext: options.signingContext,\n authProvider: options.authProvider,\n signal: options.signal,\n requestTimeoutMs: options.requestTimeoutMs,\n fetchFn: options.fetchFn,\n allowPrivateIp: options.allowPrivateIp,\n handleLegacy: options.handleLegacy,\n };\n const authHeaders = buildAuthHeaders(authToken, customHeaders, options.authProvider);\n const cacheKey = connectionCacheKey(\n agentUrl,\n authHeaders,\n options.signingContext?.cacheKey,\n options.authProvider,\n options.fetchFn,\n options.signal,\n options.requestTimeoutMs,\n options.handleLegacy,\n options.allowPrivateIp\n );\n let client: Client | undefined;\n try {\n client = await createNegotiatedClient(cacheKey, connectionOptions, authHeaders, false);\n return { connected: true, era: client.getProtocolEra() };\n } catch (error) {\n modernDiscoveries.delete(cacheKey);\n if (is401Error(error) || isAbortOrTimeoutError(error)) throw error;\n const status = httpStatusOf(error);\n if (status === 404 || status === 405) return { connected: false };\n if (isLegacyEraNegotiationFailure(error, status)) return { connected: false };\n throw error;\n } finally {\n if (client) await closeModernClient(client).catch(() => {});\n }\n}\n\n/** List tools when the endpoint selected the modern era; otherwise let the v1 caller continue. */\nexport async function tryListModernMCPTools(\n agentUrl: string,\n authToken?: string,\n customHeaders?: Record<string, string>,\n options: ModernMCPConnectionOptions = {}\n): Promise<ModernMCPListAttempt> {\n const connectionOptions: ModernConnectionOptions = {\n agentUrl,\n authToken,\n customHeaders,\n debugLogs: [],\n signingContext: options.signingContext,\n authProvider: options.authProvider,\n signal: options.signal,\n requestTimeoutMs: options.requestTimeoutMs,\n fetchFn: options.fetchFn,\n allowPrivateIp: options.allowPrivateIp,\n };\n const authHeaders = buildAuthHeaders(authToken, customHeaders, options.authProvider);\n const cacheKey = connectionCacheKey(\n agentUrl,\n authHeaders,\n options.signingContext?.cacheKey,\n options.authProvider,\n options.fetchFn,\n options.signal,\n options.requestTimeoutMs,\n options.handleLegacy,\n options.allowPrivateIp\n );\n let client: Client | undefined;\n const listTools = async (connectedClient: Client): Promise<ModernMCPListAttempt> => {\n if (connectedClient.getProtocolEra() !== 'modern') return { handled: false };\n const resolvedRequestTimeoutMs = resolveClientRequestTimeoutMs(options.requestTimeoutMs);\n const result = await connectedClient.listTools(undefined, {\n ...(options.signal && { signal: options.signal }),\n ...(resolvedRequestTimeoutMs !== undefined && { timeout: resolvedRequestTimeoutMs }),\n });\n return { handled: true, tools: result.tools };\n };\n try {\n client = await createNegotiatedClient(cacheKey, connectionOptions, authHeaders);\n return await listTools(client);\n } catch (error) {\n let failure = error;\n modernDiscoveries.delete(cacheKey);\n if (!is401Error(failure) && !isAbortOrTimeoutError(failure) && client && clientsUsingCachedDiscovery.has(client)) {\n await closeModernClient(client, false).catch(() => {});\n try {\n client = await createNegotiatedClient(cacheKey, connectionOptions, authHeaders, false);\n return await listTools(client);\n } catch (retryError) {\n failure = retryError;\n modernDiscoveries.delete(cacheKey);\n }\n }\n if (is401Error(failure) || isAbortOrTimeoutError(failure)) throw failure;\n const status = httpStatusOf(failure);\n if (status === 404 || status === 405) return { handled: false };\n if (isLegacyEraNegotiationFailure(failure, status)) return { handled: false };\n throw failure;\n } finally {\n if (client) await closeModernClient(client).catch(() => {});\n }\n}\n\nexport async function closeModernMCPConnections(): Promise<void> {\n connectionGeneration++;\n const pending = [...pendingModernConnections.values()];\n pendingModernConnections.clear();\n const settled = await Promise.allSettled(pending);\n const clients = new Set(modernConnections.values());\n for (const result of settled) {\n if (result.status === 'fulfilled') clients.add(result.value);\n }\n modernConnections.clear();\n legacyConnectionExpiresAt.clear();\n knownLegacyConnections.clear();\n modernDiscoveries.clear();\n for (const client of clients) {\n try {\n await closeModernClient(client);\n } catch {\n /* ignore close errors */\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,oBASO;AACP,yBAA2B;AAC3B,kBAAwC;AACxC,oBAA2B;AAC3B,qBAA6C;AAC7C,uBAKO;AACP,iCAA2C;AAC3C,IAAAA,iBAAwF;AAExF,mBAKO;AACP,gCAAqC;AACrC,+BAAuC;AACvC,kCAAkD;AAClD,mCAA0C;AAoC1C,MAAM,oBAAoB,oBAAI,IAAoB;AAClD,MAAM,4BAA4B,oBAAI,IAAoB;AAC1D,MAAM,2BAA2B,oBAAI,IAA6B;AAClE,MAAM,mBAAmB,oBAAI,QAA+C;AAC5E,MAAM,yBAAyB,oBAAI,IAAoB;AACvD,MAAM,oBAAoB,oBAAI,IAA6D;AAC3F,MAAM,8BAA8B,oBAAI,QAAgB;AACxD,MAAM,yBAAyB;AAC/B,MAAM,+BAA+B,IAAI,KAAK;AAC9C,MAAM,0BAA0B,IAAI,KAAK;AACzC,MAAM,yBAAyB,oBAAI,QAAwB;AAC3D,MAAM,mBAAmB,oBAAI,QAA8B;AAC3D,MAAM,kBAAkB,oBAAI,QAA6B;AACzD,IAAI,4BAA4B;AAChC,IAAI,sBAAsB;AAC1B,IAAI,qBAAqB;AACzB,IAAI,uBAAuB;AAE3B,eAAe,kBAAkB,QAAgB,mBAAmB,MAAqB;AACvF,QAAM,YAAY,iBAAiB,IAAI,MAAM;AAC7C,mBAAiB,OAAO,MAAM;AAC9B,MAAI,oBAAoB,WAAW,WAAW;AAC5C,cAAM,uDAA2B,SAAS;AAAA,EAC5C;AACA,QAAM,OAAO,MAAM;AACrB;AAEA,SAAS,mBAAmB,OAAuB;AACjD,aAAO,+BAAW,UAAU,EAAE,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK;AAC5D;AAEA,SAAS,iBACP,WACA,eACA,cACwB;AACxB,QAAM,kBACJ,gBAAgB,YACZ,OAAO;AAAA,IACL,OAAO,QAAQ,iBAAiB,CAAC,CAAC,EAAE,OAAO,cAAY;AACrD,YAAM,MAAM,SAAS,CAAC,EAAE,YAAY;AACpC,aAAO,QAAQ,mBAAmB,QAAQ;AAAA,IAC5C,CAAC;AAAA,EACH,IACA;AACN,aAAO,qCAAwB,iBAAiB,eAAe,SAAY,SAAS;AACtF;AAEA,SAAS,sBAAsB,UAAkD;AAC/E,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,MAAM,uBAAuB,IAAI,QAAQ;AAC7C,MAAI,CAAC,KAAK;AACR,UAAM,kBAAkB,EAAE,yBAAyB;AACnD,2BAAuB,IAAI,UAAU,GAAG;AAAA,EAC1C;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,SAAuD;AAC9E,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,MAAM,iBAAiB,IAAI,OAAO;AACtC,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,EAAE,mBAAmB;AACpC,qBAAiB,IAAI,SAAS,GAAG;AAAA,EACnC;AACA,SAAO;AACT;AAEA,SAAS,eAAe,QAAqD;AAC3E,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,MAAM,gBAAgB,IAAI,MAAM;AACpC,MAAI,CAAC,KAAK;AACR,UAAM,UAAU,EAAE,kBAAkB;AACpC,oBAAgB,IAAI,QAAQ,GAAG;AAAA,EACjC;AACA,SAAO;AACT;AAEA,SAAS,mBACP,UACA,SACA,iBACA,cACA,SACA,QACA,kBACA,cACA,gBACQ;AACR,QAAM,oBAAoB,OAAO,QAAQ,OAAO,EAC7C,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,IAAI,YAAY,GAAG,KAAK,CAAU,EACzD,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC;AACtD,QAAM,QAAQ,CAAC,UAAU,WAAW,mBAAmB,KAAK,UAAU,iBAAiB,CAAC,CAAC,EAAE;AAC3F,MAAI,gBAAiB,OAAM,KAAK,eAAe;AAC/C,QAAM,cAAc,sBAAsB,YAAY;AACtD,MAAI,YAAa,OAAM,KAAK,WAAW;AACvC,QAAM,WAAW,gBAAgB,OAAO;AACxC,MAAI,SAAU,OAAM,KAAK,QAAQ;AACjC,QAAM,YAAY,eAAe,MAAM;AACvC,MAAI,UAAW,OAAM,KAAK,SAAS;AACnC,MAAI,qBAAqB,OAAW,OAAM,KAAK,WAAW,gBAAgB,EAAE;AAC5E,MAAI,iBAAiB,OAAW,OAAM,KAAK,iBAAiB,YAAY,EAAE;AAC1E,MAAI,mBAAmB,OAAW,OAAM,KAAK,oBAAoB,cAAc,EAAE;AACjF,QAAM,eAAW,+CAA6B;AAC9C,MAAI,SAAU,OAAM,KAAK,QAAQ;AACjC,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,cAAc,UAA2B;AAChD,QAAM,eAAe,uBAAuB,IAAI,QAAQ;AACxD,MAAI,iBAAiB,OAAW,QAAO;AACvC,MAAI,KAAK,IAAI,IAAI,eAAe,8BAA8B;AAC5D,2BAAuB,OAAO,QAAQ;AACtC,WAAO;AAAA,EACT;AACA,yBAAuB,OAAO,QAAQ;AACtC,yBAAuB,IAAI,UAAU,YAAY;AACjD,SAAO;AACT;AAEA,SAAS,gBAAgB,UAAwB;AAC/C,oBAAkB,OAAO,QAAQ;AACjC,yBAAuB,OAAO,QAAQ;AACtC,yBAAuB,IAAI,UAAU,KAAK,IAAI,CAAC;AAC/C,SAAO,uBAAuB,OAAO,wBAAwB;AAC3D,UAAM,SAAS,uBAAuB,KAAK,EAAE,KAAK,EAAE;AACpD,QAAI,CAAC,OAAQ;AACb,2BAAuB,OAAO,MAAM;AAAA,EACtC;AACF;AAEA,SAAS,yBAAyB,UAA8C;AAC9E,QAAM,SAAS,kBAAkB,IAAI,QAAQ;AAC7C,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,OAAO,aAAa,KAAK,IAAI,GAAG;AAClC,sBAAkB,OAAO,QAAQ;AACjC,WAAO;AAAA,EACT;AACA,oBAAkB,OAAO,QAAQ;AACjC,oBAAkB,IAAI,UAAU,MAAM;AACtC,SAAO,EAAE,MAAM,UAAU,UAAU,OAAO,SAAS;AACrD;AAEA,SAAS,qBAAqB,UAAkB,UAAgC;AAC9E,oBAAkB,OAAO,QAAQ;AACjC,oBAAkB,IAAI,UAAU;AAAA,IAC9B;AAAA,IACA,WAAW,KAAK,IAAI,IAAI;AAAA,EAC1B,CAAC;AACD,SAAO,kBAAkB,OAAO,wBAAwB;AACtD,UAAM,SAAS,kBAAkB,KAAK,EAAE,KAAK,EAAE;AAC/C,QAAI,CAAC,OAAQ;AACb,sBAAkB,OAAO,MAAM;AAAA,EACjC;AACF;AAEA,SAAS,aAAa,OAAgB,QAAQ,GAAuB;AACnE,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,QAAQ,EAAG,QAAO;AAC7D,QAAM,YAAY;AAClB,MAAI,OAAO,UAAU,WAAW,SAAU,QAAO,UAAU;AAC3D,MAAI,OAAO,UAAU,UAAU,WAAW,SAAU,QAAO,UAAU,SAAS;AAC9E,MAAI,OAAO,UAAU,SAAS,YAAY,UAAU,QAAQ,OAAO,UAAU,QAAQ,IAAK,QAAO,UAAU;AAC3G,SAAO,aAAa,UAAU,OAAO,QAAQ,CAAC;AAChD;AAEA,SAAS,8BAA8B,OAAgB,SAAS,aAAa,KAAK,GAAY;AAK5F,SAAO,WAAW,UAAa,uBAAS,WAAW,KAAK,KAAK,MAAM,SAAS,2BAAa;AAC3F;AAEA,SAAS,2BAA2B,WAAuC;AACzE,SAAO,CAAC,OAAO,SAAS;AACtB,UAAM,UAAU,IAAI,QAAQ,iBAAiB,UAAU,MAAM,UAAU,MAAS;AAChF,QAAI,QAAQ,MAAM,OAAO,EAAE,QAAQ,CAAC,OAAO,QAAQ,QAAQ,IAAI,KAAK,KAAK,CAAC;AAC1E,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,YAAQ,mCAAmB,CAAC,EAAG,SAAQ,IAAI,KAAK,KAAK;AACvF,WAAO,UAAU,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC;AAAA,EAC9C;AACF;AAEA,SAAS,oBAAoB,UAAsC;AACjE,QAAM,SAAS,kBAAkB,IAAI,QAAQ;AAC7C,MAAI,QAAQ;AACV,UAAM,eAAe,0BAA0B,IAAI,QAAQ;AAC3D,QAAI,iBAAiB,UAAa,gBAAgB,KAAK,IAAI,GAAG;AAC5D,wBAAkB,OAAO,QAAQ;AACjC,gCAA0B,OAAO,QAAQ;AACzC,WAAK,kBAAkB,MAAM,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAC7C,aAAO;AAAA,IACT;AACA,sBAAkB,OAAO,QAAQ;AACjC,sBAAkB,IAAI,UAAU,MAAM;AAAA,EACxC;AACA,SAAO;AACT;AAEA,SAAS,yBAA+B;AACtC,MAAI,kBAAkB,QAAQ,uBAAwB;AACtD,QAAM,YAAY,CAAC,GAAG,kBAAkB,KAAK,CAAC,EAAE,KAAK,SAAO,KAAC,qDAAmC,GAAG,CAAC;AACpG,MAAI,CAAC,UAAW;AAChB,QAAM,SAAS,kBAAkB,IAAI,SAAS;AAC9C,oBAAkB,OAAO,SAAS;AAClC,4BAA0B,OAAO,SAAS;AAC1C,MAAI,OAAQ,MAAK,kBAAkB,MAAM,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AAC3D;AAOA,SAAS,yBAAyB,OAAyB;AACzD,aAAO,0BAAW,KAAK,KAAK,aAAa,KAAK,MAAM;AACtD;AAcA,SAAS,0BAA0B,aAAqC,cAAgC;AACtG,MAAI,aAAc,QAAO;AACzB,SAAO,OAAO,KAAK,WAAW,EAAE,KAAK,SAAO;AAC1C,UAAM,QAAQ,IAAI,YAAY;AAC9B,WAAO,UAAU,mBAAmB,UAAU;AAAA,EAChD,CAAC;AACH;AAEA,eAAe,uBACb,UACA,SACA,aACA,qBAAqB,MAMrB,YAAY,OACK;AACjB,QAAM,aAAa;AACnB,QAAM,uBAAmB,sCAAwB,QAAQ,gBAAgB;AACzE,QAAM,6BAAyB,4CAA8B,QAAQ,gBAAgB;AACrF,QAAM,sBAAkB,wDAA0B,QAAQ,UAAU;AAAA,IAClE,gBAAgB,QAAQ;AAAA,IACxB,gBAAgB,QAAQ;AAAA,EAC1B,CAAC;AACD,QAAM,eAA6B,CAAC,OAAO,aACzC,8BAA0B,CAAC,MAAM,MAAM,GAAG,kBAAkB,YAAU,gBAAgB,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;AACnH,QAAM,sBAAkB,mEAAkC,iDAAuB,YAAY,CAAC;AAC9F,QAAM,cAA4B,QAAQ,qBACrC,uCAAuB;AAAA,IACtB,UAAU;AAAA,IACV,SAAS,QAAQ,eAAe;AAAA,IAChC,eAAe,QAAQ,eAAe;AAAA,EACxC,CAAC,IACD;AACJ,QAAM,YAAY,IAAI,4CAA8B,IAAI,IAAI,QAAQ,QAAQ,GAAG;AAAA,IAC7E,aAAa,EAAE,SAAS,aAAa,UAAU,SAAS;AAAA,IACxD,WAAO,gDAAqB,2BAA2B,WAAW,CAAC;AAAA,IACnE,GAAI,QAAQ,gBAAgB;AAAA,MAC1B,cAAc,QAAQ;AAAA,IACxB;AAAA,EACF,CAAC;AACD,QAAM,SAAS,IAAI;AAAA,IACjB,EAAE,MAAM,eAAe,SAAS,QAAQ;AAAA,IACxC;AAAA,MACE,oBAAoB;AAAA,QAClB,MAAM;AAAA,QACN,GAAI,2BAA2B,UAAa,EAAE,OAAO,EAAE,WAAW,uBAAuB,EAAE;AAAA,MAC7F;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,YACT,EAAE,MAAM,SAAS,IAClB,qBACE,yBAAyB,QAAQ,IACjC;AACN,MAAI;AACF,UAAM,OAAO,QAAQ,WAAW;AAAA,MAC9B,GAAI,QAAQ,UAAU,EAAE,QAAQ,QAAQ,OAAO;AAAA,MAC/C,GAAI,2BAA2B,UAAa,EAAE,SAAS,uBAAuB;AAAA,MAC9E,GAAI,SAAS,EAAE,MAAM;AAAA,IACvB,CAAC;AACD,qBAAiB,IAAI,QAAQ,SAAS;AACtC,QAAI,SAAS,CAAC,UAAW,6BAA4B,IAAI,MAAM;AAC/D,QAAI,CAAC,OAAO;AACV,YAAM,WAAW,OAAO,kBAAkB;AAC1C,UAAI,eAAe,sBAAsB;AACvC,YAAI,OAAO,eAAe,MAAM,YAAY,SAAU,sBAAqB,UAAU,QAAQ;AAAA,YACxF,mBAAkB,OAAO,QAAQ;AAAA,MACxC;AAAA,IACF;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,SAAS,CAAC,UAAW,mBAAkB,OAAO,QAAQ;AAC1D,QAAI;AACF,YAAM,kBAAkB,QAAQ,KAAK;AAAA,IACvC,QAAQ;AAAA,IAER;AAkBA,QAAI,SAAS,CAAC,aAAa,uBAAS,WAAW,KAAK,KAAK,MAAM,SAAS,2BAAa,sBAAsB;AACzG,aAAO,uBAAuB,UAAU,SAAS,aAAa,KAAK;AAAA,IACrE;AAaA,QAAI,yBAAyB,KAAK,KAAK,CAAC,aAAa,0BAA0B,aAAa,QAAQ,YAAY,GAAG;AACjH,aAAO,uBAAuB,UAAU,SAAS,aAAa,oBAAoB,IAAI;AAAA,IACxF;AACA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,4BACb,UACA,SACA,aACiB;AACjB,QAAM,SAAS,oBAAoB,QAAQ;AAC3C,MAAI,OAAQ,QAAO;AAEnB,QAAM,UAAU,yBAAyB,IAAI,QAAQ;AACrD,MAAI,QAAS,QAAO;AAEpB,QAAM,aAAa;AACnB,QAAM,UAAU,uBAAuB,UAAU,SAAS,WAAW,EAClE,KAAK,OAAM,WAAU;AACpB,SACG,OAAO,eAAe,MAAM,YAAY,QAAQ,iBAAiB,SAClE,eAAe,sBACf;AACA,wBAAkB,IAAI,UAAU,MAAM;AACtC,8DAAkC,UAAU,UAAU,YAAY;AAChE,YAAI,kBAAkB,IAAI,QAAQ,MAAM,OAAQ;AAChD,0BAAkB,OAAO,QAAQ;AACjC,kCAA0B,OAAO,QAAQ;AACzC,0BAAkB,OAAO,QAAQ;AACjC,cAAM,kBAAkB,MAAM;AAAA,MAChC,CAAC;AACD,UAAI,OAAO,eAAe,MAAM,UAAU;AACxC,kCAA0B,IAAI,UAAU,KAAK,IAAI,IAAI,4BAA4B;AAAA,MACnF,OAAO;AACL,kCAA0B,OAAO,QAAQ;AAAA,MAC3C;AACA,6BAAuB;AAAA,IACzB,WAAW,eAAe,sBAAsB;AAC9C,YAAM,kBAAkB,MAAM,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAC9C,YAAM,IAAI,MAAM,oDAAoD;AAAA,IACtE;AACA,WAAO;AAAA,EACT,CAAC,EACA,QAAQ,MAAM;AACb,QAAI,yBAAyB,IAAI,QAAQ,MAAM,QAAS,0BAAyB,OAAO,QAAQ;AAAA,EAClG,CAAC;AACH,2BAAyB,IAAI,UAAU,OAAO;AAC9C,0DAAkC,OAAO;AACzC,SAAO;AACT;AAEA,eAAe,mBACb,QACA,UACA,MACA,QACA,kBAC2B;AAC3B,QAAM,+BAA2B,4CAA8B,gBAAgB;AAC/E,SAAQ,MAAM,OAAO;AAAA,IACnB,EAAE,MAAM,UAAU,WAAW,KAAK;AAAA,IAClC;AAAA,MACE,GAAI,UAAU,EAAE,OAAO;AAAA,MACvB,GAAI,6BAA6B,UAAa,EAAE,SAAS,yBAAyB;AAAA,IACpF;AAAA,EACF;AACF;AAEA,eAAe,kBACb,SACA,UACA,MAC2B;AAC3B,QAAM,cAAc,iBAAiB,QAAQ,WAAW,QAAQ,eAAe,QAAQ,YAAY;AACnG,QAAM,WAAW;AAAA,IACf,QAAQ;AAAA,IACR;AAAA,IACA,QAAQ,gBAAgB;AAAA,IACxB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,MAAI,cAAc,QAAQ,EAAG,QAAO,EAAE,SAAS,MAAM;AAErD,QAAM,oBACJ,QAAQ,WAAW,UAAa,QAAQ,qBAAqB,UAAa,QAAQ,YAAY;AAChG,QAAM,UAAU,yBAAqB,+CAA6B,MAAM;AACxE,MAAI;AACJ,MAAI,gBAAgB;AACpB,MAAI;AACF,aAAS,UACL,MAAM,uBAAuB,UAAU,SAAS,WAAW,IAC3D,MAAM,4BAA4B,UAAU,SAAS,WAAW;AAAA,EACtE,SAAS,OAAO;AACd,UAAM,SAAS,aAAa,KAAK;AACjC,QAAI,WAAW,OAAO,WAAW,KAAK;AACpC,sBAAgB,QAAQ;AACxB,cAAQ,UAAU,KAAK;AAAA,QACrB,MAAM;AAAA,QACN,SAAS,oDAAoD,MAAM;AAAA,QACnE,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AACD,aAAO,EAAE,SAAS,MAAM;AAAA,IAC1B;AACA,QAAI,8BAA8B,OAAO,MAAM,GAAG;AAChD,sBAAgB,QAAQ;AACxB,cAAQ,UAAU,KAAK;AAAA,QACrB,MAAM;AAAA,QACN,SAAS,mCAAmC,QAAQ;AAAA,QACpD,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AACD,aAAO,EAAE,SAAS,MAAM;AAAA,IAC1B;AACA,UAAM;AAAA,EACR;AAEA,MAAI,OAAO,eAAe,MAAM,UAAU;AACxC,QAAI,QAAQ,iBAAiB,MAAM;AACjC,cAAQ,UAAU,KAAK;AAAA,QACrB,MAAM;AAAA,QACN,SAAS,uDAAuD,QAAQ;AAAA,QACxE,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AAAA,IACH,OAAO;AACL,sBAAgB,QAAQ;AACxB,UAAI;AACF,cAAM,kBAAkB,MAAM;AAAA,MAChC,QAAQ;AAAA,MAER;AACA,cAAQ,UAAU,KAAK;AAAA,QACrB,MAAM;AAAA,QACN,SAAS,oDAAoD,QAAQ;AAAA,QACrE,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AACD,aAAO,EAAE,SAAS,MAAM;AAAA,IAC1B;AAAA,EACF;AAEA,UAAQ,UAAU,KAAK;AAAA,IACrB,MAAM;AAAA,IACN,SAAS,4BAA4B,OAAO,6BAA6B,CAAC,QAAQ,QAAQ;AAAA,IAC1F,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC,CAAC;AAED,MAAI;AACF,UAAM,WAAW,MAAM,mBAAmB,QAAQ,UAAU,MAAM,QAAQ,QAAQ,QAAQ,gBAAgB;AAC1G,oBAAgB;AAChB,WAAO,EAAE,SAAS,MAAM,SAAS;AAAA,EACnC,SAAS,OAAO;AAId,sBAAkB,OAAO,QAAQ;AACjC,8BAA0B,OAAO,QAAQ;AACzC,sBAAkB,OAAO,QAAQ;AACjC,QAAI;AACF,YAAM,kBAAkB,QAAQ,KAAC,oCAAsB,KAAK,CAAC;AAAA,IAC/D,QAAQ;AAAA,IAER;AACA,UAAM;AAAA,EACR,UAAE;AACA,QAAI,WAAW,UAAU,cAAe,OAAM,kBAAkB,MAAM,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACxF;AACF;AASA,eAAsB,qBACpB,UACA,UACA,MACA,WACA,YAA6B,CAAC,GAC9B,eACA,UAAsC,CAAC,GACZ;AAC3B,aAAO;AAAA,IAAS;AAAA,IAAsB,EAAE,aAAa,UAAU,YAAY,SAAS;AAAA,IAAG,MACrF,qCAAsB;AAAA,MAAI,QAAQ;AAAA,MAAgB,MAChD;AAAA,QACE;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,gBAAgB,QAAQ;AAAA,UACxB,cAAc,QAAQ;AAAA,UACtB,QAAQ,QAAQ;AAAA,UAChB,kBAAkB,QAAQ;AAAA,UAC1B,SAAS,QAAQ;AAAA,UACjB,gBAAgB,QAAQ;AAAA,UACxB,cAAc,QAAQ;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAMA,eAAsB,yBACpB,UACA,WACA,eACA,UAAsC,CAAC,GACqB;AAC5D,QAAM,oBAA6C;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,CAAC;AAAA,IACZ,gBAAgB,QAAQ;AAAA,IACxB,cAAc,QAAQ;AAAA,IACtB,QAAQ,QAAQ;AAAA,IAChB,kBAAkB,QAAQ;AAAA,IAC1B,SAAS,QAAQ;AAAA,IACjB,gBAAgB,QAAQ;AAAA,IACxB,cAAc,QAAQ;AAAA,EACxB;AACA,QAAM,cAAc,iBAAiB,WAAW,eAAe,QAAQ,YAAY;AACnF,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA,QAAQ,gBAAgB;AAAA,IACxB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,MAAI;AACJ,MAAI;AACF,aAAS,MAAM,uBAAuB,UAAU,mBAAmB,aAAa,KAAK;AACrF,WAAO,EAAE,WAAW,MAAM,KAAK,OAAO,eAAe,EAAE;AAAA,EACzD,SAAS,OAAO;AACd,sBAAkB,OAAO,QAAQ;AACjC,YAAI,0BAAW,KAAK,SAAK,oCAAsB,KAAK,EAAG,OAAM;AAC7D,UAAM,SAAS,aAAa,KAAK;AACjC,QAAI,WAAW,OAAO,WAAW,IAAK,QAAO,EAAE,WAAW,MAAM;AAChE,QAAI,8BAA8B,OAAO,MAAM,EAAG,QAAO,EAAE,WAAW,MAAM;AAC5E,UAAM;AAAA,EACR,UAAE;AACA,QAAI,OAAQ,OAAM,kBAAkB,MAAM,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC5D;AACF;AAGA,eAAsB,sBACpB,UACA,WACA,eACA,UAAsC,CAAC,GACR;AAC/B,QAAM,oBAA6C;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,CAAC;AAAA,IACZ,gBAAgB,QAAQ;AAAA,IACxB,cAAc,QAAQ;AAAA,IACtB,QAAQ,QAAQ;AAAA,IAChB,kBAAkB,QAAQ;AAAA,IAC1B,SAAS,QAAQ;AAAA,IACjB,gBAAgB,QAAQ;AAAA,EAC1B;AACA,QAAM,cAAc,iBAAiB,WAAW,eAAe,QAAQ,YAAY;AACnF,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA,QAAQ,gBAAgB;AAAA,IACxB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,MAAI;AACJ,QAAM,YAAY,OAAO,oBAA2D;AAClF,QAAI,gBAAgB,eAAe,MAAM,SAAU,QAAO,EAAE,SAAS,MAAM;AAC3E,UAAM,+BAA2B,4CAA8B,QAAQ,gBAAgB;AACvF,UAAM,SAAS,MAAM,gBAAgB,UAAU,QAAW;AAAA,MACxD,GAAI,QAAQ,UAAU,EAAE,QAAQ,QAAQ,OAAO;AAAA,MAC/C,GAAI,6BAA6B,UAAa,EAAE,SAAS,yBAAyB;AAAA,IACpF,CAAC;AACD,WAAO,EAAE,SAAS,MAAM,OAAO,OAAO,MAAM;AAAA,EAC9C;AACA,MAAI;AACF,aAAS,MAAM,uBAAuB,UAAU,mBAAmB,WAAW;AAC9E,WAAO,MAAM,UAAU,MAAM;AAAA,EAC/B,SAAS,OAAO;AACd,QAAI,UAAU;AACd,sBAAkB,OAAO,QAAQ;AACjC,QAAI,KAAC,0BAAW,OAAO,KAAK,KAAC,oCAAsB,OAAO,KAAK,UAAU,4BAA4B,IAAI,MAAM,GAAG;AAChH,YAAM,kBAAkB,QAAQ,KAAK,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AACrD,UAAI;AACF,iBAAS,MAAM,uBAAuB,UAAU,mBAAmB,aAAa,KAAK;AACrF,eAAO,MAAM,UAAU,MAAM;AAAA,MAC/B,SAAS,YAAY;AACnB,kBAAU;AACV,0BAAkB,OAAO,QAAQ;AAAA,MACnC;AAAA,IACF;AACA,YAAI,0BAAW,OAAO,SAAK,oCAAsB,OAAO,EAAG,OAAM;AACjE,UAAM,SAAS,aAAa,OAAO;AACnC,QAAI,WAAW,OAAO,WAAW,IAAK,QAAO,EAAE,SAAS,MAAM;AAC9D,QAAI,8BAA8B,SAAS,MAAM,EAAG,QAAO,EAAE,SAAS,MAAM;AAC5E,UAAM;AAAA,EACR,UAAE;AACA,QAAI,OAAQ,OAAM,kBAAkB,MAAM,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC5D;AACF;AAEA,eAAsB,4BAA2C;AAC/D;AACA,QAAM,UAAU,CAAC,GAAG,yBAAyB,OAAO,CAAC;AACrD,2BAAyB,MAAM;AAC/B,QAAM,UAAU,MAAM,QAAQ,WAAW,OAAO;AAChD,QAAM,UAAU,IAAI,IAAI,kBAAkB,OAAO,CAAC;AAClD,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,WAAW,YAAa,SAAQ,IAAI,OAAO,KAAK;AAAA,EAC7D;AACA,oBAAkB,MAAM;AACxB,4BAA0B,MAAM;AAChC,yBAAuB,MAAM;AAC7B,oBAAkB,MAAM;AACxB,aAAW,UAAU,SAAS;AAC5B,QAAI;AACF,YAAM,kBAAkB,MAAM;AAAA,IAChC,QAAQ;AAAA,IAER;AAAA,EACF;AACF;","names":["import_client"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/protocols/mcp-modern.ts"],"sourcesContent":["/**\n * MCP 2026-07-28 client path.\n *\n * The v2 SDK removed the experimental 2025 Tasks interception API. During the\n * migration window we therefore negotiate with the v2 client first and use it\n * only when the peer selects the modern protocol era. Legacy peers fall back\n * to mcp-tasks.ts, which keeps the existing v1 Tasks behavior intact.\n */\n\nimport {\n Client,\n SdkError,\n SdkErrorCode,\n StreamableHTTPClientTransport,\n type DiscoverResult,\n type OAuthClientProvider as ModernOAuthClientProvider,\n type PriorDiscovery,\n type Tool,\n} from '@modelcontextprotocol/client';\nimport { createHmac } from 'node:crypto';\nimport { createMCPRequestHeaders } from '../auth';\nimport { is401Error } from '../errors';\nimport { withSpan, injectTraceHeaders } from '../observability/tracing';\nimport {\n currentMCPConnectionScopeKey,\n isMCPConnectionScopeCacheKeyActive,\n registerMCPConnectionScopeCleanup,\n registerMCPConnectionScopePending,\n} from './mcp-scope';\nimport { terminateSessionBestEffort } from './session-termination';\nimport { buildAgentSigningFetch, signingContextStorage, type AgentSigningContext } from '../signing/client';\nimport type { DebugLogEntry } from '../types/adcp';\nimport {\n isAbortOrTimeoutError,\n resolveClientRequestTimeoutMs,\n resolveRequestTimeoutMs,\n withAbortSignal,\n} from './abort';\nimport { wrapFetchWithCapture } from './rawResponseCapture';\nimport { wrapFetchWithSizeLimit } from './responseSizeLimit';\nimport { wrapFetchWithTransportDiagnostics } from './transportDiagnostics';\nimport { createAgentTransportFetch } from '../net/agent-transport-fetch';\n\ntype CallToolResponse = {\n isError?: boolean;\n content?: Array<{ type: string; text?: string }>;\n [key: string]: unknown;\n};\n\nexport type ModernMCPAttempt = { handled: false } | { handled: true; response: CallToolResponse };\nexport type ModernMCPListAttempt = { handled: false } | { handled: true; tools: Tool[] };\n\nexport interface ModernMCPConnectionOptions {\n signingContext?: AgentSigningContext;\n authProvider?: object;\n signal?: AbortSignal;\n requestTimeoutMs?: number;\n fetchFn?: typeof fetch;\n allowPrivateIp?: boolean;\n /** Use the v2 SDK's negotiated legacy client instead of handing off to v1. */\n handleLegacy?: boolean;\n}\n\ninterface ModernConnectionOptions {\n agentUrl: string;\n authToken?: string;\n customHeaders?: Record<string, string>;\n debugLogs: DebugLogEntry[];\n signingContext?: AgentSigningContext;\n authProvider?: object;\n signal?: AbortSignal;\n requestTimeoutMs?: number;\n fetchFn?: typeof fetch;\n allowPrivateIp?: boolean;\n handleLegacy?: boolean;\n}\n\nconst modernConnections = new Map<string, Client>();\nconst legacyConnectionExpiresAt = new Map<string, number>();\nconst pendingModernConnections = new Map<string, Promise<Client>>();\nconst modernTransports = new WeakMap<Client, StreamableHTTPClientTransport>();\nconst knownLegacyConnections = new Map<string, number>();\nconst modernDiscoveries = new Map<string, { discover: DiscoverResult; expiresAt: number }>();\nconst clientsUsingCachedDiscovery = new WeakSet<Client>();\nconst MAX_CACHED_CONNECTIONS = 20;\nconst LEGACY_CLASSIFICATION_TTL_MS = 5 * 60 * 1000;\nconst MODERN_DISCOVERY_TTL_MS = 5 * 60 * 1000;\nconst modernOAuthProviderIds = new WeakMap<object, string>();\nconst modernFetchFnIds = new WeakMap<typeof fetch, string>();\nconst modernSignalIds = new WeakMap<AbortSignal, string>();\nlet nextModernOAuthProviderId = 0;\nlet nextModernFetchFnId = 0;\nlet nextModernSignalId = 0;\nlet connectionGeneration = 0;\n\nasync function closeModernClient(client: Client, terminateSession = true): Promise<void> {\n const transport = modernTransports.get(client);\n modernTransports.delete(client);\n if (terminateSession && transport?.sessionId) {\n await terminateSessionBestEffort(transport);\n }\n await client.close();\n}\n\nfunction cacheDisambiguator(value: string): string {\n return createHmac('sha256', '').update(value).digest('hex');\n}\n\nfunction buildAuthHeaders(\n authToken: string | undefined,\n customHeaders: Record<string, string> | undefined,\n authProvider?: object\n): Record<string, string> {\n const filteredHeaders =\n authProvider || authToken\n ? Object.fromEntries(\n Object.entries(customHeaders ?? {}).filter(keyValue => {\n const key = keyValue[0].toLowerCase();\n return key !== 'authorization' && key !== 'x-adcp-auth';\n })\n )\n : customHeaders;\n return createMCPRequestHeaders(filteredHeaders, authProvider ? undefined : authToken);\n}\n\nfunction oauthProviderCacheKey(provider: object | undefined): string | undefined {\n if (!provider) return undefined;\n let key = modernOAuthProviderIds.get(provider);\n if (!key) {\n key = `oauth-provider:${++nextModernOAuthProviderId}`;\n modernOAuthProviderIds.set(provider, key);\n }\n return key;\n}\n\nfunction fetchFnCacheKey(fetchFn: typeof fetch | undefined): string | undefined {\n if (!fetchFn) return undefined;\n let key = modernFetchFnIds.get(fetchFn);\n if (!key) {\n key = `fetch:${++nextModernFetchFnId}`;\n modernFetchFnIds.set(fetchFn, key);\n }\n return key;\n}\n\nfunction signalCacheKey(signal: AbortSignal | undefined): string | undefined {\n if (!signal) return undefined;\n let key = modernSignalIds.get(signal);\n if (!key) {\n key = `signal:${++nextModernSignalId}`;\n modernSignalIds.set(signal, key);\n }\n return key;\n}\n\nfunction connectionCacheKey(\n agentUrl: string,\n headers: Record<string, string>,\n signingCacheKey?: string,\n authProvider?: object,\n fetchFn?: typeof fetch,\n signal?: AbortSignal,\n requestTimeoutMs?: number,\n handleLegacy?: boolean,\n allowPrivateIp?: boolean\n): string {\n const normalizedHeaders = Object.entries(headers)\n .map(([key, value]) => [key.toLowerCase(), value] as const)\n .sort(([left], [right]) => left.localeCompare(right));\n const parts = [agentUrl, `headers:${cacheDisambiguator(JSON.stringify(normalizedHeaders))}`];\n if (signingCacheKey) parts.push(signingCacheKey);\n const providerKey = oauthProviderCacheKey(authProvider);\n if (providerKey) parts.push(providerKey);\n const fetchKey = fetchFnCacheKey(fetchFn);\n if (fetchKey) parts.push(fetchKey);\n const signalKey = signalCacheKey(signal);\n if (signalKey) parts.push(signalKey);\n if (requestTimeoutMs !== undefined) parts.push(`timeout:${requestTimeoutMs}`);\n if (handleLegacy !== undefined) parts.push(`handle-legacy:${handleLegacy}`);\n if (allowPrivateIp !== undefined) parts.push(`allow-private-ip:${allowPrivateIp}`);\n const scopeKey = currentMCPConnectionScopeKey();\n if (scopeKey) parts.push(scopeKey);\n return parts.join('::');\n}\n\nfunction isKnownLegacy(cacheKey: string): boolean {\n const classifiedAt = knownLegacyConnections.get(cacheKey);\n if (classifiedAt === undefined) return false;\n if (Date.now() - classifiedAt > LEGACY_CLASSIFICATION_TTL_MS) {\n knownLegacyConnections.delete(cacheKey);\n return false;\n }\n knownLegacyConnections.delete(cacheKey);\n knownLegacyConnections.set(cacheKey, classifiedAt);\n return true;\n}\n\nfunction markKnownLegacy(cacheKey: string): void {\n modernDiscoveries.delete(cacheKey);\n knownLegacyConnections.delete(cacheKey);\n knownLegacyConnections.set(cacheKey, Date.now());\n while (knownLegacyConnections.size > MAX_CACHED_CONNECTIONS) {\n const oldest = knownLegacyConnections.keys().next().value;\n if (!oldest) break;\n knownLegacyConnections.delete(oldest);\n }\n}\n\nfunction getCachedModernDiscovery(cacheKey: string): PriorDiscovery | undefined {\n const cached = modernDiscoveries.get(cacheKey);\n if (!cached) return undefined;\n if (cached.expiresAt <= Date.now()) {\n modernDiscoveries.delete(cacheKey);\n return undefined;\n }\n modernDiscoveries.delete(cacheKey);\n modernDiscoveries.set(cacheKey, cached);\n return { kind: 'modern', discover: cached.discover };\n}\n\nfunction cacheModernDiscovery(cacheKey: string, discover: DiscoverResult): void {\n modernDiscoveries.delete(cacheKey);\n modernDiscoveries.set(cacheKey, {\n discover,\n expiresAt: Date.now() + MODERN_DISCOVERY_TTL_MS,\n });\n while (modernDiscoveries.size > MAX_CACHED_CONNECTIONS) {\n const oldest = modernDiscoveries.keys().next().value;\n if (!oldest) break;\n modernDiscoveries.delete(oldest);\n }\n}\n\nfunction httpStatusOf(error: unknown, depth = 0): number | undefined {\n if (!error || typeof error !== 'object' || depth > 4) return undefined;\n const candidate = error as { status?: unknown; code?: unknown; cause?: unknown; response?: { status?: unknown } };\n if (typeof candidate.status === 'number') return candidate.status;\n if (typeof candidate.response?.status === 'number') return candidate.response.status;\n if (typeof candidate.code === 'number' && candidate.code >= 100 && candidate.code <= 599) return candidate.code;\n return httpStatusOf(candidate.cause, depth + 1);\n}\n\nfunction isLegacyEraNegotiationFailure(error: unknown, status = httpStatusOf(error)): boolean {\n // Stable MCP SDK v2 uses EraNegotiationFailed for HTTP 5xx responses so\n // callers preserve infrastructure failures instead of treating them as\n // evidence of a legacy endpoint. Only status-less negotiation failures\n // (for example a malformed legacy response) retain the v1 fallback.\n return status === undefined && SdkError.isInstance(error) && error.code === SdkErrorCode.EraNegotiationFailed;\n}\n\nfunction withPerRequestTraceHeaders(fetchImpl: typeof fetch): typeof fetch {\n return (input, init) => {\n const headers = new Headers(input instanceof Request ? input.headers : undefined);\n new Headers(init?.headers).forEach((value, key) => headers.set(key, value));\n for (const [key, value] of Object.entries(injectTraceHeaders())) headers.set(key, value);\n return fetchImpl(input, { ...init, headers });\n };\n}\n\nfunction getCachedConnection(cacheKey: string): Client | undefined {\n const client = modernConnections.get(cacheKey);\n if (client) {\n const legacyExpiry = legacyConnectionExpiresAt.get(cacheKey);\n if (legacyExpiry !== undefined && legacyExpiry <= Date.now()) {\n modernConnections.delete(cacheKey);\n legacyConnectionExpiresAt.delete(cacheKey);\n void closeModernClient(client).catch(() => {});\n return undefined;\n }\n modernConnections.delete(cacheKey);\n modernConnections.set(cacheKey, client);\n }\n return client;\n}\n\nfunction evictLeastRecentlyUsed(): void {\n if (modernConnections.size <= MAX_CACHED_CONNECTIONS) return;\n const oldestKey = [...modernConnections.keys()].find(key => !isMCPConnectionScopeCacheKeyActive(key));\n if (!oldestKey) return;\n const client = modernConnections.get(oldestKey);\n modernConnections.delete(oldestKey);\n legacyConnectionExpiresAt.delete(oldestKey);\n if (client) void closeModernClient(client).catch(() => {});\n}\n\n/**\n * Did this connect fail because the era-negotiation probe was answered with\n * `401`/`403`? That is the one probe outcome the MCP client classifies as\n * terminal instead of falling back to the legacy era.\n */\nfunction isNegotiationAuthFailure(error: unknown): boolean {\n return is401Error(error) || httpStatusOf(error) === 403;\n}\n\n/**\n * Were we already presenting a static credential on the probe?\n *\n * This is the line between \"the server is challenging us to authenticate\" and\n * \"the server refused this method\". With no credential, a `401` is a real\n * challenge and the caller wants it: `discoverMCPEndpoint` walks the\n * `WWW-Authenticate` / RFC 9728 chain and reports how to authenticate. With an\n * OAuth provider, a `401` is the provider's cue to refresh, so it must reach\n * the OAuth machinery untouched. Only a static token/header credential that the\n * server rejected *on the probe alone* tells us nothing about the credential,\n * and that is the case worth retrying on the legacy transport.\n */\nfunction presentedStaticCredential(authHeaders: Record<string, string>, authProvider?: object): boolean {\n if (authProvider) return false;\n return Object.keys(authHeaders).some(key => {\n const lower = key.toLowerCase();\n return lower === 'authorization' || lower === 'x-adcp-auth';\n });\n}\n\nasync function createNegotiatedClient(\n cacheKey: string,\n options: ModernConnectionOptions,\n authHeaders: Record<string, string>,\n useCachedDiscovery = true,\n /**\n * Skip the `server/discover` probe and `initialize` straight into the legacy\n * era. Set only on the retry after a negotiation-time 401/403 — see the catch\n * block below.\n */\n skipProbe = false\n): Promise<Client> {\n const generation = connectionGeneration;\n const requestTimeoutMs = resolveRequestTimeoutMs(options.requestTimeoutMs);\n const clientRequestTimeoutMs = resolveClientRequestTimeoutMs(options.requestTimeoutMs);\n const rawNetworkFetch = createAgentTransportFetch(options.agentUrl, {\n trustedFetchFn: options.fetchFn,\n allowPrivateIp: options.allowPrivateIp,\n originBoundHeaders: Object.keys(options.customHeaders ?? {}),\n crossOriginCredentialPolicy: 'strip',\n });\n const networkFetch: typeof fetch = (input, init) =>\n withAbortSignal<Response>([init?.signal], requestTimeoutMs, signal => rawNetworkFetch(input, { ...init, signal }));\n const diagnosticFetch = wrapFetchWithTransportDiagnostics(wrapFetchWithSizeLimit(networkFetch));\n const signedFetch: typeof fetch = options.signingContext\n ? (buildAgentSigningFetch({\n upstream: diagnosticFetch,\n signing: options.signingContext.signing,\n getCapability: options.signingContext.getCapability,\n }) as typeof fetch)\n : diagnosticFetch;\n const transport = new StreamableHTTPClientTransport(new URL(options.agentUrl), {\n requestInit: { headers: authHeaders, redirect: 'manual' },\n fetch: wrapFetchWithCapture(withPerRequestTraceHeaders(signedFetch)),\n ...(options.authProvider && {\n authProvider: options.authProvider as ModernOAuthClientProvider,\n }),\n });\n const client = new Client(\n { name: 'AdCP-Client', version: '1.0.0' },\n {\n versionNegotiation: {\n mode: 'auto',\n ...(clientRequestTimeoutMs !== undefined && { probe: { timeoutMs: clientRequestTimeoutMs } }),\n },\n }\n );\n\n const prior = skipProbe\n ? ({ kind: 'legacy' } as const)\n : useCachedDiscovery\n ? getCachedModernDiscovery(cacheKey)\n : undefined;\n try {\n await client.connect(transport, {\n ...(options.signal && { signal: options.signal }),\n ...(clientRequestTimeoutMs !== undefined && { timeout: clientRequestTimeoutMs }),\n ...(prior && { prior }),\n });\n modernTransports.set(client, transport);\n if (prior && !skipProbe) clientsUsingCachedDiscovery.add(client);\n if (!prior) {\n const discover = client.getDiscoverResult();\n if (generation === connectionGeneration) {\n if (client.getProtocolEra() === 'modern' && discover) cacheModernDiscovery(cacheKey, discover);\n else modernDiscoveries.delete(cacheKey);\n }\n }\n return client;\n } catch (error) {\n if (prior && !skipProbe) modernDiscoveries.delete(cacheKey);\n try {\n await closeModernClient(client, false);\n } catch {\n /* ignore close errors */\n }\n // `!skipProbe` keeps the explicit-legacy retry terminal. Re-probing here is\n // only meaningful when `prior` was a *cached modern* discovery that has gone\n // stale — dropping the cache and negotiating afresh can then succeed. On the\n // `skipProbe` retry `prior` is the synthetic `{ kind: 'legacy' }`: there is\n // no stale cache to discard, and recursing would reset `skipProbe` to its\n // default and re-enter the probe→legacy retry below a second time.\n //\n // Reachability: server-driven failures on this path surface as\n // `SdkHttpError` (measured: a 5xx legacy `initialize` gives\n // `CLIENT_HTTP_NOT_IMPLEMENTED`, a malformed body\n // `CLIENT_HTTP_UNEXPECTED_CONTENT`), so no server can drive the cycle today.\n // But `EraNegotiationFailed` is not unreachable under `prior`: the client\n // raises it from `_legacyHandshake` when `supportedProtocolVersions` offers\n // no pre-2026-07-28 version, and for an unrecognized `prior` shape. Those\n // depend on client construction and the library's error taxonomy — both of\n // which moved under us in the 2.0.0-beta.4 -> 2.0.0 bump. The guard makes\n // the bound independent of them.\n if (prior && !skipProbe && SdkError.isInstance(error) && error.code === SdkErrorCode.EraNegotiationFailed) {\n return createNegotiatedClient(cacheKey, options, authHeaders, false);\n }\n // Era negotiation is meant to be automatic: `mode: 'auto'` documents that\n // \"definitive legacy signals (and anything unrecognized) fall back to the\n // plain legacy `initialize` handshake\". 401/403 are the sole exception in\n // the MCP client's classifier (`classifyHttpError`), which is right when we\n // hold no credential — then a 401 IS the server's challenge and the caller\n // needs it — and wrong when we already presented one the server accepts on\n // other methods. In that case the refusal is a verdict on\n // `server/discover`, not on the credential, and the automatic fallback\n // should have run. Do it here: skip the probe and `initialize` directly,\n // the escape hatch the SDK documents for a server known to be legacy. If\n // the credential really is bad, that connect fails on its own and surfaces\n // the server's 401.\n if (isNegotiationAuthFailure(error) && !skipProbe && presentedStaticCredential(authHeaders, options.authProvider)) {\n return createNegotiatedClient(cacheKey, options, authHeaders, useCachedDiscovery, true);\n }\n throw error;\n }\n}\n\nasync function getOrCreateModernConnection(\n cacheKey: string,\n options: ModernConnectionOptions,\n authHeaders: Record<string, string>\n): Promise<Client> {\n const cached = getCachedConnection(cacheKey);\n if (cached) return cached;\n\n const pending = pendingModernConnections.get(cacheKey);\n if (pending) return pending;\n\n const generation = connectionGeneration;\n const promise = createNegotiatedClient(cacheKey, options, authHeaders)\n .then(async client => {\n if (\n (client.getProtocolEra() === 'modern' || options.handleLegacy === true) &&\n generation === connectionGeneration\n ) {\n modernConnections.set(cacheKey, client);\n registerMCPConnectionScopeCleanup('modern', cacheKey, async () => {\n if (modernConnections.get(cacheKey) !== client) return;\n modernConnections.delete(cacheKey);\n legacyConnectionExpiresAt.delete(cacheKey);\n modernDiscoveries.delete(cacheKey);\n await closeModernClient(client);\n });\n if (client.getProtocolEra() === 'legacy') {\n legacyConnectionExpiresAt.set(cacheKey, Date.now() + LEGACY_CLASSIFICATION_TTL_MS);\n } else {\n legacyConnectionExpiresAt.delete(cacheKey);\n }\n evictLeastRecentlyUsed();\n } else if (generation !== connectionGeneration) {\n await closeModernClient(client).catch(() => {});\n throw new Error('MCP connection completed after connection teardown');\n }\n return client;\n })\n .finally(() => {\n if (pendingModernConnections.get(cacheKey) === promise) pendingModernConnections.delete(cacheKey);\n });\n pendingModernConnections.set(cacheKey, promise);\n registerMCPConnectionScopePending(promise);\n return promise;\n}\n\nasync function callOnModernClient(\n client: Client,\n toolName: string,\n args: Record<string, unknown>,\n signal?: AbortSignal,\n requestTimeoutMs?: number\n): Promise<CallToolResponse> {\n const resolvedRequestTimeoutMs = resolveClientRequestTimeoutMs(requestTimeoutMs);\n return (await client.callTool(\n { name: toolName, arguments: args },\n {\n ...(signal && { signal }),\n ...(resolvedRequestTimeoutMs !== undefined && { timeout: resolvedRequestTimeoutMs }),\n }\n )) as CallToolResponse;\n}\n\nasync function attemptModernCall(\n options: ModernConnectionOptions,\n toolName: string,\n args: Record<string, unknown>\n): Promise<ModernMCPAttempt> {\n const authHeaders = buildAuthHeaders(options.authToken, options.customHeaders, options.authProvider);\n const cacheKey = connectionCacheKey(\n options.agentUrl,\n authHeaders,\n options.signingContext?.cacheKey,\n options.authProvider,\n options.fetchFn,\n options.signal,\n options.requestTimeoutMs,\n options.handleLegacy,\n options.allowPrivateIp\n );\n if (isKnownLegacy(cacheKey)) return { handled: false };\n\n const guardedConnection =\n options.signal !== undefined || options.requestTimeoutMs !== undefined || options.fetchFn !== undefined;\n const oneShot = guardedConnection && currentMCPConnectionScopeKey() === undefined;\n let client: Client;\n let callSucceeded = false;\n try {\n client = oneShot\n ? await createNegotiatedClient(cacheKey, options, authHeaders)\n : await getOrCreateModernConnection(cacheKey, options, authHeaders);\n } catch (error) {\n const status = httpStatusOf(error);\n if (status === 404 || status === 405) {\n markKnownLegacy(cacheKey);\n options.debugLogs.push({\n type: 'info',\n message: `MCP: Modern Streamable HTTP is unavailable (HTTP ${status}); preserving the v1 transport path`,\n timestamp: new Date().toISOString(),\n });\n return { handled: false };\n }\n if (isLegacyEraNegotiationFailure(error, status)) {\n markKnownLegacy(cacheKey);\n options.debugLogs.push({\n type: 'info',\n message: `MCP: Era negotiation failed for ${toolName}; preserving the v1 transport path`,\n timestamp: new Date().toISOString(),\n });\n return { handled: false };\n }\n throw error;\n }\n\n if (client.getProtocolEra() !== 'modern') {\n if (options.handleLegacy === true) {\n options.debugLogs.push({\n type: 'info',\n message: `MCP: v2 client selected the legacy protocol era for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n } else {\n markKnownLegacy(cacheKey);\n try {\n await closeModernClient(client);\n } catch {\n /* ignore close errors */\n }\n options.debugLogs.push({\n type: 'info',\n message: `MCP: Server selected the legacy protocol era for ${toolName}; preserving the v1 Tasks path`,\n timestamp: new Date().toISOString(),\n });\n return { handled: false };\n }\n }\n\n options.debugLogs.push({\n type: 'success',\n message: `MCP: Negotiated protocol ${client.getNegotiatedProtocolVersion()} for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n\n try {\n const response = await callOnModernClient(client, toolName, args, options.signal, options.requestTimeoutMs);\n callSucceeded = true;\n return { handled: true, response };\n } catch (error) {\n // A tool request may have reached the server even when its response was\n // lost. Never replay automatically: mutating AdCP tools depend on the\n // caller's explicit idempotency policy, not transport guesswork.\n modernConnections.delete(cacheKey);\n legacyConnectionExpiresAt.delete(cacheKey);\n modernDiscoveries.delete(cacheKey);\n try {\n await closeModernClient(client, !isAbortOrTimeoutError(error));\n } catch {\n /* ignore close errors */\n }\n throw error;\n } finally {\n if (oneShot && client && callSucceeded) await closeModernClient(client).catch(() => {});\n }\n}\n\n/**\n * Try a tool call using the MCP 2026-07-28 protocol era.\n *\n * `handled: false` means the caller must use the existing v1 client. This is\n * deliberately a result rather than an exception because legacy negotiation\n * is normal during the transition window.\n */\nexport async function tryCallModernMCPTool(\n agentUrl: string,\n toolName: string,\n args: Record<string, unknown>,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n customHeaders?: Record<string, string>,\n options: ModernMCPConnectionOptions = {}\n): Promise<ModernMCPAttempt> {\n return withSpan('adcp.mcp.negotiate', { 'adcp.tool': toolName, 'http.url': agentUrl }, () =>\n signingContextStorage.run(options.signingContext, () =>\n attemptModernCall(\n {\n agentUrl,\n authToken,\n customHeaders,\n debugLogs,\n signingContext: options.signingContext,\n authProvider: options.authProvider,\n signal: options.signal,\n requestTimeoutMs: options.requestTimeoutMs,\n fetchFn: options.fetchFn,\n allowPrivateIp: options.allowPrivateIp,\n handleLegacy: options.handleLegacy,\n },\n toolName,\n args\n )\n )\n );\n}\n\n/**\n * Probe an endpoint with the official v2 client's auto negotiation.\n * `connected: false` lets endpoint discovery retain its v1 SSE fallback.\n */\nexport async function probeModernMCPConnection(\n agentUrl: string,\n authToken?: string,\n customHeaders?: Record<string, string>,\n options: ModernMCPConnectionOptions = {}\n): Promise<{ connected: boolean; era?: 'legacy' | 'modern' }> {\n const connectionOptions: ModernConnectionOptions = {\n agentUrl,\n authToken,\n customHeaders,\n debugLogs: [],\n signingContext: options.signingContext,\n authProvider: options.authProvider,\n signal: options.signal,\n requestTimeoutMs: options.requestTimeoutMs,\n fetchFn: options.fetchFn,\n allowPrivateIp: options.allowPrivateIp,\n handleLegacy: options.handleLegacy,\n };\n const authHeaders = buildAuthHeaders(authToken, customHeaders, options.authProvider);\n const cacheKey = connectionCacheKey(\n agentUrl,\n authHeaders,\n options.signingContext?.cacheKey,\n options.authProvider,\n options.fetchFn,\n options.signal,\n options.requestTimeoutMs,\n options.handleLegacy,\n options.allowPrivateIp\n );\n let client: Client | undefined;\n try {\n client = await createNegotiatedClient(cacheKey, connectionOptions, authHeaders, false);\n return { connected: true, era: client.getProtocolEra() };\n } catch (error) {\n modernDiscoveries.delete(cacheKey);\n if (is401Error(error) || isAbortOrTimeoutError(error)) throw error;\n const status = httpStatusOf(error);\n if (status === 404 || status === 405) return { connected: false };\n if (isLegacyEraNegotiationFailure(error, status)) return { connected: false };\n throw error;\n } finally {\n if (client) await closeModernClient(client).catch(() => {});\n }\n}\n\n/** List tools when the endpoint selected the modern era; otherwise let the v1 caller continue. */\nexport async function tryListModernMCPTools(\n agentUrl: string,\n authToken?: string,\n customHeaders?: Record<string, string>,\n options: ModernMCPConnectionOptions = {}\n): Promise<ModernMCPListAttempt> {\n const connectionOptions: ModernConnectionOptions = {\n agentUrl,\n authToken,\n customHeaders,\n debugLogs: [],\n signingContext: options.signingContext,\n authProvider: options.authProvider,\n signal: options.signal,\n requestTimeoutMs: options.requestTimeoutMs,\n fetchFn: options.fetchFn,\n allowPrivateIp: options.allowPrivateIp,\n };\n const authHeaders = buildAuthHeaders(authToken, customHeaders, options.authProvider);\n const cacheKey = connectionCacheKey(\n agentUrl,\n authHeaders,\n options.signingContext?.cacheKey,\n options.authProvider,\n options.fetchFn,\n options.signal,\n options.requestTimeoutMs,\n options.handleLegacy,\n options.allowPrivateIp\n );\n let client: Client | undefined;\n const listTools = async (connectedClient: Client): Promise<ModernMCPListAttempt> => {\n if (connectedClient.getProtocolEra() !== 'modern') return { handled: false };\n const resolvedRequestTimeoutMs = resolveClientRequestTimeoutMs(options.requestTimeoutMs);\n const result = await connectedClient.listTools(undefined, {\n ...(options.signal && { signal: options.signal }),\n ...(resolvedRequestTimeoutMs !== undefined && { timeout: resolvedRequestTimeoutMs }),\n });\n return { handled: true, tools: result.tools };\n };\n try {\n client = await createNegotiatedClient(cacheKey, connectionOptions, authHeaders);\n return await listTools(client);\n } catch (error) {\n let failure = error;\n modernDiscoveries.delete(cacheKey);\n if (!is401Error(failure) && !isAbortOrTimeoutError(failure) && client && clientsUsingCachedDiscovery.has(client)) {\n await closeModernClient(client, false).catch(() => {});\n try {\n client = await createNegotiatedClient(cacheKey, connectionOptions, authHeaders, false);\n return await listTools(client);\n } catch (retryError) {\n failure = retryError;\n modernDiscoveries.delete(cacheKey);\n }\n }\n if (is401Error(failure) || isAbortOrTimeoutError(failure)) throw failure;\n const status = httpStatusOf(failure);\n if (status === 404 || status === 405) return { handled: false };\n if (isLegacyEraNegotiationFailure(failure, status)) return { handled: false };\n throw failure;\n } finally {\n if (client) await closeModernClient(client).catch(() => {});\n }\n}\n\nexport async function closeModernMCPConnections(): Promise<void> {\n connectionGeneration++;\n const pending = [...pendingModernConnections.values()];\n pendingModernConnections.clear();\n const settled = await Promise.allSettled(pending);\n const clients = new Set(modernConnections.values());\n for (const result of settled) {\n if (result.status === 'fulfilled') clients.add(result.value);\n }\n modernConnections.clear();\n legacyConnectionExpiresAt.clear();\n knownLegacyConnections.clear();\n modernDiscoveries.clear();\n for (const client of clients) {\n try {\n await closeModernClient(client);\n } catch {\n /* ignore close errors */\n }\n }\n}\n"],"mappings":"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","names":["import_client"]}
|
|
@@ -217,7 +217,9 @@ async function createNegotiatedClient(cacheKey, options, authHeaders, useCachedD
|
|
|
217
217
|
const clientRequestTimeoutMs = resolveClientRequestTimeoutMs(options.requestTimeoutMs);
|
|
218
218
|
const rawNetworkFetch = createAgentTransportFetch(options.agentUrl, {
|
|
219
219
|
trustedFetchFn: options.fetchFn,
|
|
220
|
-
allowPrivateIp: options.allowPrivateIp
|
|
220
|
+
allowPrivateIp: options.allowPrivateIp,
|
|
221
|
+
originBoundHeaders: Object.keys(options.customHeaders ?? {}),
|
|
222
|
+
crossOriginCredentialPolicy: "strip"
|
|
221
223
|
});
|
|
222
224
|
const networkFetch = (input, init) => withAbortSignal([init?.signal], requestTimeoutMs, (signal) => rawNetworkFetch(input, { ...init, signal }));
|
|
223
225
|
const diagnosticFetch = wrapFetchWithTransportDiagnostics(wrapFetchWithSizeLimit(networkFetch));
|