alibabacloud-agentcore-sdk 0.1.2 → 0.1.4

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.
Files changed (165) hide show
  1. package/README.md +15 -2
  2. package/dist/auth/index.cjs +6 -7
  3. package/dist/auth/index.cjs.map +1 -1
  4. package/dist/auth/index.js +5 -6
  5. package/dist/{chunk-RZNQGEGJ.cjs → chunk-25KH5XKG.cjs} +6 -6
  6. package/dist/{chunk-RZNQGEGJ.cjs.map → chunk-25KH5XKG.cjs.map} +1 -1
  7. package/dist/{chunk-A3WMLVJC.cjs → chunk-2TRT7RSV.cjs} +5 -7
  8. package/dist/chunk-2TRT7RSV.cjs.map +1 -0
  9. package/dist/{chunk-K3TE7625.js → chunk-3JXIMUUY.js} +2 -2
  10. package/dist/{chunk-UWPKFJYM.js → chunk-45S6S5WI.js} +13 -11
  11. package/dist/chunk-45S6S5WI.js.map +1 -0
  12. package/dist/{chunk-TWEO5XVM.cjs → chunk-5S55CTNM.cjs} +18 -20
  13. package/dist/chunk-5S55CTNM.cjs.map +1 -0
  14. package/dist/{chunk-JW62DVIC.js → chunk-5UQIUMSF.js} +3 -5
  15. package/dist/{chunk-JW62DVIC.js.map → chunk-5UQIUMSF.js.map} +1 -1
  16. package/dist/{chunk-ZWQBAJ5O.js → chunk-6NNPSP3O.js} +2 -2
  17. package/dist/{chunk-IUCLCPVV.js → chunk-76NTQYJB.js} +3 -3
  18. package/dist/{chunk-7Y263YIW.js → chunk-7AJ2V7RN.js} +5 -7
  19. package/dist/{chunk-7Y263YIW.js.map → chunk-7AJ2V7RN.js.map} +1 -1
  20. package/dist/{chunk-5ZOLHQXO.js → chunk-7UBN3SJI.js} +7 -9
  21. package/dist/{chunk-5ZOLHQXO.js.map → chunk-7UBN3SJI.js.map} +1 -1
  22. package/dist/{chunk-MZ5UWGXS.js → chunk-AEQ76QIO.js} +33 -5
  23. package/dist/chunk-AEQ76QIO.js.map +1 -0
  24. package/dist/{chunk-UBP5CHU7.js → chunk-AX3NM2DK.js} +5 -7
  25. package/dist/{chunk-UBP5CHU7.js.map → chunk-AX3NM2DK.js.map} +1 -1
  26. package/dist/{chunk-55XZZRKO.js → chunk-D45QSOR4.js} +4 -6
  27. package/dist/{chunk-55XZZRKO.js.map → chunk-D45QSOR4.js.map} +1 -1
  28. package/dist/{chunk-MICRSJ6R.js → chunk-EKLTJ65H.js} +2 -2
  29. package/dist/{chunk-RBAY4MO2.js → chunk-FG7K3EF7.js} +6 -8
  30. package/dist/{chunk-RBAY4MO2.js.map → chunk-FG7K3EF7.js.map} +1 -1
  31. package/dist/{chunk-PKYET77D.cjs → chunk-JK6KPDVW.cjs} +39 -41
  32. package/dist/chunk-JK6KPDVW.cjs.map +1 -0
  33. package/dist/{chunk-2E5EWEDG.cjs → chunk-KQTZUIMI.cjs} +10 -12
  34. package/dist/chunk-KQTZUIMI.cjs.map +1 -0
  35. package/dist/{chunk-ZLKYXRNM.js → chunk-KTKZCLYB.js} +3 -5
  36. package/dist/{chunk-ZLKYXRNM.js.map → chunk-KTKZCLYB.js.map} +1 -1
  37. package/dist/{chunk-RHY7Y43E.js → chunk-L74ASQWF.js} +8 -9
  38. package/dist/chunk-L74ASQWF.js.map +1 -0
  39. package/dist/{chunk-S7PWSJNP.cjs → chunk-LQM754U3.cjs} +5 -5
  40. package/dist/{chunk-S7PWSJNP.cjs.map → chunk-LQM754U3.cjs.map} +1 -1
  41. package/dist/{chunk-GYLT23D3.js → chunk-NI3U6RZL.js} +5 -5
  42. package/dist/{chunk-5JXA7JPS.js → chunk-NRYDUATX.js} +2 -2
  43. package/dist/{chunk-A3PF2SPD.cjs → chunk-NWWTBPYG.cjs} +5 -5
  44. package/dist/{chunk-A3PF2SPD.cjs.map → chunk-NWWTBPYG.cjs.map} +1 -1
  45. package/dist/{chunk-5RKN46UU.cjs → chunk-NXMTTQQK.cjs} +15 -15
  46. package/dist/{chunk-5RKN46UU.cjs.map → chunk-NXMTTQQK.cjs.map} +1 -1
  47. package/dist/{chunk-IF7LMBXC.js → chunk-PHVKSATD.js} +60 -16
  48. package/dist/chunk-PHVKSATD.js.map +1 -0
  49. package/dist/{chunk-RYXL25AI.js → chunk-PS3EAUMK.js} +2 -2
  50. package/dist/{chunk-ULJTQSLE.cjs → chunk-R7NVBTPK.cjs} +3 -3
  51. package/dist/{chunk-ULJTQSLE.cjs.map → chunk-R7NVBTPK.cjs.map} +1 -1
  52. package/dist/{chunk-YZP55W7S.cjs → chunk-RJCDBVZ6.cjs} +3 -3
  53. package/dist/{chunk-YZP55W7S.cjs.map → chunk-RJCDBVZ6.cjs.map} +1 -1
  54. package/dist/{chunk-LXHW6OT4.cjs → chunk-T26WN7TD.cjs} +19 -17
  55. package/dist/chunk-T26WN7TD.cjs.map +1 -0
  56. package/dist/{chunk-ZTWLCHCO.cjs → chunk-UKRJR66Y.cjs} +24 -26
  57. package/dist/chunk-UKRJR66Y.cjs.map +1 -0
  58. package/dist/{chunk-MWAHO47B.cjs → chunk-UMTUXOKE.cjs} +25 -27
  59. package/dist/chunk-UMTUXOKE.cjs.map +1 -0
  60. package/dist/{chunk-JSP7ZROS.cjs → chunk-V4A6MJ42.cjs} +36 -8
  61. package/dist/chunk-V4A6MJ42.cjs.map +1 -0
  62. package/dist/{chunk-BVZ7H2F5.cjs → chunk-VYOJJECB.cjs} +55 -56
  63. package/dist/chunk-VYOJJECB.cjs.map +1 -0
  64. package/dist/{chunk-ZLQ2IBTC.cjs → chunk-WRRIPTJP.cjs} +12 -12
  65. package/dist/{chunk-ZLQ2IBTC.cjs.map → chunk-WRRIPTJP.cjs.map} +1 -1
  66. package/dist/{chunk-QIZO3A4Y.cjs → chunk-ZIXZWQSP.cjs} +85 -41
  67. package/dist/chunk-ZIXZWQSP.cjs.map +1 -0
  68. package/dist/{chunk-RQRI6RCG.cjs → chunk-ZXPTDLXJ.cjs} +12 -14
  69. package/dist/chunk-ZXPTDLXJ.cjs.map +1 -0
  70. package/dist/collaboration/index.cjs +3 -3
  71. package/dist/collaboration/index.d.cts +2 -2
  72. package/dist/collaboration/index.d.ts +2 -2
  73. package/dist/collaboration/index.js +2 -2
  74. package/dist/controlplane/index.cjs +7 -8
  75. package/dist/controlplane/index.cjs.map +1 -1
  76. package/dist/controlplane/index.js +6 -7
  77. package/dist/{errors-D9OtcR-o.d.cts → errors-BGfCbCgs.d.cts} +4 -1
  78. package/dist/{errors-BjGO6N10.d.ts → errors-D_809AqR.d.ts} +4 -1
  79. package/dist/{google-adk-model-N47R7GB2.js → google-adk-model-V7SC6RQD.js} +3 -3
  80. package/dist/{google-adk-model-PDBKY5YZ.cjs → google-adk-model-WYWEQI4R.cjs} +13 -13
  81. package/dist/{google-adk-model-PDBKY5YZ.cjs.map → google-adk-model-WYWEQI4R.cjs.map} +1 -1
  82. package/dist/index.cjs +33 -35
  83. package/dist/index.cjs.map +1 -1
  84. package/dist/index.d.cts +2 -2
  85. package/dist/index.d.ts +2 -2
  86. package/dist/index.js +15 -17
  87. package/dist/index.js.map +1 -1
  88. package/dist/integrations/ai-sdk.cjs +3 -3
  89. package/dist/integrations/ai-sdk.js +2 -2
  90. package/dist/integrations/google-adk.cjs +14 -15
  91. package/dist/integrations/google-adk.cjs.map +1 -1
  92. package/dist/integrations/google-adk.js +10 -11
  93. package/dist/integrations/google-adk.js.map +1 -1
  94. package/dist/integrations/langchain.cjs +18 -19
  95. package/dist/integrations/langchain.cjs.map +1 -1
  96. package/dist/integrations/langchain.d.cts +3 -2
  97. package/dist/integrations/langchain.d.ts +3 -2
  98. package/dist/integrations/langchain.js +11 -12
  99. package/dist/integrations/langchain.js.map +1 -1
  100. package/dist/integrations/langgraph.cjs +10 -11
  101. package/dist/integrations/langgraph.cjs.map +1 -1
  102. package/dist/integrations/langgraph.d.cts +3 -2
  103. package/dist/integrations/langgraph.d.ts +3 -2
  104. package/dist/integrations/langgraph.js +9 -10
  105. package/dist/integrations/mastra.cjs +14 -15
  106. package/dist/integrations/mastra.cjs.map +1 -1
  107. package/dist/integrations/mastra.js +8 -9
  108. package/dist/integrations/mastra.js.map +1 -1
  109. package/dist/{langchain-adapter-DJsyjm5V.d.ts → langchain-adapter-CaTCXaeo.d.ts} +4 -2
  110. package/dist/{langchain-adapter-DFJdEX04.d.cts → langchain-adapter-DtxU7oAi.d.cts} +4 -2
  111. package/dist/{langchain-provider-PHL4UWNF.js → langchain-provider-JFWLKOGL.js} +26 -2
  112. package/dist/langchain-provider-JFWLKOGL.js.map +1 -0
  113. package/dist/{langchain-provider-NF5GIDQV.cjs → langchain-provider-UKO27CQA.cjs} +38 -14
  114. package/dist/langchain-provider-UKO27CQA.cjs.map +1 -0
  115. package/dist/mcp/index.cjs +3 -4
  116. package/dist/mcp/index.cjs.map +1 -1
  117. package/dist/mcp/index.js +2 -3
  118. package/dist/memory/index.cjs +6 -7
  119. package/dist/memory/index.cjs.map +1 -1
  120. package/dist/memory/index.d.cts +24 -2
  121. package/dist/memory/index.d.ts +24 -2
  122. package/dist/memory/index.js +5 -6
  123. package/dist/model/index.cjs +4 -5
  124. package/dist/model/index.cjs.map +1 -1
  125. package/dist/model/index.js +3 -4
  126. package/dist/runtime/index.cjs +7 -8
  127. package/dist/runtime/index.cjs.map +1 -1
  128. package/dist/runtime/index.js +6 -7
  129. package/dist/server/index.cjs +13 -15
  130. package/dist/server/index.cjs.map +1 -1
  131. package/dist/server/index.js +5 -7
  132. package/dist/server/index.js.map +1 -1
  133. package/dist/skill/index.cjs +4 -5
  134. package/dist/skill/index.cjs.map +1 -1
  135. package/dist/skill/index.js +3 -4
  136. package/package.json +1 -1
  137. package/dist/chunk-2E5EWEDG.cjs.map +0 -1
  138. package/dist/chunk-A3WMLVJC.cjs.map +0 -1
  139. package/dist/chunk-BVZ7H2F5.cjs.map +0 -1
  140. package/dist/chunk-IF7LMBXC.js.map +0 -1
  141. package/dist/chunk-JSP7ZROS.cjs.map +0 -1
  142. package/dist/chunk-LE5P3SJW.cjs +0 -16
  143. package/dist/chunk-LE5P3SJW.cjs.map +0 -1
  144. package/dist/chunk-LXHW6OT4.cjs.map +0 -1
  145. package/dist/chunk-MWAHO47B.cjs.map +0 -1
  146. package/dist/chunk-MZ5UWGXS.js.map +0 -1
  147. package/dist/chunk-NZL3VPJ2.js +0 -16
  148. package/dist/chunk-NZL3VPJ2.js.map +0 -1
  149. package/dist/chunk-PKYET77D.cjs.map +0 -1
  150. package/dist/chunk-QIZO3A4Y.cjs.map +0 -1
  151. package/dist/chunk-RHY7Y43E.js.map +0 -1
  152. package/dist/chunk-RQRI6RCG.cjs.map +0 -1
  153. package/dist/chunk-TWEO5XVM.cjs.map +0 -1
  154. package/dist/chunk-UWPKFJYM.js.map +0 -1
  155. package/dist/chunk-ZTWLCHCO.cjs.map +0 -1
  156. package/dist/langchain-provider-NF5GIDQV.cjs.map +0 -1
  157. package/dist/langchain-provider-PHL4UWNF.js.map +0 -1
  158. /package/dist/{chunk-K3TE7625.js.map → chunk-3JXIMUUY.js.map} +0 -0
  159. /package/dist/{chunk-ZWQBAJ5O.js.map → chunk-6NNPSP3O.js.map} +0 -0
  160. /package/dist/{chunk-IUCLCPVV.js.map → chunk-76NTQYJB.js.map} +0 -0
  161. /package/dist/{chunk-MICRSJ6R.js.map → chunk-EKLTJ65H.js.map} +0 -0
  162. /package/dist/{chunk-GYLT23D3.js.map → chunk-NI3U6RZL.js.map} +0 -0
  163. /package/dist/{chunk-5JXA7JPS.js.map → chunk-NRYDUATX.js.map} +0 -0
  164. /package/dist/{chunk-RYXL25AI.js.map → chunk-PS3EAUMK.js.map} +0 -0
  165. /package/dist/{google-adk-model-N47R7GB2.js.map → google-adk-model-V7SC6RQD.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mcp/client.ts","../src/mcp/headers.ts"],"sourcesContent":["import { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';\nimport { StdioClientTransport, type StdioServerParameters } from '@modelcontextprotocol/sdk/client/stdio.js';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport { CallToolResultSchema, McpError, ErrorCode, type CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { inspect } from 'node:util';\nimport { ConfigError } from '../errors';\nimport { nullLogger, type Logger } from '../logging';\nimport type { MCPDescriptor } from '../controlplane/client';\nimport type { AgentConfig } from '../runtime/config';\nimport type { HeadersProvider } from '../model/client';\nimport { Tool, type ToolArguments } from '../integrations/common';\nimport { mergeMCPHeaders } from './headers';\n\nexport interface MCPTimeouts { sessionMs?: number; metadataMs?: number; toolMs?: number; }\nexport interface ManagedMCPOptions extends MCPTimeouts { headers?: Readonly<Record<string, string>>; credentialName?: string; }\nexport type DirectMCPOptions = ({ url: string; transport?: 'streamable-http' | 'sse'; headersProvider?: HeadersProvider } |\n { transport: 'stdio'; server: StdioServerParameters }) & MCPTimeouts & { logger?: Logger };\nexport interface MCPCallOptions { signal?: AbortSignal; }\ninterface Session {\n client: Client;\n transport: Transport;\n abort: AbortController;\n invalid: boolean;\n active: Set<Promise<unknown>>;\n closing?: Promise<void>;\n}\n\nexport function mcpServerURL(gatewayURL: string, id: string): string {\n const gateway = gatewayURL.replace(/\\/+$/, '').replace(/\\/(?:mcp|mcp-servers)$/, '');\n return `${gateway}/mcp-servers/${encodeURIComponent(id)}`;\n}\n\nexport class MCPClient {\n readonly descriptor?: MCPDescriptor;\n private readonly logger: Logger;\n private state?: Session;\n private opening?: Promise<Session>;\n private closed = false;\n private closing?: Promise<void>;\n private readonly timeouts: Required<MCPTimeouts>;\n\n private constructor(private readonly options: DirectMCPOptions, descriptor?: MCPDescriptor) {\n this.descriptor = descriptor;\n this.logger = options.logger ?? nullLogger;\n this.timeouts = { sessionMs: options.sessionMs ?? 30_000, metadataMs: options.metadataMs ?? 60_000, toolMs: options.toolMs ?? 600_000 };\n if (Object.values(this.timeouts).some((timeout) => !Number.isFinite(timeout) || timeout <= 0)) throw new ConfigError('MCP operation timeouts must be positive');\n if (options.transport !== 'stdio') {\n let url: URL;\n try { url = new URL(options.url); } catch { throw new ConfigError('Direct MCP URL must be HTTP(S)'); }\n if (!['http:', 'https:'].includes(url.protocol)) throw new ConfigError('Direct MCP URL must be HTTP(S)');\n if (options.transport !== undefined && !['streamable-http', 'sse'].includes(options.transport)) throw new ConfigError('MCP transport must be streamable-http, sse, or stdio');\n }\n this.logger.info('agentcore.mcp.client.created', { mode: descriptor ? 'managed' : 'direct', transport: options.transport ?? 'streamable-http', url: this.safeURL });\n }\n static platform(config: AgentConfig, descriptor: MCPDescriptor, options: Omit<ManagedMCPOptions, 'credentialName'> & {\n logger?: Logger; credentialHeadersProvider?: () => Promise<Record<string, string>>;\n } = {}): MCPClient {\n const { headers: custom, credentialHeadersProvider, ...connectionOptions } = options;\n const customHeaders = mergeMCPHeaders({}, custom);\n const headers = mergeMCPHeaders(config.gatewayHeaders, custom);\n return new MCPClient({ ...connectionOptions, url: mcpServerURL(config.mcpGatewayUrl, descriptor.mcpServerId), transport: 'streamable-http', headersProvider: async () => {\n if (!credentialHeadersProvider) return headers;\n const bound = mergeMCPHeaders(config.gatewayHeaders, await credentialHeadersProvider());\n return mergeMCPHeaders(bound, customHeaders);\n } }, descriptor);\n }\n static direct(options: DirectMCPOptions): MCPClient { return new MCPClient(options); }\n\n async listTools(options: MCPCallOptions = {}): Promise<Tool[]> {\n return this.withSession('list_tools', async (session) => {\n const definitions: Awaited<ReturnType<Client['listTools']>>['tools'] = [];\n let cursor: string | undefined;\n const deadline = AbortSignal.timeout(this.timeouts.metadataMs);\n const signal = AbortSignal.any([deadline, ...(options.signal ? [options.signal] : [])]);\n do {\n const result = await session.client.listTools(cursor ? { cursor } : undefined, { signal, timeout: this.timeouts.metadataMs });\n definitions.push(...result.tools); cursor = result.nextCursor;\n } while (cursor);\n return definitions.map((definition) => new Tool({ name: definition.name, description: definition.description ?? '', parameters: definition.inputSchema,\n invoke: (arguments_) => this.callTool(definition.name, arguments_),\n }));\n });\n }\n async tools(options: MCPCallOptions = {}): Promise<Tool[]> { return this.listTools(options); }\n async callTool(name: string, arguments_: ToolArguments, options: MCPCallOptions = {}): Promise<CallToolResult> {\n return this.withSession('call_tool', (session) => session.client.callTool({ name, arguments: arguments_ }, CallToolResultSchema,\n { timeout: this.timeouts.toolMs, signal: options.signal }) as Promise<CallToolResult>);\n }\n\n close(): Promise<void> {\n if (this.closing) return this.closing;\n this.closed = true;\n this.closing = (async () => {\n if (this.opening && this.state) this.state.abort.abort();\n await this.opening?.catch(() => undefined);\n if (this.state) await this.retire(this.state);\n })();\n return this.closing;\n }\n [inspect.custom](): string { return `MCPClient(url=${this.safeURL}, <redacted>)`; }\n toJSON(): string { return this[inspect.custom](); }\n\n private get safeURL(): string {\n if (this.options.transport === 'stdio') return 'stdio';\n const url = new URL(this.options.url); return `${url.origin}${url.pathname}`;\n }\n private async acquire(): Promise<Session> {\n for (;;) {\n if (this.closed) throw new Error('MCP client is closed');\n if (this.opening) return this.opening;\n if (this.state?.invalid) { await this.retire(this.state); continue; }\n if (this.state) return this.state;\n const request = this.open(); this.opening = request;\n try { return await request; } finally { this.opening = undefined; }\n }\n }\n private async open(): Promise<Session> {\n const client = new Client({ name: 'agentcore-sdk', version: '0.1.0' });\n const abort = new AbortController();\n let transport: Transport;\n if (this.options.transport === 'stdio') transport = new StdioClientTransport(this.options.server);\n else {\n const headers = await this.options.headersProvider?.() ?? {};\n const fetch: typeof globalThis.fetch = (input, init) => globalThis.fetch(input, { ...init, redirect: 'manual', signal: AbortSignal.any([abort.signal, ...(init?.signal ? [init.signal] : [])]) });\n transport = this.options.transport === 'sse'\n ? new SSEClientTransport(new URL(this.options.url), { requestInit: { headers }, fetch })\n : new StreamableHTTPClientTransport(new URL(this.options.url), { requestInit: { headers }, fetch });\n }\n const session: Session = { client, transport, abort, invalid: false, active: new Set() };\n this.state = session;\n const timer = setTimeout(() => abort.abort(new Error('MCP session open timed out')), this.timeouts.sessionMs);\n client.onclose = () => { session.invalid = true; };\n client.onerror = (error) => {\n if (this.closed || session.closing) return;\n session.invalid = true;\n this.logger.warn('agentcore.mcp.session.error', { url: this.safeURL, errorType: error.name });\n };\n this.logger.info('agentcore.mcp.session.open.started', { url: this.safeURL, timeoutMs: this.timeouts.sessionMs });\n try {\n await client.connect(transport, { signal: abort.signal, timeout: this.timeouts.sessionMs });\n abort.signal.throwIfAborted();\n if (this.closed) throw new Error('MCP client is closed');\n this.logger.info('agentcore.mcp.session.open.succeeded', { url: this.safeURL });\n return session;\n } catch (error) { await this.retire(session); throw error; }\n finally { clearTimeout(timer); }\n }\n\n private async withSession<T>(operation: string, call: (session: Session) => Promise<T>): Promise<T> {\n const session = await this.acquire();\n if (this.closed) throw new Error('MCP client is closed');\n const request = call(session); session.active.add(request);\n this.logger.info('agentcore.mcp.request.started', { operation, url: this.safeURL });\n try { const result = await request; this.logger.info('agentcore.mcp.request.succeeded', { operation, url: this.safeURL }); return result; }\n catch (error) {\n if (!(error instanceof McpError) || [ErrorCode.ConnectionClosed, ErrorCode.RequestTimeout].includes(error.code)) session.invalid = true;\n this.logger.warn('agentcore.mcp.request.failed', { operation, url: this.safeURL, errorType: error instanceof Error ? error.name : 'unknown' });\n throw error;\n } finally { session.active.delete(request); }\n }\n private retire(session: Session): Promise<void> {\n if (session.closing) return session.closing;\n session.invalid = true;\n session.closing = (async () => {\n await Promise.allSettled([...session.active]);\n session.abort.abort();\n try { await session.client.close(); }\n catch (error) { this.logger.warn('agentcore.mcp.session.close.failed', { errorType: error instanceof Error ? error.name : 'unknown', url: this.safeURL }); }\n if (this.state === session) this.state = undefined;\n })();\n return session.closing;\n }\n}\n","import { ConfigError } from '../errors';\n\nconst transportHeaders = new Set([\n 'host', 'content-length', 'connection', 'transfer-encoding', 'upgrade',\n 'mcp-session-id', 'mcp-protocol-version', 'last-event-id', 'content-type', 'accept',\n]);\n\n/** Copy fixed headers, rejecting case-insensitive credential/transport conflicts. */\nexport function mergeMCPHeaders(base: Readonly<Record<string, string>>, custom?: Readonly<Record<string, string>>): Record<string, string> {\n const result = { ...base };\n if (custom === undefined) return result;\n if (!custom || typeof custom !== 'object' || Array.isArray(custom)) throw new ConfigError('MCP headers must be an object');\n const protectedNames = new Set([...Object.keys(base).map((name) => name.toLowerCase()), ...transportHeaders, 'authorization']);\n const seen = new Set<string>();\n for (const [name, value] of Object.entries(custom)) {\n if (!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/.test(name)) throw new ConfigError('Invalid MCP header name');\n if (typeof value !== 'string' || /[\\x00-\\x1f\\x7f]/.test(value)) throw new ConfigError('MCP header values must be strings without control characters');\n const folded = name.toLowerCase();\n if (protectedNames.has(folded)) throw new ConfigError(`MCP header is protected: ${folded}`);\n if (seen.has(folded)) throw new ConfigError(`Duplicate MCP header: ${folded}`);\n seen.add(folded);\n Object.defineProperty(result, folded, { value, enumerable: true, configurable: true, writable: true });\n }\n return result;\n}\n"],"mappings":";;;;;;;;;;;AAAA,SAAS,cAAc;AACvB,SAAS,qCAAqC;AAC9C,SAAS,0BAA0B;AACnC,SAAS,4BAAwD;AAEjE,SAAS,sBAAsB,UAAU,iBAAsC;AAC/E,SAAS,eAAe;;;ACJxB,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EAC/B;AAAA,EAAQ;AAAA,EAAkB;AAAA,EAAc;AAAA,EAAqB;AAAA,EAC7D;AAAA,EAAkB;AAAA,EAAwB;AAAA,EAAiB;AAAA,EAAgB;AAC7E,CAAC;AAGM,SAAS,gBAAgB,MAAwC,QAAmE;AACzI,QAAM,SAAS,EAAE,GAAG,KAAK;AACzB,MAAI,WAAW,OAAW,QAAO;AACjC,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,EAAG,OAAM,IAAI,YAAY,+BAA+B;AACzH,QAAM,iBAAiB,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,IAAI,EAAE,IAAI,CAAC,SAAS,KAAK,YAAY,CAAC,GAAG,GAAG,kBAAkB,eAAe,CAAC;AAC7H,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAClD,QAAI,CAAC,gCAAgC,KAAK,IAAI,EAAG,OAAM,IAAI,YAAY,yBAAyB;AAChG,QAAI,OAAO,UAAU,YAAY,kBAAkB,KAAK,KAAK,EAAG,OAAM,IAAI,YAAY,8DAA8D;AACpJ,UAAM,SAAS,KAAK,YAAY;AAChC,QAAI,eAAe,IAAI,MAAM,EAAG,OAAM,IAAI,YAAY,4BAA4B,MAAM,EAAE;AAC1F,QAAI,KAAK,IAAI,MAAM,EAAG,OAAM,IAAI,YAAY,yBAAyB,MAAM,EAAE;AAC7E,SAAK,IAAI,MAAM;AACf,WAAO,eAAe,QAAQ,QAAQ,EAAE,OAAO,YAAY,MAAM,cAAc,MAAM,UAAU,KAAK,CAAC;AAAA,EACvG;AACA,SAAO;AACT;;;ADKO,SAAS,aAAa,YAAoB,IAAoB;AACnE,QAAM,UAAU,WAAW,QAAQ,QAAQ,EAAE,EAAE,QAAQ,0BAA0B,EAAE;AACnF,SAAO,GAAG,OAAO,gBAAgB,mBAAmB,EAAE,CAAC;AACzD;AAEO,IAAM,YAAN,MAAM,WAAU;AAAA,EASb,YAA6B,SAA2B,YAA4B;AAAvD;AACnC,SAAK,aAAa;AAClB,SAAK,SAAS,QAAQ,UAAU;AAChC,SAAK,WAAW,EAAE,WAAW,QAAQ,aAAa,KAAQ,YAAY,QAAQ,cAAc,KAAQ,QAAQ,QAAQ,UAAU,IAAQ;AACtI,QAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC,OAAO,SAAS,OAAO,KAAK,WAAW,CAAC,EAAG,OAAM,IAAI,YAAY,yCAAyC;AAC9J,QAAI,QAAQ,cAAc,SAAS;AACjC,UAAI;AACJ,UAAI;AAAE,cAAM,IAAI,IAAI,QAAQ,GAAG;AAAA,MAAG,QAAQ;AAAE,cAAM,IAAI,YAAY,gCAAgC;AAAA,MAAG;AACrG,UAAI,CAAC,CAAC,SAAS,QAAQ,EAAE,SAAS,IAAI,QAAQ,EAAG,OAAM,IAAI,YAAY,gCAAgC;AACvG,UAAI,QAAQ,cAAc,UAAa,CAAC,CAAC,mBAAmB,KAAK,EAAE,SAAS,QAAQ,SAAS,EAAG,OAAM,IAAI,YAAY,sDAAsD;AAAA,IAC9K;AACA,SAAK,OAAO,KAAK,gCAAgC,EAAE,MAAM,aAAa,YAAY,UAAU,WAAW,QAAQ,aAAa,mBAAmB,KAAK,KAAK,QAAQ,CAAC;AAAA,EACpK;AAAA,EAZqC;AAAA,EAR5B;AAAA,EACQ;AAAA,EACT;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACS;AAAA,EAejB,OAAO,SAAS,QAAqB,YAA2B,UAE5D,CAAC,GAAc;AACjB,UAAM,EAAE,SAAS,QAAQ,2BAA2B,GAAG,kBAAkB,IAAI;AAC7E,UAAM,gBAAgB,gBAAgB,CAAC,GAAG,MAAM;AAChD,UAAM,UAAU,gBAAgB,OAAO,gBAAgB,MAAM;AAC7D,WAAO,IAAI,WAAU,EAAE,GAAG,mBAAmB,KAAK,aAAa,OAAO,eAAe,WAAW,WAAW,GAAG,WAAW,mBAAmB,iBAAiB,YAAY;AACvK,UAAI,CAAC,0BAA2B,QAAO;AACvC,YAAM,QAAQ,gBAAgB,OAAO,gBAAgB,MAAM,0BAA0B,CAAC;AACtF,aAAO,gBAAgB,OAAO,aAAa;AAAA,IAC7C,EAAE,GAAG,UAAU;AAAA,EACjB;AAAA,EACA,OAAO,OAAO,SAAsC;AAAE,WAAO,IAAI,WAAU,OAAO;AAAA,EAAG;AAAA,EAErF,MAAM,UAAU,UAA0B,CAAC,GAAoB;AAC7D,WAAO,KAAK,YAAY,cAAc,OAAO,YAAY;AACvD,YAAM,cAAiE,CAAC;AACxE,UAAI;AACJ,YAAM,WAAW,YAAY,QAAQ,KAAK,SAAS,UAAU;AAC7D,YAAM,SAAS,YAAY,IAAI,CAAC,UAAU,GAAI,QAAQ,SAAS,CAAC,QAAQ,MAAM,IAAI,CAAC,CAAE,CAAC;AACtF,SAAG;AACD,cAAM,SAAS,MAAM,QAAQ,OAAO,UAAU,SAAS,EAAE,OAAO,IAAI,QAAW,EAAE,QAAQ,SAAS,KAAK,SAAS,WAAW,CAAC;AAC5H,oBAAY,KAAK,GAAG,OAAO,KAAK;AAAG,iBAAS,OAAO;AAAA,MACrD,SAAS;AACT,aAAO,YAAY,IAAI,CAAC,eAAe,IAAI,KAAK;AAAA,QAAE,MAAM,WAAW;AAAA,QAAM,aAAa,WAAW,eAAe;AAAA,QAAI,YAAY,WAAW;AAAA,QACzI,QAAQ,CAAC,eAAe,KAAK,SAAS,WAAW,MAAM,UAAU;AAAA,MACnE,CAAC,CAAC;AAAA,IACJ,CAAC;AAAA,EACH;AAAA,EACA,MAAM,MAAM,UAA0B,CAAC,GAAoB;AAAE,WAAO,KAAK,UAAU,OAAO;AAAA,EAAG;AAAA,EAC7F,MAAM,SAAS,MAAc,YAA2B,UAA0B,CAAC,GAA4B;AAC7G,WAAO,KAAK,YAAY,aAAa,CAAC,YAAY,QAAQ,OAAO;AAAA,MAAS,EAAE,MAAM,WAAW,WAAW;AAAA,MAAG;AAAA,MACzG,EAAE,SAAS,KAAK,SAAS,QAAQ,QAAQ,QAAQ,OAAO;AAAA,IAAC,CAA4B;AAAA,EACzF;AAAA,EAEA,QAAuB;AACrB,QAAI,KAAK,QAAS,QAAO,KAAK;AAC9B,SAAK,SAAS;AACd,SAAK,WAAW,YAAY;AAC1B,UAAI,KAAK,WAAW,KAAK,MAAO,MAAK,MAAM,MAAM,MAAM;AACvD,YAAM,KAAK,SAAS,MAAM,MAAM,MAAS;AACzC,UAAI,KAAK,MAAO,OAAM,KAAK,OAAO,KAAK,KAAK;AAAA,IAC9C,GAAG;AACH,WAAO,KAAK;AAAA,EACd;AAAA,EACA,CAAC,QAAQ,MAAM,IAAY;AAAE,WAAO,iBAAiB,KAAK,OAAO;AAAA,EAAiB;AAAA,EAClF,SAAiB;AAAE,WAAO,KAAK,QAAQ,MAAM,EAAE;AAAA,EAAG;AAAA,EAElD,IAAY,UAAkB;AAC5B,QAAI,KAAK,QAAQ,cAAc,QAAS,QAAO;AAC/C,UAAM,MAAM,IAAI,IAAI,KAAK,QAAQ,GAAG;AAAG,WAAO,GAAG,IAAI,MAAM,GAAG,IAAI,QAAQ;AAAA,EAC5E;AAAA,EACA,MAAc,UAA4B;AACxC,eAAS;AACP,UAAI,KAAK,OAAQ,OAAM,IAAI,MAAM,sBAAsB;AACvD,UAAI,KAAK,QAAS,QAAO,KAAK;AAC9B,UAAI,KAAK,OAAO,SAAS;AAAE,cAAM,KAAK,OAAO,KAAK,KAAK;AAAG;AAAA,MAAU;AACpE,UAAI,KAAK,MAAO,QAAO,KAAK;AAC5B,YAAM,UAAU,KAAK,KAAK;AAAG,WAAK,UAAU;AAC5C,UAAI;AAAE,eAAO,MAAM;AAAA,MAAS,UAAE;AAAU,aAAK,UAAU;AAAA,MAAW;AAAA,IACpE;AAAA,EACF;AAAA,EACA,MAAc,OAAyB;AACrC,UAAM,SAAS,IAAI,OAAO,EAAE,MAAM,iBAAiB,SAAS,QAAQ,CAAC;AACrE,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI;AACJ,QAAI,KAAK,QAAQ,cAAc,QAAS,aAAY,IAAI,qBAAqB,KAAK,QAAQ,MAAM;AAAA,SAC3F;AACH,YAAM,UAAU,MAAM,KAAK,QAAQ,kBAAkB,KAAK,CAAC;AAC3D,YAAM,QAAiC,CAAC,OAAO,SAAS,WAAW,MAAM,OAAO,EAAE,GAAG,MAAM,UAAU,UAAU,QAAQ,YAAY,IAAI,CAAC,MAAM,QAAQ,GAAI,MAAM,SAAS,CAAC,KAAK,MAAM,IAAI,CAAC,CAAE,CAAC,EAAE,CAAC;AAChM,kBAAY,KAAK,QAAQ,cAAc,QACnC,IAAI,mBAAmB,IAAI,IAAI,KAAK,QAAQ,GAAG,GAAG,EAAE,aAAa,EAAE,QAAQ,GAAG,MAAM,CAAC,IACrF,IAAI,8BAA8B,IAAI,IAAI,KAAK,QAAQ,GAAG,GAAG,EAAE,aAAa,EAAE,QAAQ,GAAG,MAAM,CAAC;AAAA,IACtG;AACA,UAAM,UAAmB,EAAE,QAAQ,WAAW,OAAO,SAAS,OAAO,QAAQ,oBAAI,IAAI,EAAE;AACvF,SAAK,QAAQ;AACb,UAAM,QAAQ,WAAW,MAAM,MAAM,MAAM,IAAI,MAAM,4BAA4B,CAAC,GAAG,KAAK,SAAS,SAAS;AAC5G,WAAO,UAAU,MAAM;AAAE,cAAQ,UAAU;AAAA,IAAM;AACjD,WAAO,UAAU,CAAC,UAAU;AAC1B,UAAI,KAAK,UAAU,QAAQ,QAAS;AACpC,cAAQ,UAAU;AAClB,WAAK,OAAO,KAAK,+BAA+B,EAAE,KAAK,KAAK,SAAS,WAAW,MAAM,KAAK,CAAC;AAAA,IAC9F;AACA,SAAK,OAAO,KAAK,sCAAsC,EAAE,KAAK,KAAK,SAAS,WAAW,KAAK,SAAS,UAAU,CAAC;AAChH,QAAI;AACF,YAAM,OAAO,QAAQ,WAAW,EAAE,QAAQ,MAAM,QAAQ,SAAS,KAAK,SAAS,UAAU,CAAC;AAC1F,YAAM,OAAO,eAAe;AAC5B,UAAI,KAAK,OAAQ,OAAM,IAAI,MAAM,sBAAsB;AACvD,WAAK,OAAO,KAAK,wCAAwC,EAAE,KAAK,KAAK,QAAQ,CAAC;AAC9E,aAAO;AAAA,IACT,SAAS,OAAO;AAAE,YAAM,KAAK,OAAO,OAAO;AAAG,YAAM;AAAA,IAAO,UAC3D;AAAU,mBAAa,KAAK;AAAA,IAAG;AAAA,EACjC;AAAA,EAEA,MAAc,YAAe,WAAmB,MAAoD;AAClG,UAAM,UAAU,MAAM,KAAK,QAAQ;AACnC,QAAI,KAAK,OAAQ,OAAM,IAAI,MAAM,sBAAsB;AACvD,UAAM,UAAU,KAAK,OAAO;AAAG,YAAQ,OAAO,IAAI,OAAO;AACzD,SAAK,OAAO,KAAK,iCAAiC,EAAE,WAAW,KAAK,KAAK,QAAQ,CAAC;AAClF,QAAI;AAAE,YAAM,SAAS,MAAM;AAAS,WAAK,OAAO,KAAK,mCAAmC,EAAE,WAAW,KAAK,KAAK,QAAQ,CAAC;AAAG,aAAO;AAAA,IAAQ,SACnI,OAAO;AACZ,UAAI,EAAE,iBAAiB,aAAa,CAAC,UAAU,kBAAkB,UAAU,cAAc,EAAE,SAAS,MAAM,IAAI,EAAG,SAAQ,UAAU;AACnI,WAAK,OAAO,KAAK,gCAAgC,EAAE,WAAW,KAAK,KAAK,SAAS,WAAW,iBAAiB,QAAQ,MAAM,OAAO,UAAU,CAAC;AAC7I,YAAM;AAAA,IACR,UAAE;AAAU,cAAQ,OAAO,OAAO,OAAO;AAAA,IAAG;AAAA,EAC9C;AAAA,EACQ,OAAO,SAAiC;AAC9C,QAAI,QAAQ,QAAS,QAAO,QAAQ;AACpC,YAAQ,UAAU;AAClB,YAAQ,WAAW,YAAY;AAC7B,YAAM,QAAQ,WAAW,CAAC,GAAG,QAAQ,MAAM,CAAC;AAC5C,cAAQ,MAAM,MAAM;AACpB,UAAI;AAAE,cAAM,QAAQ,OAAO,MAAM;AAAA,MAAG,SAC7B,OAAO;AAAE,aAAK,OAAO,KAAK,sCAAsC,EAAE,WAAW,iBAAiB,QAAQ,MAAM,OAAO,WAAW,KAAK,KAAK,QAAQ,CAAC;AAAA,MAAG;AAC3J,UAAI,KAAK,UAAU,QAAS,MAAK,QAAQ;AAAA,IAC3C,GAAG;AACH,WAAO,QAAQ;AAAA,EACjB;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/mcp/client.ts","../src/mcp/headers.ts"],"sourcesContent":["import { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';\nimport { StdioClientTransport, type StdioServerParameters } from '@modelcontextprotocol/sdk/client/stdio.js';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport { CallToolResultSchema, McpError, ErrorCode, type CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { inspect } from 'node:util';\nimport { ConfigError } from '../errors';\nimport { nullLogger, type Logger } from '../logging';\nimport type { MCPDescriptor } from '../controlplane/client';\nimport type { AgentConfig } from '../runtime/config';\nimport type { HeadersProvider } from '../model/client';\nimport { Tool, type ToolArguments } from '../integrations/common';\nimport { mergeMCPHeaders } from './headers';\n\nexport interface MCPTimeouts { sessionMs?: number; metadataMs?: number; toolMs?: number; }\nexport interface ManagedMCPOptions extends MCPTimeouts { headers?: Readonly<Record<string, string>>; credentialName?: string; }\nexport type DirectMCPOptions = ({ url: string; transport?: 'streamable-http' | 'sse'; headersProvider?: HeadersProvider } |\n { transport: 'stdio'; server: StdioServerParameters }) & MCPTimeouts & { logger?: Logger };\nexport interface MCPCallOptions { signal?: AbortSignal; }\ninterface Session {\n client: Client;\n transport: Transport;\n abort: AbortController;\n invalid: boolean;\n active: Set<Promise<unknown>>;\n closing?: Promise<void>;\n}\n\nexport function mcpServerURL(gatewayURL: string, id: string): string {\n const gateway = gatewayURL.replace(/\\/+$/, '').replace(/\\/(?:mcp|mcp-servers)$/, '');\n return `${gateway}/mcp-servers/${encodeURIComponent(id)}`;\n}\n\nexport class MCPClient {\n readonly descriptor?: MCPDescriptor;\n private readonly logger: Logger;\n private state?: Session;\n private opening?: Promise<Session>;\n private closed = false;\n private closing?: Promise<void>;\n private readonly timeouts: Required<MCPTimeouts>;\n\n private constructor(private readonly options: DirectMCPOptions, descriptor?: MCPDescriptor) {\n this.descriptor = descriptor;\n this.logger = options.logger ?? nullLogger;\n this.timeouts = { sessionMs: options.sessionMs ?? 30_000, metadataMs: options.metadataMs ?? 60_000, toolMs: options.toolMs ?? 600_000 };\n if (Object.values(this.timeouts).some((timeout) => !Number.isFinite(timeout) || timeout <= 0)) throw new ConfigError('MCP operation timeouts must be positive');\n if (options.transport !== 'stdio') {\n let url: URL;\n try { url = new URL(options.url); } catch { throw new ConfigError('Direct MCP URL must be HTTP(S)'); }\n if (!['http:', 'https:'].includes(url.protocol)) throw new ConfigError('Direct MCP URL must be HTTP(S)');\n if (options.transport !== undefined && !['streamable-http', 'sse'].includes(options.transport)) throw new ConfigError('MCP transport must be streamable-http, sse, or stdio');\n }\n this.logger.info('agentcore.mcp.client.created', { mode: descriptor ? 'managed' : 'direct', transport: options.transport ?? 'streamable-http', url: this.safeURL });\n }\n static platform(config: AgentConfig, descriptor: MCPDescriptor, options: Omit<ManagedMCPOptions, 'credentialName'> & {\n logger?: Logger; credentialHeadersProvider?: () => Promise<Record<string, string>>;\n } = {}): MCPClient {\n const { headers: custom, credentialHeadersProvider, ...connectionOptions } = options;\n const customHeaders = mergeMCPHeaders({}, custom);\n const headers = mergeMCPHeaders(config.gatewayHeaders, custom);\n return new MCPClient({ ...connectionOptions, url: mcpServerURL(config.mcpGatewayUrl, descriptor.mcpServerId), transport: 'streamable-http', headersProvider: async () => {\n if (!credentialHeadersProvider) return headers;\n const bound = mergeMCPHeaders(config.gatewayHeaders, await credentialHeadersProvider());\n return mergeMCPHeaders(bound, customHeaders);\n } }, descriptor);\n }\n static direct(options: DirectMCPOptions): MCPClient { return new MCPClient(options); }\n\n async listTools(options: MCPCallOptions = {}): Promise<Tool[]> {\n return this.withSession('list_tools', async (session) => {\n const definitions: Awaited<ReturnType<Client['listTools']>>['tools'] = [];\n let cursor: string | undefined;\n const deadline = AbortSignal.timeout(this.timeouts.metadataMs);\n const signal = AbortSignal.any([deadline, ...(options.signal ? [options.signal] : [])]);\n do {\n const result = await session.client.listTools(cursor ? { cursor } : undefined, { signal, timeout: this.timeouts.metadataMs });\n definitions.push(...result.tools); cursor = result.nextCursor;\n } while (cursor);\n return definitions.map((definition) => new Tool({ name: definition.name, description: definition.description ?? '', parameters: definition.inputSchema,\n invoke: (arguments_) => this.callTool(definition.name, arguments_),\n }));\n });\n }\n async tools(options: MCPCallOptions = {}): Promise<Tool[]> { return this.listTools(options); }\n async callTool(name: string, arguments_: ToolArguments, options: MCPCallOptions = {}): Promise<CallToolResult> {\n return this.withSession('call_tool', (session) => session.client.callTool({ name, arguments: arguments_ }, CallToolResultSchema,\n { timeout: this.timeouts.toolMs, signal: options.signal }) as Promise<CallToolResult>);\n }\n\n close(): Promise<void> {\n if (this.closing) return this.closing;\n this.closed = true;\n this.closing = (async () => {\n if (this.opening && this.state) this.state.abort.abort();\n await this.opening?.catch(() => undefined);\n if (this.state) await this.retire(this.state);\n })();\n return this.closing;\n }\n [inspect.custom](): string { return `MCPClient(url=${this.safeURL}, <redacted>)`; }\n toJSON(): string { return this[inspect.custom](); }\n\n private get safeURL(): string {\n if (this.options.transport === 'stdio') return 'stdio';\n const url = new URL(this.options.url); return `${url.origin}${url.pathname}`;\n }\n private async acquire(): Promise<Session> {\n for (;;) {\n if (this.closed) throw new Error('MCP client is closed');\n if (this.opening) return this.opening;\n if (this.state?.invalid) { await this.retire(this.state); continue; }\n if (this.state) return this.state;\n const request = this.open(); this.opening = request;\n try { return await request; } finally { this.opening = undefined; }\n }\n }\n private async open(): Promise<Session> {\n const client = new Client({ name: 'agentcore-sdk', version: '0.1.0' });\n const abort = new AbortController();\n let transport: Transport;\n if (this.options.transport === 'stdio') transport = new StdioClientTransport(this.options.server);\n else {\n const headers = await this.options.headersProvider?.() ?? {};\n const fetch: typeof globalThis.fetch = (input, init) => globalThis.fetch(input, { ...init, redirect: 'manual', signal: AbortSignal.any([abort.signal, ...(init?.signal ? [init.signal] : [])]) });\n transport = this.options.transport === 'sse'\n ? new SSEClientTransport(new URL(this.options.url), { requestInit: { headers }, fetch })\n : new StreamableHTTPClientTransport(new URL(this.options.url), { requestInit: { headers }, fetch });\n }\n const session: Session = { client, transport, abort, invalid: false, active: new Set() };\n this.state = session;\n const timer = setTimeout(() => abort.abort(new Error('MCP session open timed out')), this.timeouts.sessionMs);\n client.onclose = () => { session.invalid = true; };\n client.onerror = (error) => {\n if (this.closed || session.closing) return;\n session.invalid = true;\n this.logger.warn('agentcore.mcp.session.error', { url: this.safeURL, errorType: error.name });\n };\n this.logger.info('agentcore.mcp.session.open.started', { url: this.safeURL, timeoutMs: this.timeouts.sessionMs });\n try {\n await client.connect(transport, { signal: abort.signal, timeout: this.timeouts.sessionMs });\n abort.signal.throwIfAborted();\n if (this.closed) throw new Error('MCP client is closed');\n this.logger.info('agentcore.mcp.session.open.succeeded', { url: this.safeURL });\n return session;\n } catch (error) { await this.retire(session); throw error; }\n finally { clearTimeout(timer); }\n }\n\n private async withSession<T>(operation: string, call: (session: Session) => Promise<T>): Promise<T> {\n const session = await this.acquire();\n if (this.closed) throw new Error('MCP client is closed');\n const request = call(session); session.active.add(request);\n this.logger.info('agentcore.mcp.request.started', { operation, url: this.safeURL });\n try { const result = await request; this.logger.info('agentcore.mcp.request.succeeded', { operation, url: this.safeURL }); return result; }\n catch (error) {\n if (!(error instanceof McpError) || [ErrorCode.ConnectionClosed, ErrorCode.RequestTimeout].includes(error.code)) session.invalid = true;\n this.logger.warn('agentcore.mcp.request.failed', { operation, url: this.safeURL, errorType: error instanceof Error ? error.name : 'unknown' });\n throw error;\n } finally { session.active.delete(request); }\n }\n private retire(session: Session): Promise<void> {\n if (session.closing) return session.closing;\n session.invalid = true;\n session.closing = (async () => {\n await Promise.allSettled([...session.active]);\n session.abort.abort();\n try { await session.client.close(); }\n catch (error) { this.logger.warn('agentcore.mcp.session.close.failed', { errorType: error instanceof Error ? error.name : 'unknown', url: this.safeURL }); }\n if (this.state === session) this.state = undefined;\n })();\n return session.closing;\n }\n}\n","import { ConfigError } from '../errors';\n\nconst transportHeaders = new Set([\n 'host', 'content-length', 'connection', 'transfer-encoding', 'upgrade',\n 'mcp-session-id', 'mcp-protocol-version', 'last-event-id', 'content-type', 'accept',\n]);\n\n/** Copy fixed headers, rejecting case-insensitive credential/transport conflicts. */\nexport function mergeMCPHeaders(base: Readonly<Record<string, string>>, custom?: Readonly<Record<string, string>>): Record<string, string> {\n const result = { ...base };\n if (custom === undefined) return result;\n if (!custom || typeof custom !== 'object' || Array.isArray(custom)) throw new ConfigError('MCP headers must be an object');\n const protectedNames = new Set([...Object.keys(base).map((name) => name.toLowerCase()), ...transportHeaders, 'authorization']);\n const seen = new Set<string>();\n for (const [name, value] of Object.entries(custom)) {\n if (!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/.test(name)) throw new ConfigError('Invalid MCP header name');\n if (typeof value !== 'string' || /[\\x00-\\x1f\\x7f]/.test(value)) throw new ConfigError('MCP header values must be strings without control characters');\n const folded = name.toLowerCase();\n if (protectedNames.has(folded)) throw new ConfigError(`MCP header is protected: ${folded}`);\n if (seen.has(folded)) throw new ConfigError(`Duplicate MCP header: ${folded}`);\n seen.add(folded);\n Object.defineProperty(result, folded, { value, enumerable: true, configurable: true, writable: true });\n }\n return result;\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ContextError
3
- } from "./chunk-MZ5UWGXS.js";
3
+ } from "./chunk-AEQ76QIO.js";
4
4
 
5
5
  // src/runtime/context.ts
6
6
  import { AsyncLocalStorage } from "async_hooks";
@@ -32,4 +32,4 @@ export {
32
32
  currentContext,
33
33
  useContext
34
34
  };
35
- //# sourceMappingURL=chunk-ZWQBAJ5O.js.map
35
+ //# sourceMappingURL=chunk-6NNPSP3O.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  ControllerClient
3
- } from "./chunk-UBP5CHU7.js";
3
+ } from "./chunk-AX3NM2DK.js";
4
4
  import {
5
5
  CredentialExchangeError
6
- } from "./chunk-MZ5UWGXS.js";
6
+ } from "./chunk-AEQ76QIO.js";
7
7
 
