{"version":3,"file":"copilot-runtime.cjs","names":["InMemoryAgentRunner","TelemetryAgentRunner","CopilotRuntimeVNext","EndpointType","CopilotKitMisuseError","BuiltInAgent","aguiToGQL","extractParametersFromSchema"],"sources":["../../../src/lib/runtime/copilot-runtime.ts"],"sourcesContent":["/**\n * <Callout type=\"info\">\n *   This is the reference for the `CopilotRuntime` class. For more information and example code snippets, please see [Concept: Copilot Runtime](/concepts/copilot-runtime).\n * </Callout>\n *\n * ## Usage\n *\n * ```tsx\n * import { CopilotRuntime } from \"@copilotkit/runtime\";\n *\n * const copilotKit = new CopilotRuntime();\n * ```\n */\n\nimport {\n  type Action,\n  type CopilotErrorHandler,\n  CopilotKitMisuseError,\n  type MaybePromise,\n  type NonEmptyRecord,\n  type Parameter,\n  readBody,\n  getZodParameters,\n  type PartialBy,\n  isTelemetryDisabled,\n} from \"@copilotkit/shared\";\nimport type { RunAgentInput } from \"@ag-ui/core\";\nimport { aguiToGQL } from \"../../graphql/message-conversion/agui-to-gql\";\nimport type {\n  CopilotServiceAdapter,\n  RemoteChainParameters,\n} from \"../../service-adapters\";\nimport {\n  CopilotRuntime as CopilotRuntimeVNext,\n  type CopilotRuntimeOptions,\n  type CopilotRuntimeOptions as CopilotRuntimeOptionsVNext,\n  type AgentRunner,\n  InMemoryAgentRunner,\n} from \"../../v2/runtime\";\nimport { TelemetryAgentRunner } from \"./telemetry-agent-runner\";\nimport telemetry from \"../telemetry-client\";\n\nimport type { MessageInput } from \"../../graphql/inputs/message.input\";\nimport type { Message } from \"../../graphql/types/converted\";\n\nimport {\n  EndpointType,\n  type EndpointDefinition,\n  type CopilotKitEndpoint,\n  type LangGraphPlatformEndpoint,\n} from \"./types\";\n\nimport type {\n  CopilotObservabilityConfig,\n  LLMRequestData,\n  LLMResponseData,\n} from \"../observability\";\nimport type { AbstractAgent } from \"@ag-ui/client\";\n\n// +++ MCP Imports +++\nimport {\n  type MCPClient,\n  type MCPEndpointConfig,\n  type MCPTool,\n  extractParametersFromSchema,\n} from \"./mcp-tools-utils\";\nimport { BuiltInAgent, type BuiltInAgentClassicConfig } from \"../../agent\";\n// Define the function type alias here or import if defined elsewhere\ntype CreateMCPClientFunction = (\n  config: MCPEndpointConfig,\n) => Promise<MCPClient>;\n\ntype ActionsConfiguration<T extends Parameter[] | [] = []> =\n  | Action<T>[]\n  | ((ctx: { properties: any; url?: string }) => Action<T>[]);\n\ninterface OnBeforeRequestOptions {\n  threadId?: string;\n  runId?: string;\n  inputMessages: Message[];\n  properties: any;\n  url?: string;\n}\n\ntype OnBeforeRequestHandler = (\n  options: OnBeforeRequestOptions,\n) => void | Promise<void>;\n\ninterface OnAfterRequestOptions {\n  threadId: string;\n  runId?: string;\n  inputMessages: Message[];\n  outputMessages: Message[];\n  properties: any;\n  url?: string;\n}\n\ntype OnAfterRequestHandler = (\n  options: OnAfterRequestOptions,\n) => void | Promise<void>;\n\ninterface OnStopGenerationOptions {\n  threadId: string;\n  runId?: string;\n  url?: string;\n  agentName?: string;\n  lastMessage: MessageInput;\n}\ntype OnStopGenerationHandler = (\n  options: OnStopGenerationOptions,\n) => void | Promise<void>;\n\ninterface Middleware {\n  /**\n   * A function that is called before the request is processed.\n   */\n  /**\n   * @deprecated This middleware hook is deprecated and will be removed in a future version.\n   * Use updated middleware integration methods in CopilotRuntimeVNext instead.\n   */\n  onBeforeRequest?: OnBeforeRequestHandler;\n\n  /**\n   * A function that is called after the request is processed.\n   */\n  /**\n   * @deprecated This middleware hook is deprecated and will be removed in a future version.\n   * Use updated middleware integration methods in CopilotRuntimeVNext instead.\n   */\n  onAfterRequest?: OnAfterRequestHandler;\n}\n\nexport interface CopilotRuntimeConstructorParams_BASE<\n  T extends Parameter[] | [] = [],\n> {\n  /**\n   * Middleware to be used by the runtime.\n   *\n   * ```ts\n   * onBeforeRequest: (options: {\n   *   threadId?: string;\n   *   runId?: string;\n   *   inputMessages: Message[];\n   *   properties: any;\n   * }) => void | Promise<void>;\n   * ```\n   *\n   * ```ts\n   * onAfterRequest: (options: {\n   *   threadId?: string;\n   *   runId?: string;\n   *   inputMessages: Message[];\n   *   outputMessages: Message[];\n   *   properties: any;\n   * }) => void | Promise<void>;\n   * ```\n   */\n  /**\n   * @deprecated This middleware hook is deprecated and will be removed in a future version.\n   * Use updated middleware integration methods in CopilotRuntimeVNext instead.\n   */\n  middleware?: Middleware;\n\n  /*\n   * A list of server side actions that can be executed. Will be ignored when remoteActions are set\n   */\n  actions?: ActionsConfiguration<T>;\n\n  /*\n   * Deprecated: Use `remoteEndpoints`.\n   */\n  remoteActions?: CopilotKitEndpoint[];\n\n  /*\n   * A list of remote actions that can be executed.\n   */\n  remoteEndpoints?: EndpointDefinition[];\n\n  /*\n   * An array of LangServer URLs.\n   */\n  langserve?: RemoteChainParameters[];\n\n  /**\n   * Optional agent runner to use for SSE runtime.\n   */\n  runner?: AgentRunner;\n\n  /*\n   * A map of agent names to AGUI agents.\n   * Example agent config:\n   * ```ts\n   * import { AbstractAgent } from \"@ag-ui/client\";\n   * // ...\n   * agents: {\n   *   \"support\": new CustomerSupportAgent(),\n   *   \"technical\": new TechnicalAgent()\n   * }\n   * ```\n   */\n  agents?: Record<string, AbstractAgent>;\n\n  /*\n   * Delegates agent state processing to the service adapter.\n   *\n   * When enabled, individual agent state requests will not be processed by the agent itself.\n   * Instead, all processing will be handled by the service adapter.\n   */\n  delegateAgentProcessingToServiceAdapter?: boolean;\n\n  /**\n   * Configuration for LLM request/response logging.\n   * Requires publicApiKey from CopilotKit component to be set:\n   *\n   * ```tsx\n   * <CopilotKit publicApiKey=\"ck_pub_...\" />\n   * ```\n   *\n   * Example logging config:\n   * ```ts\n   * logging: {\n   *   enabled: true, // Enable or disable logging\n   *   progressive: true, // Set to false for buffered logging\n   *   logger: {\n   *     logRequest: (data) => langfuse.trace({ name: \"LLM Request\", input: data }),\n   *     logResponse: (data) => langfuse.trace({ name: \"LLM Response\", output: data }),\n   *     logError: (errorData) => langfuse.trace({ name: \"LLM Error\", metadata: errorData }),\n   *   },\n   * }\n   * ```\n   */\n  observability_c?: CopilotObservabilityConfig;\n\n  /**\n   * Configuration for connecting to Model Context Protocol (MCP) servers.\n   * Allows fetching and using tools defined on external MCP-compliant servers.\n   * Requires providing the `createMCPClient` function during instantiation.\n   * @experimental\n   */\n  mcpServers?: MCPEndpointConfig[];\n\n  /**\n   * A function that creates an MCP client instance for a given endpoint configuration.\n   * This function is responsible for using the appropriate MCP client library\n   * (e.g., `@copilotkit/runtime`, `ai`) to establish a connection.\n   * Required if `mcpServers` is provided.\n   *\n   * ```typescript\n   * import { experimental_createMCPClient } from \"ai\"; // Import from vercel ai library\n   * // ...\n   * const runtime = new CopilotRuntime({\n   *   mcpServers: [{ endpoint: \"...\" }],\n   *   async createMCPClient(config) {\n   *     return await experimental_createMCPClient({\n   *       transport: {\n   *         type: \"sse\",\n   *         url: config.endpoint,\n   *         headers: config.apiKey\n   *           ? { Authorization: `Bearer ${config.apiKey}` }\n   *           : undefined,\n   *       },\n   *     });\n   *   }\n   * });\n   * ```\n   */\n  createMCPClient?: CreateMCPClientFunction;\n\n  /**\n   * Optional error handler for comprehensive debugging and observability.\n   *\n   * **Requires publicApiKey**: Error handling only works when requests include a valid publicApiKey.\n   * This is a premium Copilot Cloud feature.\n   *\n   * @param errorEvent - Structured error event with rich debugging context\n   *\n   * @example\n   * ```typescript\n   * const runtime = new CopilotRuntime({\n   *   onError: (errorEvent) => {\n   *     debugDashboard.capture(errorEvent);\n   *   }\n   * });\n   * ```\n   */\n  onError?: CopilotErrorHandler;\n\n  onStopGeneration?: OnStopGenerationHandler;\n\n  // /** Optional transcription service for audio processing. */\n  // transcriptionService?: CopilotRuntimeOptionsVNext[\"transcriptionService\"];\n  // /** Optional *before* middleware – callback function or webhook URL. */\n  // beforeRequestMiddleware?: CopilotRuntimeOptionsVNext[\"beforeRequestMiddleware\"];\n  // /** Optional *after* middleware – callback function or webhook URL. */\n  // afterRequestMiddleware?: CopilotRuntimeOptionsVNext[\"afterRequestMiddleware\"];\n}\n\ntype BeforeRequestMiddleware =\n  CopilotRuntimeOptionsVNext[\"beforeRequestMiddleware\"];\ntype AfterRequestMiddleware =\n  CopilotRuntimeOptionsVNext[\"afterRequestMiddleware\"];\ntype BeforeRequestMiddlewareFn = Exclude<BeforeRequestMiddleware, string>;\ntype BeforeRequestMiddlewareFnParameters =\n  Parameters<BeforeRequestMiddlewareFn>;\ntype BeforeRequestMiddlewareFnResult = ReturnType<BeforeRequestMiddlewareFn>;\ntype AfterRequestMiddlewareFn = Exclude<AfterRequestMiddleware, string>;\ntype AfterRequestMiddlewareFnParameters = Parameters<AfterRequestMiddlewareFn>;\n\ninterface CopilotRuntimeConstructorParams<T extends Parameter[] | [] = []>\n  extends\n    Omit<CopilotRuntimeConstructorParams_BASE<T>, \"agents\">,\n    Omit<CopilotRuntimeOptionsVNext, \"agents\" | \"transcriptionService\"> {\n  /**\n   * TODO: un-omit `transcriptionService` above once it's supported\n   *\n   * This satisfies...\n   *  – the optional constraint in `CopilotRuntimeConstructorParams_BASE`\n   *  – the `MaybePromise<NonEmptyRecord<T>>` constraint in `CopilotRuntimeOptionsVNext`\n   *  – the `Record<string, AbstractAgent>` constraint in `both\n   */\n  agents?: MaybePromise<NonEmptyRecord<Record<string, AbstractAgent>>>;\n}\n\n/**\n * Central runtime object passed to all request handlers.\n */\nexport class CopilotRuntime<const T extends Parameter[] | [] = []> {\n  params?: CopilotRuntimeConstructorParams<T>;\n  private observability?: CopilotObservabilityConfig;\n  // Cache MCP tools per endpoint to avoid re-fetching repeatedly\n  private mcpToolsCache: Map<string, BuiltInAgentClassicConfig[\"tools\"]> =\n    new Map();\n  private runtimeArgs: CopilotRuntimeOptions;\n  private _instance: CopilotRuntimeVNext;\n\n  constructor(\n    params?: CopilotRuntimeConstructorParams<T> &\n      PartialBy<CopilotRuntimeOptions, \"agents\">,\n  ) {\n    const agents = params?.agents ?? {};\n    const endpointAgents = this.assignEndpointsToAgents(\n      params?.remoteEndpoints ?? [],\n    );\n\n    // Determine the base runner (user-provided or default)\n    const baseRunner = params?.runner ?? new InMemoryAgentRunner();\n\n    // Wrap with TelemetryAgentRunner unless telemetry is disabled\n    // This ensures we always capture agent execution telemetry when enabled,\n    // even if the user provides their own custom runner\n    const runner = isTelemetryDisabled()\n      ? baseRunner\n      : new TelemetryAgentRunner({ runner: baseRunner });\n\n    this.runtimeArgs = {\n      agents: { ...endpointAgents, ...agents },\n      runner,\n      licenseToken: params?.licenseToken,\n      // TODO: add support for transcriptionService from CopilotRuntimeOptionsVNext once it is ready\n      // transcriptionService: params?.transcriptionService,\n\n      beforeRequestMiddleware:\n        this.createOnBeforeRequestHandler(params).bind(this),\n      ...(params?.afterRequestMiddleware || params?.middleware?.onAfterRequest\n        ? {\n            afterRequestMiddleware:\n              this.createOnAfterRequestHandler(params).bind(this),\n          }\n        : {}),\n      a2ui: params?.a2ui,\n      mcpApps: params?.mcpApps,\n      openGenerativeUI: params?.openGenerativeUI,\n    };\n    this.params = params;\n    this.observability = params?.observability_c;\n  }\n\n  get instance() {\n    if (!this._instance) {\n      this._instance = new CopilotRuntimeVNext(this.runtimeArgs);\n    }\n\n    return this._instance;\n  }\n\n  private assignEndpointsToAgents(\n    endpoints: CopilotRuntimeConstructorParams<T>[\"remoteEndpoints\"],\n  ): Record<string, AbstractAgent> {\n    let result: Record<string, AbstractAgent> = {};\n\n    if (\n      endpoints.some(\n        (endpoint) =>\n          resolveEndpointType(endpoint) == EndpointType.LangGraphPlatform,\n      )\n    ) {\n      throw new CopilotKitMisuseError({\n        message:\n          \"LangGraphPlatformEndpoint in remoteEndpoints is deprecated. \" +\n          'Please use the \"agents\" option instead with LangGraphAgent from \"@copilotkit/runtime/langgraph\". ' +\n          'Example: agents: { myAgent: new LangGraphAgent({ deploymentUrl: \"...\", graphId: \"...\" }) }',\n      });\n    }\n\n    return result;\n  }\n\n  handleServiceAdapter(serviceAdapter: CopilotServiceAdapter) {\n    this.runtimeArgs.agents = Promise.resolve(\n      this.runtimeArgs.agents ?? {},\n    ).then(async (agents) => {\n      let agentsList = agents;\n      const isAgentsListEmpty = !Object.keys(agents).length;\n      const hasServiceAdapter = Boolean(serviceAdapter);\n      const illegalServiceAdapterNames = [\"EmptyAdapter\"];\n      const serviceAdapterCanBeUsedForAgent =\n        !illegalServiceAdapterNames.includes(serviceAdapter.name);\n\n      if (\n        isAgentsListEmpty &&\n        (!hasServiceAdapter || !serviceAdapterCanBeUsedForAgent)\n      ) {\n        throw new CopilotKitMisuseError({\n          message:\n            \"No default agent provided. Please provide a default agent in the runtime config.\",\n        });\n      }\n\n      if (isAgentsListEmpty) {\n        const model =\n          serviceAdapter.getLanguageModel?.() ??\n          `${serviceAdapter.provider}/${serviceAdapter.model}`;\n        agentsList.default = new BuiltInAgent({ model });\n      }\n\n      const actions = this.params?.actions;\n      if (actions) {\n        const mcpTools = await this.getToolsFromMCP();\n        agentsList = this.assignToolsToAgents(agents, [\n          ...this.getToolsFromActions(actions),\n          ...mcpTools,\n        ]);\n      }\n\n      return agentsList;\n    });\n  }\n\n  // Receive this.params.action and turn it into the AbstractAgent tools\n  private getToolsFromActions(\n    actions: ActionsConfiguration<any>,\n  ): BuiltInAgentClassicConfig[\"tools\"] {\n    // Resolve actions to an array (handle function case)\n    const actionsArray =\n      typeof actions === \"function\"\n        ? actions({ properties: {}, url: undefined })\n        : actions;\n\n    // Convert each Action to a ToolDefinition\n    return actionsArray.map((action) => {\n      // Convert JSON schema to Zod schema\n      const zodSchema = getZodParameters(action.parameters || []);\n\n      return {\n        name: action.name,\n        description: action.description || \"\",\n        parameters: zodSchema,\n        execute: () => Promise.resolve(),\n      };\n    });\n  }\n\n  private assignToolsToAgents(\n    agents: Record<string, AbstractAgent>,\n    tools: BuiltInAgentClassicConfig[\"tools\"],\n  ): Record<string, AbstractAgent> {\n    if (!tools?.length) {\n      return agents;\n    }\n\n    const enrichedAgents: Record<string, AbstractAgent> = { ...agents };\n\n    for (const [agentId, agent] of Object.entries(enrichedAgents)) {\n      const existingConfig = (Reflect.get(agent, \"config\") ?? {}) as Record<\n        string,\n        unknown\n      >;\n\n      // Skip factory-mode agents — they don't have a tools property\n      if (\"factory\" in existingConfig) {\n        continue;\n      }\n\n      const classicConfig = existingConfig as BuiltInAgentClassicConfig;\n      const existingTools = classicConfig.tools ?? [];\n\n      const updatedConfig: BuiltInAgentClassicConfig = {\n        ...classicConfig,\n        tools: [...existingTools, ...tools],\n      };\n\n      Reflect.set(agent, \"config\", updatedConfig);\n      enrichedAgents[agentId] = agent;\n    }\n\n    return enrichedAgents;\n  }\n\n  private createOnBeforeRequestHandler(\n    params?: CopilotRuntimeConstructorParams<T> &\n      PartialBy<CopilotRuntimeOptions, \"agents\">,\n  ) {\n    return async (hookParams: BeforeRequestMiddlewareFnParameters[0]) => {\n      const { request } = hookParams;\n\n      // Capture telemetry for copilot request creation\n      const publicApiKey = request.headers.get(\"x-copilotcloud-public-api-key\");\n      const body = (await readBody(request)) as RunAgentInput;\n\n      const forwardedProps = body?.forwardedProps as\n        | {\n            cloud?: { guardrails?: unknown };\n            metadata?: { requestType?: string };\n          }\n        | undefined;\n\n      // Get cloud base URL from environment or default\n      const cloudBaseUrl =\n        process.env.COPILOT_CLOUD_BASE_URL || \"https://api.cloud.copilotkit.ai\";\n\n      telemetry.capture(\"oss.runtime.copilot_request_created\", {\n        \"cloud.guardrails.enabled\":\n          forwardedProps?.cloud?.guardrails !== undefined,\n        requestType: forwardedProps?.metadata?.requestType ?? \"unknown\",\n        \"cloud.api_key_provided\": !!publicApiKey,\n        ...(publicApiKey ? { \"cloud.public_api_key\": publicApiKey } : {}),\n        \"cloud.base_url\": cloudBaseUrl,\n      });\n\n      // We do not process middleware for the internal GET requests\n      if (request.method === \"GET\" || !body) return;\n\n      // TODO: get public api key and run with expected data\n      // if (this.observability?.enabled && this.params.publicApiKey) {\n      //   this.logObservabilityBeforeRequest()\n      // }\n\n      // TODO: replace hooksParams top argument type with BeforeRequestMiddlewareParameters when exported\n      const middlewareResult =\n        await params?.beforeRequestMiddleware?.(hookParams);\n\n      if (params?.middleware?.onBeforeRequest) {\n        const { request, runtime, path } = hookParams;\n        const gqlMessages = (aguiToGQL(body.messages) as Message[]).reduce(\n          (acc, msg) => {\n            if (\"role\" in msg && msg.role === \"user\") {\n              acc.inputMessages.push(msg);\n            } else {\n              acc.outputMessages.push(msg);\n            }\n            return acc;\n          },\n          { inputMessages: [] as Message[], outputMessages: [] as Message[] },\n        );\n        const { inputMessages, outputMessages } = gqlMessages;\n        params.middleware.onBeforeRequest({\n          threadId: body.threadId,\n          runId: body.runId,\n          inputMessages,\n          properties: body.forwardedProps,\n          url: request.url,\n        } satisfies OnBeforeRequestOptions);\n      }\n\n      return middlewareResult;\n    };\n  }\n\n  private createOnAfterRequestHandler(\n    params?: CopilotRuntimeConstructorParams<T> &\n      PartialBy<CopilotRuntimeOptions, \"agents\">,\n  ) {\n    return async (hookParams: AfterRequestMiddlewareFnParameters[0]) => {\n      // TODO: get public api key and run with expected data\n      // if (this.observability?.enabled && publicApiKey) {\n      //   this.logObservabilityAfterRequest()\n      // }\n\n      // TODO: replace hooksParams top argument type with AfterRequestMiddlewareParameters when exported\n      params?.afterRequestMiddleware?.(hookParams);\n\n      if (params?.middleware?.onAfterRequest) {\n        // TODO: provide old expected params here when available\n        // @ts-expect-error -- missing arguments.\n        params.middleware.onAfterRequest({});\n      }\n    };\n  }\n\n  // Observability Methods\n\n  /**\n   * Log LLM request if observability is enabled\n   */\n  private async logObservabilityBeforeRequest(\n    requestData: LLMRequestData,\n  ): Promise<void> {\n    try {\n      await this.observability.hooks.handleRequest(requestData);\n    } catch (error) {\n      console.error(\"Error logging LLM request:\", error);\n    }\n  }\n\n  /**\n   * Log final LLM response after request completes\n   */\n  private logObservabilityAfterRequest(\n    outputMessagesPromise: Promise<Message[]>,\n    baseData: {\n      threadId: string;\n      runId?: string;\n      model?: string;\n      provider?: string;\n      agentName?: string;\n      nodeName?: string;\n    },\n    streamedChunks: any[],\n    requestStartTime: number,\n    publicApiKey?: string,\n  ): void {\n    try {\n      outputMessagesPromise\n        .then((outputMessages) => {\n          const responseData: LLMResponseData = {\n            threadId: baseData.threadId,\n            runId: baseData.runId,\n            model: baseData.model,\n            // Use collected chunks for progressive mode or outputMessages for regular mode\n            output: this.observability.progressive\n              ? streamedChunks\n              : outputMessages,\n            latency: Date.now() - requestStartTime,\n            timestamp: Date.now(),\n            provider: baseData.provider,\n            isFinalResponse: true,\n            agentName: baseData.agentName,\n            nodeName: baseData.nodeName,\n          };\n\n          try {\n            this.observability.hooks.handleResponse(responseData);\n          } catch (logError) {\n            console.error(\"Error logging LLM response:\", logError);\n          }\n        })\n        .catch((error) => {\n          console.error(\"Failed to get output messages for logging:\", error);\n        });\n    } catch (error) {\n      console.error(\"Error setting up logging for LLM response:\", error);\n    }\n  }\n\n  // Resolve MCP tools to BuiltInAgent tool definitions\n  // Optionally accepts request-scoped properties to merge request-provided mcpServers\n  private async getToolsFromMCP(options?: {\n    properties?: Record<string, unknown>;\n  }): Promise<BuiltInAgentClassicConfig[\"tools\"]> {\n    const runtimeMcpServers = (this.params?.mcpServers ??\n      []) as MCPEndpointConfig[];\n    const createMCPClient = this.params?.createMCPClient as\n      | CreateMCPClientFunction\n      | undefined;\n\n    // If no runtime config and no request overrides, nothing to do\n    const requestMcpServers = ((\n      options?.properties as { mcpServers?: MCPEndpointConfig[] } | undefined\n    )?.mcpServers ??\n      (\n        options?.properties as\n          | { mcpEndpoints?: MCPEndpointConfig[] }\n          | undefined\n      )?.mcpEndpoints ??\n      []) as MCPEndpointConfig[];\n\n    const hasAnyServers =\n      (runtimeMcpServers?.length ?? 0) > 0 ||\n      (requestMcpServers?.length ?? 0) > 0;\n    if (!hasAnyServers) {\n      return [];\n    }\n\n    if (!createMCPClient) {\n      // Mirror legacy behavior: when servers are provided without a factory, treat as misconfiguration\n      throw new CopilotKitMisuseError({\n        message:\n          \"MCP Integration Error: `mcpServers` were provided, but the `createMCPClient` function was not passed to the CopilotRuntime constructor. Please provide an implementation for `createMCPClient`.\",\n      });\n    }\n\n    // Merge and dedupe endpoints by URL; request-level overrides take precedence\n    const effectiveEndpoints = (() => {\n      const byUrl = new Map<string, MCPEndpointConfig>();\n      for (const ep of runtimeMcpServers) {\n        if (ep?.endpoint) byUrl.set(ep.endpoint, ep);\n      }\n      for (const ep of requestMcpServers) {\n        if (ep?.endpoint) byUrl.set(ep.endpoint, ep);\n      }\n      return Array.from(byUrl.values());\n    })();\n\n    const allTools: BuiltInAgentClassicConfig[\"tools\"] = [];\n\n    for (const config of effectiveEndpoints) {\n      const endpointUrl = config.endpoint;\n      // Return cached tool definitions when available\n      const cached = this.mcpToolsCache.get(endpointUrl);\n      if (cached) {\n        allTools.push(...cached);\n        continue;\n      }\n\n      try {\n        const client = await createMCPClient(config);\n        const toolsMap = await client.tools();\n\n        const toolDefs: BuiltInAgentClassicConfig[\"tools\"] = Object.entries(\n          toolsMap,\n        ).map(([toolName, tool]: [string, MCPTool]) => {\n          const params: Parameter[] = extractParametersFromSchema(tool);\n          const zodSchema = getZodParameters(params);\n          return {\n            name: toolName,\n            description:\n              tool.description || `MCP tool: ${toolName} (from ${endpointUrl})`,\n            parameters: zodSchema,\n            execute: () => Promise.resolve(),\n          };\n        });\n\n        // Cache per endpoint and add to aggregate\n        this.mcpToolsCache.set(endpointUrl, toolDefs);\n        allTools.push(...toolDefs);\n      } catch (error) {\n        console.error(\n          `MCP: Failed to fetch tools from endpoint ${endpointUrl}. Skipping. Error:`,\n          error,\n        );\n        // Cache empty to prevent repeated attempts within lifecycle\n        this.mcpToolsCache.set(endpointUrl, []);\n      }\n    }\n\n    // Dedupe tools by name while preserving last-in wins (request overrides)\n    const dedupedByName = new Map<string, (typeof allTools)[number]>();\n    for (const tool of allTools) {\n      dedupedByName.set(tool.name, tool);\n    }\n\n    return Array.from(dedupedByName.values());\n  }\n}\n\n// The two functions below are \"factory functions\", meant to create the action objects that adhere to the expected interfaces\nexport function copilotKitEndpoint(\n  config: Omit<CopilotKitEndpoint, \"type\">,\n): CopilotKitEndpoint {\n  return {\n    ...config,\n    type: EndpointType.CopilotKit,\n  };\n}\n\nexport function langGraphPlatformEndpoint(\n  config: Omit<LangGraphPlatformEndpoint, \"type\">,\n): LangGraphPlatformEndpoint {\n  return {\n    ...config,\n    type: EndpointType.LangGraphPlatform,\n  };\n}\n\nexport function resolveEndpointType(endpoint: EndpointDefinition) {\n  if (!endpoint.type) {\n    if (\"deploymentUrl\" in endpoint && \"agents\" in endpoint) {\n      return EndpointType.LangGraphPlatform;\n    } else {\n      return EndpointType.CopilotKit;\n    }\n  }\n\n  return endpoint.type;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsUA,IAAa,iBAAb,MAAmE;CASjE,YACE,QAEA;uCAPA,IAAI,KAAK;EAQT,MAAM,SAAS,QAAQ,UAAU,EAAE;EACnC,MAAM,iBAAiB,KAAK,wBAC1B,QAAQ,mBAAmB,EAAE,CAC9B;EAGD,MAAM,aAAa,QAAQ,UAAU,IAAIA,uCAAqB;EAK9D,MAAM,sDAA8B,GAChC,aACA,IAAIC,oDAAqB,EAAE,QAAQ,YAAY,CAAC;AAEpD,OAAK,cAAc;GACjB,QAAQ;IAAE,GAAG;IAAgB,GAAG;IAAQ;GACxC;GACA,cAAc,QAAQ;GAItB,yBACE,KAAK,6BAA6B,OAAO,CAAC,KAAK,KAAK;GACtD,GAAI,QAAQ,0BAA0B,QAAQ,YAAY,iBACtD,EACE,wBACE,KAAK,4BAA4B,OAAO,CAAC,KAAK,KAAK,EACtD,GACD,EAAE;GACN,MAAM,QAAQ;GACd,SAAS,QAAQ;GACjB,kBAAkB,QAAQ;GAC3B;AACD,OAAK,SAAS;AACd,OAAK,gBAAgB,QAAQ;;CAG/B,IAAI,WAAW;AACb,MAAI,CAAC,KAAK,UACR,MAAK,YAAY,IAAIC,iCAAoB,KAAK,YAAY;AAG5D,SAAO,KAAK;;CAGd,AAAQ,wBACN,WAC+B;EAC/B,IAAI,SAAwC,EAAE;AAE9C,MACE,UAAU,MACP,aACC,oBAAoB,SAAS,IAAIC,2BAAa,kBACjD,CAED,OAAM,IAAIC,yCAAsB,EAC9B,SACE,mQAGH,CAAC;AAGJ,SAAO;;CAGT,qBAAqB,gBAAuC;AAC1D,OAAK,YAAY,SAAS,QAAQ,QAChC,KAAK,YAAY,UAAU,EAAE,CAC9B,CAAC,KAAK,OAAO,WAAW;GACvB,IAAI,aAAa;GACjB,MAAM,oBAAoB,CAAC,OAAO,KAAK,OAAO,CAAC;GAC/C,MAAM,oBAAoB,QAAQ,eAAe;GAEjD,MAAM,kCACJ,CAFiC,CAAC,eAAe,CAErB,SAAS,eAAe,KAAK;AAE3D,OACE,sBACC,CAAC,qBAAqB,CAAC,iCAExB,OAAM,IAAIA,yCAAsB,EAC9B,SACE,oFACH,CAAC;AAGJ,OAAI,mBAAmB;IACrB,MAAM,QACJ,eAAe,oBAAoB,IACnC,GAAG,eAAe,SAAS,GAAG,eAAe;AAC/C,eAAW,UAAU,IAAIC,2BAAa,EAAE,OAAO,CAAC;;GAGlD,MAAM,UAAU,KAAK,QAAQ;AAC7B,OAAI,SAAS;IACX,MAAM,WAAW,MAAM,KAAK,iBAAiB;AAC7C,iBAAa,KAAK,oBAAoB,QAAQ,CAC5C,GAAG,KAAK,oBAAoB,QAAQ,EACpC,GAAG,SACJ,CAAC;;AAGJ,UAAO;IACP;;CAIJ,AAAQ,oBACN,SACoC;AAQpC,UALE,OAAO,YAAY,aACf,QAAQ;GAAE,YAAY,EAAE;GAAE,KAAK;GAAW,CAAC,GAC3C,SAGc,KAAK,WAAW;GAElC,MAAM,qDAA6B,OAAO,cAAc,EAAE,CAAC;AAE3D,UAAO;IACL,MAAM,OAAO;IACb,aAAa,OAAO,eAAe;IACnC,YAAY;IACZ,eAAe,QAAQ,SAAS;IACjC;IACD;;CAGJ,AAAQ,oBACN,QACA,OAC+B;AAC/B,MAAI,CAAC,OAAO,OACV,QAAO;EAGT,MAAM,iBAAgD,EAAE,GAAG,QAAQ;AAEnE,OAAK,MAAM,CAAC,SAAS,UAAU,OAAO,QAAQ,eAAe,EAAE;GAC7D,MAAM,iBAAkB,QAAQ,IAAI,OAAO,SAAS,IAAI,EAAE;AAM1D,OAAI,aAAa,eACf;GAGF,MAAM,gBAAgB;GACtB,MAAM,gBAAgB,cAAc,SAAS,EAAE;GAE/C,MAAM,gBAA2C;IAC/C,GAAG;IACH,OAAO,CAAC,GAAG,eAAe,GAAG,MAAM;IACpC;AAED,WAAQ,IAAI,OAAO,UAAU,cAAc;AAC3C,kBAAe,WAAW;;AAG5B,SAAO;;CAGT,AAAQ,6BACN,QAEA;AACA,SAAO,OAAO,eAAuD;GACnE,MAAM,EAAE,YAAY;GAGpB,MAAM,eAAe,QAAQ,QAAQ,IAAI,gCAAgC;GACzE,MAAM,OAAQ,uCAAe,QAAQ;GAErC,MAAM,iBAAiB,MAAM;GAQ7B,MAAM,eACJ,QAAQ,IAAI,0BAA0B;AAExC,oCAAU,QAAQ,uCAAuC;IACvD,4BACE,gBAAgB,OAAO,eAAe;IACxC,aAAa,gBAAgB,UAAU,eAAe;IACtD,0BAA0B,CAAC,CAAC;IAC5B,GAAI,eAAe,EAAE,wBAAwB,cAAc,GAAG,EAAE;IAChE,kBAAkB;IACnB,CAAC;AAGF,OAAI,QAAQ,WAAW,SAAS,CAAC,KAAM;GAQvC,MAAM,mBACJ,MAAM,QAAQ,0BAA0B,WAAW;AAErD,OAAI,QAAQ,YAAY,iBAAiB;IACvC,MAAM,EAAE,SAAS,SAAS,SAAS;IAYnC,MAAM,EAAE,eAAe,mBAXFC,8BAAU,KAAK,SAAS,CAAe,QACzD,KAAK,QAAQ;AACZ,SAAI,UAAU,OAAO,IAAI,SAAS,OAChC,KAAI,cAAc,KAAK,IAAI;SAE3B,KAAI,eAAe,KAAK,IAAI;AAE9B,YAAO;OAET;KAAE,eAAe,EAAE;KAAe,gBAAgB,EAAE;KAAe,CACpE;AAED,WAAO,WAAW,gBAAgB;KAChC,UAAU,KAAK;KACf,OAAO,KAAK;KACZ;KACA,YAAY,KAAK;KACjB,KAAK,QAAQ;KACd,CAAkC;;AAGrC,UAAO;;;CAIX,AAAQ,4BACN,QAEA;AACA,SAAO,OAAO,eAAsD;AAOlE,WAAQ,yBAAyB,WAAW;AAE5C,OAAI,QAAQ,YAAY,eAGtB,QAAO,WAAW,eAAe,EAAE,CAAC;;;;;;CAU1C,MAAc,8BACZ,aACe;AACf,MAAI;AACF,SAAM,KAAK,cAAc,MAAM,cAAc,YAAY;WAClD,OAAO;AACd,WAAQ,MAAM,8BAA8B,MAAM;;;;;;CAOtD,AAAQ,6BACN,uBACA,UAQA,gBACA,kBACA,cACM;AACN,MAAI;AACF,yBACG,MAAM,mBAAmB;IACxB,MAAM,eAAgC;KACpC,UAAU,SAAS;KACnB,OAAO,SAAS;KAChB,OAAO,SAAS;KAEhB,QAAQ,KAAK,cAAc,cACvB,iBACA;KACJ,SAAS,KAAK,KAAK,GAAG;KACtB,WAAW,KAAK,KAAK;KACrB,UAAU,SAAS;KACnB,iBAAiB;KACjB,WAAW,SAAS;KACpB,UAAU,SAAS;KACpB;AAED,QAAI;AACF,UAAK,cAAc,MAAM,eAAe,aAAa;aAC9C,UAAU;AACjB,aAAQ,MAAM,+BAA+B,SAAS;;KAExD,CACD,OAAO,UAAU;AAChB,YAAQ,MAAM,8CAA8C,MAAM;KAClE;WACG,OAAO;AACd,WAAQ,MAAM,8CAA8C,MAAM;;;CAMtE,MAAc,gBAAgB,SAEkB;EAC9C,MAAM,oBAAqB,KAAK,QAAQ,cACtC,EAAE;EACJ,MAAM,kBAAkB,KAAK,QAAQ;EAKrC,MAAM,qBACJ,SAAS,aACR,eAEC,SAAS,aAGR,gBACH,EAAE;AAKJ,MAAI,GAFD,mBAAmB,UAAU,KAAK,MAClC,mBAAmB,UAAU,KAAK,GAEnC,QAAO,EAAE;AAGX,MAAI,CAAC,gBAEH,OAAM,IAAIF,yCAAsB,EAC9B,SACE,mMACH,CAAC;EAIJ,MAAM,4BAA4B;GAChC,MAAM,wBAAQ,IAAI,KAAgC;AAClD,QAAK,MAAM,MAAM,kBACf,KAAI,IAAI,SAAU,OAAM,IAAI,GAAG,UAAU,GAAG;AAE9C,QAAK,MAAM,MAAM,kBACf,KAAI,IAAI,SAAU,OAAM,IAAI,GAAG,UAAU,GAAG;AAE9C,UAAO,MAAM,KAAK,MAAM,QAAQ,CAAC;MAC/B;EAEJ,MAAM,WAA+C,EAAE;AAEvD,OAAK,MAAM,UAAU,oBAAoB;GACvC,MAAM,cAAc,OAAO;GAE3B,MAAM,SAAS,KAAK,cAAc,IAAI,YAAY;AAClD,OAAI,QAAQ;AACV,aAAS,KAAK,GAAG,OAAO;AACxB;;AAGF,OAAI;IAEF,MAAM,WAAW,OADF,MAAM,gBAAgB,OAAO,EACd,OAAO;IAErC,MAAM,WAA+C,OAAO,QAC1D,SACD,CAAC,KAAK,CAAC,UAAU,UAA6B;KAE7C,MAAM,qDADsBG,oDAA4B,KAAK,CACnB;AAC1C,YAAO;MACL,MAAM;MACN,aACE,KAAK,eAAe,aAAa,SAAS,SAAS,YAAY;MACjE,YAAY;MACZ,eAAe,QAAQ,SAAS;MACjC;MACD;AAGF,SAAK,cAAc,IAAI,aAAa,SAAS;AAC7C,aAAS,KAAK,GAAG,SAAS;YACnB,OAAO;AACd,YAAQ,MACN,4CAA4C,YAAY,qBACxD,MACD;AAED,SAAK,cAAc,IAAI,aAAa,EAAE,CAAC;;;EAK3C,MAAM,gCAAgB,IAAI,KAAwC;AAClE,OAAK,MAAM,QAAQ,SACjB,eAAc,IAAI,KAAK,MAAM,KAAK;AAGpC,SAAO,MAAM,KAAK,cAAc,QAAQ,CAAC;;;AAK7C,SAAgB,mBACd,QACoB;AACpB,QAAO;EACL,GAAG;EACH,MAAMJ,2BAAa;EACpB;;AAGH,SAAgB,0BACd,QAC2B;AAC3B,QAAO;EACL,GAAG;EACH,MAAMA,2BAAa;EACpB;;AAGH,SAAgB,oBAAoB,UAA8B;AAChE,KAAI,CAAC,SAAS,KACZ,KAAI,mBAAmB,YAAY,YAAY,SAC7C,QAAOA,2BAAa;KAEpB,QAAOA,2BAAa;AAIxB,QAAO,SAAS"}