8
8
  // src/auth/access-key.ts
9
9
  import { inspect } from "util";
@@ -110,4 +110,4 @@ export {
110
110
  AGENT_IDENTITY_DATA_PURPOSE,
111
111
  ResourceSTSProvider
112
112
  };
113
- //# sourceMappingURL=chunk-IUCLCPVV.js.map
113
+ //# sourceMappingURL=chunk-76NTQYJB.js.map
@@ -1,14 +1,12 @@
1
1
  import {
2
2
  httpUrl,
3
3
  requiredString
4
- } from "./chunk-K3TE7625.js";
5
- import {
6
- nullLogger
7
- } from "./chunk-NZL3VPJ2.js";
4
+ } from "./chunk-3JXIMUUY.js";
8
5
  import {
9
6
  ConfigError,
10
- InvocationError
11
- } from "./chunk-MZ5UWGXS.js";
7
+ InvocationError,
8
+ nullLogger
9
+ } from "./chunk-AEQ76QIO.js";
12
10
 
13
11
  // src/model/client.ts
14
12
  import OpenAI from "openai";
@@ -295,4 +293,4 @@ export {
295
293
  ModelClient,
296
294
  ProviderModelClient
297
295
  };
298
- //# sourceMappingURL=chunk-7Y263YIW.js.map
296
+ //# sourceMappingURL=chunk-7AJ2V7RN.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/model/client.ts","../src/model/provider.ts"],"sourcesContent":["import OpenAI from 'openai';\nimport Anthropic from '@anthropic-ai/sdk';\nimport { inspect } from 'node:util';\nimport { ConfigError, InvocationError } from '../errors';\nimport { nullLogger, type Logger } from '../logging';\nimport { httpUrl, requiredString, type AgentConfig } from '../runtime/config';\nimport type { ModelDescriptor } from '../controlplane/client';\n\nexport type ModelProtocol = 'openai' | 'anthropic';\nexport type ModelMessage = { role: string; content?: unknown; [key: string]: unknown };\nexport type ModelParameters = Record<string, unknown>;\nexport type ModelResponse = Record<string, unknown>;\nexport type HeadersProvider = () => Readonly<Record<string, string>> | Promise<Readonly<Record<string, string>>>;\nexport interface ModelCallOptions { signal?: AbortSignal; }\nexport interface DirectModelOptions {\n model: string;\n baseURL: string;\n provider?: ModelProtocol;\n apiKey?: string;\n apiKeyProvider?: () => string | Promise<string>;\n headersProvider?: HeadersProvider;\n timeoutMs?: number;\n logger?: Logger;\n}\nexport interface ModelSettings {\n readonly model: string;\n readonly provider: ModelProtocol;\n readonly baseURL: string;\n readonly maxTokens?: number;\n}\n\nexport function managedModelProtocol(protocol: string): ModelProtocol {\n switch (protocol.trim().toLowerCase()) {\n case 'openai/v1': return 'openai';\n case 'anthropic': return 'anthropic';\n default: throw new ConfigError(`managed model protocol has no SDK adapter: ${protocol}`);\n }\n}\nexport function modelBaseURL(gatewayURL: string, connectionId: string, protocol: string): string {\n const provider = managedModelProtocol(protocol);\n const gateway = gatewayURL.replace(/\\/+$/, '').replace(/\\/v1$/, '').replace(/\\/model-connection$/, '');\n return `${gateway}/model-connection/${encodeURIComponent(connectionId)}${provider === 'openai' ? '/v1' : ''}`;\n}\n\nexport class ModelClient {\n readonly descriptor?: ModelDescriptor;\n readonly settings: ModelSettings;\n private readonly logger: Logger;\n private readonly openai?: OpenAI;\n private readonly anthropic?: Anthropic;\n private readonly lifetime = new AbortController();\n private readonly requestHeaders: HeadersProvider;\n\n private constructor(settings: ModelSettings, requestHeaders: HeadersProvider, descriptor: ModelDescriptor | undefined, logger: Logger, private readonly timeoutMs: number) {\n this.settings = Object.freeze(settings); this.requestHeaders = requestHeaders;\n this.descriptor = descriptor; this.logger = logger;\n const fetch = this.httpFetch.bind(this);\n // OpenAI requires a non-empty constructor key; our fetch always replaces it\n // with the current provider headers, so this marker is never transmitted.\n if (settings.provider === 'openai') this.openai = new OpenAI({ baseURL: settings.baseURL, apiKey: 'agentcore-transport', fetch, timeout: timeoutMs, maxRetries: 0 });\n else this.anthropic = new Anthropic({ baseURL: settings.baseURL, apiKey: null, authToken: '', defaultHeaders: { 'X-Api-Key': null, Authorization: null }, fetch, timeout: timeoutMs, maxRetries: 0 });\n this.logger.info('agentcore.model.client.created', { mode: descriptor ? 'managed' : 'direct', model: settings.model, provider: settings.provider, baseURL: settings.baseURL });\n }\n\n static platform(config: AgentConfig, descriptor: ModelDescriptor, options: { logger?: Logger; timeoutMs?: number } = {}): ModelClient {\n const provider = managedModelProtocol(descriptor.protocol);\n const headers = { ...config.gatewayHeaders };\n return new ModelClient({ model: descriptor.modelName, provider, baseURL: modelBaseURL(config.modelGatewayUrl, descriptor.connectionId, descriptor.protocol), maxTokens: descriptor.maxTokens },\n () => headers, descriptor, options.logger ?? nullLogger, options.timeoutMs ?? 600_000);\n }\n static direct(options: DirectModelOptions): ModelClient {\n if (options.apiKey !== undefined && options.apiKeyProvider !== undefined) throw new ConfigError('apiKey and apiKeyProvider are mutually exclusive');\n const provider = options.provider ?? 'openai';\n if (provider !== 'openai' && provider !== 'anthropic') throw new ConfigError(`direct model protocol has no SDK adapter: ${provider}`);\n const model = requiredString(options.model, 'model'); const baseURL = httpUrl(options.baseURL, 'direct model baseURL');\n const resolve = async () => {\n const headers: Record<string, string> = {};\n const key = options.apiKeyProvider ? requiredString(await options.apiKeyProvider(), 'apiKeyProvider result') : options.apiKey;\n if (key) headers[provider === 'openai' ? 'authorization' : 'x-api-key'] = provider === 'openai' ? `Bearer ${key}` : key;\n Object.assign(headers, await options.headersProvider?.());\n return headers;\n };\n return new ModelClient({ model, baseURL, provider }, resolve, undefined, options.logger ?? nullLogger, options.timeoutMs ?? 600_000);\n }\n\n /** Headers are resolved for framework transports as well as direct API calls. */\n async headers(): Promise<Readonly<Record<string, string>>> { return this.requestHeaders(); }\n\n async completion(messages: readonly ModelMessage[], parameters: ModelParameters = {}, options: ModelCallOptions = {}): Promise<ModelResponse> {\n this.reject(parameters, ['messages', 'stream']);\n return this.invokeRequest('completion', async () => {\n if (this.openai) return this.openai.chat.completions.create({ ...parameters, model: this.settings.model, messages: [...messages], stream: false } as OpenAI.ChatCompletionCreateParamsNonStreaming, options);\n return this.anthropic!.messages.create({ ...this.anthropicParameters(messages, parameters), model: this.settings.model, stream: false } as Anthropic.MessageCreateParamsNonStreaming, options);\n });\n }\n async invoke(messages: readonly ModelMessage[], parameters: ModelParameters = {}, options: ModelCallOptions = {}): Promise<ModelResponse> { return this.completion(messages, parameters, options); }\n async *stream(messages: readonly ModelMessage[], parameters: ModelParameters = {}, options: ModelCallOptions = {}): AsyncGenerator<ModelResponse> {\n this.reject(parameters, ['messages', 'stream']);\n const request = async () => this.openai\n ? this.openai.chat.completions.create({ ...parameters, model: this.settings.model, messages: [...messages], stream: true } as OpenAI.ChatCompletionCreateParamsStreaming, options)\n : this.anthropic!.messages.create({ ...this.anthropicParameters(messages, parameters), model: this.settings.model, stream: true } as Anthropic.MessageCreateParamsStreaming, options);\n yield* this.invokeStream('stream', request);\n }\n async responses(input: unknown, parameters: ModelParameters = {}, options: ModelCallOptions = {}): Promise<ModelResponse> {\n this.reject(parameters, ['input', 'stream']); this.requireOpenAI('Responses API');\n return this.invokeRequest('responses', () => this.openai!.responses.create({ ...parameters, model: this.settings.model, input, stream: false } as OpenAI.Responses.ResponseCreateParamsNonStreaming, options));\n }\n async *responsesStream(input: unknown, parameters: ModelParameters = {}, options: ModelCallOptions = {}): AsyncGenerator<ModelResponse> {\n this.reject(parameters, ['input', 'stream']); this.requireOpenAI('Responses API');\n yield* this.invokeStream('responsesStream', () => this.openai!.responses.create({ ...parameters, model: this.settings.model, input, stream: true } as OpenAI.Responses.ResponseCreateParamsStreaming, options));\n }\n async embedding(input: unknown, parameters: ModelParameters = {}, options: ModelCallOptions = {}): Promise<ModelResponse> {\n this.reject(parameters, ['input']);\n if (this.descriptor) throw new InvocationError('managed model protocol does not publish Embedding API');\n this.requireOpenAI('Embedding API');\n return this.invokeRequest('embedding', () => this.openai!.embeddings.create({ ...parameters, model: this.settings.model, input } as OpenAI.EmbeddingCreateParams, options));\n }\n close(): void { this.lifetime.abort(); }\n [inspect.custom](): string { return `ModelClient(model=${this.settings.model}, provider=${this.settings.provider}, <redacted>)`; }\n toJSON(): string { return this[inspect.custom](); }\n\n private requireOpenAI(operation: string): void { if (!this.openai) throw new InvocationError(`Anthropic protocol does not publish ${operation}`); }\n private reject(parameters: ModelParameters, operationFields: string[]): void {\n this.lifetime.signal.throwIfAborted();\n const reserved = ['model', 'resourceName', 'resource_name', 'extra_headers', ...operationFields];\n const conflicts = reserved.filter((name) => Object.hasOwn(parameters, name));\n if (conflicts.length) throw new TypeError(`reserved model request parameters: ${conflicts.join(', ')}`);\n }\n private anthropicParameters(messages: readonly ModelMessage[], parameters: ModelParameters): Record<string, unknown> {\n const systemMessages = messages.filter((m) => m.role === 'system').map((m) => m.content);\n const body = { ...parameters, messages: messages.filter((m) => m.role !== 'system') };\n const maxTokens = parameters.max_tokens ?? this.settings.maxTokens;\n if (maxTokens === undefined) throw new ConfigError('Anthropic model requires max_tokens');\n Object.assign(body, { max_tokens: maxTokens });\n if (systemMessages.length) {\n if (Object.hasOwn(parameters, 'system')) throw new TypeError('system is already set by a system message');\n if (systemMessages.length > 1 && !systemMessages.every((v) => typeof v === 'string')) throw new TypeError('multiple Anthropic system messages must contain text');\n Object.assign(body, { system: systemMessages.length === 1 ? systemMessages[0] : systemMessages.join('\\n\\n') });\n }\n return body;\n }\n /** Authenticated transport shared by native clients and framework adapters. */\n async httpFetch(input: Parameters<typeof fetch>[0], init?: Parameters<typeof fetch>[1]): Promise<Response> {\n this.lifetime.signal.throwIfAborted();\n const request = new Request(input, init);\n const url = new URL(request.url);\n const headers = new Headers(request.headers);\n // Native SDK auth is populated here, including dynamic direct credentials.\n headers.delete('authorization'); headers.delete('x-api-key');\n for (const [key, value] of Object.entries(await this.requestHeaders())) headers.set(key, value);\n this.logger.info('agentcore.model.http.request', { method: request.method, url: `${url.origin}${url.pathname}` });\n return globalThis.fetch(request, { headers, redirect: 'manual',\n signal: AbortSignal.any([this.lifetime.signal, request.signal, AbortSignal.timeout(this.timeoutMs)]),\n });\n }\n private async invokeRequest(operation: string, request: () => Promise<unknown>): Promise<ModelResponse> {\n try { return await request() as ModelResponse; }\n catch (cause) { this.failed(operation, cause); throw new InvocationError('model request failed', { cause }); }\n }\n private async *invokeStream(operation: string, request: () => Promise<AsyncIterable<unknown> & { controller: AbortController }>): AsyncGenerator<ModelResponse> {\n let stream: (AsyncIterable<unknown> & { controller: AbortController }) | undefined;\n try { stream = await request(); for await (const event of stream) yield event as ModelResponse; }\n catch (cause) { this.failed(operation, cause); throw new InvocationError('model stream request failed', { cause }); }\n finally { stream?.controller.abort(); }\n }\n private failed(operation: string, error: unknown): void {\n const status = error && typeof error === 'object' && 'status' in error ? String(error.status) : undefined;\n const requestId = error && typeof error === 'object' && 'request_id' in error ? String(error.request_id) : undefined;\n this.logger.warn('agentcore.model.request.failed', { operation, baseURL: this.settings.baseURL, model: this.settings.model, status, requestId });\n }\n}\n","import type { EmbeddingModelV3, LanguageModelV3 } from '@ai-sdk/provider';\nimport type { generateText, streamText, embedMany, ModelMessage, ToolSet } from 'ai';\nimport { inspect } from 'node:util';\nimport { ConfigError } from '../errors';\nimport { nullLogger, type Logger } from '../logging';\nimport type { ModelCallOptions } from './client';\n\nexport interface DirectProviderOptions {\n /** A configured AI SDK provider model. The provider owns its endpoint and auth. */\n languageModel: LanguageModelV3;\n embeddingModel?: EmbeddingModelV3;\n timeoutMs?: number;\n logger?: Logger;\n}\nexport type ProviderGenerateOptions<T extends ToolSet = ToolSet> = Omit<Parameters<typeof generateText<T>>[0], 'model' | 'messages' | 'prompt' | 'abortSignal'>;\nexport type ProviderStreamOptions<T extends ToolSet = ToolSet> = Omit<Parameters<typeof streamText<T>>[0], 'model' | 'messages' | 'prompt' | 'abortSignal'>;\nexport type ProviderEmbeddingOptions = Omit<Parameters<typeof embedMany>[0], 'model' | 'values' | 'abortSignal'>;\n\n/** Multi-provider Direct models use AI SDK messages/results, not a simulated OpenAI protocol. */\nexport class ProviderModelClient {\n readonly settings: Readonly<{ model: string; provider: string }>;\n readonly languageModel: LanguageModelV3;\n private readonly lifetime = new AbortController();\n private readonly logger: Logger;\n private readonly timeoutMs: number;\n private readonly embeddingModel?: EmbeddingModelV3;\n\n constructor(options: DirectProviderOptions) {\n const model = options.languageModel;\n this.settings = Object.freeze({ model: model.modelId, provider: model.provider });\n this.timeoutMs = options.timeoutMs ?? 600_000;\n this.logger = options.logger ?? nullLogger;\n // Keep lifecycle enforcement when this model is handed to a framework.\n this.languageModel = {\n specificationVersion: 'v3', provider: model.provider, modelId: model.modelId,\n supportedUrls: model.supportedUrls,\n doGenerate: async args => {\n const abortSignal = this.signal(args.abortSignal);\n return model.doGenerate({ ...args, abortSignal });\n },\n doStream: async args => {\n const abortSignal = this.signal(args.abortSignal);\n return model.doStream({ ...args, abortSignal });\n },\n };\n this.embeddingModel = options.embeddingModel;\n this.logger.info('agentcore.model.client.created', { mode: 'direct-provider', ...this.settings });\n }\n\n async completion<T extends ToolSet = ToolSet>(messages: readonly ModelMessage[], parameters: ProviderGenerateOptions<T> = {}, options: ModelCallOptions = {}) {\n const abortSignal = this.signal(options.signal);\n const { generateText } = await import('ai');\n return this.request('completion', () => generateText<T>({ maxRetries: 0, ...parameters,\n model: this.languageModel, messages: [...messages], abortSignal,\n }));\n }\n async invoke<T extends ToolSet = ToolSet>(messages: readonly ModelMessage[], parameters: ProviderGenerateOptions<T> = {}, options: ModelCallOptions = {}) {\n return this.completion(messages, parameters, options);\n }\n async *stream<T extends ToolSet = ToolSet>(messages: readonly ModelMessage[], parameters: ProviderStreamOptions<T> = {}, options: ModelCallOptions = {}) {\n const controller = new AbortController();\n const abortSignal = this.signal(AbortSignal.any([controller.signal, ...(options.signal ? [options.signal] : [])]));\n const { streamText } = await import('ai');\n try {\n // The iterator below propagates errors and logs safe metadata. AI SDK's\n // default onError prints the entire error, including provider request data.\n const result = streamText<T>({ maxRetries: 0, onError: () => {}, ...parameters, model: this.languageModel, messages: [...messages], abortSignal });\n for await (const part of result.fullStream) {\n if (part.type === 'error') throw part.error;\n yield part;\n }\n } catch (error) { this.failed('stream', error); throw error; }\n finally { controller.abort(); }\n }\n async embedding(input: string | readonly string[], parameters: ProviderEmbeddingOptions = {}, options: ModelCallOptions = {}) {\n const abortSignal = this.signal(options.signal);\n if (!this.embeddingModel) throw new ConfigError('direct provider embedding requires embeddingModel');\n const { embedMany } = await import('ai');\n return this.request('embedding', () => embedMany({ maxRetries: 0, ...parameters, model: this.embeddingModel!,\n values: typeof input === 'string' ? [input] : [...input], abortSignal,\n }));\n }\n close(): void { this.lifetime.abort(); }\n [inspect.custom](): string { return `ProviderModelClient(model=${this.settings.model}, provider=${this.settings.provider}, <redacted>)`; }\n toJSON(): string { return this[inspect.custom](); }\n\n private signal(signal?: AbortSignal): AbortSignal {\n this.lifetime.signal.throwIfAborted();\n return AbortSignal.any([this.lifetime.signal, AbortSignal.timeout(this.timeoutMs), ...(signal ? [signal] : [])]);\n }\n private async request<T>(operation: string, invoke: () => Promise<T>): Promise<T> {\n try { return await invoke(); } catch (error) { this.failed(operation, error); throw error; }\n }\n private failed(operation: string, error: unknown): void {\n this.logger.warn('agentcore.model.request.failed', { operation, ...this.settings,\n errorType: error instanceof Error ? error.name : typeof error,\n });\n }\n}\n"],"mappings":"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","names":["inspect","inspect"]}
1
+ {"version":3,"sources":["../src/model/client.ts","../src/model/provider.ts"],"sourcesContent":["import OpenAI from 'openai';\nimport Anthropic from '@anthropic-ai/sdk';\nimport { inspect } from 'node:util';\nimport { ConfigError, InvocationError } from '../errors';\nimport { nullLogger, type Logger } from '../logging';\nimport { httpUrl, requiredString, type AgentConfig } from '../runtime/config';\nimport type { ModelDescriptor } from '../controlplane/client';\n\nexport type ModelProtocol = 'openai' | 'anthropic';\nexport type ModelMessage = { role: string; content?: unknown; [key: string]: unknown };\nexport type ModelParameters = Record<string, unknown>;\nexport type ModelResponse = Record<string, unknown>;\nexport type HeadersProvider = () => Readonly<Record<string, string>> | Promise<Readonly<Record<string, string>>>;\nexport interface ModelCallOptions { signal?: AbortSignal; }\nexport interface DirectModelOptions {\n model: string;\n baseURL: string;\n provider?: ModelProtocol;\n apiKey?: string;\n apiKeyProvider?: () => string | Promise<string>;\n headersProvider?: HeadersProvider;\n timeoutMs?: number;\n logger?: Logger;\n}\nexport interface ModelSettings {\n readonly model: string;\n readonly provider: ModelProtocol;\n readonly baseURL: string;\n readonly maxTokens?: number;\n}\n\nexport function managedModelProtocol(protocol: string): ModelProtocol {\n switch (protocol.trim().toLowerCase()) {\n case 'openai/v1': return 'openai';\n case 'anthropic': return 'anthropic';\n default: throw new ConfigError(`managed model protocol has no SDK adapter: ${protocol}`);\n }\n}\nexport function modelBaseURL(gatewayURL: string, connectionId: string, protocol: string): string {\n const provider = managedModelProtocol(protocol);\n const gateway = gatewayURL.replace(/\\/+$/, '').replace(/\\/v1$/, '').replace(/\\/model-connection$/, '');\n return `${gateway}/model-connection/${encodeURIComponent(connectionId)}${provider === 'openai' ? '/v1' : ''}`;\n}\n\nexport class ModelClient {\n readonly descriptor?: ModelDescriptor;\n readonly settings: ModelSettings;\n private readonly logger: Logger;\n private readonly openai?: OpenAI;\n private readonly anthropic?: Anthropic;\n private readonly lifetime = new AbortController();\n private readonly requestHeaders: HeadersProvider;\n\n private constructor(settings: ModelSettings, requestHeaders: HeadersProvider, descriptor: ModelDescriptor | undefined, logger: Logger, private readonly timeoutMs: number) {\n this.settings = Object.freeze(settings); this.requestHeaders = requestHeaders;\n this.descriptor = descriptor; this.logger = logger;\n const fetch = this.httpFetch.bind(this);\n // OpenAI requires a non-empty constructor key; our fetch always replaces it\n // with the current provider headers, so this marker is never transmitted.\n if (settings.provider === 'openai') this.openai = new OpenAI({ baseURL: settings.baseURL, apiKey: 'agentcore-transport', fetch, timeout: timeoutMs, maxRetries: 0 });\n else this.anthropic = new Anthropic({ baseURL: settings.baseURL, apiKey: null, authToken: '', defaultHeaders: { 'X-Api-Key': null, Authorization: null }, fetch, timeout: timeoutMs, maxRetries: 0 });\n this.logger.info('agentcore.model.client.created', { mode: descriptor ? 'managed' : 'direct', model: settings.model, provider: settings.provider, baseURL: settings.baseURL });\n }\n\n static platform(config: AgentConfig, descriptor: ModelDescriptor, options: { logger?: Logger; timeoutMs?: number } = {}): ModelClient {\n const provider = managedModelProtocol(descriptor.protocol);\n const headers = { ...config.gatewayHeaders };\n return new ModelClient({ model: descriptor.modelName, provider, baseURL: modelBaseURL(config.modelGatewayUrl, descriptor.connectionId, descriptor.protocol), maxTokens: descriptor.maxTokens },\n () => headers, descriptor, options.logger ?? nullLogger, options.timeoutMs ?? 600_000);\n }\n static direct(options: DirectModelOptions): ModelClient {\n if (options.apiKey !== undefined && options.apiKeyProvider !== undefined) throw new ConfigError('apiKey and apiKeyProvider are mutually exclusive');\n const provider = options.provider ?? 'openai';\n if (provider !== 'openai' && provider !== 'anthropic') throw new ConfigError(`direct model protocol has no SDK adapter: ${provider}`);\n const model = requiredString(options.model, 'model'); const baseURL = httpUrl(options.baseURL, 'direct model baseURL');\n const resolve = async () => {\n const headers: Record<string, string> = {};\n const key = options.apiKeyProvider ? requiredString(await options.apiKeyProvider(), 'apiKeyProvider result') : options.apiKey;\n if (key) headers[provider === 'openai' ? 'authorization' : 'x-api-key'] = provider === 'openai' ? `Bearer ${key}` : key;\n Object.assign(headers, await options.headersProvider?.());\n return headers;\n };\n return new ModelClient({ model, baseURL, provider }, resolve, undefined, options.logger ?? nullLogger, options.timeoutMs ?? 600_000);\n }\n\n /** Headers are resolved for framework transports as well as direct API calls. */\n async headers(): Promise<Readonly<Record<string, string>>> { return this.requestHeaders(); }\n\n async completion(messages: readonly ModelMessage[], parameters: ModelParameters = {}, options: ModelCallOptions = {}): Promise<ModelResponse> {\n this.reject(parameters, ['messages', 'stream']);\n return this.invokeRequest('completion', async () => {\n if (this.openai) return this.openai.chat.completions.create({ ...parameters, model: this.settings.model, messages: [...messages], stream: false } as OpenAI.ChatCompletionCreateParamsNonStreaming, options);\n return this.anthropic!.messages.create({ ...this.anthropicParameters(messages, parameters), model: this.settings.model, stream: false } as Anthropic.MessageCreateParamsNonStreaming, options);\n });\n }\n async invoke(messages: readonly ModelMessage[], parameters: ModelParameters = {}, options: ModelCallOptions = {}): Promise<ModelResponse> { return this.completion(messages, parameters, options); }\n async *stream(messages: readonly ModelMessage[], parameters: ModelParameters = {}, options: ModelCallOptions = {}): AsyncGenerator<ModelResponse> {\n this.reject(parameters, ['messages', 'stream']);\n const request = async () => this.openai\n ? this.openai.chat.completions.create({ ...parameters, model: this.settings.model, messages: [...messages], stream: true } as OpenAI.ChatCompletionCreateParamsStreaming, options)\n : this.anthropic!.messages.create({ ...this.anthropicParameters(messages, parameters), model: this.settings.model, stream: true } as Anthropic.MessageCreateParamsStreaming, options);\n yield* this.invokeStream('stream', request);\n }\n async responses(input: unknown, parameters: ModelParameters = {}, options: ModelCallOptions = {}): Promise<ModelResponse> {\n this.reject(parameters, ['input', 'stream']); this.requireOpenAI('Responses API');\n return this.invokeRequest('responses', () => this.openai!.responses.create({ ...parameters, model: this.settings.model, input, stream: false } as OpenAI.Responses.ResponseCreateParamsNonStreaming, options));\n }\n async *responsesStream(input: unknown, parameters: ModelParameters = {}, options: ModelCallOptions = {}): AsyncGenerator<ModelResponse> {\n this.reject(parameters, ['input', 'stream']); this.requireOpenAI('Responses API');\n yield* this.invokeStream('responsesStream', () => this.openai!.responses.create({ ...parameters, model: this.settings.model, input, stream: true } as OpenAI.Responses.ResponseCreateParamsStreaming, options));\n }\n async embedding(input: unknown, parameters: ModelParameters = {}, options: ModelCallOptions = {}): Promise<ModelResponse> {\n this.reject(parameters, ['input']);\n if (this.descriptor) throw new InvocationError('managed model protocol does not publish Embedding API');\n this.requireOpenAI('Embedding API');\n return this.invokeRequest('embedding', () => this.openai!.embeddings.create({ ...parameters, model: this.settings.model, input } as OpenAI.EmbeddingCreateParams, options));\n }\n close(): void { this.lifetime.abort(); }\n [inspect.custom](): string { return `ModelClient(model=${this.settings.model}, provider=${this.settings.provider}, <redacted>)`; }\n toJSON(): string { return this[inspect.custom](); }\n\n private requireOpenAI(operation: string): void { if (!this.openai) throw new InvocationError(`Anthropic protocol does not publish ${operation}`); }\n private reject(parameters: ModelParameters, operationFields: string[]): void {\n this.lifetime.signal.throwIfAborted();\n const reserved = ['model', 'resourceName', 'resource_name', 'extra_headers', ...operationFields];\n const conflicts = reserved.filter((name) => Object.hasOwn(parameters, name));\n if (conflicts.length) throw new TypeError(`reserved model request parameters: ${conflicts.join(', ')}`);\n }\n private anthropicParameters(messages: readonly ModelMessage[], parameters: ModelParameters): Record<string, unknown> {\n const systemMessages = messages.filter((m) => m.role === 'system').map((m) => m.content);\n const body = { ...parameters, messages: messages.filter((m) => m.role !== 'system') };\n const maxTokens = parameters.max_tokens ?? this.settings.maxTokens;\n if (maxTokens === undefined) throw new ConfigError('Anthropic model requires max_tokens');\n Object.assign(body, { max_tokens: maxTokens });\n if (systemMessages.length) {\n if (Object.hasOwn(parameters, 'system')) throw new TypeError('system is already set by a system message');\n if (systemMessages.length > 1 && !systemMessages.every((v) => typeof v === 'string')) throw new TypeError('multiple Anthropic system messages must contain text');\n Object.assign(body, { system: systemMessages.length === 1 ? systemMessages[0] : systemMessages.join('\\n\\n') });\n }\n return body;\n }\n /** Authenticated transport shared by native clients and framework adapters. */\n async httpFetch(input: Parameters<typeof fetch>[0], init?: Parameters<typeof fetch>[1]): Promise<Response> {\n this.lifetime.signal.throwIfAborted();\n const request = new Request(input, init);\n const url = new URL(request.url);\n const headers = new Headers(request.headers);\n // Native SDK auth is populated here, including dynamic direct credentials.\n headers.delete('authorization'); headers.delete('x-api-key');\n for (const [key, value] of Object.entries(await this.requestHeaders())) headers.set(key, value);\n this.logger.info('agentcore.model.http.request', { method: request.method, url: `${url.origin}${url.pathname}` });\n return globalThis.fetch(request, { headers, redirect: 'manual',\n signal: AbortSignal.any([this.lifetime.signal, request.signal, AbortSignal.timeout(this.timeoutMs)]),\n });\n }\n private async invokeRequest(operation: string, request: () => Promise<unknown>): Promise<ModelResponse> {\n try { return await request() as ModelResponse; }\n catch (cause) { this.failed(operation, cause); throw new InvocationError('model request failed', { cause }); }\n }\n private async *invokeStream(operation: string, request: () => Promise<AsyncIterable<unknown> & { controller: AbortController }>): AsyncGenerator<ModelResponse> {\n let stream: (AsyncIterable<unknown> & { controller: AbortController }) | undefined;\n try { stream = await request(); for await (const event of stream) yield event as ModelResponse; }\n catch (cause) { this.failed(operation, cause); throw new InvocationError('model stream request failed', { cause }); }\n finally { stream?.controller.abort(); }\n }\n private failed(operation: string, error: unknown): void {\n const status = error && typeof error === 'object' && 'status' in error ? String(error.status) : undefined;\n const requestId = error && typeof error === 'object' && 'request_id' in error ? String(error.request_id) : undefined;\n this.logger.warn('agentcore.model.request.failed', { operation, baseURL: this.settings.baseURL, model: this.settings.model, status, requestId });\n }\n}\n","import type { EmbeddingModelV3, LanguageModelV3 } from '@ai-sdk/provider';\nimport type { generateText, streamText, embedMany, ModelMessage, ToolSet } from 'ai';\nimport { inspect } from 'node:util';\nimport { ConfigError } from '../errors';\nimport { nullLogger, type Logger } from '../logging';\nimport type { ModelCallOptions } from './client';\n\nexport interface DirectProviderOptions {\n /** A configured AI SDK provider model. The provider owns its endpoint and auth. */\n languageModel: LanguageModelV3;\n embeddingModel?: EmbeddingModelV3;\n timeoutMs?: number;\n logger?: Logger;\n}\nexport type ProviderGenerateOptions<T extends ToolSet = ToolSet> = Omit<Parameters<typeof generateText<T>>[0], 'model' | 'messages' | 'prompt' | 'abortSignal'>;\nexport type ProviderStreamOptions<T extends ToolSet = ToolSet> = Omit<Parameters<typeof streamText<T>>[0], 'model' | 'messages' | 'prompt' | 'abortSignal'>;\nexport type ProviderEmbeddingOptions = Omit<Parameters<typeof embedMany>[0], 'model' | 'values' | 'abortSignal'>;\n\n/** Multi-provider Direct models use AI SDK messages/results, not a simulated OpenAI protocol. */\nexport class ProviderModelClient {\n readonly settings: Readonly<{ model: string; provider: string }>;\n readonly languageModel: LanguageModelV3;\n private readonly lifetime = new AbortController();\n private readonly logger: Logger;\n private readonly timeoutMs: number;\n private readonly embeddingModel?: EmbeddingModelV3;\n\n constructor(options: DirectProviderOptions) {\n const model = options.languageModel;\n this.settings = Object.freeze({ model: model.modelId, provider: model.provider });\n this.timeoutMs = options.timeoutMs ?? 600_000;\n this.logger = options.logger ?? nullLogger;\n // Keep lifecycle enforcement when this model is handed to a framework.\n this.languageModel = {\n specificationVersion: 'v3', provider: model.provider, modelId: model.modelId,\n supportedUrls: model.supportedUrls,\n doGenerate: async args => {\n const abortSignal = this.signal(args.abortSignal);\n return model.doGenerate({ ...args, abortSignal });\n },\n doStream: async args => {\n const abortSignal = this.signal(args.abortSignal);\n return model.doStream({ ...args, abortSignal });\n },\n };\n this.embeddingModel = options.embeddingModel;\n this.logger.info('agentcore.model.client.created', { mode: 'direct-provider', ...this.settings });\n }\n\n async completion<T extends ToolSet = ToolSet>(messages: readonly ModelMessage[], parameters: ProviderGenerateOptions<T> = {}, options: ModelCallOptions = {}) {\n const abortSignal = this.signal(options.signal);\n const { generateText } = await import('ai');\n return this.request('completion', () => generateText<T>({ maxRetries: 0, ...parameters,\n model: this.languageModel, messages: [...messages], abortSignal,\n }));\n }\n async invoke<T extends ToolSet = ToolSet>(messages: readonly ModelMessage[], parameters: ProviderGenerateOptions<T> = {}, options: ModelCallOptions = {}) {\n return this.completion(messages, parameters, options);\n }\n async *stream<T extends ToolSet = ToolSet>(messages: readonly ModelMessage[], parameters: ProviderStreamOptions<T> = {}, options: ModelCallOptions = {}) {\n const controller = new AbortController();\n const abortSignal = this.signal(AbortSignal.any([controller.signal, ...(options.signal ? [options.signal] : [])]));\n const { streamText } = await import('ai');\n try {\n // The iterator below propagates errors and logs safe metadata. AI SDK's\n // default onError prints the entire error, including provider request data.\n const result = streamText<T>({ maxRetries: 0, onError: () => {}, ...parameters, model: this.languageModel, messages: [...messages], abortSignal });\n for await (const part of result.fullStream) {\n if (part.type === 'error') throw part.error;\n yield part;\n }\n } catch (error) { this.failed('stream', error); throw error; }\n finally { controller.abort(); }\n }\n async embedding(input: string | readonly string[], parameters: ProviderEmbeddingOptions = {}, options: ModelCallOptions = {}) {\n const abortSignal = this.signal(options.signal);\n if (!this.embeddingModel) throw new ConfigError('direct provider embedding requires embeddingModel');\n const { embedMany } = await import('ai');\n return this.request('embedding', () => embedMany({ maxRetries: 0, ...parameters, model: this.embeddingModel!,\n values: typeof input === 'string' ? [input] : [...input], abortSignal,\n }));\n }\n close(): void { this.lifetime.abort(); }\n [inspect.custom](): string { return `ProviderModelClient(model=${this.settings.model}, provider=${this.settings.provider}, <redacted>)`; }\n toJSON(): string { return this[inspect.custom](); }\n\n private signal(signal?: AbortSignal): AbortSignal {\n this.lifetime.signal.throwIfAborted();\n return AbortSignal.any([this.lifetime.signal, AbortSignal.timeout(this.timeoutMs), ...(signal ? [signal] : [])]);\n }\n private async request<T>(operation: string, invoke: () => Promise<T>): Promise<T> {\n try { return await invoke(); } catch (error) { this.failed(operation, error); throw error; }\n }\n private failed(operation: string, error: unknown): void {\n this.logger.warn('agentcore.model.request.failed', { operation, ...this.settings,\n errorType: error instanceof Error ? error.name : typeof error,\n });\n }\n}\n"],"mappings":"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","names":["inspect","inspect"]}
@@ -1,23 +1,21 @@
1
1
  import {
2
2
  readBytes
3
- } from "./chunk-5JXA7JPS.js";
3
+ } from "./chunk-NRYDUATX.js";
4
4
  import {
5
5
  HIGH_CODE_SDK_PURPOSE
6
- } from "./chunk-IUCLCPVV.js";
6
+ } from "./chunk-76NTQYJB.js";
7
7
  import {
8
8
  httpUrl,
9
9
  requiredString
10
- } from "./chunk-K3TE7625.js";
11
- import {
12
- nullLogger
13
- } from "./chunk-NZL3VPJ2.js";
10
+ } from "./chunk-3JXIMUUY.js";
14
11
  import {
15
12
  ConfigError,
16
13
  InvocationError,
17
14
  MCPServerNotFoundError,
18
15
  ModelConnectionNotFoundError,
19
- ResourceNotConfiguredError
20
- } from "./chunk-MZ5UWGXS.js";
16
+ ResourceNotConfiguredError,
17
+ nullLogger
18
+ } from "./chunk-AEQ76QIO.js";
21
19
 
22
20
  // src/controlplane/client.ts
23
21
  import Client, * as models from "@alicloud/agentcore20260804";
@@ -293,4 +291,4 @@ function internalOSSURL(url) {
293
291
  export {
294
292
  AgentCoreControlPlane
295
293
  };
296
- //# sourceMappingURL=chunk-5ZOLHQXO.js.map
294
+ //# sourceMappingURL=chunk-7UBN3SJI.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/controlplane/client.ts"],"sourcesContent":["import Client, * as models from '@alicloud/agentcore20260804';\nimport { $OpenApiUtil } from '@alicloud/openapi-core';\nimport { RuntimeOptions } from '@darabonba/typescript';\nimport { AccessKeyCredential, type CredentialProvider } from '../auth/access-key';\nimport { HIGH_CODE_SDK_PURPOSE } from '../auth/resource-sts';\nimport { ConfigError, InvocationError, MCPServerNotFoundError, ModelConnectionNotFoundError, ResourceNotConfiguredError } from '../errors';\nimport { readBytes } from '../http';\nimport { nullLogger, type Logger } from '../logging';\nimport { httpUrl, requiredString } from '../runtime/config';\n\n// The generated package is CJS: native ESM sees module.exports as the default.\nconst GeneratedClient = typeof Client === 'function' ? Client : (Client as unknown as { default: typeof Client }).default;\n\nexport interface ModelDescriptor {\n readonly connectionId: string;\n readonly connectionName: string;\n readonly protocol: string;\n readonly providerType: string;\n readonly modelId: string;\n readonly modelName: string;\n readonly contextSize?: number;\n readonly maxTokens?: number;\n readonly capabilities: Readonly<Record<string, boolean>>;\n}\nexport interface MCPDescriptor {\n readonly mcpServerId: string;\n readonly name: string;\n readonly protocol: string;\n readonly type: string;\n readonly status: string;\n}\nexport interface SkillArtifact { version: string; archive: Uint8Array; }\nexport interface CredentialMetadata {\n readonly credentialId: string;\n readonly name: string;\n readonly credentialType: string;\n readonly resourceScope: string;\n readonly resourceRefs: ReadonlyArray<{ resourceType: string; resourceId: string }>;\n}\nexport interface ControlPlaneOptions {\n workspaceId: string;\n regionId: string;\n accessKeyCredential?: AccessKeyCredential;\n resourceSTSProvider?: CredentialProvider;\n endpoint?: string;\n logger?: Logger;\n}\n\nfunction exact<T>(items: T[], field: keyof T, name: string, label: string, ErrorType: typeof ResourceNotConfiguredError = ResourceNotConfiguredError): T {\n const matches = items.filter((item) => item[field] === name);\n if (!matches.length) throw new ErrorType(`${label} ${JSON.stringify(name)} does not exist`);\n if (matches.length !== 1) throw new ConfigError(`${label} ${JSON.stringify(name)} is not unique`);\n return matches[0]!;\n}\n\nfunction errorField(error: unknown, key: string): unknown {\n return error && typeof error === 'object' ? (error as Record<string, unknown>)[key] : undefined;\n}\nfunction responseBody<T>(body: T | undefined): T {\n if (body === undefined) throw new ConfigError('AgentCore returned an empty control-plane response');\n return body;\n}\nfunction endpointFailure(error: unknown): boolean {\n const status = errorField(error, 'statusCode');\n const code = errorField(error, 'code');\n return (typeof status === 'number' && status >= 500 && status < 600) ||\n ['ECONNREFUSED', 'ECONNRESET', 'ENOTFOUND', 'EAI_AGAIN', 'ETIMEDOUT', 'ESOCKETTIMEDOUT'].includes(String(code)) ||\n errorField(error, 'name') === 'TimeoutError';\n}\n\nexport class AgentCoreControlPlane {\n readonly workspaceId: string;\n readonly regionId: string;\n private readonly endpoint?: string;\n private readonly protocol?: string;\n private discoveredEndpoint?: string;\n private readonly logger: Logger;\n private readonly lifetime = new AbortController();\n\n constructor(private readonly options: ControlPlaneOptions) {\n this.workspaceId = requiredString(options.workspaceId, 'workspaceId');\n this.regionId = requiredString(options.regionId, 'regionId');\n if (!options.accessKeyCredential && !options.resourceSTSProvider) throw new ConfigError('AgentCore control plane requires an AccessKey credential source');\n if (options.endpoint !== undefined) {\n const value = options.endpoint.trim();\n const url = new URL(httpUrl(value.includes('://') ? value : `https://${value}`, 'AgentCore control endpoint'));\n if (url.pathname !== '/') throw new ConfigError('AgentCore control endpoint must not contain a path');\n this.endpoint = url.host; this.protocol = url.protocol.slice(0, -1);\n }\n this.logger = options.logger ?? nullLogger;\n }\n\n async resolveModel(connectionName: string, modelName?: string): Promise<ModelDescriptor> {\n const client = await this.client();\n const connections: models.ListModelConnectionsResponseBodyItems[] = [];\n let nextToken: string | undefined;\n do {\n const response = await this.invoke(client, 'ListModelConnections', () => client.listModelConnectionsWithOptions(this.workspaceId,\n new models.ListModelConnectionsRequest({ name: connectionName, searchType: 'accurate', maxResults: 100, nextToken }), {}, this.runtimeOptions()));\n const body = responseBody(response.body);\n connections.push(...(body.items ?? [])); nextToken = body.nextToken;\n } while (nextToken);\n const connection = exact(connections, 'name', connectionName, 'model connection', ModelConnectionNotFoundError);\n const connectionId = requiredString(connection.connectionId, 'connectionId');\n const available: models.ListModelsResponseBodyItems[] = [];\n do {\n const response = await this.invoke(client, 'ListModels', () => client.listModelsWithOptions(this.workspaceId,\n new models.ListModelsRequest({ connectionId, modelName, maxResults: 100, nextToken }), {}, this.runtimeOptions()));\n const body = responseBody(response.body);\n available.push(...(body.items ?? [])); nextToken = body.nextToken;\n } while (nextToken);\n let model: models.ListModelsResponseBodyItems;\n if (modelName !== undefined) model = exact(available, 'modelName', modelName, 'model');\n else {\n if (available.length !== 1) throw new ResourceNotConfiguredError(`model connection ${JSON.stringify(connectionName)} requires an explicit model name`);\n model = available[0]!;\n }\n const capabilities = Object.fromEntries(Object.entries(model.capabilities ?? {}).filter((entry): entry is [string, boolean] => typeof entry[1] === 'boolean'));\n const descriptor = Object.freeze({ connectionId, connectionName: requiredString(connection.name, 'connection name'),\n protocol: connection.protocol ?? '', providerType: connection.providerType ?? '',\n modelId: requiredString(model.modelId, 'modelId'), modelName: requiredString(model.modelName, 'modelName'),\n contextSize: model.contextSize, maxTokens: model.maxTokens, capabilities: Object.freeze(capabilities),\n });\n this.logger.info('agentcore.control_plane.model.resolve.succeeded', { connectionName, connectionId, modelName: descriptor.modelName });\n return descriptor;\n }\n\n async resolveMCP(name: string): Promise<MCPDescriptor> {\n const client = await this.client();\n const items: models.ListMcpsResponseBodyItems[] = [];\n let nextToken: string | undefined;\n do {\n const response = await this.invoke(client, 'ListMcps', () => client.listMcpsWithOptions(this.workspaceId,\n new models.ListMcpsRequest({ name, searchType: 'accurate', maxResults: 100, nextToken }), {}, this.runtimeOptions()));\n const body = responseBody(response.body);\n items.push(...(body.items ?? [])); nextToken = body.nextToken;\n } while (nextToken);\n const item = exact(items, 'name', name, 'MCP server', MCPServerNotFoundError);\n const descriptor = Object.freeze({ mcpServerId: requiredString(item.mcpServerId, 'mcpServerId'),\n name: requiredString(item.name, 'MCP name'), protocol: item.protocol ?? '', type: item.type ?? '', status: item.status ?? '',\n });\n this.logger.info('agentcore.control_plane.mcp.resolve.succeeded', { name, mcpServerId: descriptor.mcpServerId, protocol: descriptor.protocol });\n return descriptor;\n }\n\n async getSkill(name: string, version?: string): Promise<SkillArtifact> {\n const client = await this.client();\n if (version === undefined) {\n const detail = await this.invoke(client, 'GetSkillDetail', () => client.getSkillDetailWithOptions(this.workspaceId, name, new models.GetSkillDetailRequest({}), {}, this.runtimeOptions()));\n version = latestVersion(responseBody(detail.body).data);\n }\n const resolvedVersion = version;\n const response = await this.invoke(client, 'DownloadSkillVersionViaOss', () => client.downloadSkillVersionViaOssWithOptions(this.workspaceId, name, resolvedVersion,\n new models.DownloadSkillVersionViaOssRequest({}), {}, this.runtimeOptions()));\n const downloadURL = responseBody(response.body).data;\n if (typeof downloadURL !== 'string') throw new ConfigError('AgentCore returned an invalid Skill download URL');\n return { version: resolvedVersion, archive: await this.downloadSkill(downloadURL) };\n }\n\n close(): void { this.lifetime.abort(); }\n\n async resolveCredential(name: string): Promise<CredentialMetadata> {\n const client = await this.client();\n const params = new $OpenApiUtil.Params({ action: 'ListCredentials', version: '2026-08-04', protocol: 'HTTPS',\n pathname: `/workspaces/${encodeURIComponent(this.workspaceId)}/credentials`, method: 'GET', authType: 'AK',\n style: 'ROA', reqBodyType: 'json', bodyType: 'json' });\n const items: Record<string, unknown>[] = [];\n let nextToken: string | undefined;\n do {\n const request = new $OpenApiUtil.OpenApiRequest({ query: { name, maxResults: '100', ...(nextToken ? { nextToken } : {}) } });\n const response = await this.invoke(client, 'ListCredentials', () => client.callApi(params, request, this.runtimeOptions()));\n const body = responseBody(response.body);\n items.push(...(body.items ?? [])); nextToken = body.nextToken;\n } while (nextToken);\n const item = exact(items, 'name', name, 'credential');\n const refs = (item.resourceRefs ?? []) as Array<Record<string, unknown>>;\n return {\n credentialId: requiredString(item.credentialId, 'credentialId'), name: requiredString(item.name, 'name'),\n credentialType: requiredString(item.credentialType, 'credentialType'), resourceScope: String(item.resourceScope ?? ''),\n resourceRefs: refs.map((ref) => ({ resourceType: requiredString(ref.resourceType, 'resourceType'), resourceId: requiredString(ref.resourceId, 'resourceId') })),\n };\n }\n\n private runtimeOptions(): RuntimeOptions { return new RuntimeOptions({ autoretry: false, connectTimeout: 10_000, readTimeout: 30_000 }); }\n private async client(): Promise<Client> {\n this.lifetime.signal.throwIfAborted();\n const credential = this.options.accessKeyCredential ?? await this.options.resourceSTSProvider!.get(HIGH_CODE_SDK_PURPOSE);\n return new GeneratedClient(new $OpenApiUtil.Config({\n accessKeyId: credential.accessKeyId, accessKeySecret: credential.accessKeySecret, securityToken: credential.securityToken,\n regionId: this.regionId, endpoint: this.endpoint ?? this.discoveredEndpoint, protocol: this.protocol,\n }));\n }\n private async invoke<T>(client: Client, operation: string, call: () => Promise<T>): Promise<T> {\n this.lifetime.signal.throwIfAborted();\n const invoke = async () => {\n this.logger.debug('agentcore.control_plane.request.started', { operation, host: client._endpoint });\n try { return await call(); }\n catch (cause) {\n const data = errorField(cause, 'data');\n this.logger.warn('agentcore.control_plane.request.failed', { operation, host: client._endpoint,\n status: String(errorField(cause, 'statusCode') ?? '-'), code: String(errorField(cause, 'code') ?? '-'),\n requestId: String(errorField(cause, 'requestId') ?? errorField(data, 'RequestId') ?? errorField(data, 'requestId') ?? '-'),\n });\n throw new InvocationError('AgentCore control-plane request failed', { cause });\n }\n };\n try { return await invoke(); }\n catch (error) {\n if (!(error instanceof InvocationError) || this.endpoint || client._endpoint !== `agentcore.${this.regionId}.aliyuncs.com` || !endpointFailure(error.cause)) throw error;\n const host = `agentcore-vpc.${this.regionId}.aliyuncs.com`;\n this.logger.warn('agentcore.control_plane.endpoint.fallback', { operation, fromHost: client._endpoint, toHost: host });\n client._endpoint = host;\n const result = await invoke(); this.discoveredEndpoint = host; return result;\n }\n }\n\n private async downloadSkill(value: string): Promise<Uint8Array> {\n let original: URL;\n try { original = new URL(value); } catch { throw new ConfigError('AgentCore returned an invalid Skill download URL'); }\n if (!['http:', 'https:'].includes(original.protocol) || original.username || original.password) throw new ConfigError('AgentCore returned an invalid Skill download URL');\n let candidate = original;\n for (;;) {\n this.lifetime.signal.throwIfAborted();\n let status: number | undefined;\n try {\n const response = await fetch(candidate, { redirect: 'manual', signal: AbortSignal.any([this.lifetime.signal, AbortSignal.timeout(30_000)]) });\n if (response.ok) {\n const archive = await readBytes(response, 10 * 1024 * 1024, 'Skill archive');\n if (!archive.length) throw new ConfigError('Skill package is empty');\n return archive;\n }\n status = response.status; await response.body?.cancel();\n } catch (error) {\n this.lifetime.signal.throwIfAborted();\n if (error instanceof ConfigError) throw error;\n }\n this.logger.warn('agentcore.control_plane.skill.download.failed', { host: candidate.host, path: candidate.pathname, status });\n const fallback = candidate === original && (status === undefined || status >= 500 && status < 600) ? internalOSSURL(original) : undefined;\n if (!fallback) throw new InvocationError(status ? `Skill package download failed with HTTP ${status}` : 'Skill package download failed');\n this.logger.warn('agentcore.control_plane.skill.download.fallback', { fromHost: candidate.host, toHost: fallback.host });\n candidate = fallback;\n }\n }\n}\n\nfunction latestVersion(data?: models.GetSkillDetailResponseBodyData): string {\n if (!data) throw new ResourceNotConfiguredError('AgentCore Skill does not exist');\n for (const [label, value] of Object.entries(data.labels ?? {})) if (label.toLowerCase() === 'latest' && value) return value;\n const online = (data.versions ?? []).filter((v) => v.status?.toLowerCase() === 'online' && v.version);\n online.sort((a, b) => (b.updateTime ?? -1) - (a.updateTime ?? -1) || (b.version ?? '').localeCompare(a.version ?? ''));\n if (!online[0]?.version) throw new ResourceNotConfiguredError('AgentCore Skill has no online version');\n return online[0].version;\n}\n\nexport function internalOSSURL(url: URL): URL | undefined {\n const match = /^([a-z0-9-]+)\\.(oss-[a-z]+-[a-z0-9-]+)\\.aliyuncs\\.com$/.exec(url.hostname);\n if (!match || match[2]!.endsWith('-internal') || match[2]!.startsWith('oss-accelerate') || url.username || url.password) return undefined;\n if (url.searchParams.getAll('x-oss-additional-headers').some((v) => v.split(';').includes('host'))) return undefined;\n const result = new URL(url); result.hostname = `${match[1]}.${match[2]}-internal.aliyuncs.com`; return result;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/controlplane/client.ts"],"sourcesContent":["import Client, * as models from '@alicloud/agentcore20260804';\nimport { $OpenApiUtil } from '@alicloud/openapi-core';\nimport { RuntimeOptions } from '@darabonba/typescript';\nimport { AccessKeyCredential, type CredentialProvider } from '../auth/access-key';\nimport { HIGH_CODE_SDK_PURPOSE } from '../auth/resource-sts';\nimport { ConfigError, InvocationError, MCPServerNotFoundError, ModelConnectionNotFoundError, ResourceNotConfiguredError } from '../errors';\nimport { readBytes } from '../http';\nimport { nullLogger, type Logger } from '../logging';\nimport { httpUrl, requiredString } from '../runtime/config';\n\n// The generated package is CJS: native ESM sees module.exports as the default.\nconst GeneratedClient = typeof Client === 'function' ? Client : (Client as unknown as { default: typeof Client }).default;\n\nexport interface ModelDescriptor {\n readonly connectionId: string;\n readonly connectionName: string;\n readonly protocol: string;\n readonly providerType: string;\n readonly modelId: string;\n readonly modelName: string;\n readonly contextSize?: number;\n readonly maxTokens?: number;\n readonly capabilities: Readonly<Record<string, boolean>>;\n}\nexport interface MCPDescriptor {\n readonly mcpServerId: string;\n readonly name: string;\n readonly protocol: string;\n readonly type: string;\n readonly status: string;\n}\nexport interface SkillArtifact { version: string; archive: Uint8Array; }\nexport interface CredentialMetadata {\n readonly credentialId: string;\n readonly name: string;\n readonly credentialType: string;\n readonly resourceScope: string;\n readonly resourceRefs: ReadonlyArray<{ resourceType: string; resourceId: string }>;\n}\nexport interface ControlPlaneOptions {\n workspaceId: string;\n regionId: string;\n accessKeyCredential?: AccessKeyCredential;\n resourceSTSProvider?: CredentialProvider;\n endpoint?: string;\n logger?: Logger;\n}\n\nfunction exact<T>(items: T[], field: keyof T, name: string, label: string, ErrorType: typeof ResourceNotConfiguredError = ResourceNotConfiguredError): T {\n const matches = items.filter((item) => item[field] === name);\n if (!matches.length) throw new ErrorType(`${label} ${JSON.stringify(name)} does not exist`);\n if (matches.length !== 1) throw new ConfigError(`${label} ${JSON.stringify(name)} is not unique`);\n return matches[0]!;\n}\n\nfunction errorField(error: unknown, key: string): unknown {\n return error && typeof error === 'object' ? (error as Record<string, unknown>)[key] : undefined;\n}\nfunction responseBody<T>(body: T | undefined): T {\n if (body === undefined) throw new ConfigError('AgentCore returned an empty control-plane response');\n return body;\n}\nfunction endpointFailure(error: unknown): boolean {\n const status = errorField(error, 'statusCode');\n const code = errorField(error, 'code');\n return (typeof status === 'number' && status >= 500 && status < 600) ||\n ['ECONNREFUSED', 'ECONNRESET', 'ENOTFOUND', 'EAI_AGAIN', 'ETIMEDOUT', 'ESOCKETTIMEDOUT'].includes(String(code)) ||\n errorField(error, 'name') === 'TimeoutError';\n}\n\nexport class AgentCoreControlPlane {\n readonly workspaceId: string;\n readonly regionId: string;\n private readonly endpoint?: string;\n private readonly protocol?: string;\n private discoveredEndpoint?: string;\n private readonly logger: Logger;\n private readonly lifetime = new AbortController();\n\n constructor(private readonly options: ControlPlaneOptions) {\n this.workspaceId = requiredString(options.workspaceId, 'workspaceId');\n this.regionId = requiredString(options.regionId, 'regionId');\n if (!options.accessKeyCredential && !options.resourceSTSProvider) throw new ConfigError('AgentCore control plane requires an AccessKey credential source');\n if (options.endpoint !== undefined) {\n const value = options.endpoint.trim();\n const url = new URL(httpUrl(value.includes('://') ? value : `https://${value}`, 'AgentCore control endpoint'));\n if (url.pathname !== '/') throw new ConfigError('AgentCore control endpoint must not contain a path');\n this.endpoint = url.host; this.protocol = url.protocol.slice(0, -1);\n }\n this.logger = options.logger ?? nullLogger;\n }\n\n async resolveModel(connectionName: string, modelName?: string): Promise<ModelDescriptor> {\n const client = await this.client();\n const connections: models.ListModelConnectionsResponseBodyItems[] = [];\n let nextToken: string | undefined;\n do {\n const response = await this.invoke(client, 'ListModelConnections', () => client.listModelConnectionsWithOptions(this.workspaceId,\n new models.ListModelConnectionsRequest({ name: connectionName, searchType: 'accurate', maxResults: 100, nextToken }), {}, this.runtimeOptions()));\n const body = responseBody(response.body);\n connections.push(...(body.items ?? [])); nextToken = body.nextToken;\n } while (nextToken);\n const connection = exact(connections, 'name', connectionName, 'model connection', ModelConnectionNotFoundError);\n const connectionId = requiredString(connection.connectionId, 'connectionId');\n const available: models.ListModelsResponseBodyItems[] = [];\n do {\n const response = await this.invoke(client, 'ListModels', () => client.listModelsWithOptions(this.workspaceId,\n new models.ListModelsRequest({ connectionId, modelName, maxResults: 100, nextToken }), {}, this.runtimeOptions()));\n const body = responseBody(response.body);\n available.push(...(body.items ?? [])); nextToken = body.nextToken;\n } while (nextToken);\n let model: models.ListModelsResponseBodyItems;\n if (modelName !== undefined) model = exact(available, 'modelName', modelName, 'model');\n else {\n if (available.length !== 1) throw new ResourceNotConfiguredError(`model connection ${JSON.stringify(connectionName)} requires an explicit model name`);\n model = available[0]!;\n }\n const capabilities = Object.fromEntries(Object.entries(model.capabilities ?? {}).filter((entry): entry is [string, boolean] => typeof entry[1] === 'boolean'));\n const descriptor = Object.freeze({ connectionId, connectionName: requiredString(connection.name, 'connection name'),\n protocol: connection.protocol ?? '', providerType: connection.providerType ?? '',\n modelId: requiredString(model.modelId, 'modelId'), modelName: requiredString(model.modelName, 'modelName'),\n contextSize: model.contextSize, maxTokens: model.maxTokens, capabilities: Object.freeze(capabilities),\n });\n this.logger.info('agentcore.control_plane.model.resolve.succeeded', { connectionName, connectionId, modelName: descriptor.modelName });\n return descriptor;\n }\n\n async resolveMCP(name: string): Promise<MCPDescriptor> {\n const client = await this.client();\n const items: models.ListMcpsResponseBodyItems[] = [];\n let nextToken: string | undefined;\n do {\n const response = await this.invoke(client, 'ListMcps', () => client.listMcpsWithOptions(this.workspaceId,\n new models.ListMcpsRequest({ name, searchType: 'accurate', maxResults: 100, nextToken }), {}, this.runtimeOptions()));\n const body = responseBody(response.body);\n items.push(...(body.items ?? [])); nextToken = body.nextToken;\n } while (nextToken);\n const item = exact(items, 'name', name, 'MCP server', MCPServerNotFoundError);\n const descriptor = Object.freeze({ mcpServerId: requiredString(item.mcpServerId, 'mcpServerId'),\n name: requiredString(item.name, 'MCP name'), protocol: item.protocol ?? '', type: item.type ?? '', status: item.status ?? '',\n });\n this.logger.info('agentcore.control_plane.mcp.resolve.succeeded', { name, mcpServerId: descriptor.mcpServerId, protocol: descriptor.protocol });\n return descriptor;\n }\n\n async getSkill(name: string, version?: string): Promise<SkillArtifact> {\n const client = await this.client();\n if (version === undefined) {\n const detail = await this.invoke(client, 'GetSkillDetail', () => client.getSkillDetailWithOptions(this.workspaceId, name, new models.GetSkillDetailRequest({}), {}, this.runtimeOptions()));\n version = latestVersion(responseBody(detail.body).data);\n }\n const resolvedVersion = version;\n const response = await this.invoke(client, 'DownloadSkillVersionViaOss', () => client.downloadSkillVersionViaOssWithOptions(this.workspaceId, name, resolvedVersion,\n new models.DownloadSkillVersionViaOssRequest({}), {}, this.runtimeOptions()));\n const downloadURL = responseBody(response.body).data;\n if (typeof downloadURL !== 'string') throw new ConfigError('AgentCore returned an invalid Skill download URL');\n return { version: resolvedVersion, archive: await this.downloadSkill(downloadURL) };\n }\n\n close(): void { this.lifetime.abort(); }\n\n async resolveCredential(name: string): Promise<CredentialMetadata> {\n const client = await this.client();\n const params = new $OpenApiUtil.Params({ action: 'ListCredentials', version: '2026-08-04', protocol: 'HTTPS',\n pathname: `/workspaces/${encodeURIComponent(this.workspaceId)}/credentials`, method: 'GET', authType: 'AK',\n style: 'ROA', reqBodyType: 'json', bodyType: 'json' });\n const items: Record<string, unknown>[] = [];\n let nextToken: string | undefined;\n do {\n const request = new $OpenApiUtil.OpenApiRequest({ query: { name, maxResults: '100', ...(nextToken ? { nextToken } : {}) } });\n const response = await this.invoke(client, 'ListCredentials', () => client.callApi(params, request, this.runtimeOptions()));\n const body = responseBody(response.body);\n items.push(...(body.items ?? [])); nextToken = body.nextToken;\n } while (nextToken);\n const item = exact(items, 'name', name, 'credential');\n const refs = (item.resourceRefs ?? []) as Array<Record<string, unknown>>;\n return {\n credentialId: requiredString(item.credentialId, 'credentialId'), name: requiredString(item.name, 'name'),\n credentialType: requiredString(item.credentialType, 'credentialType'), resourceScope: String(item.resourceScope ?? ''),\n resourceRefs: refs.map((ref) => ({ resourceType: requiredString(ref.resourceType, 'resourceType'), resourceId: requiredString(ref.resourceId, 'resourceId') })),\n };\n }\n\n private runtimeOptions(): RuntimeOptions { return new RuntimeOptions({ autoretry: false, connectTimeout: 10_000, readTimeout: 30_000 }); }\n private async client(): Promise<Client> {\n this.lifetime.signal.throwIfAborted();\n const credential = this.options.accessKeyCredential ?? await this.options.resourceSTSProvider!.get(HIGH_CODE_SDK_PURPOSE);\n return new GeneratedClient(new $OpenApiUtil.Config({\n accessKeyId: credential.accessKeyId, accessKeySecret: credential.accessKeySecret, securityToken: credential.securityToken,\n regionId: this.regionId, endpoint: this.endpoint ?? this.discoveredEndpoint, protocol: this.protocol,\n }));\n }\n private async invoke<T>(client: Client, operation: string, call: () => Promise<T>): Promise<T> {\n this.lifetime.signal.throwIfAborted();\n const invoke = async () => {\n this.logger.debug('agentcore.control_plane.request.started', { operation, host: client._endpoint });\n try { return await call(); }\n catch (cause) {\n const data = errorField(cause, 'data');\n this.logger.warn('agentcore.control_plane.request.failed', { operation, host: client._endpoint,\n status: String(errorField(cause, 'statusCode') ?? '-'), code: String(errorField(cause, 'code') ?? '-'),\n requestId: String(errorField(cause, 'requestId') ?? errorField(data, 'RequestId') ?? errorField(data, 'requestId') ?? '-'),\n });\n throw new InvocationError('AgentCore control-plane request failed', { cause });\n }\n };\n try { return await invoke(); }\n catch (error) {\n if (!(error instanceof InvocationError) || this.endpoint || client._endpoint !== `agentcore.${this.regionId}.aliyuncs.com` || !endpointFailure(error.cause)) throw error;\n const host = `agentcore-vpc.${this.regionId}.aliyuncs.com`;\n this.logger.warn('agentcore.control_plane.endpoint.fallback', { operation, fromHost: client._endpoint, toHost: host });\n client._endpoint = host;\n const result = await invoke(); this.discoveredEndpoint = host; return result;\n }\n }\n\n private async downloadSkill(value: string): Promise<Uint8Array> {\n let original: URL;\n try { original = new URL(value); } catch { throw new ConfigError('AgentCore returned an invalid Skill download URL'); }\n if (!['http:', 'https:'].includes(original.protocol) || original.username || original.password) throw new ConfigError('AgentCore returned an invalid Skill download URL');\n let candidate = original;\n for (;;) {\n this.lifetime.signal.throwIfAborted();\n let status: number | undefined;\n try {\n const response = await fetch(candidate, { redirect: 'manual', signal: AbortSignal.any([this.lifetime.signal, AbortSignal.timeout(30_000)]) });\n if (response.ok) {\n const archive = await readBytes(response, 10 * 1024 * 1024, 'Skill archive');\n if (!archive.length) throw new ConfigError('Skill package is empty');\n return archive;\n }\n status = response.status; await response.body?.cancel();\n } catch (error) {\n this.lifetime.signal.throwIfAborted();\n if (error instanceof ConfigError) throw error;\n }\n this.logger.warn('agentcore.control_plane.skill.download.failed', { host: candidate.host, path: candidate.pathname, status });\n const fallback = candidate === original && (status === undefined || status >= 500 && status < 600) ? internalOSSURL(original) : undefined;\n if (!fallback) throw new InvocationError(status ? `Skill package download failed with HTTP ${status}` : 'Skill package download failed');\n this.logger.warn('agentcore.control_plane.skill.download.fallback', { fromHost: candidate.host, toHost: fallback.host });\n candidate = fallback;\n }\n }\n}\n\nfunction latestVersion(data?: models.GetSkillDetailResponseBodyData): string {\n if (!data) throw new ResourceNotConfiguredError('AgentCore Skill does not exist');\n for (const [label, value] of Object.entries(data.labels ?? {})) if (label.toLowerCase() === 'latest' && value) return value;\n const online = (data.versions ?? []).filter((v) => v.status?.toLowerCase() === 'online' && v.version);\n online.sort((a, b) => (b.updateTime ?? -1) - (a.updateTime ?? -1) || (b.version ?? '').localeCompare(a.version ?? ''));\n if (!online[0]?.version) throw new ResourceNotConfiguredError('AgentCore Skill has no online version');\n return online[0].version;\n}\n\nexport function internalOSSURL(url: URL): URL | undefined {\n const match = /^([a-z0-9-]+)\\.(oss-[a-z]+-[a-z0-9-]+)\\.aliyuncs\\.com$/.exec(url.hostname);\n if (!match || match[2]!.endsWith('-internal') || match[2]!.startsWith('oss-accelerate') || url.username || url.password) return undefined;\n if (url.searchParams.getAll('x-oss-additional-headers').some((v) => v.split(';').includes('host'))) return undefined;\n const result = new URL(url); result.hostname = `${match[1]}.${match[2]}-internal.aliyuncs.com`; return result;\n}\n"],"mappings":"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","names":[]}
@@ -1,3 +1,19 @@
1
+ // src/logging.ts
2
+ var nullLogger = {
3
+ debug() {
4
+ },
5
+ info() {
6
+ },
7
+ warn() {
8
+ },
9
+ error() {
10
+ }
11
+ };
12
+ function safeErrorMessage(value) {
13
+ if (typeof value !== "string" || !value.trim()) return void 0;
14
+ return value.replace(/[\x00-\x1f\x7f]+/g, " ").replace(/\b(?:authorization|api[ _-]?key(?:\s+provided)?|access[_-]?key(?:[_-]?(?:id|secret))?|(?:security|access|refresh|jwt)[_-]?token|token|password|secret|text|content|query|messages|metadata|headers)["']?\s*[:=].*/i, "<redacted>").replace(/\b(?:Bearer|Basic)\s+[^\s,;]+/gi, "<redacted>").replace(/\b(?:LTAI[A-Za-z0-9]+|eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+)\b/g, "<redacted>").replace(/https?:\/\/\S+/g, "<url>").slice(0, 512);
15
+ }
16
+
1
17
  // src/errors.ts
2
18
  var AgentCoreError = class extends Error {
3
19
  code = "AGENTCORE_ERROR";
@@ -44,17 +60,29 @@ var MemoryValidationError = class extends AgentCoreError {
44
60
  };
45
61
  var MemoryAPIError = class extends AgentCoreError {
46
62
  constructor(operation, details = {}) {
47
- super(`AgentCore Memory operation ${operation} failed`);
63
+ super("");
48
64
  this.operation = operation;
49
65
  this.serviceCode = details.serviceCode;
50
66
  this.httpStatusCode = details.httpStatusCode;
51
67
  this.requestId = details.requestId;
68
+ this.serviceMessage = safeErrorMessage(details.serviceMessage);
69
+ const diagnostics = Object.entries({
70
+ status: this.httpStatusCode,
71
+ service_code: this.serviceCode,
72
+ request_id: this.requestId,
73
+ message: this.serviceMessage
74
+ }).filter(([, value]) => value !== void 0).map(([key, value]) => `${key}=${value}`).join(", ");
75
+ this.message = this.summary(operation) + (diagnostics ? `: ${diagnostics}` : "");
52
76
  }
53
77
  operation;
54
78
  code = "MEMORY_API_FAILED";
55
79
  serviceCode;
56
80
  httpStatusCode;
57
81
  requestId;
82
+ serviceMessage;
83
+ summary(operation) {
84
+ return `AgentCore Memory operation ${operation} failed`;
85
+ }
58
86
  };
59
87
  var MemoryContractError = class extends AgentCoreError {
60
88
  constructor(operation, detail) {
@@ -68,13 +96,13 @@ var MemoryContractError = class extends AgentCoreError {
68
96
  };
69
97
  var AddMemoriesOutcomeUnknownError = class extends MemoryAPIError {
70
98
  code = "ADD_MEMORIES_OUTCOME_UNKNOWN";
71
- constructor(operation, details = {}) {
72
- super(operation, details);
73
- this.message = "AgentCore Memory AddMemories outcome is unknown; the write may have succeeded";
99
+ summary() {
100
+ return "AgentCore Memory AddMemories outcome is unknown; the write may have succeeded";
74
101
  }
75
102
  };
76
103
 
77
104
  export {
105
+ nullLogger,
78
106
  AgentCoreError,
79
107
  ConfigError,
80
108
  ContextError,
@@ -92,4 +120,4 @@ export {
92
120
  MemoryContractError,
93
121
  AddMemoriesOutcomeUnknownError
94
122
  };
95
- //# sourceMappingURL=chunk-MZ5UWGXS.js.map
123
+ //# sourceMappingURL=chunk-AEQ76QIO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/logging.ts","../src/errors.ts"],"sourcesContent":["export type LogFields = Readonly<Record<string, string | number | boolean | undefined>>;\nexport interface Logger {\n debug(event: string, fields?: LogFields): void;\n info(event: string, fields?: LogFields): void;\n warn(event: string, fields?: LogFields): void;\n error(event: string, fields?: LogFields): void;\n}\n\n// Libraries are silent unless the application supplies a logger.\nexport const nullLogger: Logger = {\n debug() {}, info() {}, warn() {}, error() {},\n};\n\n/** Render only a service message field, never a response or exception dump. */\nexport function safeErrorMessage(value: unknown): string | undefined {\n if (typeof value !== 'string' || !value.trim()) return undefined;\n return value.replace(/[\\x00-\\x1f\\x7f]+/g, ' ')\n .replace(/\\b(?:authorization|api[ _-]?key(?:\\s+provided)?|access[_-]?key(?:[_-]?(?:id|secret))?|(?:security|access|refresh|jwt)[_-]?token|token|password|secret|text|content|query|messages|metadata|headers)[\"']?\\s*[:=].*/i, '<redacted>')\n .replace(/\\b(?:Bearer|Basic)\\s+[^\\s,;]+/gi, '<redacted>')\n .replace(/\\b(?:LTAI[A-Za-z0-9]+|eyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+)\\b/g, '<redacted>')\n .replace(/https?:\\/\\/\\S+/g, '<url>')\n .slice(0, 512);\n}\n","import { safeErrorMessage } from './logging';\n\nexport class AgentCoreError extends Error {\n readonly code: string = 'AGENTCORE_ERROR';\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = new.target.name;\n }\n}\n\nexport class ConfigError extends AgentCoreError { override readonly code: string = 'CONFIG_INVALID'; }\nexport class ContextError extends AgentCoreError { override readonly code: string = 'CONTEXT_INVALID'; }\nexport class AuthenticationError extends AgentCoreError { override readonly code: string = 'AUTHENTICATION_FAILED'; }\nexport class CredentialExchangeError extends AuthenticationError { override readonly code: string = 'CREDENTIAL_EXCHANGE_FAILED'; }\nexport class WorkloadIdentityNotConfiguredError extends AuthenticationError { override readonly code = 'WORKLOAD_IDENTITY_NOT_CONFIGURED'; }\nexport class WorkloadAccessTokenRejectedError extends CredentialExchangeError { override readonly code = 'WORKLOAD_ACCESS_TOKEN_REJECTED'; }\nexport class ResourceNotConfiguredError extends AgentCoreError { override readonly code: string = 'RESOURCE_NOT_CONFIGURED'; }\nexport class ModelConnectionNotFoundError extends ResourceNotConfiguredError { override readonly code = 'MODEL_CONNECTION_NOT_FOUND'; }\nexport class MCPServerNotFoundError extends ResourceNotConfiguredError { override readonly code = 'MCP_SERVER_NOT_FOUND'; }\nexport class InvocationError extends AgentCoreError { override readonly code = 'INVOCATION_FAILED'; }\nexport class UnsupportedFeatureError extends AgentCoreError { override readonly code = 'UNSUPPORTED_FEATURE'; }\n\nexport class MemoryValidationError extends AgentCoreError { override readonly code = 'MEMORY_VALIDATION_FAILED'; }\nexport interface MemoryErrorDetails { serviceCode?: string; httpStatusCode?: number; requestId?: string; serviceMessage?: string; }\nexport class MemoryAPIError extends AgentCoreError {\n override readonly code: string = 'MEMORY_API_FAILED';\n readonly serviceCode?: string;\n readonly httpStatusCode?: number;\n readonly requestId?: string;\n readonly serviceMessage?: string;\n constructor(readonly operation: string, details: MemoryErrorDetails = {}) {\n super('');\n this.serviceCode = details.serviceCode; this.httpStatusCode = details.httpStatusCode; this.requestId = details.requestId;\n this.serviceMessage = safeErrorMessage(details.serviceMessage);\n const diagnostics = Object.entries({ status: this.httpStatusCode, service_code: this.serviceCode,\n request_id: this.requestId, message: this.serviceMessage })\n .filter(([, value]) => value !== undefined).map(([key, value]) => `${key}=${value}`).join(', ');\n this.message = this.summary(operation) + (diagnostics ? `: ${diagnostics}` : '');\n }\n protected summary(operation: string): string { return `AgentCore Memory operation ${operation} failed`; }\n}\nexport class MemoryContractError extends AgentCoreError {\n override readonly code = 'MEMORY_RESPONSE_INVALID';\n constructor(readonly operation: string, readonly detail: string) { super(`AgentCore Memory ${operation} returned an invalid response: ${detail}`); }\n}\nexport class AddMemoriesOutcomeUnknownError extends MemoryAPIError {\n override readonly code = 'ADD_MEMORIES_OUTCOME_UNKNOWN';\n protected override summary(): string { return 'AgentCore Memory AddMemories outcome is unknown; the write may have succeeded'; }\n}\n"],"mappings":";AASO,IAAM,aAAqB;AAAA,EAChC,QAAQ;AAAA,EAAC;AAAA,EAAG,OAAO;AAAA,EAAC;AAAA,EAAG,OAAO;AAAA,EAAC;AAAA,EAAG,QAAQ;AAAA,EAAC;AAC7C;AAGO,SAAS,iBAAiB,OAAoC;AACnE,MAAI,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK,EAAG,QAAO;AACvD,SAAO,MAAM,QAAQ,qBAAqB,GAAG,EAC1C,QAAQ,sNAAsN,YAAY,EAC1O,QAAQ,mCAAmC,YAAY,EACvD,QAAQ,+EAA+E,YAAY,EACnG,QAAQ,mBAAmB,OAAO,EAClC,MAAM,GAAG,GAAG;AACjB;;;ACpBO,IAAM,iBAAN,cAA6B,MAAM;AAAA,EAC/B,OAAe;AAAA,EACxB,YAAY,SAAiB,SAAwB;AACnD,UAAM,SAAS,OAAO;AACtB,SAAK,OAAO,WAAW;AAAA,EACzB;AACF;AAEO,IAAM,cAAN,cAA0B,eAAe;AAAA,EAAoB,OAAe;AAAkB;AAC9F,IAAM,eAAN,cAA2B,eAAe;AAAA,EAAoB,OAAe;AAAmB;AAChG,IAAM,sBAAN,cAAkC,eAAe;AAAA,EAAoB,OAAe;AAAyB;AAC7G,IAAM,0BAAN,cAAsC,oBAAoB;AAAA,EAAoB,OAAe;AAA8B;AAC3H,IAAM,qCAAN,cAAiD,oBAAoB;AAAA,EAAoB,OAAO;AAAoC;AACpI,IAAM,mCAAN,cAA+C,wBAAwB;AAAA,EAAoB,OAAO;AAAkC;AACpI,IAAM,6BAAN,cAAyC,eAAe;AAAA,EAAoB,OAAe;AAA2B;AACtH,IAAM,+BAAN,cAA2C,2BAA2B;AAAA,EAAoB,OAAO;AAA8B;AAC/H,IAAM,yBAAN,cAAqC,2BAA2B;AAAA,EAAoB,OAAO;AAAwB;AACnH,IAAM,kBAAN,cAA8B,eAAe;AAAA,EAAoB,OAAO;AAAqB;AAC7F,IAAM,0BAAN,cAAsC,eAAe;AAAA,EAAoB,OAAO;AAAuB;AAEvG,IAAM,wBAAN,cAAoC,eAAe;AAAA,EAAoB,OAAO;AAA4B;AAE1G,IAAM,iBAAN,cAA6B,eAAe;AAAA,EAMjD,YAAqB,WAAmB,UAA8B,CAAC,GAAG;AACxE,UAAM,EAAE;AADW;AAEnB,SAAK,cAAc,QAAQ;AAAa,SAAK,iBAAiB,QAAQ;AAAgB,SAAK,YAAY,QAAQ;AAC/G,SAAK,iBAAiB,iBAAiB,QAAQ,cAAc;AAC7D,UAAM,cAAc,OAAO,QAAQ;AAAA,MAAE,QAAQ,KAAK;AAAA,MAAgB,cAAc,KAAK;AAAA,MACnF,YAAY,KAAK;AAAA,MAAW,SAAS,KAAK;AAAA,IAAe,CAAC,EACzD,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,MAAS,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,EAAE,KAAK,IAAI;AAChG,SAAK,UAAU,KAAK,QAAQ,SAAS,KAAK,cAAc,KAAK,WAAW,KAAK;AAAA,EAC/E;AAAA,EARqB;AAAA,EALH,OAAe;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAUC,QAAQ,WAA2B;AAAE,WAAO,8BAA8B,SAAS;AAAA,EAAW;AAC1G;AACO,IAAM,sBAAN,cAAkC,eAAe;AAAA,EAEtD,YAAqB,WAA4B,QAAgB;AAAE,UAAM,oBAAoB,SAAS,kCAAkC,MAAM,EAAE;AAA3H;AAA4B;AAAA,EAAkG;AAAA,EAA9H;AAAA,EAA4B;AAAA,EAD/B,OAAO;AAE3B;AACO,IAAM,iCAAN,cAA6C,eAAe;AAAA,EAC/C,OAAO;AAAA,EACN,UAAkB;AAAE,WAAO;AAAA,EAAiF;AACjI;","names":[]}
@@ -1,13 +1,11 @@
1
1
  import {
2
2
  httpUrl
3
- } from "./chunk-K3TE7625.js";
4
- import {
5
- nullLogger
6
- } from "./chunk-NZL3VPJ2.js";
3
+ } from "./chunk-3JXIMUUY.js";
7
4
  import {
8
5
  AuthenticationError,
9
- CredentialExchangeError
10
- } from "./chunk-MZ5UWGXS.js";
6
+ CredentialExchangeError,
7
+ nullLogger
8
+ } from "./chunk-AEQ76QIO.js";
11
9
 
12
10
  // src/auth/agent-sa-token.ts
13
11
  import { readFile } from "fs/promises";
@@ -139,4 +137,4 @@ export {
139
137
  refreshAgentSAToken,
140
138
  ControllerClient
141
139
  };
142
- //# sourceMappingURL=chunk-UBP5CHU7.js.map
140
+ //# sourceMappingURL=chunk-AX3NM2DK.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/auth/agent-sa-token.ts","../src/auth/controller.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport { AuthenticationError } from '../errors';\n\nexport const DEFAULT_AGENT_SA_TOKEN_PATH = '/var/run/agentcore/agent/token';\nexport interface AgentSATokenSource {\n get(): string | Promise<string>;\n refresh?(current: string): string | Promise<string>;\n}\n\nexport class AgentSATokenProvider implements AgentSATokenSource {\n constructor(readonly path = DEFAULT_AGENT_SA_TOKEN_PATH) {}\n async get(): Promise<string> {\n let token: string;\n try { token = await readFile(this.path, 'utf8'); } catch (cause) {\n throw new AuthenticationError('cannot read the Agent SA token file', { cause });\n }\n return validToken(token);\n }\n}\n\nfunction validToken(token: string): string {\n if (typeof token !== 'string' || !token.trim()) throw new AuthenticationError('the Agent SA token source returned an empty token');\n return token.trim();\n}\nexport async function getAgentSAToken(source: AgentSATokenSource): Promise<string> {\n return validToken(await source.get());\n}\nexport async function refreshAgentSAToken(source: AgentSATokenSource, current: string): Promise<string> {\n return validToken(await (source.refresh ? source.refresh(current) : source.get()));\n}\n","import { setTimeout as sleep } from 'node:timers/promises';\nimport { AuthenticationError, CredentialExchangeError } from '../errors';\nimport { nullLogger, type Logger } from '../logging';\nimport { httpUrl } from '../runtime/config';\nimport { getAgentSAToken, refreshAgentSAToken, type AgentSATokenSource } from './agent-sa-token';\n\nexport interface ControllerOptions {\n timeoutMs?: number;\n maxAttempts?: number;\n logger?: Logger;\n}\ninterface ControllerResponse {\n status: number;\n payload: unknown;\n message?: string;\n}\n\n// Shared transport only for the Controller's idempotent credential exchanges.\nexport class ControllerClient {\n private readonly endpoint: string;\n private readonly timeoutMs: number;\n private readonly maxAttempts: number;\n private readonly logger: Logger;\n private readonly lifetime = new AbortController();\n\n constructor(endpoint: string, private readonly saTokens: AgentSATokenSource, options: ControllerOptions = {}) {\n this.endpoint = httpUrl(endpoint, 'Controller endpoint');\n this.timeoutMs = options.timeoutMs ?? 10_000;\n this.maxAttempts = options.maxAttempts ?? 3;\n if (!Number.isFinite(this.timeoutMs) || this.timeoutMs <= 0 || !Number.isInteger(this.maxAttempts) || this.maxAttempts < 1) {\n throw new TypeError('timeoutMs and maxAttempts must be positive');\n }\n this.logger = options.logger ?? nullLogger;\n }\n\n async post(path: string, purpose?: string | Readonly<Record<string, string>>): Promise<ControllerResponse> {\n let token = await getAgentSAToken(this.saTokens);\n let response = await this.request(path, token, purpose);\n if (response.status === 401) {\n const rotated = await refreshAgentSAToken(this.saTokens, token);\n this.logger.warn('agentcore.controller.sa_rejected', { rotated: rotated !== token });\n if (rotated !== token) {\n token = rotated;\n response = await this.request(path, token, purpose);\n }\n }\n if (response.status === 401) throw new AuthenticationError('Controller rejected the Agent SA token');\n return response;\n }\n\n close(): void { this.lifetime.abort(); }\n\n private async request(path: string, token: string, purpose?: string | Readonly<Record<string, string>>): Promise<ControllerResponse> {\n const url = new URL(`${this.endpoint}${path}`);\n const query = typeof purpose === 'string' ? { purpose } : purpose;\n for (const [key, value] of Object.entries(query ?? {})) url.searchParams.set(key, value);\n const fields = { url: `${url.origin}${url.pathname}`, purpose: query?.purpose ?? 'default' };\n for (let attempt = 1; attempt <= this.maxAttempts; attempt++) {\n this.lifetime.signal.throwIfAborted();\n this.logger.debug('agentcore.controller.request.started', { ...fields, attempt });\n let response: Response;\n let text: string;\n const timeout = new AbortController();\n const timer = setTimeout(() => timeout.abort(), this.timeoutMs);\n const signal = AbortSignal.any([this.lifetime.signal, timeout.signal]);\n try {\n response = await fetch(url, {\n method: 'POST', headers: { Authorization: `Bearer ${token}` }, body: '',\n redirect: 'manual', signal,\n });\n text = await response.text();\n } catch (cause) {\n this.lifetime.signal.throwIfAborted();\n this.logger.warn('agentcore.controller.request.failed', { ...fields, attempt, reason: 'transport_error' });\n if (attempt === this.maxAttempts) throw new CredentialExchangeError('cannot reach the AgentCore Controller', { cause });\n await sleep(50 * 2 ** (attempt - 1), undefined, { signal: this.lifetime.signal });\n continue;\n } finally { clearTimeout(timer); }\n let payload: unknown;\n try { payload = JSON.parse(text); } catch { payload = undefined; }\n // Never log a successful credential response, headers, or arbitrary JSON fields.\n const rawMessage = payload && typeof payload === 'object' && 'message' in payload ? payload.message : undefined;\n const message = typeof rawMessage === 'string'\n ? rawMessage.split(token).join('<redacted>').replace(/Bearer\\s+\\S+/gi, 'Bearer <redacted>').replace(/\\s+/g, ' ').slice(0, 1024)\n : undefined;\n const result = { status: response.status, payload, message };\n if (response.ok) {\n this.logger.debug('agentcore.controller.request.succeeded', { ...fields, status: response.status });\n return result;\n }\n this.logger.warn('agentcore.controller.request.failed', {\n ...fields, status: response.status, attempt, message,\n requestId: response.headers.get('x-acs-request-id') ?? response.headers.get('x-request-id') ?? undefined,\n });\n if (![500, 502, 503, 504].includes(response.status) || attempt === this.maxAttempts) return result;\n await sleep(50 * 2 ** (attempt - 1), undefined, { signal: this.lifetime.signal });\n }\n throw new CredentialExchangeError('Controller request did not complete');\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/auth/agent-sa-token.ts","../src/auth/controller.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport { AuthenticationError } from '../errors';\n\nexport const DEFAULT_AGENT_SA_TOKEN_PATH = '/var/run/agentcore/agent/token';\nexport interface AgentSATokenSource {\n get(): string | Promise<string>;\n refresh?(current: string): string | Promise<string>;\n}\n\nexport class AgentSATokenProvider implements AgentSATokenSource {\n constructor(readonly path = DEFAULT_AGENT_SA_TOKEN_PATH) {}\n async get(): Promise<string> {\n let token: string;\n try { token = await readFile(this.path, 'utf8'); } catch (cause) {\n throw new AuthenticationError('cannot read the Agent SA token file', { cause });\n }\n return validToken(token);\n }\n}\n\nfunction validToken(token: string): string {\n if (typeof token !== 'string' || !token.trim()) throw new AuthenticationError('the Agent SA token source returned an empty token');\n return token.trim();\n}\nexport async function getAgentSAToken(source: AgentSATokenSource): Promise<string> {\n return validToken(await source.get());\n}\nexport async function refreshAgentSAToken(source: AgentSATokenSource, current: string): Promise<string> {\n return validToken(await (source.refresh ? source.refresh(current) : source.get()));\n}\n","import { setTimeout as sleep } from 'node:timers/promises';\nimport { AuthenticationError, CredentialExchangeError } from '../errors';\nimport { nullLogger, type Logger } from '../logging';\nimport { httpUrl } from '../runtime/config';\nimport { getAgentSAToken, refreshAgentSAToken, type AgentSATokenSource } from './agent-sa-token';\n\nexport interface ControllerOptions {\n timeoutMs?: number;\n maxAttempts?: number;\n logger?: Logger;\n}\ninterface ControllerResponse {\n status: number;\n payload: unknown;\n message?: string;\n}\n\n// Shared transport only for the Controller's idempotent credential exchanges.\nexport class ControllerClient {\n private readonly endpoint: string;\n private readonly timeoutMs: number;\n private readonly maxAttempts: number;\n private readonly logger: Logger;\n private readonly lifetime = new AbortController();\n\n constructor(endpoint: string, private readonly saTokens: AgentSATokenSource, options: ControllerOptions = {}) {\n this.endpoint = httpUrl(endpoint, 'Controller endpoint');\n this.timeoutMs = options.timeoutMs ?? 10_000;\n this.maxAttempts = options.maxAttempts ?? 3;\n if (!Number.isFinite(this.timeoutMs) || this.timeoutMs <= 0 || !Number.isInteger(this.maxAttempts) || this.maxAttempts < 1) {\n throw new TypeError('timeoutMs and maxAttempts must be positive');\n }\n this.logger = options.logger ?? nullLogger;\n }\n\n async post(path: string, purpose?: string | Readonly<Record<string, string>>): Promise<ControllerResponse> {\n let token = await getAgentSAToken(this.saTokens);\n let response = await this.request(path, token, purpose);\n if (response.status === 401) {\n const rotated = await refreshAgentSAToken(this.saTokens, token);\n this.logger.warn('agentcore.controller.sa_rejected', { rotated: rotated !== token });\n if (rotated !== token) {\n token = rotated;\n response = await this.request(path, token, purpose);\n }\n }\n if (response.status === 401) throw new AuthenticationError('Controller rejected the Agent SA token');\n return response;\n }\n\n close(): void { this.lifetime.abort(); }\n\n private async request(path: string, token: string, purpose?: string | Readonly<Record<string, string>>): Promise<ControllerResponse> {\n const url = new URL(`${this.endpoint}${path}`);\n const query = typeof purpose === 'string' ? { purpose } : purpose;\n for (const [key, value] of Object.entries(query ?? {})) url.searchParams.set(key, value);\n const fields = { url: `${url.origin}${url.pathname}`, purpose: query?.purpose ?? 'default' };\n for (let attempt = 1; attempt <= this.maxAttempts; attempt++) {\n this.lifetime.signal.throwIfAborted();\n this.logger.debug('agentcore.controller.request.started', { ...fields, attempt });\n let response: Response;\n let text: string;\n const timeout = new AbortController();\n const timer = setTimeout(() => timeout.abort(), this.timeoutMs);\n const signal = AbortSignal.any([this.lifetime.signal, timeout.signal]);\n try {\n response = await fetch(url, {\n method: 'POST', headers: { Authorization: `Bearer ${token}` }, body: '',\n redirect: 'manual', signal,\n });\n text = await response.text();\n } catch (cause) {\n this.lifetime.signal.throwIfAborted();\n this.logger.warn('agentcore.controller.request.failed', { ...fields, attempt, reason: 'transport_error' });\n if (attempt === this.maxAttempts) throw new CredentialExchangeError('cannot reach the AgentCore Controller', { cause });\n await sleep(50 * 2 ** (attempt - 1), undefined, { signal: this.lifetime.signal });\n continue;\n } finally { clearTimeout(timer); }\n let payload: unknown;\n try { payload = JSON.parse(text); } catch { payload = undefined; }\n // Never log a successful credential response, headers, or arbitrary JSON fields.\n const rawMessage = payload && typeof payload === 'object' && 'message' in payload ? payload.message : undefined;\n const message = typeof rawMessage === 'string'\n ? rawMessage.split(token).join('<redacted>').replace(/Bearer\\s+\\S+/gi, 'Bearer <redacted>').replace(/\\s+/g, ' ').slice(0, 1024)\n : undefined;\n const result = { status: response.status, payload, message };\n if (response.ok) {\n this.logger.debug('agentcore.controller.request.succeeded', { ...fields, status: response.status });\n return result;\n }\n this.logger.warn('agentcore.controller.request.failed', {\n ...fields, status: response.status, attempt, message,\n requestId: response.headers.get('x-acs-request-id') ?? response.headers.get('x-request-id') ?? undefined,\n });\n if (![500, 502, 503, 504].includes(response.status) || attempt === this.maxAttempts) return result;\n await sleep(50 * 2 ** (attempt - 1), undefined, { signal: this.lifetime.signal });\n }\n throw new CredentialExchangeError('Controller request did not complete');\n }\n}\n"],"mappings":"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","names":[]}