@mcpjam/sdk 0.8.1 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +17 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +17 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/mcp-client-manager/constants.ts","../src/mcp-client-manager/error-utils.ts","../src/mcp-client-manager/errors.ts","../src/mcp-client-manager/transport-utils.ts","../src/mcp-client-manager/notification-handlers.ts","../src/mcp-client-manager/elicitation.ts","../src/mcp-client-manager/tasks.ts","../src/mcp-client-manager/tool-converters.ts","../src/mcp-client-manager/MCPClientManager.ts","../src/model-factory.ts","../src/tool-extraction.ts","../src/PromptResult.ts","../src/TestAgent.ts","../src/validators.ts","../src/percentiles.ts","../src/EvalTest.ts","../src/EvalSuite.ts"],"names":["DEFAULT_REQUEST_TIMEOUT_MSEC","ProgressNotificationSchema","ElicitRequestSchema","z","CallToolResultSchema","dynamicTool","jsonSchema","defineTool","CreateTaskResultSchema","StreamableHTTPClientTransport","ResourceListChangedNotificationSchema","ResourceUpdatedNotificationSchema","PromptListChangedNotificationSchema","Client","StdioClientTransport","getDefaultEnvironment","SSEClientTransport","openai","createOpenAI","anthropic","createAnthropic","deepseek","createDeepSeek","google","createGoogleGenerativeAI","createOllama","mistral","createMistral","createOpenRouter","xai","createXai","azure","createAzure","generateText","stepCountIs"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Default values and constants for MCPClientManager\n */\n\nimport { DEFAULT_REQUEST_TIMEOUT_MSEC } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\n\n/** Default client version to report to servers */\nexport const DEFAULT_CLIENT_VERSION = \"1.0.0\";\n\n/** Default request timeout (from MCP SDK) */\nexport const DEFAULT_TIMEOUT = DEFAULT_REQUEST_TIMEOUT_MSEC;\n\n/** Timeout for initial HTTP transport attempt before falling back to SSE */\nexport const HTTP_CONNECT_TIMEOUT = 3000;\n","/**\n * Error handling utilities for MCPClientManager\n */\n\n/**\n * Checks if an error indicates that a method is not available/implemented by the server.\n * Used for graceful degradation when servers don't support certain MCP features.\n *\n * @param error - The error to check\n * @param method - The MCP method name (e.g., \"tools/list\", \"resources/list\")\n * @returns True if the error indicates the method is unavailable\n */\nexport function isMethodUnavailableError(\n error: unknown,\n method: string\n): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const message = error.message.toLowerCase();\n\n // Build set of tokens from the method name\n const methodTokens = new Set<string>();\n methodTokens.add(method.toLowerCase());\n for (const part of method.split(/[/:._-]/)) {\n if (part) {\n methodTokens.add(part.toLowerCase());\n }\n }\n\n // Common error indicators for unavailable methods\n const indicators = [\n \"method not found\",\n \"not implemented\",\n \"unsupported\",\n \"does not support\",\n \"unimplemented\",\n ];\n\n const indicatorMatch = indicators.some((indicator) =>\n message.includes(indicator)\n );\n\n if (!indicatorMatch) {\n return false;\n }\n\n // Check if error mentions the method (or just assume it does if indicator matched)\n if (Array.from(methodTokens).some((token) => message.includes(token))) {\n return true;\n }\n\n // If we got an indicator match, assume it's about this method\n return true;\n}\n\n/**\n * Formats an error for display in error messages.\n *\n * @param error - The error to format\n * @returns A string representation of the error\n */\nexport function formatError(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n}\n","/**\n * Custom error classes for MCP SDK\n */\n\n/**\n * Base error class for all MCP SDK errors\n */\nexport class MCPError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n options?: { cause?: unknown }\n ) {\n super(message, options);\n this.name = \"MCPError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Authentication error - thrown for 401, token expired, invalid token, etc.\n */\nexport class MCPAuthError extends MCPError {\n constructor(\n message: string,\n public readonly statusCode?: number,\n options?: { cause?: unknown }\n ) {\n super(message, \"AUTH_ERROR\", options);\n this.name = \"MCPAuthError\";\n }\n}\n\n/**\n * Type guard to check if an error is an MCPAuthError\n */\nexport function isMCPAuthError(error: unknown): error is MCPAuthError {\n return error instanceof MCPAuthError;\n}\n\n/**\n * Type guard for errors with a numeric code property (like StreamableHTTPError, SseError)\n */\nfunction hasNumericCode(error: unknown): error is Error & { code: number } {\n return (\n error instanceof Error &&\n \"code\" in error &&\n typeof (error as { code: unknown }).code === \"number\"\n );\n}\n\n/**\n * Checks if an error is an authentication-related error.\n * Detects auth errors by:\n * 1. Error class name (UnauthorizedError from MCP SDK)\n * 2. HTTP status codes (401, 403) from transport errors\n * 3. Common auth-related patterns in error messages (case-insensitive)\n */\nexport function isAuthError(error: unknown): {\n isAuth: boolean;\n statusCode?: number;\n} {\n if (!(error instanceof Error)) {\n return { isAuth: false };\n }\n\n // Check for MCP SDK's UnauthorizedError by class name\n // (We check by name to avoid importing from @modelcontextprotocol/sdk)\n if (error.name === \"UnauthorizedError\") {\n return { isAuth: true, statusCode: 401 };\n }\n\n // Check for our own MCPAuthError by name\n if (error.name === \"MCPAuthError\") {\n const statusCode =\n \"statusCode\" in error && typeof error.statusCode === \"number\"\n ? error.statusCode\n : undefined;\n return { isAuth: true, statusCode };\n }\n\n // Check for transport errors with HTTP status codes (StreamableHTTPError, SseError)\n if (hasNumericCode(error)) {\n const code = error.code;\n if (code === 401 || code === 403) {\n return { isAuth: true, statusCode: code };\n }\n }\n\n // Fall back to message pattern matching (case-insensitive)\n const message = error.message.toLowerCase();\n const authPatterns = [\n \"unauthorized\",\n \"invalid_token\",\n \"invalid token\",\n \"token expired\",\n \"token has expired\",\n \"access denied\",\n \"authentication failed\",\n \"authentication required\",\n \"not authenticated\",\n \"forbidden\",\n ];\n\n if (authPatterns.some((pattern) => message.includes(pattern))) {\n return { isAuth: true };\n }\n\n // Check for HTTP status codes in error messages (e.g., \"HTTP 401\" or \"status: 401\")\n const statusMatch = message.match(/\\b(status[:\\s]*)?401\\b|\\bhttp\\s*401\\b/i);\n if (statusMatch) {\n return { isAuth: true, statusCode: 401 };\n }\n\n const forbiddenMatch = message.match(\n /\\b(status[:\\s]*)?403\\b|\\bhttp\\s*403\\b/i\n );\n if (forbiddenMatch) {\n return { isAuth: true, statusCode: 403 };\n }\n\n return { isAuth: false };\n}\n","/**\n * Transport utilities for MCPClientManager\n */\n\nimport type { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport type { TransportSendOptions } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport type {\n JSONRPCMessage,\n MessageExtraInfo,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { StreamableHTTPClientTransportOptions } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport type { RpcLogger } from \"./types.js\";\n\n/**\n * Normalizes headers from various formats (Headers, string[][], or plain object)\n * into a plain Record<string, string>.\n *\n * @param headers - Headers in any supported format\n * @returns Plain object with header key-value pairs\n */\nfunction normalizeHeaders(\n headers: HeadersInit | undefined\n): Record<string, string> {\n if (!headers) {\n return {};\n }\n\n // If it's already a plain object (not Headers or array), return as-is\n if (\n typeof headers === \"object\" &&\n !Array.isArray(headers) &&\n !(headers instanceof Headers)\n ) {\n return headers as Record<string, string>;\n }\n\n // Convert Headers or string[][] to a plain object\n const normalized: Record<string, string> = {};\n const headersObj = new Headers(headers);\n headersObj.forEach((value, key) => {\n normalized[key] = value;\n });\n return normalized;\n}\n\n/**\n * Checks if headers contain an Authorization header (case-insensitive check).\n *\n * @param headers - Normalized headers object\n * @returns The Authorization value if present, undefined otherwise\n */\nfunction getExistingAuthorization(\n headers: Record<string, string>\n): string | undefined {\n return headers[\"Authorization\"] ?? headers[\"authorization\"];\n}\n\n/**\n * Builds the requestInit object, merging accessToken into Authorization header if provided.\n *\n * @param accessToken - Optional access token for Bearer auth\n * @param requestInit - Optional existing requestInit config\n * @returns Merged requestInit with Authorization header if accessToken provided\n */\nexport function buildRequestInit(\n accessToken: string | undefined,\n requestInit: StreamableHTTPClientTransportOptions[\"requestInit\"]\n): StreamableHTTPClientTransportOptions[\"requestInit\"] {\n if (!accessToken) {\n return requestInit;\n }\n\n const existingHeaders = normalizeHeaders(requestInit?.headers);\n const existingAuth = getExistingAuthorization(existingHeaders);\n\n // Remove any lowercase 'authorization' key to avoid duplicate headers\n const { authorization: _, ...headersWithoutLowercaseAuth } = existingHeaders;\n\n return {\n ...requestInit,\n headers: {\n Authorization: existingAuth ?? `Bearer ${accessToken}`,\n ...headersWithoutLowercaseAuth,\n },\n };\n}\n\n/**\n * Creates a logging wrapper transport that logs JSON-RPC traffic.\n *\n * @param serverId - The server ID for logging context\n * @param logger - The RPC logger function\n * @param transport - The underlying transport to wrap\n * @returns A new transport that logs all messages\n */\nexport function wrapTransportForLogging(\n serverId: string,\n logger: RpcLogger,\n transport: Transport\n): Transport {\n class LoggingTransport implements Transport {\n onclose?: () => void;\n onerror?: (error: Error) => void;\n onmessage?: (message: JSONRPCMessage, extra?: MessageExtraInfo) => void;\n\n constructor(private readonly inner: Transport) {\n this.inner.onmessage = (\n message: JSONRPCMessage,\n extra?: MessageExtraInfo\n ) => {\n try {\n logger({ direction: \"receive\", message, serverId });\n } catch {\n // Ignore logger errors\n }\n this.onmessage?.(message, extra);\n };\n this.inner.onclose = () => {\n this.onclose?.();\n };\n this.inner.onerror = (error: Error) => {\n this.onerror?.(error);\n };\n }\n\n async start(): Promise<void> {\n if (typeof (this.inner as any).start === \"function\") {\n await (this.inner as any).start();\n }\n }\n\n async send(\n message: JSONRPCMessage,\n options?: TransportSendOptions\n ): Promise<void> {\n try {\n logger({ direction: \"send\", message, serverId });\n } catch {\n // Ignore logger errors\n }\n await this.inner.send(message as any, options as any);\n }\n\n async close(): Promise<void> {\n await this.inner.close();\n }\n\n get sessionId(): string | undefined {\n return (this.inner as any).sessionId;\n }\n\n setProtocolVersion?(version: string): void {\n if (typeof this.inner.setProtocolVersion === \"function\") {\n this.inner.setProtocolVersion(version);\n }\n }\n }\n\n return new LoggingTransport(transport);\n}\n\n/**\n * Creates a default console logger for JSON-RPC traffic.\n *\n * @returns A logger function that outputs to console.debug\n */\nexport function createDefaultRpcLogger(): RpcLogger {\n return ({ direction, message, serverId }) => {\n let printable: string;\n try {\n printable =\n typeof message === \"string\" ? message : JSON.stringify(message);\n } catch {\n printable = String(message);\n }\n\n console.debug(`[MCP:${serverId}] ${direction.toUpperCase()} ${printable}`);\n };\n}\n","/**\n * Notification handler management for MCPClientManager\n */\n\nimport type { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport {\n ResourceListChangedNotificationSchema,\n ResourceUpdatedNotificationSchema,\n PromptListChangedNotificationSchema,\n ProgressNotificationSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ProgressHandler } from \"./types.js\";\n\n// Type aliases for notification handling\ntype NotificationSchema = Parameters<Client[\"setNotificationHandler\"]>[0];\ntype NotificationHandler = Parameters<Client[\"setNotificationHandler\"]>[1];\n\n// Re-export notification schemas for convenience\nexport {\n ResourceListChangedNotificationSchema,\n ResourceUpdatedNotificationSchema,\n PromptListChangedNotificationSchema,\n ProgressNotificationSchema,\n};\n\nexport type { NotificationSchema, NotificationHandler };\n\n/**\n * Manages notification handlers for multiple MCP servers.\n * Allows registering multiple handlers per server and schema.\n */\nexport class NotificationManager {\n private handlers = new Map<\n string,\n Map<NotificationSchema, Set<NotificationHandler>>\n >();\n\n /**\n * Adds a notification handler for a specific server and schema.\n *\n * @param serverId - The server ID\n * @param schema - The notification schema to handle\n * @param handler - The handler function\n */\n addHandler(\n serverId: string,\n schema: NotificationSchema,\n handler: NotificationHandler\n ): void {\n const serverHandlers = this.handlers.get(serverId) ?? new Map();\n const handlersForSchema =\n serverHandlers.get(schema) ?? new Set<NotificationHandler>();\n handlersForSchema.add(handler);\n serverHandlers.set(schema, handlersForSchema);\n this.handlers.set(serverId, serverHandlers);\n }\n\n /**\n * Creates a dispatcher function that invokes all handlers for a schema.\n *\n * @param serverId - The server ID\n * @param schema - The notification schema\n * @returns A handler that dispatches to all registered handlers\n */\n createDispatcher(\n serverId: string,\n schema: NotificationSchema\n ): NotificationHandler {\n return (notification) => {\n const serverHandlers = this.handlers.get(serverId);\n const handlersForSchema = serverHandlers?.get(schema);\n if (!handlersForSchema || handlersForSchema.size === 0) {\n return;\n }\n\n for (const handler of handlersForSchema) {\n try {\n handler(notification);\n } catch {\n // Swallow individual handler errors to avoid breaking other listeners\n }\n }\n };\n }\n\n /**\n * Applies all registered handlers to a client.\n *\n * @param serverId - The server ID\n * @param client - The MCP client to configure\n */\n applyToClient(serverId: string, client: Client): void {\n const serverHandlers = this.handlers.get(serverId);\n if (!serverHandlers) {\n return;\n }\n\n for (const [schema] of serverHandlers) {\n client.setNotificationHandler(\n schema,\n this.createDispatcher(serverId, schema)\n );\n }\n }\n\n /**\n * Clears all handlers for a server.\n *\n * @param serverId - The server ID to clear\n */\n clearServer(serverId: string): void {\n this.handlers.delete(serverId);\n }\n\n /**\n * Gets handler schemas registered for a server.\n *\n * @param serverId - The server ID\n * @returns Array of registered notification schemas\n */\n getSchemas(serverId: string): NotificationSchema[] {\n const serverHandlers = this.handlers.get(serverId);\n return serverHandlers ? Array.from(serverHandlers.keys()) : [];\n }\n}\n\n/**\n * Sets up progress notification handler on a client.\n *\n * @param serverId - The server ID for context\n * @param client - The MCP client\n * @param progressHandler - The progress handler function\n */\nexport function applyProgressHandler(\n serverId: string,\n client: Client,\n progressHandler: ProgressHandler\n): void {\n client.setNotificationHandler(ProgressNotificationSchema, (notification) => {\n const params = notification.params;\n progressHandler({\n serverId,\n progressToken: params.progressToken,\n progress: params.progress,\n total: params.total,\n message: params.message,\n });\n });\n}\n","/**\n * Elicitation handler management for MCPClientManager\n */\n\nimport type { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { ElicitRequestSchema } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ElicitResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ElicitationHandler, ElicitationCallback } from \"./types.js\";\n\n// Re-export the schema for convenience\nexport { ElicitRequestSchema };\n\n/**\n * Manages elicitation handlers and callbacks for MCP servers.\n * Supports both server-specific handlers and a global callback.\n */\nexport class ElicitationManager {\n private handlers = new Map<string, ElicitationHandler>();\n private globalCallback?: ElicitationCallback;\n private pendingElicitations = new Map<\n string,\n {\n resolve: (value: ElicitResult) => void;\n reject: (error: unknown) => void;\n }\n >();\n\n /**\n * Sets a server-specific elicitation handler.\n *\n * @param serverId - The server ID\n * @param handler - The elicitation handler\n */\n setHandler(serverId: string, handler: ElicitationHandler): void {\n this.handlers.set(serverId, handler);\n }\n\n /**\n * Clears a server-specific handler.\n *\n * @param serverId - The server ID\n */\n clearHandler(serverId: string): void {\n this.handlers.delete(serverId);\n }\n\n /**\n * Gets a server-specific handler.\n *\n * @param serverId - The server ID\n * @returns The handler if set, undefined otherwise\n */\n getHandler(serverId: string): ElicitationHandler | undefined {\n return this.handlers.get(serverId);\n }\n\n /**\n * Sets the global elicitation callback.\n *\n * @param callback - The callback function\n */\n setGlobalCallback(callback: ElicitationCallback): void {\n this.globalCallback = callback;\n }\n\n /**\n * Clears the global callback.\n */\n clearGlobalCallback(): void {\n this.globalCallback = undefined;\n }\n\n /**\n * Gets the global callback.\n *\n * @returns The callback if set, undefined otherwise\n */\n getGlobalCallback(): ElicitationCallback | undefined {\n return this.globalCallback;\n }\n\n /**\n * Gets the pending elicitations map.\n * Useful for external code that needs to add resolvers.\n *\n * @returns The pending elicitations map\n */\n getPendingElicitations(): Map<\n string,\n {\n resolve: (value: ElicitResult) => void;\n reject: (error: unknown) => void;\n }\n > {\n return this.pendingElicitations;\n }\n\n /**\n * Resolves a pending elicitation by requestId.\n *\n * @param requestId - The request ID to resolve\n * @param response - The elicitation response\n * @returns True if the elicitation was found and resolved\n */\n respond(requestId: string, response: ElicitResult): boolean {\n const pending = this.pendingElicitations.get(requestId);\n if (!pending) {\n return false;\n }\n try {\n pending.resolve(response);\n return true;\n } finally {\n this.pendingElicitations.delete(requestId);\n }\n }\n\n /**\n * Applies the appropriate elicitation handler to a client.\n * Server-specific handlers take precedence over the global callback.\n *\n * @param serverId - The server ID\n * @param client - The MCP client\n */\n applyToClient(serverId: string, client: Client): void {\n const serverSpecific = this.handlers.get(serverId);\n\n if (serverSpecific) {\n client.setRequestHandler(ElicitRequestSchema, async (request) =>\n serverSpecific(request.params)\n );\n return;\n }\n\n if (this.globalCallback) {\n client.setRequestHandler(ElicitRequestSchema, async (request) => {\n const reqId = `elicit_${Date.now()}_${Math.random()\n .toString(36)\n .slice(2, 9)}`;\n\n // Extract related task ID from _meta per MCP Tasks spec (2025-11-25)\n const meta = (request.params as any)?._meta;\n const relatedTask = meta?.[\"io.modelcontextprotocol/related-task\"];\n const relatedTaskId = relatedTask?.taskId as string | undefined;\n\n return await this.globalCallback!({\n requestId: reqId,\n message: (request.params as any)?.message,\n schema:\n (request.params as any)?.requestedSchema ??\n (request.params as any)?.schema,\n relatedTaskId,\n });\n });\n }\n }\n\n /**\n * Removes elicitation handler from a client.\n *\n * @param client - The MCP client\n */\n removeFromClient(client: Client): void {\n client.removeRequestHandler(\"elicitation/create\");\n }\n\n /**\n * Clears all data for a server.\n *\n * @param serverId - The server ID\n */\n clearServer(serverId: string): void {\n this.handlers.delete(serverId);\n }\n}\n","/**\n * MCP Tasks support (experimental feature - spec 2025-11-25)\n */\n\nimport type { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport type { ServerCapabilities } from \"@modelcontextprotocol/sdk/types.js\";\nimport { z } from \"zod\";\nimport type {\n MCPTask,\n MCPListTasksResult,\n ClientRequestOptions,\n} from \"./types.js\";\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/**\n * Task object schema\n */\nexport const TaskSchema = z.object({\n taskId: z.string(),\n status: z.enum([\n \"working\",\n \"input_required\",\n \"completed\",\n \"failed\",\n \"cancelled\",\n ]),\n statusMessage: z.string().optional(),\n createdAt: z.string(),\n lastUpdatedAt: z.string(),\n ttl: z.number().nullable(),\n pollInterval: z.number().optional(),\n});\n\n/**\n * List tasks result schema\n */\nexport const ListTasksResultSchema = z.object({\n tasks: z.array(TaskSchema),\n nextCursor: z.string().optional(),\n});\n\n/**\n * Task status notification schema\n * Per spec, notification includes the full Task object\n */\nexport const TaskStatusNotificationSchema = z.object({\n method: z.literal(\"notifications/tasks/status\"),\n params: z\n .object({\n taskId: z.string(),\n status: z.enum([\n \"working\",\n \"input_required\",\n \"completed\",\n \"failed\",\n \"cancelled\",\n ]),\n statusMessage: z.string().optional(),\n createdAt: z.string(),\n lastUpdatedAt: z.string(),\n ttl: z.number().nullable(),\n pollInterval: z.number().optional(),\n })\n .optional(),\n});\n\n/**\n * Generic result schema for tasks/result\n * Per MCP spec: \"tasks/result returns exactly what the underlying request would have returned\"\n */\nexport const TaskResultSchema = z.unknown();\n\n// ============================================================================\n// Task Operations\n// ============================================================================\n\n/**\n * Lists tasks from an MCP server.\n *\n * @param client - The MCP client\n * @param cursor - Optional pagination cursor\n * @param options - Request options\n * @returns List of tasks\n */\nexport async function listTasks(\n client: Client,\n cursor?: string,\n options?: ClientRequestOptions\n): Promise<MCPListTasksResult> {\n return client.request(\n {\n method: \"tasks/list\",\n params: cursor ? { cursor } : {},\n },\n ListTasksResultSchema,\n options\n );\n}\n\n/**\n * Gets a specific task by ID.\n *\n * @param client - The MCP client\n * @param taskId - The task ID\n * @param options - Request options\n * @returns The task object\n */\nexport async function getTask(\n client: Client,\n taskId: string,\n options?: ClientRequestOptions\n): Promise<MCPTask> {\n return client.request(\n {\n method: \"tasks/get\",\n params: { taskId },\n },\n TaskSchema,\n options\n );\n}\n\n/**\n * Gets the result of a completed task.\n * Per MCP Tasks spec, returns exactly what the underlying request would have returned.\n *\n * @param client - The MCP client\n * @param taskId - The task ID\n * @param options - Request options\n * @returns The task result (type depends on original request)\n */\nexport async function getTaskResult(\n client: Client,\n taskId: string,\n options?: ClientRequestOptions\n): Promise<unknown> {\n return client.request(\n {\n method: \"tasks/result\",\n params: { taskId },\n },\n TaskResultSchema,\n options\n );\n}\n\n/**\n * Cancels a task.\n *\n * @param client - The MCP client\n * @param taskId - The task ID to cancel\n * @param options - Request options\n * @returns The updated task object\n */\nexport async function cancelTask(\n client: Client,\n taskId: string,\n options?: ClientRequestOptions\n): Promise<MCPTask> {\n return client.request(\n {\n method: \"tasks/cancel\",\n params: { taskId },\n },\n TaskSchema,\n options\n );\n}\n\n// ============================================================================\n// Capability Checks\n// ============================================================================\n\n/**\n * Checks if server supports task-augmented tool calls.\n * Checks both top-level tasks and experimental.tasks namespaces.\n *\n * @param capabilities - The server capabilities\n * @returns True if server supports task-augmented tool calls\n */\nexport function supportsTasksForToolCalls(\n capabilities: ServerCapabilities | undefined\n): boolean {\n const caps = capabilities as any;\n return Boolean(\n caps?.tasks?.requests?.tools?.call ||\n caps?.experimental?.tasks?.requests?.tools?.call\n );\n}\n\n/**\n * Checks if server supports tasks/list operation.\n *\n * @param capabilities - The server capabilities\n * @returns True if server supports listing tasks\n */\nexport function supportsTasksList(\n capabilities: ServerCapabilities | undefined\n): boolean {\n const caps = capabilities as any;\n return Boolean(caps?.tasks?.list || caps?.experimental?.tasks?.list);\n}\n\n/**\n * Checks if server supports tasks/cancel operation.\n *\n * @param capabilities - The server capabilities\n * @returns True if server supports canceling tasks\n */\nexport function supportsTasksCancel(\n capabilities: ServerCapabilities | undefined\n): boolean {\n const caps = capabilities as any;\n return Boolean(caps?.tasks?.cancel || caps?.experimental?.tasks?.cancel);\n}\n","/**\n * Tool conversion utilities for integrating MCP tools with Vercel AI SDK\n */\n\nimport type { JSONSchema7, JSONSchema7Definition } from \"json-schema\";\nimport {\n CallToolResult,\n CallToolResultSchema,\n ListToolsResult,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport {\n dynamicTool,\n jsonSchema,\n tool as defineTool,\n type Tool,\n type ToolCallOptions,\n type ToolSet,\n} from \"ai\";\n\n/**\n * Normalizes a schema to a valid JSON Schema object.\n * Many MCP tools omit the top-level type; Anthropic requires an object schema.\n *\n * @param schema - The input schema (may be incomplete)\n * @returns A normalized JSONSchema7 object\n */\nexport function ensureJsonSchemaObject(schema: unknown): JSONSchema7 {\n if (schema && typeof schema === \"object\") {\n const record = schema as Record<string, unknown>;\n const base: JSONSchema7 = record.jsonSchema\n ? ensureJsonSchemaObject(record.jsonSchema)\n : (record as JSONSchema7);\n\n // Many MCP tools omit the top-level type; Anthropic requires an object schema\n if (!(\"type\" in base) || base.type === undefined) {\n base.type = \"object\";\n }\n\n if (base.type === \"object\") {\n base.properties = (base.properties ?? {}) as Record<\n string,\n JSONSchema7Definition\n >;\n if (base.additionalProperties === undefined) {\n base.additionalProperties = false;\n }\n }\n\n return base;\n }\n\n // Return a minimal valid object schema\n return {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n } satisfies JSONSchema7;\n}\n\n/**\n * Function type for executing tool calls\n */\nexport type CallToolExecutor = (params: {\n name: string;\n args: unknown;\n options?: ToolCallOptions;\n}) => Promise<CallToolResult>;\n\n/**\n * Input schema type for tool definitions\n */\ntype ToolInputSchema = Parameters<typeof dynamicTool>[0][\"inputSchema\"];\n\n/**\n * Schema overrides for specific tools\n * Maps tool name to custom input schema definition\n */\nexport type ToolSchemaOverrides = Record<\n string,\n { inputSchema: ToolInputSchema }\n>;\n\n/**\n * Result type for converted tools\n * When explicit schemas are provided, returns typed object\n * When \"automatic\", returns generic record\n */\nexport type ConvertedToolSet<\n SCHEMAS extends ToolSchemaOverrides | \"automatic\",\n> = SCHEMAS extends ToolSchemaOverrides\n ? { [K in keyof SCHEMAS]: Tool }\n : Record<string, Tool>;\n\n/**\n * Options for tool conversion\n */\nexport interface ConvertOptions<\n TOOL_SCHEMAS extends ToolSchemaOverrides | \"automatic\",\n> {\n /** Schema overrides or \"automatic\" for dynamic conversion */\n schemas?: TOOL_SCHEMAS;\n /** Function to execute tool calls */\n callTool: CallToolExecutor;\n}\n\n/**\n * Checks whether a tool is an MCP App by inspecting its _meta for a UI resource URI.\n *\n * @param toolMeta - The tool's _meta field from listTools result\n * @returns true if the tool is an MCP App\n */\nexport function isMcpAppTool(\n toolMeta: Record<string, unknown> | undefined\n): boolean {\n if (!toolMeta) return false;\n // MCP Apps use _meta.ui.resourceUri (preferred) or legacy \"ui/resourceUri\".\n const nested = (toolMeta as { ui?: { resourceUri?: unknown } }).ui;\n if (typeof nested?.resourceUri === \"string\") return true;\n return typeof toolMeta[\"ui/resourceUri\"] === \"string\";\n}\n\n/**\n * Checks whether a tool is a ChatGPT App by inspecting its _meta for an output template.\n *\n * @param toolMeta - The tool's _meta field from listTools result\n * @returns true if the tool is a ChatGPT App\n */\nexport function isChatGPTAppTool(\n toolMeta: Record<string, unknown> | undefined\n): boolean {\n if (!toolMeta) return false;\n return typeof toolMeta[\"openai/outputTemplate\"] === \"string\";\n}\n\n/**\n * Removes only the _meta field from a tool result (shallow copy).\n *\n * @param result - The full tool call result\n * @returns A shallow copy of the result without _meta\n */\nexport function scrubMetaFromToolResult(result: CallToolResult): CallToolResult {\n if (!result) return result;\n const copy = { ...result };\n if ((copy as Record<string, unknown>)._meta) {\n delete (copy as Record<string, unknown>)._meta;\n }\n return copy;\n}\n\n/**\n * Removes only structuredContent from a tool result (shallow copy).\n *\n * @param result - The full tool call result\n * @returns A shallow copy of the result without structuredContent\n */\nexport function scrubStructuredContentFromToolResult(\n result: CallToolResult\n): CallToolResult {\n if (!result) return result;\n const copy = { ...result };\n if ((copy as Record<string, unknown>).structuredContent) {\n delete (copy as Record<string, unknown>).structuredContent;\n }\n return copy;\n}\n\n/**\n * Returns a shallow copy of a CallToolResult with _meta and structuredContent removed.\n *\n * @param result - The full tool call result\n * @returns A scrubbed shallow copy without _meta and structuredContent\n */\nexport function scrubMetaAndStructuredContentFromToolResult(\n result: CallToolResult\n): CallToolResult {\n if (!result) return result;\n return scrubMetaFromToolResult(scrubStructuredContentFromToolResult(result));\n}\n\n/**\n * Converts MCP tools to Vercel AI SDK format.\n *\n * @param listToolsResult - The result from listTools()\n * @param options - Conversion options including callTool executor\n * @returns A ToolSet compatible with Vercel AI SDK\n *\n * @example\n * ```typescript\n * const tools = await convertMCPToolsToVercelTools(listToolsResult, {\n * callTool: async ({ name, args, options }) => {\n * return await mcpClient.callTool({ name, arguments: args });\n * },\n * });\n *\n * // Use with Vercel AI SDK\n * const result = await generateText({\n * model: openai(\"gpt-4\"),\n * tools,\n * messages: [{ role: \"user\", content: \"...\" }],\n * });\n * ```\n */\nexport async function convertMCPToolsToVercelTools(\n listToolsResult: ListToolsResult,\n {\n schemas = \"automatic\",\n callTool,\n }: ConvertOptions<ToolSchemaOverrides | \"automatic\">\n): Promise<ToolSet> {\n const tools: ToolSet = {};\n\n for (const toolDescription of listToolsResult.tools) {\n const { name, description, inputSchema } = toolDescription;\n const toolMeta = toolDescription._meta as Record<string, unknown> | undefined;\n\n // Create the execute function that delegates to the provided callTool\n const execute = async (args: unknown, options?: ToolCallOptions) => {\n options?.abortSignal?.throwIfAborted();\n const result = await callTool({ name, args, options });\n return CallToolResultSchema.parse(result);\n };\n\n // For MCP app tools, strip _meta and structuredContent before sending to the LLM.\n // For ChatGPT app tools, strip structuredContent before sending to the LLM.\n // The raw execute() return value still reaches the UI stream unchanged.\n // Runtime signature: ({ toolCallId, input, output }) => ToolResultOutput\n // Note: Type assertion needed due to slight type misalignment between CallToolResult and JSONValue\n const toModelOutput = isMcpAppTool(toolMeta)\n ? ((opts: { toolCallId: string; input: unknown; output: unknown }) => {\n const scrubbed = scrubMetaAndStructuredContentFromToolResult(\n opts.output as CallToolResult\n );\n return { type: \"json\" as const, value: scrubbed as any } as any;\n })\n : isChatGPTAppTool(toolMeta)\n ? ((opts: { toolCallId: string; input: unknown; output: unknown }) => {\n const scrubbed = scrubStructuredContentFromToolResult(\n opts.output as CallToolResult\n );\n return { type: \"json\" as const, value: scrubbed as any } as any;\n })\n : undefined;\n\n let vercelTool: Tool;\n\n if (schemas === \"automatic\") {\n // Automatic mode: normalize the schema and create a dynamic tool\n const normalizedInputSchema = ensureJsonSchemaObject(inputSchema);\n vercelTool = dynamicTool({\n description,\n inputSchema: jsonSchema(normalizedInputSchema),\n execute,\n ...(toModelOutput ? { toModelOutput } : {}),\n });\n } else {\n // Override mode: only include tools explicitly listed in overrides\n const overrides = schemas;\n if (!(name in overrides)) {\n continue;\n }\n vercelTool = defineTool<unknown, CallToolResult>({\n description,\n inputSchema: overrides[name].inputSchema,\n execute,\n ...(toModelOutput ? { toModelOutput } : {}),\n });\n }\n\n tools[name] = vercelTool;\n }\n\n return tools;\n}\n","/**\n * MCPClientManager - Manages multiple MCP server connections\n */\n\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport {\n getDefaultEnvironment,\n StdioClientTransport,\n} from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport {\n CallToolResultSchema,\n CreateTaskResultSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport type { RequestOptions } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport type {\n LoggingLevel,\n ServerCapabilities,\n CallToolResult,\n} from \"@modelcontextprotocol/sdk/types.js\";\n\nimport type {\n MCPClientManagerConfig,\n MCPClientManagerOptions,\n MCPServerConfig,\n StdioServerConfig,\n HttpServerConfig,\n ManagedClientState,\n MCPConnectionStatus,\n ServerSummary,\n ClientCapabilityOptions,\n ExecuteToolArguments,\n TaskOptions,\n ClientRequestOptions,\n ListResourcesParams,\n ListResourceTemplatesParams,\n ReadResourceParams,\n SubscribeResourceParams,\n UnsubscribeResourceParams,\n ListPromptsParams,\n GetPromptParams,\n ListToolsResult,\n ElicitationHandler,\n ElicitationCallback,\n ElicitResult,\n ProgressHandler,\n RpcLogger,\n Tool,\n AiSdkTool,\n} from \"./types.js\";\n\nimport {\n DEFAULT_CLIENT_VERSION,\n DEFAULT_TIMEOUT,\n HTTP_CONNECT_TIMEOUT,\n} from \"./constants.js\";\nimport { isMethodUnavailableError, formatError } from \"./error-utils.js\";\nimport { MCPAuthError, isAuthError } from \"./errors.js\";\nimport {\n buildRequestInit,\n wrapTransportForLogging,\n createDefaultRpcLogger,\n} from \"./transport-utils.js\";\nimport {\n NotificationManager,\n applyProgressHandler,\n ResourceListChangedNotificationSchema,\n ResourceUpdatedNotificationSchema,\n PromptListChangedNotificationSchema,\n type NotificationSchema,\n type NotificationHandler,\n} from \"./notification-handlers.js\";\nimport { ElicitationManager } from \"./elicitation.js\";\nimport {\n listTasks as tasksListTasks,\n getTask as tasksGetTask,\n getTaskResult as tasksGetTaskResult,\n cancelTask as tasksCancelTask,\n supportsTasksForToolCalls,\n supportsTasksList,\n supportsTasksCancel,\n TaskStatusNotificationSchema,\n} from \"./tasks.js\";\nimport {\n convertMCPToolsToVercelTools,\n type ToolSchemaOverrides,\n} from \"./tool-converters.js\";\n\n/**\n * Manages multiple MCP server connections with support for tools, resources,\n * prompts, notifications, elicitation, and tasks.\n *\n * @example\n * ```typescript\n * const manager = new MCPClientManager({\n * everything: {\n * command: \"npx\",\n * args: [\"-y\", \"@modelcontextprotocol/server-everything\"],\n * },\n * myServer: {\n * url: \"https://my-server.com/mcp\",\n * accessToken: \"my-token\",\n * },\n * });\n *\n * const tools = await manager.listTools(\"everything\");\n * const result = await manager.executeTool(\"everything\", \"add\", { a: 1, b: 2 });\n * ```\n */\nexport class MCPClientManager {\n // State management\n private readonly clientStates = new Map<string, ManagedClientState>();\n private readonly toolsMetadataCache = new Map<string, Map<string, any>>();\n\n // Managers for specific features\n private readonly notificationManager = new NotificationManager();\n private readonly elicitationManager = new ElicitationManager();\n\n // Default options\n private readonly defaultClientName: string | undefined;\n private readonly defaultClientVersion: string;\n private readonly defaultCapabilities: ClientCapabilityOptions;\n private readonly defaultTimeout: number;\n private readonly defaultLogJsonRpc: boolean;\n private readonly defaultRpcLogger?: RpcLogger;\n private readonly defaultProgressHandler?: ProgressHandler;\n\n // Progress token counter for uniqueness\n private progressTokenCounter = 0;\n\n /**\n * Creates a new MCPClientManager.\n *\n * @param servers - Configuration map of server IDs to server configs\n * @param options - Global options for the manager\n */\n constructor(\n servers: MCPClientManagerConfig = {},\n options: MCPClientManagerOptions = {}\n ) {\n this.defaultClientVersion =\n options.defaultClientVersion ?? DEFAULT_CLIENT_VERSION;\n this.defaultClientName = options.defaultClientName;\n this.defaultCapabilities = { ...(options.defaultCapabilities ?? {}) };\n this.defaultTimeout = options.defaultTimeout ?? DEFAULT_TIMEOUT;\n this.defaultLogJsonRpc = options.defaultLogJsonRpc ?? false;\n this.defaultRpcLogger = options.rpcLogger;\n this.defaultProgressHandler = options.progressHandler;\n\n // Start connecting to all configured servers\n for (const [id, config] of Object.entries(servers)) {\n void this.connectToServer(id, config);\n }\n }\n\n // ===========================================================================\n // Server Management\n // ===========================================================================\n\n /**\n * Lists all registered server IDs.\n */\n listServers(): string[] {\n return Array.from(this.clientStates.keys());\n }\n\n /**\n * Checks if a server is registered.\n */\n hasServer(serverId: string): boolean {\n return this.clientStates.has(serverId);\n }\n\n /**\n * Gets summaries for all registered servers.\n */\n getServerSummaries(): ServerSummary[] {\n return Array.from(this.clientStates.entries()).map(([serverId, state]) => ({\n id: serverId,\n status: this.getConnectionStatus(serverId),\n config: state.config,\n }));\n }\n\n /**\n * Gets the connection status for a server.\n */\n getConnectionStatus(serverId: string): MCPConnectionStatus {\n const state = this.clientStates.get(serverId);\n if (state?.promise) return \"connecting\";\n if (state?.client) return \"connected\";\n return \"disconnected\";\n }\n\n /**\n * Gets the configuration for a server.\n */\n getServerConfig(serverId: string): MCPServerConfig | undefined {\n return this.clientStates.get(serverId)?.config;\n }\n\n /**\n * Gets the capabilities reported by a server.\n */\n getServerCapabilities(serverId: string): ServerCapabilities | undefined {\n return this.clientStates.get(serverId)?.client?.getServerCapabilities();\n }\n\n /**\n * Gets the underlying MCP Client for a server.\n */\n getClient(serverId: string): Client | undefined {\n return this.clientStates.get(serverId)?.client;\n }\n\n /**\n * Gets initialization information for a connected server.\n */\n getInitializationInfo(serverId: string) {\n const state = this.clientStates.get(serverId);\n const client = state?.client;\n if (!client) return undefined;\n\n const config = state.config;\n let transportType: string;\n if (this.isStdioConfig(config)) {\n transportType = \"stdio\";\n } else {\n const url = new URL(config.url);\n transportType =\n config.preferSSE || url.pathname.endsWith(\"/sse\")\n ? \"sse\"\n : \"streamable-http\";\n }\n\n let protocolVersion: string | undefined;\n if (state.transport) {\n protocolVersion = (state.transport as any)._protocolVersion;\n }\n\n return {\n protocolVersion,\n transport: transportType,\n serverCapabilities: client.getServerCapabilities(),\n serverVersion: client.getServerVersion(),\n instructions: client.getInstructions(),\n clientCapabilities: this.buildCapabilities(config),\n };\n }\n\n // ===========================================================================\n // Connection Management\n // ===========================================================================\n\n /**\n * Connects to an MCP server.\n *\n * @param serverId - Unique identifier for the server\n * @param config - Server configuration\n * @returns The connected MCP Client\n */\n async connectToServer(\n serverId: string,\n config: MCPServerConfig\n ): Promise<Client> {\n const timeout = config.timeout ?? this.defaultTimeout;\n const existingState = this.clientStates.get(serverId);\n\n if (existingState?.client) {\n throw new Error(`MCP server \"${serverId}\" is already connected.`);\n }\n\n const state: ManagedClientState = existingState ?? { config, timeout };\n state.config = config;\n state.timeout = timeout;\n\n // Reuse existing connection promise if in-flight\n if (state.promise) {\n this.clientStates.set(serverId, state);\n return state.promise;\n }\n\n const connectionPromise = this.performConnection(\n serverId,\n config,\n timeout,\n state\n );\n state.promise = connectionPromise;\n this.clientStates.set(serverId, state);\n\n return connectionPromise;\n }\n\n /**\n * Disconnects from a server.\n */\n async disconnectServer(serverId: string): Promise<void> {\n const state = this.clientStates.get(serverId);\n if (!state?.client) return;\n\n try {\n await state.client.close();\n } catch {\n // Ignore close errors\n } finally {\n if (state.transport) {\n await this.safeCloseTransport(state.transport);\n }\n this.resetState(serverId);\n }\n }\n\n /**\n * Removes a server from the manager entirely.\n */\n async removeServer(serverId: string): Promise<void> {\n await this.disconnectServer(serverId);\n this.notificationManager.clearServer(serverId);\n this.elicitationManager.clearServer(serverId);\n }\n\n /**\n * Disconnects from all servers.\n */\n async disconnectAllServers(): Promise<void> {\n const serverIds = this.listServers();\n await Promise.all(serverIds.map((id) => this.disconnectServer(id)));\n\n for (const serverId of serverIds) {\n this.notificationManager.clearServer(serverId);\n this.elicitationManager.clearServer(serverId);\n }\n }\n\n // ===========================================================================\n // Tools\n // ===========================================================================\n\n /**\n * Lists tools available from a server.\n */\n async listTools(\n serverId: string,\n params?: Parameters<Client[\"listTools\"]>[0],\n options?: ClientRequestOptions\n ): Promise<ListToolsResult> {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n\n try {\n const result = await client.listTools(\n params,\n this.withTimeout(serverId, options)\n );\n this.cacheToolsMetadata(serverId, result.tools);\n return result;\n } catch (error) {\n if (isMethodUnavailableError(error, \"tools/list\")) {\n this.toolsMetadataCache.set(serverId, new Map());\n return { tools: [] } as ListToolsResult;\n }\n throw error;\n }\n }\n\n /**\n * Gets tools from multiple servers (or all servers if none specified).\n * Returns tools with execute functions pre-wired to call this manager.\n *\n * @param serverIds - Server IDs to get tools from (or all if omitted)\n * @returns Array of executable tools\n *\n * @example\n * ```typescript\n * const tools = await manager.getTools([\"asana\"]);\n * const agent = new TestAgent({ tools, model: \"openai/gpt-4o\", apiKey });\n * ```\n */\n async getTools(serverIds?: string[]): Promise<Tool[]> {\n const targetIds = serverIds !== undefined ? serverIds : this.listServers();\n\n const toolLists = await Promise.all(\n targetIds.map(async (serverId) => {\n await this.ensureConnected(serverId);\n const result = await this.listTools(serverId);\n\n // Attach execute function to each tool\n return result.tools.map((tool) => ({\n ...tool,\n _meta: { ...tool._meta, _serverId: serverId },\n execute: async (\n args: Record<string, unknown>,\n options?: { signal?: AbortSignal }\n ): Promise<CallToolResult> => {\n // When called without taskOptions, executeTool always returns CallToolResult\n const requestOptions = options?.signal\n ? { signal: options.signal }\n : undefined;\n return this.executeTool(\n serverId,\n tool.name,\n args,\n requestOptions\n ) as Promise<CallToolResult>;\n },\n }));\n })\n );\n\n return toolLists.flat();\n }\n\n /**\n * Gets cached tool metadata for a server.\n */\n getAllToolsMetadata(serverId: string): Record<string, Record<string, any>> {\n const metadataMap = this.toolsMetadataCache.get(serverId);\n return metadataMap ? Object.fromEntries(metadataMap) : {};\n }\n\n /**\n * Gets tools formatted for Vercel AI SDK.\n *\n * @param serverIds - Server IDs to get tools from (or all if omitted)\n * @param options - Schema options\n * @returns AiSdkTool compatible with Vercel AI SDK's generateText()\n */\n async getToolsForAiSdk(\n serverIds?: string[] | string,\n options: { schemas?: ToolSchemaOverrides | \"automatic\" } = {}\n ): Promise<AiSdkTool> {\n const ids = Array.isArray(serverIds)\n ? serverIds\n : serverIds\n ? [serverIds]\n : this.listServers();\n\n const perServerTools = await Promise.all(\n ids.map(async (id) => {\n try {\n await this.ensureConnected(id);\n const listToolsResult = await this.listTools(id);\n\n const tools = await convertMCPToolsToVercelTools(listToolsResult, {\n schemas: options.schemas,\n callTool: async ({ name, args, options: callOptions }) => {\n const requestOptions = callOptions?.abortSignal\n ? { signal: callOptions.abortSignal }\n : undefined;\n const result = await this.executeTool(\n id,\n name,\n (args ?? {}) as ExecuteToolArguments,\n requestOptions\n );\n return CallToolResultSchema.parse(result);\n },\n });\n\n // Attach server ID metadata to each tool\n for (const [_name, tool] of Object.entries(tools)) {\n (tool as any)._serverId = id;\n }\n return tools;\n } catch (error) {\n if (isMethodUnavailableError(error, \"tools/list\")) {\n return {} as AiSdkTool;\n }\n throw error;\n }\n })\n );\n\n // Flatten (last-in wins for name collisions)\n const flattened: AiSdkTool = {};\n for (const toolset of perServerTools) {\n Object.assign(flattened, toolset);\n }\n return flattened;\n }\n\n /**\n * Executes a tool on a server.\n *\n * @param serverId - The server ID\n * @param toolName - The tool name\n * @param args - Tool arguments\n * @param options - Request options\n * @param taskOptions - Task options for async execution\n */\n async executeTool(\n serverId: string,\n toolName: string,\n args: ExecuteToolArguments = {},\n options?: ClientRequestOptions,\n taskOptions?: TaskOptions\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n\n const mergedOptions = this.withProgressHandler(serverId, options);\n const callParams = { name: toolName, arguments: args };\n\n if (taskOptions !== undefined) {\n // Task-augmented tool call per MCP Tasks spec\n const taskValue =\n taskOptions.ttl !== undefined ? { ttl: taskOptions.ttl } : {};\n const result = await client.request(\n { method: \"tools/call\", params: { ...callParams, task: taskValue } },\n CreateTaskResultSchema,\n mergedOptions\n );\n return {\n task: result.task,\n _meta: {\n \"io.modelcontextprotocol/model-immediate-response\": `Task ${result.task.taskId} created with status: ${result.task.status}`,\n },\n };\n }\n\n return client.callTool(callParams, CallToolResultSchema, mergedOptions);\n }\n\n // ===========================================================================\n // Resources\n // ===========================================================================\n\n /**\n * Lists resources available from a server.\n */\n async listResources(\n serverId: string,\n params?: ListResourcesParams,\n options?: ClientRequestOptions\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n\n try {\n return await client.listResources(\n params,\n this.withTimeout(serverId, options)\n );\n } catch (error) {\n if (isMethodUnavailableError(error, \"resources/list\")) {\n return { resources: [] } as Awaited<\n ReturnType<Client[\"listResources\"]>\n >;\n }\n throw error;\n }\n }\n\n /**\n * Reads a resource from a server.\n */\n async readResource(\n serverId: string,\n params: ReadResourceParams,\n options?: ClientRequestOptions\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n return client.readResource(\n params,\n this.withProgressHandler(serverId, options)\n );\n }\n\n /**\n * Subscribes to resource updates.\n */\n async subscribeResource(\n serverId: string,\n params: SubscribeResourceParams,\n options?: ClientRequestOptions\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n return client.subscribeResource(\n params,\n this.withTimeout(serverId, options)\n );\n }\n\n /**\n * Unsubscribes from resource updates.\n */\n async unsubscribeResource(\n serverId: string,\n params: UnsubscribeResourceParams,\n options?: ClientRequestOptions\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n return client.unsubscribeResource(\n params,\n this.withTimeout(serverId, options)\n );\n }\n\n /**\n * Lists resource templates from a server.\n */\n async listResourceTemplates(\n serverId: string,\n params?: ListResourceTemplatesParams,\n options?: ClientRequestOptions\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n return client.listResourceTemplates(\n params,\n this.withTimeout(serverId, options)\n );\n }\n\n // ===========================================================================\n // Prompts\n // ===========================================================================\n\n /**\n * Lists prompts available from a server.\n */\n async listPrompts(\n serverId: string,\n params?: ListPromptsParams,\n options?: ClientRequestOptions\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n\n try {\n return await client.listPrompts(\n params,\n this.withTimeout(serverId, options)\n );\n } catch (error) {\n if (isMethodUnavailableError(error, \"prompts/list\")) {\n return { prompts: [] } as Awaited<ReturnType<Client[\"listPrompts\"]>>;\n }\n throw error;\n }\n }\n\n /**\n * Gets a prompt from a server.\n */\n async getPrompt(\n serverId: string,\n params: GetPromptParams,\n options?: ClientRequestOptions\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n return client.getPrompt(\n params,\n this.withProgressHandler(serverId, options)\n );\n }\n\n // ===========================================================================\n // Utility Methods\n // ===========================================================================\n\n /**\n * Pings a server to check connectivity.\n */\n pingServer(serverId: string, options?: RequestOptions): void {\n const client = this.getClientOrThrow(serverId);\n try {\n client.ping(options);\n } catch (error) {\n throw new Error(\n `Failed to ping MCP server \"${serverId}\": ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n }\n\n /**\n * Sets the logging level for a server.\n */\n async setLoggingLevel(\n serverId: string,\n level: LoggingLevel = \"debug\"\n ): Promise<void> {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n await client.setLoggingLevel(level);\n }\n\n /**\n * Gets the session ID for a Streamable HTTP server.\n */\n getSessionIdByServer(serverId: string): string | undefined {\n const state = this.clientStates.get(serverId);\n if (!state?.transport) {\n throw new Error(`Unknown MCP server \"${serverId}\".`);\n }\n if (state.transport instanceof StreamableHTTPClientTransport) {\n return state.transport.sessionId;\n }\n throw new Error(\n `Server \"${serverId}\" must be Streamable HTTP to get the session ID.`\n );\n }\n\n // ===========================================================================\n // Notification Handlers\n // ===========================================================================\n\n /**\n * Adds a notification handler for a server.\n */\n addNotificationHandler(\n serverId: string,\n schema: NotificationSchema,\n handler: NotificationHandler\n ): void {\n this.notificationManager.addHandler(serverId, schema, handler);\n\n const client = this.clientStates.get(serverId)?.client;\n if (client) {\n client.setNotificationHandler(\n schema,\n this.notificationManager.createDispatcher(serverId, schema)\n );\n }\n }\n\n /**\n * Registers a handler for resource list changes.\n */\n onResourceListChanged(serverId: string, handler: NotificationHandler): void {\n this.addNotificationHandler(\n serverId,\n ResourceListChangedNotificationSchema,\n handler\n );\n }\n\n /**\n * Registers a handler for resource updates.\n */\n onResourceUpdated(serverId: string, handler: NotificationHandler): void {\n this.addNotificationHandler(\n serverId,\n ResourceUpdatedNotificationSchema,\n handler\n );\n }\n\n /**\n * Registers a handler for prompt list changes.\n */\n onPromptListChanged(serverId: string, handler: NotificationHandler): void {\n this.addNotificationHandler(\n serverId,\n PromptListChangedNotificationSchema,\n handler\n );\n }\n\n /**\n * Registers a handler for task status changes.\n */\n onTaskStatusChanged(serverId: string, handler: NotificationHandler): void {\n this.addNotificationHandler(\n serverId,\n TaskStatusNotificationSchema,\n handler\n );\n }\n\n // ===========================================================================\n // Elicitation\n // ===========================================================================\n\n /**\n * Sets a server-specific elicitation handler.\n */\n setElicitationHandler(serverId: string, handler: ElicitationHandler): void {\n if (!this.clientStates.has(serverId)) {\n throw new Error(`Unknown MCP server \"${serverId}\".`);\n }\n this.elicitationManager.setHandler(serverId, handler);\n\n const client = this.clientStates.get(serverId)?.client;\n if (client) {\n this.elicitationManager.applyToClient(serverId, client);\n }\n }\n\n /**\n * Clears a server-specific elicitation handler.\n */\n clearElicitationHandler(serverId: string): void {\n this.elicitationManager.clearHandler(serverId);\n const client = this.clientStates.get(serverId)?.client;\n if (client) {\n if (this.elicitationManager.getGlobalCallback()) {\n this.elicitationManager.applyToClient(serverId, client);\n } else {\n this.elicitationManager.removeFromClient(client);\n }\n }\n }\n\n /**\n * Sets a global elicitation callback for all servers.\n */\n setElicitationCallback(callback: ElicitationCallback): void {\n this.elicitationManager.setGlobalCallback(callback);\n for (const [serverId, state] of this.clientStates.entries()) {\n if (state.client) {\n this.elicitationManager.applyToClient(serverId, state.client);\n }\n }\n }\n\n /**\n * Clears the global elicitation callback.\n */\n clearElicitationCallback(): void {\n this.elicitationManager.clearGlobalCallback();\n for (const [serverId, state] of this.clientStates.entries()) {\n if (!state.client) continue;\n if (this.elicitationManager.getHandler(serverId)) {\n this.elicitationManager.applyToClient(serverId, state.client);\n } else {\n this.elicitationManager.removeFromClient(state.client);\n }\n }\n }\n\n /**\n * Gets the pending elicitations map for external resolvers.\n */\n getPendingElicitations() {\n return this.elicitationManager.getPendingElicitations();\n }\n\n /**\n * Responds to a pending elicitation.\n */\n respondToElicitation(requestId: string, response: ElicitResult): boolean {\n return this.elicitationManager.respond(requestId, response);\n }\n\n // ===========================================================================\n // Tasks (MCP Tasks experimental feature)\n // ===========================================================================\n\n /**\n * Lists tasks from a server.\n */\n async listTasks(\n serverId: string,\n cursor?: string,\n options?: ClientRequestOptions\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n try {\n return await tasksListTasks(\n client,\n cursor,\n this.withTimeout(serverId, options)\n );\n } catch (error) {\n if (isMethodUnavailableError(error, \"tasks/list\")) {\n return { tasks: [] };\n }\n throw error;\n }\n }\n\n /**\n * Gets a task by ID.\n */\n async getTask(\n serverId: string,\n taskId: string,\n options?: ClientRequestOptions\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n return tasksGetTask(client, taskId, this.withTimeout(serverId, options));\n }\n\n /**\n * Gets the result of a completed task.\n */\n async getTaskResult(\n serverId: string,\n taskId: string,\n options?: ClientRequestOptions\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n return tasksGetTaskResult(\n client,\n taskId,\n this.withTimeout(serverId, options)\n );\n }\n\n /**\n * Cancels a task.\n */\n async cancelTask(\n serverId: string,\n taskId: string,\n options?: ClientRequestOptions\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n return tasksCancelTask(client, taskId, this.withTimeout(serverId, options));\n }\n\n /**\n * Checks if server supports task-augmented tool calls.\n */\n supportsTasksForToolCalls(serverId: string): boolean {\n return supportsTasksForToolCalls(this.getServerCapabilities(serverId));\n }\n\n /**\n * Checks if server supports listing tasks.\n */\n supportsTasksList(serverId: string): boolean {\n return supportsTasksList(this.getServerCapabilities(serverId));\n }\n\n /**\n * Checks if server supports canceling tasks.\n */\n supportsTasksCancel(serverId: string): boolean {\n return supportsTasksCancel(this.getServerCapabilities(serverId));\n }\n\n // ===========================================================================\n // Private Helpers\n // ===========================================================================\n\n private async performConnection(\n serverId: string,\n config: MCPServerConfig,\n timeout: number,\n state: ManagedClientState\n ): Promise<Client> {\n try {\n const client = new Client(\n {\n name: this.defaultClientName ?? serverId,\n version: config.version ?? this.defaultClientVersion,\n },\n { capabilities: this.buildCapabilities(config) }\n );\n\n // Apply handlers\n this.notificationManager.applyToClient(serverId, client);\n if (this.defaultProgressHandler) {\n applyProgressHandler(serverId, client, this.defaultProgressHandler);\n }\n this.elicitationManager.applyToClient(serverId, client);\n\n if (config.onError) {\n client.onerror = (error) => config.onError?.(error);\n }\n\n client.onclose = () => this.resetState(serverId);\n\n let transport: Transport;\n if (this.isStdioConfig(config)) {\n transport = await this.connectViaStdio(\n serverId,\n client,\n config,\n timeout\n );\n } else {\n transport = await this.connectViaHttp(\n serverId,\n client,\n config,\n timeout\n );\n }\n\n state.client = client;\n state.transport = transport;\n state.promise = undefined;\n this.clientStates.set(serverId, state);\n\n // Set logging level (ignore errors)\n this.setLoggingLevel(serverId, \"debug\").catch(() => {});\n\n return client;\n } catch (error) {\n this.resetState(serverId);\n throw error;\n }\n }\n\n private async connectViaStdio(\n serverId: string,\n client: Client,\n config: StdioServerConfig,\n timeout: number\n ): Promise<Transport> {\n const underlying = new StdioClientTransport({\n command: config.command,\n args: config.args,\n env: { ...getDefaultEnvironment(), ...(config.env ?? {}) },\n });\n\n const logger = this.resolveRpcLogger(config);\n const transport = logger\n ? wrapTransportForLogging(serverId, logger, underlying)\n : underlying;\n\n await client.connect(transport, { timeout });\n return underlying;\n }\n\n private async connectViaHttp(\n serverId: string,\n client: Client,\n config: HttpServerConfig,\n timeout: number\n ): Promise<Transport> {\n const url = new URL(config.url);\n const requestInit = buildRequestInit(\n config.accessToken,\n config.requestInit\n );\n const preferSSE = config.preferSSE ?? url.pathname.endsWith(\"/sse\");\n let streamableError: unknown;\n\n if (!preferSSE) {\n const streamableTransport = new StreamableHTTPClientTransport(url, {\n requestInit,\n reconnectionOptions: config.reconnectionOptions,\n authProvider: config.authProvider,\n sessionId: config.sessionId,\n });\n\n try {\n const logger = this.resolveRpcLogger(config);\n const wrapped = logger\n ? wrapTransportForLogging(serverId, logger, streamableTransport)\n : streamableTransport;\n await client.connect(wrapped, {\n timeout: Math.min(timeout, HTTP_CONNECT_TIMEOUT),\n });\n return streamableTransport;\n } catch (error) {\n streamableError = error;\n await this.safeCloseTransport(streamableTransport);\n }\n }\n\n const sseTransport = new SSEClientTransport(url, {\n requestInit,\n eventSourceInit: config.eventSourceInit,\n authProvider: config.authProvider,\n });\n\n try {\n const logger = this.resolveRpcLogger(config);\n const wrapped = logger\n ? wrapTransportForLogging(serverId, logger, sseTransport)\n : sseTransport;\n await client.connect(wrapped, { timeout });\n return sseTransport;\n } catch (error) {\n await this.safeCloseTransport(sseTransport);\n const streamableMessage = streamableError\n ? ` Streamable HTTP error: ${formatError(streamableError)}.`\n : \"\";\n const sseErrorMessage = formatError(error);\n const combinedErrorMessage =\n `${streamableMessage} SSE error: ${sseErrorMessage}`.trim();\n\n // Check for auth errors in both the SSE error and streamable error\n const sseAuthCheck = isAuthError(error);\n const streamableAuthCheck = streamableError\n ? isAuthError(streamableError)\n : { isAuth: false };\n\n if (sseAuthCheck.isAuth || streamableAuthCheck.isAuth) {\n const statusCode =\n sseAuthCheck.statusCode ?? streamableAuthCheck.statusCode;\n throw new MCPAuthError(\n `Authentication failed for MCP server \"${serverId}\": ${combinedErrorMessage}`,\n statusCode,\n { cause: error }\n );\n }\n\n throw new Error(\n `Failed to connect to MCP server \"${serverId}\" using HTTP transports.${streamableMessage} SSE error: ${sseErrorMessage}.`\n );\n }\n }\n\n private async safeCloseTransport(transport: Transport): Promise<void> {\n try {\n await transport.close();\n } catch {\n // Ignore close errors\n }\n }\n\n private async ensureConnected(serverId: string): Promise<void> {\n const state = this.clientStates.get(serverId);\n if (state?.client) return;\n\n if (!state) {\n throw new Error(`Unknown MCP server \"${serverId}\".`);\n }\n if (state.promise) {\n await state.promise;\n return;\n }\n await this.connectToServer(serverId, state.config);\n }\n\n private getClientOrThrow(serverId: string): Client {\n const state = this.clientStates.get(serverId);\n if (!state?.client) {\n throw new Error(`MCP server \"${serverId}\" is not connected.`);\n }\n return state.client;\n }\n\n private resetState(serverId: string): void {\n this.clientStates.delete(serverId);\n this.toolsMetadataCache.delete(serverId);\n }\n\n private withTimeout(\n serverId: string,\n options?: RequestOptions\n ): RequestOptions {\n const state = this.clientStates.get(serverId);\n const timeout = state?.timeout ?? this.defaultTimeout;\n\n if (!options) return { timeout };\n if (options.timeout === undefined) return { ...options, timeout };\n return options;\n }\n\n private withProgressHandler(\n serverId: string,\n options?: RequestOptions\n ): RequestOptions {\n const mergedOptions = this.withTimeout(serverId, options);\n\n if (!mergedOptions.onprogress && this.defaultProgressHandler) {\n const progressToken = `${serverId}-request-${Date.now()}-${++this.progressTokenCounter}`;\n mergedOptions.onprogress = (progress) => {\n this.defaultProgressHandler!({\n serverId,\n progressToken,\n progress: progress.progress,\n total: progress.total,\n message: progress.message,\n });\n };\n }\n\n return mergedOptions;\n }\n\n private buildCapabilities(config: MCPServerConfig): ClientCapabilityOptions {\n const capabilities: ClientCapabilityOptions = {\n ...this.defaultCapabilities,\n ...(config.capabilities ?? {}),\n };\n if (!capabilities.elicitation) {\n capabilities.elicitation = {};\n }\n return capabilities;\n }\n\n private resolveRpcLogger(config: MCPServerConfig): RpcLogger | undefined {\n if (config.rpcLogger) return config.rpcLogger;\n if (config.logJsonRpc || this.defaultLogJsonRpc)\n return createDefaultRpcLogger();\n if (this.defaultRpcLogger) return this.defaultRpcLogger;\n return undefined;\n }\n\n private cacheToolsMetadata(\n serverId: string,\n tools: Array<{ name: string; _meta?: any }>\n ): void {\n const metadataMap = new Map<string, any>();\n for (const tool of tools) {\n if (tool._meta) {\n metadataMap.set(tool.name, tool._meta);\n }\n }\n this.toolsMetadataCache.set(serverId, metadataMap);\n }\n\n private isStdioConfig(config: MCPServerConfig): config is StdioServerConfig {\n return \"command\" in config;\n }\n}\n","/**\n * Model factory for creating AI SDK language models from provider/model strings.\n * Supports both built-in providers and user-defined custom providers.\n */\n\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createAzure } from \"@ai-sdk/azure\";\nimport { createDeepSeek } from \"@ai-sdk/deepseek\";\nimport { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { createMistral } from \"@ai-sdk/mistral\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createXai } from \"@ai-sdk/xai\";\nimport { createOpenRouter } from \"@openrouter/ai-sdk-provider\";\nimport { createOllama } from \"ollama-ai-provider-v2\";\nimport type { LLMProvider, CustomProvider } from \"./types.js\";\n\n/**\n * Custom base URLs for built-in providers that support them.\n */\nexport interface BaseUrls {\n ollama?: string;\n azure?: string;\n anthropic?: string;\n openai?: string;\n}\n\n/**\n * Options for creating a model.\n */\nexport interface CreateModelOptions {\n apiKey: string;\n baseUrls?: BaseUrls;\n /** Custom providers registry (name -> config) */\n customProviders?:\n | Map<string, CustomProvider>\n | Record<string, CustomProvider>;\n}\n\n/** Built-in providers list */\nconst BUILT_IN_PROVIDERS: LLMProvider[] = [\n \"anthropic\",\n \"openai\",\n \"azure\",\n \"deepseek\",\n \"google\",\n \"ollama\",\n \"mistral\",\n \"openrouter\",\n \"xai\",\n];\n\n/**\n * Result of parsing an LLM string\n */\nexport type ParsedLLMString =\n | { type: \"builtin\"; provider: LLMProvider; model: string }\n | { type: \"custom\"; providerName: string; model: string };\n\n/**\n * Parse an LLM string into provider and model components.\n * Supports both built-in providers and custom provider names.\n *\n * @param llmString - String in format \"provider/model\" (e.g., \"openai/gpt-4o\" or \"my-litellm/gpt-4\")\n * @param customProviderNames - Optional set of registered custom provider names for validation\n * @returns Parsed result with type discriminator\n */\nexport function parseLLMString(\n llmString: string,\n customProviderNames?: Set<string>\n): ParsedLLMString {\n const parts = llmString.split(\"/\");\n if (parts.length < 2) {\n throw new Error(\n `Invalid LLM string format: \"${llmString}\". Expected format: \"provider/model\" (e.g., \"openai/gpt-4o\")`\n );\n }\n\n const providerName = parts[0];\n const model = parts.slice(1).join(\"/\"); // Handle models with slashes in name\n\n // Check if it's a built-in provider\n if (BUILT_IN_PROVIDERS.includes(providerName as LLMProvider)) {\n return {\n type: \"builtin\",\n provider: providerName as LLMProvider,\n model,\n };\n }\n\n // Check if it's a registered custom provider\n if (customProviderNames?.has(providerName)) {\n return {\n type: \"custom\",\n providerName,\n model,\n };\n }\n\n // Unknown provider\n const allProviders = customProviderNames\n ? [...BUILT_IN_PROVIDERS, ...customProviderNames]\n : BUILT_IN_PROVIDERS;\n\n throw new Error(\n `Unknown LLM provider: \"${providerName}\". Supported providers: ${allProviders.join(\", \")}`\n );\n}\n\n/**\n * Model type returned by provider factories.\n */\nexport type ProviderLanguageModel = ReturnType<ReturnType<typeof createOpenAI>>;\n\n/**\n * Create a model from a custom provider configuration.\n */\nfunction createModelFromCustomProvider(\n customProvider: CustomProvider,\n model: string,\n runtimeApiKey?: string\n): ProviderLanguageModel {\n // Resolve API key: runtime > config > env var\n const apiKey =\n runtimeApiKey ||\n customProvider.apiKey ||\n (customProvider.apiKeyEnvVar\n ? process.env[customProvider.apiKeyEnvVar]\n : undefined) ||\n \"\";\n\n switch (customProvider.protocol) {\n case \"openai-compatible\": {\n const openai = createOpenAI({\n apiKey,\n baseURL: customProvider.baseUrl,\n });\n // Use .chat() for providers that need Chat Completions API (like LiteLLM)\n return customProvider.useChatCompletions\n ? openai.chat(model)\n : openai(model);\n }\n\n case \"anthropic-compatible\": {\n const anthropic = createAnthropic({\n apiKey,\n baseURL: customProvider.baseUrl,\n });\n return anthropic(model) as ProviderLanguageModel;\n }\n\n default: {\n const _exhaustiveCheck: never = customProvider.protocol;\n throw new Error(`Unknown protocol: ${_exhaustiveCheck}`);\n }\n }\n}\n\n/**\n * Create a language model from an LLM string.\n * @param llmString - String in format \"provider/model\" (e.g., \"openai/gpt-4o\" or \"my-provider/model\")\n * @param options - API key, optional base URLs, and custom providers registry\n * @returns AI SDK language model instance\n */\nexport function createModelFromString(\n llmString: string,\n options: CreateModelOptions\n): ProviderLanguageModel {\n const { apiKey, baseUrls, customProviders } = options;\n\n // Convert custom providers to Map if provided as object\n const customProvidersMap =\n customProviders instanceof Map\n ? customProviders\n : customProviders\n ? new Map(Object.entries(customProviders))\n : new Map<string, CustomProvider>();\n\n const customProviderNames = new Set(customProvidersMap.keys());\n const parsed = parseLLMString(llmString, customProviderNames);\n\n // Handle custom providers\n if (parsed.type === \"custom\") {\n const customProvider = customProvidersMap.get(parsed.providerName);\n if (!customProvider) {\n throw new Error(\n `Custom provider \"${parsed.providerName}\" not found in registry`\n );\n }\n return createModelFromCustomProvider(customProvider, parsed.model, apiKey);\n }\n\n // Handle built-in providers\n const { provider, model } = parsed;\n\n switch (provider) {\n case \"anthropic\": {\n const anthropic = createAnthropic({\n apiKey,\n ...(baseUrls?.anthropic && { baseURL: baseUrls.anthropic }),\n });\n return anthropic(model) as ProviderLanguageModel;\n }\n\n case \"openai\": {\n const openai = createOpenAI({\n apiKey,\n ...(baseUrls?.openai && { baseURL: baseUrls.openai }),\n });\n return openai(model);\n }\n\n case \"deepseek\": {\n const deepseek = createDeepSeek({ apiKey });\n return deepseek(model) as ProviderLanguageModel;\n }\n\n case \"google\": {\n const google = createGoogleGenerativeAI({ apiKey });\n return google(model) as ProviderLanguageModel;\n }\n\n case \"ollama\": {\n // Normalize the base URL to ensure it ends with /api\n const raw = baseUrls?.ollama || \"http://127.0.0.1:11434/api\";\n const normalized = /\\/api\\/?$/.test(raw)\n ? raw\n : `${raw.replace(/\\/+$/, \"\")}/api`;\n const ollama = createOllama({ baseURL: normalized });\n return ollama(model) as unknown as ProviderLanguageModel;\n }\n\n case \"mistral\": {\n const mistral = createMistral({ apiKey });\n return mistral(model) as ProviderLanguageModel;\n }\n\n case \"openrouter\": {\n const openrouter = createOpenRouter({ apiKey });\n return openrouter(model) as unknown as ProviderLanguageModel;\n }\n\n case \"xai\": {\n const xai = createXai({ apiKey });\n return xai(model) as ProviderLanguageModel;\n }\n\n case \"azure\": {\n const azure = createAzure({\n apiKey,\n baseURL: baseUrls?.azure,\n });\n return azure(model) as ProviderLanguageModel;\n }\n\n default: {\n const _exhaustiveCheck: never = provider;\n throw new Error(`Unhandled provider: ${_exhaustiveCheck}`);\n }\n }\n}\n\n/**\n * Parse a comma-separated string of model IDs into an array.\n * Handles whitespace and empty entries.\n */\nexport function parseModelIds(modelIdsString: string): string[] {\n return modelIdsString\n .split(\",\")\n .map((id) => id.trim())\n .filter((id) => id.length > 0);\n}\n\n/**\n * Create a CustomProvider configuration from user input.\n * This is a helper for building the configuration from form inputs.\n */\nexport function createCustomProvider(config: {\n name: string;\n protocol: \"openai-compatible\" | \"anthropic-compatible\";\n baseUrl: string;\n modelIds: string | string[];\n apiKey?: string;\n apiKeyEnvVar?: string;\n useChatCompletions?: boolean;\n}): CustomProvider {\n const modelIds = Array.isArray(config.modelIds)\n ? config.modelIds\n : parseModelIds(config.modelIds);\n\n if (modelIds.length === 0) {\n throw new Error(\"At least one model ID is required\");\n }\n\n if (!config.name || config.name.includes(\"/\")) {\n throw new Error(\"Provider name is required and cannot contain '/'\");\n }\n\n if (!config.baseUrl) {\n throw new Error(\"Base URL is required\");\n }\n\n return {\n name: config.name,\n protocol: config.protocol,\n baseUrl: config.baseUrl,\n modelIds,\n ...(config.apiKey && { apiKey: config.apiKey }),\n ...(config.apiKeyEnvVar && { apiKeyEnvVar: config.apiKeyEnvVar }),\n ...(config.useChatCompletions && {\n useChatCompletions: config.useChatCompletions,\n }),\n };\n}\n\n/**\n * Preset configurations for common OpenAI-compatible providers.\n * Users can use these as starting points and customize as needed.\n */\nexport const PROVIDER_PRESETS = {\n /** LiteLLM proxy - requires useChatCompletions */\n litellm: (\n baseUrl = \"http://localhost:4000\",\n modelIds: string[]\n ): CustomProvider => ({\n name: \"litellm\",\n protocol: \"openai-compatible\",\n baseUrl,\n modelIds,\n apiKeyEnvVar: \"LITELLM_API_KEY\",\n useChatCompletions: true,\n }),\n} as const;\n","/**\n * Tool extraction utilities for AI SDK generateText results\n */\n\nimport { GenerateTextResult, ToolSet } from \"ai\";\nimport type { ToolCall } from \"./types.js\";\n\n/**\n * Extract all tool calls from an AI SDK generateText result.\n * Collects tool calls from all steps in the agentic loop.\n *\n * @param result - The result from AI SDK's generateText\n * @returns Array of ToolCall objects with toolName and arguments\n */\nexport function extractToolCalls(\n result: GenerateTextResult<ToolSet, never>\n): ToolCall[] {\n const toolCalls: ToolCall[] = [];\n\n // Extract from steps (multi-step agentic loop)\n if (result.steps && Array.isArray(result.steps)) {\n for (const step of result.steps) {\n if (step.toolCalls && Array.isArray(step.toolCalls)) {\n for (const tc of step.toolCalls) {\n toolCalls.push({\n toolName: tc.toolName,\n arguments: tc.input ?? {},\n });\n }\n }\n }\n }\n\n // If no steps, check top-level toolCalls (single-step result)\n if (\n toolCalls.length === 0 &&\n result.toolCalls &&\n Array.isArray(result.toolCalls)\n ) {\n for (const tc of result.toolCalls) {\n toolCalls.push({\n toolName: tc.toolName,\n arguments: tc.input ?? {},\n });\n }\n }\n\n return toolCalls;\n}\n\n/**\n * Extract tool names from an AI SDK generateText result.\n * Convenience function that returns just the tool names.\n *\n * @param result - The result from AI SDK's generateText\n * @returns Array of tool names that were called\n */\nexport function extractToolNames(\n result: GenerateTextResult<ToolSet, never>\n): string[] {\n return extractToolCalls(result).map((tc) => tc.toolName);\n}\n","/**\n * PromptResult class - wraps the result of a TestAgent prompt\n */\n\nimport type {\n ToolCall,\n TokenUsage,\n PromptResultData,\n LatencyBreakdown,\n CoreMessage,\n CoreUserMessage,\n CoreAssistantMessage,\n CoreToolMessage,\n} from \"./types.js\";\n\n/**\n * Represents the result of a TestAgent prompt.\n * Provides convenient methods to inspect tool calls, token usage, and errors.\n */\nexport class PromptResult {\n /** The original prompt/query that was sent */\n readonly prompt: string;\n\n /** The text response from the LLM */\n readonly text: string;\n\n /** The full conversation history */\n private readonly _messages: CoreMessage[];\n\n /** Latency breakdown (e2e, llm, mcp) */\n private readonly _latency: LatencyBreakdown;\n\n /** Tool calls made during the prompt */\n private readonly _toolCalls: ToolCall[];\n\n /** Token usage statistics */\n private readonly _usage: TokenUsage;\n\n /** Error message if the prompt failed */\n private readonly _error?: string;\n\n /**\n * Create a new PromptResult\n * @param data - The raw prompt result data\n */\n constructor(data: PromptResultData) {\n this.prompt = data.prompt;\n this._messages = data.messages;\n this.text = data.text;\n this._latency = data.latency;\n this._toolCalls = data.toolCalls;\n this._usage = data.usage;\n this._error = data.error;\n }\n\n /**\n * Get the original query/prompt that was sent.\n *\n * @returns The original prompt string\n */\n getPrompt(): string {\n return this.prompt;\n }\n\n /**\n * Get the full conversation history (user, assistant, tool messages).\n * Returns a copy to prevent external modification.\n *\n * @returns Array of CoreMessage objects\n */\n getMessages(): CoreMessage[] {\n return [...this._messages];\n }\n\n /**\n * Get only user messages from the conversation.\n *\n * @returns Array of CoreUserMessage objects\n */\n getUserMessages(): CoreUserMessage[] {\n return this._messages.filter(\n (m): m is CoreUserMessage => m.role === \"user\"\n );\n }\n\n /**\n * Get only assistant messages from the conversation.\n *\n * @returns Array of CoreAssistantMessage objects\n */\n getAssistantMessages(): CoreAssistantMessage[] {\n return this._messages.filter(\n (m): m is CoreAssistantMessage => m.role === \"assistant\"\n );\n }\n\n /**\n * Get only tool result messages from the conversation.\n *\n * @returns Array of CoreToolMessage objects\n */\n getToolMessages(): CoreToolMessage[] {\n return this._messages.filter(\n (m): m is CoreToolMessage => m.role === \"tool\"\n );\n }\n\n /**\n * Get the end-to-end latency in milliseconds.\n * This is the total wall-clock time for the prompt.\n *\n * @returns End-to-end latency in milliseconds\n */\n e2eLatencyMs(): number {\n return this._latency.e2eMs;\n }\n\n /**\n * Get the LLM API latency in milliseconds.\n * This is the time spent waiting for LLM responses (excluding tool execution).\n *\n * @returns LLM latency in milliseconds\n */\n llmLatencyMs(): number {\n return this._latency.llmMs;\n }\n\n /**\n * Get the MCP tool execution latency in milliseconds.\n * This is the time spent executing MCP tools.\n *\n * @returns MCP tool latency in milliseconds\n */\n mcpLatencyMs(): number {\n return this._latency.mcpMs;\n }\n\n /**\n * Get the full latency breakdown.\n *\n * @returns LatencyBreakdown object with e2eMs, llmMs, and mcpMs\n */\n getLatency(): LatencyBreakdown {\n return { ...this._latency };\n }\n\n /**\n * Get the names of all tools that were called during this prompt.\n * Returns a standard string[] that can be used with .includes().\n *\n * @returns Array of tool names\n */\n toolsCalled(): string[] {\n return this._toolCalls.map((tc) => tc.toolName);\n }\n\n /**\n * Check if a specific tool was called during this prompt.\n * Case-sensitive exact match.\n *\n * @param toolName - The name of the tool to check for\n * @returns true if the tool was called\n */\n hasToolCall(toolName: string): boolean {\n return this._toolCalls.some((tc) => tc.toolName === toolName);\n }\n\n /**\n * Get all tool calls with their arguments.\n *\n * @returns Array of ToolCall objects\n */\n getToolCalls(): ToolCall[] {\n return [...this._toolCalls];\n }\n\n /**\n * Get the arguments passed to a specific tool call.\n * Returns undefined if the tool was not called.\n * If the tool was called multiple times, returns the first call's arguments.\n *\n * @param toolName - The name of the tool\n * @returns The arguments object or undefined\n */\n getToolArguments(toolName: string): Record<string, unknown> | undefined {\n const call = this._toolCalls.find((tc) => tc.toolName === toolName);\n return call?.arguments;\n }\n\n /**\n * Get the total number of tokens used.\n *\n * @returns Total tokens (input + output)\n */\n totalTokens(): number {\n return this._usage.totalTokens;\n }\n\n /**\n * Get the number of input tokens used.\n *\n * @returns Input token count\n */\n inputTokens(): number {\n return this._usage.inputTokens;\n }\n\n /**\n * Get the number of output tokens used.\n *\n * @returns Output token count\n */\n outputTokens(): number {\n return this._usage.outputTokens;\n }\n\n /**\n * Get the full token usage statistics.\n *\n * @returns TokenUsage object\n */\n getUsage(): TokenUsage {\n return { ...this._usage };\n }\n\n /**\n * Check if this prompt resulted in an error.\n *\n * @returns true if there was an error\n */\n hasError(): boolean {\n return this._error !== undefined;\n }\n\n /**\n * Get the error message if the prompt failed.\n *\n * @returns The error message or undefined\n */\n getError(): string | undefined {\n return this._error;\n }\n\n /**\n * Create a PromptResult from raw data.\n * Factory method for convenience.\n *\n * @param data - The raw prompt result data\n * @returns A new PromptResult instance\n */\n static from(data: PromptResultData): PromptResult {\n return new PromptResult(data);\n }\n\n /**\n * Create an error PromptResult.\n * Factory method for error cases.\n *\n * @param error - The error message\n * @param latency - The latency breakdown or e2e time in milliseconds\n * @returns A new PromptResult instance with error state\n */\n static error(\n error: string,\n latency: LatencyBreakdown | number = 0,\n prompt: string = \"\"\n ): PromptResult {\n const latencyBreakdown: LatencyBreakdown =\n typeof latency === \"number\"\n ? { e2eMs: latency, llmMs: 0, mcpMs: 0 }\n : latency;\n\n return new PromptResult({\n prompt,\n messages: [],\n text: \"\",\n toolCalls: [],\n usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n latency: latencyBreakdown,\n error,\n });\n }\n\n /**\n * Format the conversation trace as a JSON string.\n * Useful for debugging failed evaluations.\n *\n * @returns A JSON string of the conversation messages\n */\n formatTrace(): string {\n return JSON.stringify(this._messages, null, 2);\n }\n}\n","/**\n * TestAgent - Runs LLM prompts with tool calling for evals\n */\n\nimport { generateText, stepCountIs, dynamicTool, jsonSchema } from \"ai\";\nimport type { ToolSet, ModelMessage, UserModelMessage } from \"ai\";\nimport { CallToolResultSchema } from \"@modelcontextprotocol/sdk/types.js\";\nimport { createModelFromString } from \"./model-factory.js\";\nimport type { CreateModelOptions } from \"./model-factory.js\";\nimport { extractToolCalls } from \"./tool-extraction.js\";\nimport { PromptResult } from \"./PromptResult.js\";\nimport type { CustomProvider } from \"./types.js\";\nimport type { Tool, AiSdkTool } from \"./mcp-client-manager/types.js\";\nimport { ensureJsonSchemaObject } from \"./mcp-client-manager/tool-converters.js\";\n\n/**\n * Configuration for creating a TestAgent\n */\nexport interface TestAgentConfig {\n /** Tools to provide to the LLM (Tool[] from manager.getTools() or AiSdkTool from manager.getToolsForAiSdk()) */\n tools: Tool[] | AiSdkTool;\n /** LLM provider and model string (e.g., \"openai/gpt-4o\", \"anthropic/claude-3-5-sonnet-20241022\") */\n model: string;\n /** API key for the LLM provider */\n apiKey: string;\n /** System prompt for the LLM (default: \"You are a helpful assistant.\") */\n systemPrompt?: string;\n /** Temperature for LLM responses (0-2). If undefined, uses model default. Some models (e.g., reasoning models) don't support temperature. */\n temperature?: number;\n /** Maximum number of agentic steps/tool calls (default: 10) */\n maxSteps?: number;\n /** Custom providers registry for non-standard LLM providers */\n customProviders?:\n | Map<string, CustomProvider>\n | Record<string, CustomProvider>;\n}\n\n/**\n * Options for the prompt() method\n */\nexport interface PromptOptions {\n /** Previous PromptResult(s) to include as conversation context for multi-turn conversations */\n context?: PromptResult | PromptResult[];\n}\n\n/**\n * Type guard to check if tools is Tool[] (from getTools())\n */\nfunction isToolArray(tools: Tool[] | AiSdkTool): tools is Tool[] {\n return Array.isArray(tools);\n}\n\n/**\n * Converts Tool[] to AI SDK ToolSet format\n */\nfunction convertToToolSet(tools: Tool[]): ToolSet {\n const toolSet: ToolSet = {};\n for (const tool of tools) {\n // Filter out app-only tools (visibility: [\"app\"]) per SEP-1865\n const visibility = (tool._meta?.ui as any)?.visibility as\n | Array<\"model\" | \"app\">\n | undefined;\n if (visibility && visibility.length === 1 && visibility[0] === \"app\") {\n continue;\n }\n\n const converted = dynamicTool({\n description: tool.description,\n inputSchema: jsonSchema(ensureJsonSchemaObject(tool.inputSchema)),\n execute: async (args, options) => {\n options?.abortSignal?.throwIfAborted?.();\n const result = await tool.execute(args as Record<string, unknown>);\n return CallToolResultSchema.parse(result);\n },\n });\n\n // Preserve _serverId like getToolsForAiSdk() does\n if (tool._meta?._serverId) {\n (converted as any)._serverId = tool._meta._serverId;\n }\n\n toolSet[tool.name] = converted;\n }\n return toolSet;\n}\n\n/**\n * Agent for running LLM prompts with tool calling.\n * Wraps the AI SDK generateText function with proper tool integration.\n *\n * @example\n * ```typescript\n * const manager = new MCPClientManager({\n * everything: { command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-everything\"] },\n * });\n * await manager.connectToServer(\"everything\");\n *\n * const agent = new TestAgent({\n * tools: await manager.getToolsForAiSdk([\"everything\"]),\n * model: \"openai/gpt-4o\",\n * apiKey: process.env.OPENAI_API_KEY!,\n * });\n *\n * const result = await agent.prompt(\"Add 2 and 3\");\n * console.log(result.toolsCalled()); // [\"add\"]\n * console.log(result.text); // \"The result of adding 2 and 3 is 5.\"\n * ```\n */\nexport class TestAgent {\n private readonly tools: ToolSet;\n private readonly model: string;\n private readonly apiKey: string;\n private systemPrompt: string;\n private temperature: number | undefined;\n private readonly maxSteps: number;\n private readonly customProviders?:\n | Map<string, CustomProvider>\n | Record<string, CustomProvider>;\n\n /** The result of the last prompt (for toolsCalled() convenience method) */\n private lastResult: PromptResult | undefined;\n\n /** History of all prompt results during a test execution */\n private promptHistory: PromptResult[] = [];\n\n /**\n * Create a new TestAgent\n * @param config - Agent configuration\n */\n constructor(config: TestAgentConfig) {\n // Convert Tool[] to ToolSet if needed\n this.tools = isToolArray(config.tools)\n ? convertToToolSet(config.tools)\n : config.tools;\n this.model = config.model;\n this.apiKey = config.apiKey;\n this.systemPrompt = config.systemPrompt ?? \"You are a helpful assistant.\";\n this.temperature = config.temperature;\n this.maxSteps = config.maxSteps ?? 10;\n this.customProviders = config.customProviders;\n }\n\n /**\n * Create instrumented tools that track execution latency.\n * @param onLatency - Callback to report latency for each tool execution\n * @returns ToolSet with instrumented execute functions\n */\n private createInstrumentedTools(onLatency: (ms: number) => void): ToolSet {\n const instrumented: ToolSet = {};\n for (const [name, tool] of Object.entries(this.tools)) {\n // Only instrument tools that have an execute function\n if (tool.execute) {\n const originalExecute = tool.execute;\n instrumented[name] = {\n ...tool,\n execute: async (args: any, options: any) => {\n const start = Date.now();\n try {\n return await originalExecute(args, options);\n } finally {\n onLatency(Date.now() - start);\n }\n },\n };\n } else {\n // Pass through tools without execute function unchanged\n instrumented[name] = tool;\n }\n }\n return instrumented;\n }\n\n /**\n * Build an array of ModelMessages from previous PromptResult(s) for multi-turn context.\n * @param context - Single PromptResult or array of PromptResults to include as context\n * @returns Array of ModelMessages representing the conversation history\n */\n private buildContextMessages(\n context: PromptResult | PromptResult[] | undefined\n ): ModelMessage[] {\n if (!context) {\n return [];\n }\n\n const results = Array.isArray(context) ? context : [context];\n const messages: ModelMessage[] = [];\n\n for (const result of results) {\n // Get all messages from this prompt result (user message + assistant/tool responses)\n messages.push(...result.getMessages());\n }\n\n return messages;\n }\n\n /**\n * Run a prompt with the LLM, allowing tool calls.\n * Never throws - errors are returned in the PromptResult.\n *\n * @param message - The user message to send to the LLM\n * @param options - Optional settings including context for multi-turn conversations\n * @returns PromptResult with text response, tool calls, token usage, and latency breakdown\n *\n * @example\n * // Single-turn (default)\n * const result = await agent.prompt(\"Show me workspaces\");\n *\n * @example\n * // Multi-turn with context\n * const r1 = await agent.prompt(\"Show me workspaces\");\n * const r2 = await agent.prompt(\"Now show tasks\", { context: r1 });\n *\n * @example\n * // Multi-turn with multiple context results\n * const r1 = await agent.prompt(\"Show workspaces\");\n * const r2 = await agent.prompt(\"Pick the first\", { context: r1 });\n * const r3 = await agent.prompt(\"Show tasks\", { context: [r1, r2] });\n */\n async prompt(\n message: string,\n options?: PromptOptions\n ): Promise<PromptResult> {\n const startTime = Date.now();\n let totalMcpMs = 0;\n let lastStepEndTime = startTime;\n let totalLlmMs = 0;\n let stepMcpMs = 0; // MCP time within current step\n\n try {\n const modelOptions: CreateModelOptions = {\n apiKey: this.apiKey,\n customProviders: this.customProviders,\n };\n const model = createModelFromString(this.model, modelOptions);\n\n // Instrument tools to track MCP execution time\n const instrumentedTools = this.createInstrumentedTools((ms) => {\n totalMcpMs += ms;\n stepMcpMs += ms; // Accumulate per-step for LLM calculation\n });\n\n // Build messages array if context is provided for multi-turn\n const contextMessages = this.buildContextMessages(options?.context);\n const userMessage: UserModelMessage = { role: \"user\", content: message };\n\n // Cast model to any to handle AI SDK version compatibility\n const result = await generateText({\n model: model as any,\n tools: instrumentedTools,\n system: this.systemPrompt,\n // Use messages array for multi-turn, simple prompt for single-turn\n ...(contextMessages.length > 0\n ? { messages: [...contextMessages, userMessage] }\n : { prompt: message }),\n // Only include temperature if explicitly set (some models like reasoning models don't support it)\n ...(this.temperature !== undefined && {\n temperature: this.temperature,\n }),\n // Use stopWhen with stepCountIs for controlling max agentic steps\n // AI SDK v6+ uses this instead of maxSteps\n stopWhen: stepCountIs(this.maxSteps),\n onStepFinish: () => {\n const now = Date.now();\n const stepDuration = now - lastStepEndTime;\n // LLM time for this step = step duration - MCP time in this step\n totalLlmMs += Math.max(0, stepDuration - stepMcpMs);\n lastStepEndTime = now;\n stepMcpMs = 0; // Reset for next step\n },\n });\n\n const e2eMs = Date.now() - startTime;\n const toolCalls = extractToolCalls(result);\n const usage = result.totalUsage ?? result.usage;\n const inputTokens = usage?.inputTokens ?? 0;\n const outputTokens = usage?.outputTokens ?? 0;\n\n const messages: ModelMessage[] = [];\n messages.push(userMessage);\n\n // Add response messages (assistant + tool messages from agentic loop)\n if (result.response?.messages) {\n messages.push(...result.response.messages);\n }\n\n this.lastResult = PromptResult.from({\n prompt: message,\n messages,\n text: result.text,\n toolCalls,\n usage: {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n },\n latency: { e2eMs, llmMs: totalLlmMs, mcpMs: totalMcpMs },\n });\n\n this.promptHistory.push(this.lastResult);\n return this.lastResult;\n } catch (error) {\n const e2eMs = Date.now() - startTime;\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n this.lastResult = PromptResult.error(\n errorMessage,\n {\n e2eMs,\n llmMs: totalLlmMs,\n mcpMs: totalMcpMs,\n },\n message\n );\n this.promptHistory.push(this.lastResult);\n return this.lastResult;\n }\n }\n\n /**\n * Get the names of tools called in the last prompt.\n * Convenience method for quick checks in eval functions.\n *\n * @returns Array of tool names from the last prompt, or empty array if no prompt has been run\n */\n toolsCalled(): string[] {\n if (!this.lastResult) {\n return [];\n }\n return this.lastResult.toolsCalled();\n }\n\n /**\n * Create a new TestAgent with modified options.\n * Useful for creating variants for different test scenarios.\n *\n * @param options - Partial config to override\n * @returns A new TestAgent instance with the merged configuration\n */\n withOptions(options: Partial<TestAgentConfig>): TestAgent {\n return new TestAgent({\n tools: options.tools ?? this.tools,\n model: options.model ?? this.model,\n apiKey: options.apiKey ?? this.apiKey,\n systemPrompt: options.systemPrompt ?? this.systemPrompt,\n temperature: options.temperature ?? this.temperature,\n maxSteps: options.maxSteps ?? this.maxSteps,\n customProviders: options.customProviders ?? this.customProviders,\n });\n }\n\n /**\n * Get the configured tools\n */\n getTools(): ToolSet {\n return this.tools;\n }\n\n /**\n * Get the LLM provider/model string\n */\n getModel(): string {\n return this.model;\n }\n\n /**\n * Get the API key\n */\n getApiKey(): string {\n return this.apiKey;\n }\n\n /**\n * Get the current system prompt\n */\n getSystemPrompt(): string {\n return this.systemPrompt;\n }\n\n /**\n * Set a new system prompt\n */\n setSystemPrompt(prompt: string): void {\n this.systemPrompt = prompt;\n }\n\n /**\n * Get the current temperature (undefined means model default)\n */\n getTemperature(): number | undefined {\n return this.temperature;\n }\n\n /**\n * Set the temperature (must be between 0 and 2)\n */\n setTemperature(temperature: number): void {\n if (temperature < 0 || temperature > 2) {\n throw new Error(\"Temperature must be between 0 and 2\");\n }\n this.temperature = temperature;\n }\n\n /**\n * Get the max steps configuration\n */\n getMaxSteps(): number {\n return this.maxSteps;\n }\n\n /**\n * Get the result of the last prompt\n */\n getLastResult(): PromptResult | undefined {\n return this.lastResult;\n }\n\n /**\n * Reset the prompt history.\n * Call this before each test iteration to clear previous results.\n */\n resetPromptHistory(): void {\n this.promptHistory = [];\n }\n\n /**\n * Get the history of all prompt results since the last reset.\n * Returns a copy of the array to prevent external modification.\n */\n getPromptHistory(): PromptResult[] {\n return [...this.promptHistory];\n }\n}\n","/**\n * Validators for matching tool calls in eval tests\n *\n * All matching is case-sensitive and uses exact strings only (no wildcards).\n */\n\nimport type { ToolCall } from \"./types.js\";\n\n/**\n * Exact match - all expected tools must be present in exact order.\n * Case-sensitive exact string comparison.\n *\n * @param expected - The expected tool names in order\n * @param actual - The actual tool names that were called\n * @returns true if actual matches expected exactly\n *\n * @example\n * matchToolCalls(['add', 'multiply'], ['add', 'multiply']) // true\n * matchToolCalls(['add', 'multiply'], ['multiply', 'add']) // false (wrong order)\n * matchToolCalls(['add'], ['add', 'multiply']) // false (extra tool)\n */\nexport function matchToolCalls(expected: string[], actual: string[]): boolean {\n if (expected.length !== actual.length) {\n return false;\n }\n\n for (let i = 0; i < expected.length; i++) {\n if (expected[i] !== actual[i]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Subset match - all expected tools must be present, order doesn't matter.\n * Case-sensitive exact string comparison.\n *\n * @param expected - The expected tool names (any order)\n * @param actual - The actual tool names that were called\n * @returns true if all expected tools are present in actual\n *\n * @example\n * matchToolCallsSubset(['add', 'multiply'], ['multiply', 'add']) // true\n * matchToolCallsSubset(['add'], ['add', 'multiply']) // true\n * matchToolCallsSubset(['add', 'subtract'], ['add', 'multiply']) // false (missing subtract)\n */\nexport function matchToolCallsSubset(\n expected: string[],\n actual: string[]\n): boolean {\n for (const tool of expected) {\n if (!actual.includes(tool)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Any match - at least one expected tool must be present.\n * Case-sensitive exact string comparison.\n *\n * @param expected - The expected tool names (at least one must match)\n * @param actual - The actual tool names that were called\n * @returns true if at least one expected tool is present in actual\n *\n * @example\n * matchAnyToolCall(['add', 'subtract'], ['multiply', 'add']) // true\n * matchAnyToolCall(['add', 'subtract'], ['multiply', 'divide']) // false\n * matchAnyToolCall([], ['add']) // false (empty expected)\n */\nexport function matchAnyToolCall(\n expected: string[],\n actual: string[]\n): boolean {\n if (expected.length === 0) {\n return false;\n }\n\n for (const tool of expected) {\n if (actual.includes(tool)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Count match - check if a specific tool was called exactly N times.\n * Case-sensitive exact string comparison.\n *\n * @param toolName - The tool name to count\n * @param actual - The actual tool names that were called\n * @param count - The expected number of times the tool should be called\n * @returns true if the tool was called exactly count times\n *\n * @example\n * matchToolCallCount('add', ['add', 'add', 'multiply'], 2) // true\n * matchToolCallCount('add', ['add', 'multiply'], 2) // false\n */\nexport function matchToolCallCount(\n toolName: string,\n actual: string[],\n count: number\n): boolean {\n const actualCount = actual.filter((t) => t === toolName).length;\n return actualCount === count;\n}\n\n/**\n * No tools match - check that no tools were called.\n *\n * @param actual - The actual tool names that were called\n * @returns true if no tools were called\n *\n * @example\n * matchNoToolCalls([]) // true\n * matchNoToolCalls(['add']) // false\n */\nexport function matchNoToolCalls(actual: string[]): boolean {\n return actual.length === 0;\n}\n\n// === Argument-based validators (Phase 2.5) ===\n\n/**\n * Deep equality check that is key-order independent for objects.\n * Handles objects, arrays, and primitives.\n */\nfunction deepEqual(a: unknown, b: unknown): boolean {\n // Handle primitives and null\n if (a === b) {\n return true;\n }\n\n // Handle null/undefined cases\n if (a === null || b === null || a === undefined || b === undefined) {\n return false;\n }\n\n // Handle different types\n if (typeof a !== typeof b) {\n return false;\n }\n\n // Handle arrays\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n\n // Handle array vs non-array mismatch\n if (Array.isArray(a) || Array.isArray(b)) {\n return false;\n }\n\n // Handle objects (key-order independent)\n if (typeof a === \"object\" && typeof b === \"object\") {\n const aKeys = Object.keys(a as Record<string, unknown>);\n const bKeys = Object.keys(b as Record<string, unknown>);\n\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n\n for (const key of aKeys) {\n if (\n !Object.prototype.hasOwnProperty.call(b, key) ||\n !deepEqual(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key]\n )\n ) {\n return false;\n }\n }\n return true;\n }\n\n return false;\n}\n\n/**\n * Check if tool was called with exact arguments (deep equality).\n * Returns true if any call to the tool has exactly matching arguments.\n * Case-sensitive for tool names.\n *\n * @param toolName - The tool name to match\n * @param expectedArgs - The expected arguments (exact match)\n * @param toolCalls - The actual tool calls made\n * @returns true if any call to the tool has exactly matching arguments\n *\n * @example\n * matchToolCallWithArgs('add', {a: 2, b: 3}, toolCalls) // true if add({a:2, b:3}) was called\n * matchToolCallWithArgs('add', {a: 2}, [{toolName:'add', arguments:{a:2, b:3}}]) // false (extra arg)\n */\nexport function matchToolCallWithArgs(\n toolName: string,\n expectedArgs: Record<string, unknown>,\n toolCalls: ToolCall[]\n): boolean {\n for (const call of toolCalls) {\n if (call.toolName === toolName && deepEqual(call.arguments, expectedArgs)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if tool was called with at least these arguments (partial match).\n * Allows extra arguments in the actual call.\n * Case-sensitive for tool names.\n *\n * @param toolName - The tool name to match\n * @param expectedArgs - The expected arguments (partial match)\n * @param toolCalls - The actual tool calls made\n * @returns true if any call to the tool contains all expected arguments\n *\n * @example\n * matchToolCallWithPartialArgs('add', {a: 2}, [{toolName:'add', arguments:{a:2, b:3}}]) // true\n * matchToolCallWithPartialArgs('add', {a: 2, c: 5}, [{toolName:'add', arguments:{a:2, b:3}}]) // false\n */\nexport function matchToolCallWithPartialArgs(\n toolName: string,\n expectedArgs: Record<string, unknown>,\n toolCalls: ToolCall[]\n): boolean {\n for (const call of toolCalls) {\n if (call.toolName !== toolName) {\n continue;\n }\n\n let allMatch = true;\n for (const [key, expectedValue] of Object.entries(expectedArgs)) {\n if (\n !(key in call.arguments) ||\n !deepEqual(call.arguments[key], expectedValue)\n ) {\n allMatch = false;\n break;\n }\n }\n\n if (allMatch) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if a specific argument has a specific value in any call to the tool.\n * Case-sensitive for tool names.\n *\n * @param toolName - The tool name to match\n * @param argKey - The argument key to check\n * @param expectedValue - The expected value for the argument\n * @param toolCalls - The actual tool calls made\n * @returns true if any call to the tool has the specified argument value\n *\n * @example\n * matchToolArgument('add', 'a', 2, toolCalls) // true if any add() call had a=2\n */\nexport function matchToolArgument(\n toolName: string,\n argKey: string,\n expectedValue: unknown,\n toolCalls: ToolCall[]\n): boolean {\n for (const call of toolCalls) {\n if (\n call.toolName === toolName &&\n argKey in call.arguments &&\n deepEqual(call.arguments[argKey], expectedValue)\n ) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if argument value matches a predicate function.\n * Useful for partial matches, type checks, or range validation.\n * Case-sensitive for tool names.\n *\n * @param toolName - The tool name to match\n * @param argKey - The argument key to check\n * @param predicate - Function that tests the argument value\n * @param toolCalls - The actual tool calls made\n * @returns true if any call to the tool has an argument value that passes the predicate\n *\n * @example\n * matchToolArgumentWith('echo', 'message', (v) => typeof v === 'string' && v.includes('hello'), toolCalls)\n * matchToolArgumentWith('add', 'a', (v) => typeof v === 'number' && v > 0, toolCalls)\n */\nexport function matchToolArgumentWith(\n toolName: string,\n argKey: string,\n predicate: (value: unknown) => boolean,\n toolCalls: ToolCall[]\n): boolean {\n for (const call of toolCalls) {\n if (call.toolName === toolName && argKey in call.arguments) {\n if (predicate(call.arguments[argKey])) {\n return true;\n }\n }\n }\n return false;\n}\n","/**\n * Percentile calculation utilities for latency statistics\n */\n\n/**\n * Calculate a specific percentile from sorted values.\n *\n * @param sortedValues - Array of numbers sorted in ascending order\n * @param percentile - The percentile to calculate (0-100)\n * @returns The percentile value\n * @throws Error if array is empty or percentile is out of range\n */\nexport function calculatePercentile(\n sortedValues: number[],\n percentile: number\n): number {\n if (sortedValues.length === 0) {\n throw new Error(\"Cannot calculate percentile of empty array\");\n }\n if (percentile < 0 || percentile > 100) {\n throw new Error(\"Percentile must be between 0 and 100\");\n }\n\n const index = (percentile / 100) * (sortedValues.length - 1);\n const lowerIndex = Math.floor(index);\n const upperIndex = Math.ceil(index);\n\n if (lowerIndex === upperIndex) {\n return sortedValues[lowerIndex];\n }\n\n // Linear interpolation between the two values\n const weight = index - lowerIndex;\n return (\n sortedValues[lowerIndex] * (1 - weight) + sortedValues[upperIndex] * weight\n );\n}\n\n/**\n * Statistics for latency values\n */\nexport interface LatencyStats {\n /** Minimum value */\n min: number;\n /** Maximum value */\n max: number;\n /** Mean (average) value */\n mean: number;\n /** 50th percentile (median) */\n p50: number;\n /** 95th percentile */\n p95: number;\n /** Number of values */\n count: number;\n}\n\n/**\n * Calculate comprehensive latency statistics for a set of values.\n *\n * @param values - Array of latency values (milliseconds)\n * @returns LatencyStats object with min, max, mean, p50, p95, and count\n * @throws Error if array is empty\n */\nexport function calculateLatencyStats(values: number[]): LatencyStats {\n if (values.length === 0) {\n throw new Error(\"Cannot calculate stats of empty array\");\n }\n\n const sorted = [...values].sort((a, b) => a - b);\n const sum = values.reduce((acc, val) => acc + val, 0);\n\n return {\n min: sorted[0],\n max: sorted[sorted.length - 1],\n mean: sum / values.length,\n p50: calculatePercentile(sorted, 50),\n p95: calculatePercentile(sorted, 95),\n count: values.length,\n };\n}\n","import type { TestAgent } from \"./TestAgent.js\";\nimport type { PromptResult } from \"./PromptResult.js\";\nimport type { LatencyBreakdown } from \"./types.js\";\nimport { calculateLatencyStats, type LatencyStats } from \"./percentiles.js\";\n\n/**\n * Configuration for an EvalTest\n *\n * All tests use the multi-turn pattern with a test function that receives a TestAgent.\n */\nexport interface EvalTestConfig {\n name: string;\n test: (agent: TestAgent) => boolean | Promise<boolean>;\n}\n\n/**\n * Options for running an EvalTest\n */\nexport interface EvalTestRunOptions {\n iterations: number;\n concurrency?: number; // default: 5\n retries?: number; // default: 0\n timeoutMs?: number; // default: 30000\n onProgress?: (completed: number, total: number) => void;\n /** Called with a failure report if any iterations fail */\n onFailure?: (report: string) => void;\n}\n\n/**\n * Result details for a single iteration\n */\nexport interface IterationResult {\n passed: boolean;\n latencies: LatencyBreakdown[];\n tokens: { total: number; input: number; output: number };\n error?: string;\n retryCount?: number;\n /** The prompt results from this iteration */\n prompts?: PromptResult[];\n}\n\n/**\n * Result of running an EvalTest\n */\nexport interface EvalRunResult {\n iterations: number;\n successes: number;\n failures: number;\n results: boolean[];\n iterationDetails: IterationResult[];\n tokenUsage: {\n total: number;\n input: number;\n output: number;\n perIteration: { total: number; input: number; output: number }[];\n };\n latency: {\n e2e: LatencyStats;\n llm: LatencyStats;\n mcp: LatencyStats;\n perIteration: LatencyBreakdown[];\n };\n}\n\n/**\n * Semaphore for controlling concurrency\n */\nclass Semaphore {\n private permits: number;\n private waiting: (() => void)[] = [];\n\n constructor(permits: number) {\n this.permits = permits;\n }\n\n async acquire(): Promise<void> {\n if (this.permits > 0) {\n this.permits--;\n return;\n }\n await new Promise<void>((resolve) => this.waiting.push(resolve));\n }\n\n release(): void {\n const next = this.waiting.shift();\n if (next) {\n next();\n } else {\n this.permits++;\n }\n }\n}\n\n/**\n * Timeout wrapper for promises\n */\nfunction withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`Operation timed out after ${ms}ms`));\n }, ms);\n\n promise\n .then((value) => {\n clearTimeout(timer);\n resolve(value);\n })\n .catch((error) => {\n clearTimeout(timer);\n reject(error);\n });\n });\n}\n\n/**\n * Sleep for a given number of milliseconds\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * EvalTest - Runs a single test scenario with iterations\n *\n * Can be run standalone or as part of an EvalSuite.\n *\n * @example\n * ```ts\n * const test = new EvalTest({\n * name: \"addition\",\n * test: async (agent) => {\n * const result = await agent.prompt(\"Add 2+3\");\n * return result.hasToolCall(\"add\");\n * },\n * });\n * await test.run(agent, { iterations: 30 });\n * console.log(test.accuracy()); // 0.97\n * ```\n */\nexport class EvalTest {\n private config: EvalTestConfig;\n private lastRunResult: EvalRunResult | null = null;\n\n constructor(config: EvalTestConfig) {\n if (!config.test) {\n throw new Error(\"Invalid config: must provide 'test' function\");\n }\n this.config = config;\n }\n\n /**\n * Run this test with the given agent and options\n */\n async run(\n agent: TestAgent,\n options: EvalTestRunOptions\n ): Promise<EvalRunResult> {\n const concurrency = options.concurrency ?? 5;\n const retries = options.retries ?? 0;\n const timeoutMs = options.timeoutMs ?? 30000;\n const onProgress = options.onProgress;\n\n const semaphore = new Semaphore(concurrency);\n let completedCount = 0;\n\n const testFn = this.config.test;\n const iterationResults: IterationResult[] = [];\n const total = options.iterations;\n\n const runSingleIteration = async (): Promise<IterationResult> => {\n await semaphore.acquire();\n try {\n let lastError: string | undefined;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n // Create a fresh agent clone for this iteration to avoid race conditions\n // when multiple iterations run concurrently\n const iterationAgent = agent.withOptions({});\n\n const passed = await withTimeout(\n Promise.resolve(testFn(iterationAgent)),\n timeoutMs\n );\n\n // Get metrics from this iteration's prompt history\n const promptResults = iterationAgent.getPromptHistory();\n const latencies = promptResults.map((r) => r.getLatency());\n const tokens = {\n total: promptResults.reduce((sum, r) => sum + r.totalTokens(), 0),\n input: promptResults.reduce((sum, r) => sum + r.inputTokens(), 0),\n output: promptResults.reduce(\n (sum, r) => sum + r.outputTokens(),\n 0\n ),\n };\n\n return {\n passed,\n latencies:\n latencies.length > 0\n ? latencies\n : [{ e2eMs: 0, llmMs: 0, mcpMs: 0 }],\n tokens,\n retryCount: attempt,\n prompts: promptResults,\n };\n } catch (error) {\n lastError = error instanceof Error ? error.message : String(error);\n\n if (attempt < retries) {\n await sleep(100 * Math.pow(2, attempt));\n }\n }\n }\n\n return {\n passed: false,\n latencies: [{ e2eMs: 0, llmMs: 0, mcpMs: 0 }],\n tokens: { total: 0, input: 0, output: 0 },\n error: lastError,\n retryCount: retries,\n };\n } finally {\n semaphore.release();\n const completed = ++completedCount;\n if (onProgress) {\n onProgress(completed, total);\n }\n }\n };\n\n const promises = Array.from({ length: options.iterations }, () =>\n runSingleIteration()\n );\n const results = await Promise.all(promises);\n iterationResults.push(...results);\n\n const runResult = this.aggregateResults(iterationResults);\n\n // Call onFailure callback if there are any failures\n if (options.onFailure && runResult.failures > 0) {\n options.onFailure(this.getFailureReport());\n }\n\n return runResult;\n }\n\n private aggregateResults(iterations: IterationResult[]): EvalRunResult {\n const allLatencies = iterations.flatMap((r) => r.latencies);\n\n // Handle empty latencies array\n const defaultStats: LatencyStats = {\n min: 0,\n max: 0,\n mean: 0,\n p50: 0,\n p95: 0,\n count: 0,\n };\n\n const e2eValues = allLatencies.map((l) => l.e2eMs);\n const llmValues = allLatencies.map((l) => l.llmMs);\n const mcpValues = allLatencies.map((l) => l.mcpMs);\n\n const successes = iterations.filter((r) => r.passed).length;\n const failures = iterations.filter((r) => !r.passed).length;\n\n this.lastRunResult = {\n iterations: iterations.length,\n successes,\n failures,\n results: iterations.map((r) => r.passed),\n iterationDetails: iterations,\n tokenUsage: {\n total: iterations.reduce((sum, r) => sum + r.tokens.total, 0),\n input: iterations.reduce((sum, r) => sum + r.tokens.input, 0),\n output: iterations.reduce((sum, r) => sum + r.tokens.output, 0),\n perIteration: iterations.map((r) => r.tokens),\n },\n latency: {\n e2e:\n e2eValues.length > 0\n ? calculateLatencyStats(e2eValues)\n : defaultStats,\n llm:\n llmValues.length > 0\n ? calculateLatencyStats(llmValues)\n : defaultStats,\n mcp:\n mcpValues.length > 0\n ? calculateLatencyStats(mcpValues)\n : defaultStats,\n perIteration: allLatencies,\n },\n };\n\n return this.lastRunResult;\n }\n\n /**\n * Get the accuracy of the last run (success rate)\n */\n accuracy(): number {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n return this.lastRunResult.successes / this.lastRunResult.iterations;\n }\n\n /**\n * Get the recall (true positive rate) of the last run\n */\n recall(): number {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n // In a basic eval context, recall equals accuracy\n return this.accuracy();\n }\n\n /**\n * Get the precision of the last run\n */\n precision(): number {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n // In a basic eval context, precision equals accuracy\n return this.accuracy();\n }\n\n /**\n * Get the true positive rate (same as recall)\n */\n truePositiveRate(): number {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n return this.recall();\n }\n\n /**\n * Get the false positive rate\n */\n falsePositiveRate(): number {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n return this.lastRunResult.failures / this.lastRunResult.iterations;\n }\n\n /**\n * Get the average token use per iteration\n */\n averageTokenUse(): number {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n if (this.lastRunResult.iterations === 0) {\n return 0;\n }\n return this.lastRunResult.tokenUsage.total / this.lastRunResult.iterations;\n }\n\n /**\n * Get the full results of the last run\n */\n getResults(): EvalRunResult | null {\n return this.lastRunResult;\n }\n\n /**\n * Get the name of this test\n */\n getName(): string {\n return this.config.name;\n }\n\n /**\n * Get the configuration of this test\n */\n getConfig(): EvalTestConfig {\n return this.config;\n }\n\n /**\n * Get all iteration details from the last run\n */\n getAllIterations(): IterationResult[] {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n return [...this.lastRunResult.iterationDetails];\n }\n\n /**\n * Get only the failed iterations from the last run\n */\n getFailedIterations(): IterationResult[] {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n return this.lastRunResult.iterationDetails.filter((r) => !r.passed);\n }\n\n /**\n * Get only the successful iterations from the last run\n */\n getSuccessfulIterations(): IterationResult[] {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n return this.lastRunResult.iterationDetails.filter((r) => r.passed);\n }\n\n /**\n * Get a failure report with traces from all failed iterations.\n * Useful for debugging why evaluations failed.\n *\n * @returns A formatted string with failure details\n */\n getFailureReport(): string {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n\n const failedIterations = this.getFailedIterations();\n if (failedIterations.length === 0) {\n return \"No failures.\";\n }\n\n const reports = failedIterations.map((iteration, index) => {\n const header = `=== Failed Iteration ${index + 1}/${failedIterations.length} ===`;\n const error = iteration.error ? `Error: ${iteration.error}` : \"\";\n const traces = (iteration.prompts ?? [])\n .map((p, i) => `--- Prompt ${i + 1} ---\\n${p.formatTrace()}`)\n .join(\"\\n\\n\");\n\n return [header, error, traces].filter(Boolean).join(\"\\n\");\n });\n\n return reports.join(\"\\n\\n\");\n }\n}\n","import type { TestAgent } from \"./TestAgent.js\";\nimport type { LatencyBreakdown } from \"./types.js\";\nimport { calculateLatencyStats, type LatencyStats } from \"./percentiles.js\";\nimport type {\n EvalTest,\n EvalTestRunOptions,\n EvalRunResult,\n IterationResult,\n} from \"./EvalTest.js\";\n\n/**\n * Configuration for an EvalSuite\n */\nexport interface EvalSuiteConfig {\n name?: string;\n}\n\n/**\n * Result for a single test within the suite\n */\nexport interface TestResult {\n name: string;\n result: EvalRunResult;\n}\n\n/**\n * Result of running an EvalSuite\n */\nexport interface EvalSuiteResult {\n tests: Map<string, EvalRunResult>;\n aggregate: {\n iterations: number;\n successes: number;\n failures: number;\n accuracy: number;\n tokenUsage: {\n total: number;\n perTest: number[];\n };\n latency: {\n e2e: LatencyStats;\n llm: LatencyStats;\n mcp: LatencyStats;\n };\n };\n}\n\n/**\n * EvalSuite - Groups multiple EvalTests and provides aggregate metrics\n *\n * @example\n * ```ts\n * const suite = new EvalSuite({ name: \"Math\" });\n * suite.add(new EvalTest({\n * name: \"addition\",\n * test: async (agent) => {\n * const r = await agent.prompt(\"Add 2+3\");\n * return r.hasToolCall(\"add\");\n * },\n * }));\n * suite.add(new EvalTest({\n * name: \"multiply\",\n * test: async (agent) => {\n * const r = await agent.prompt(\"Multiply 4*5\");\n * return r.hasToolCall(\"multiply\");\n * },\n * }));\n *\n * await suite.run(agent, { iterations: 30 });\n * console.log(suite.accuracy()); // Aggregate: 0.95\n * console.log(suite.get(\"addition\").accuracy()); // Individual: 0.97\n * ```\n */\nexport class EvalSuite {\n private name: string;\n private tests: Map<string, EvalTest> = new Map();\n private lastRunResult: EvalSuiteResult | null = null;\n\n constructor(config?: EvalSuiteConfig) {\n this.name = config?.name ?? \"EvalSuite\";\n }\n\n /**\n * Add a test to the suite\n */\n add(test: EvalTest): void {\n const name = test.getName();\n if (this.tests.has(name)) {\n throw new Error(`Test with name \"${name}\" already exists in suite`);\n }\n this.tests.set(name, test);\n }\n\n /**\n * Get a test by name\n */\n get(name: string): EvalTest | undefined {\n return this.tests.get(name);\n }\n\n /**\n * Get all tests in the suite\n */\n getAll(): EvalTest[] {\n return Array.from(this.tests.values());\n }\n\n /**\n * Run all tests in the suite with the given agent and options\n */\n async run(\n agent: TestAgent,\n options: EvalTestRunOptions\n ): Promise<EvalSuiteResult> {\n const testResults = new Map<string, EvalRunResult>();\n\n // Track total progress across all tests\n const totalIterations = this.tests.size * options.iterations;\n let completedIterations = 0;\n\n // Run each test sequentially to avoid overwhelming the system\n for (const [name, test] of this.tests) {\n const testOptions: EvalTestRunOptions = {\n ...options,\n onProgress: options.onProgress\n ? (completed, _total) => {\n // Calculate overall progress\n const overallCompleted = completedIterations + completed;\n options.onProgress!(overallCompleted, totalIterations);\n }\n : undefined,\n };\n\n const result = await test.run(agent, testOptions);\n testResults.set(name, result);\n completedIterations += options.iterations;\n }\n\n // Aggregate results\n this.lastRunResult = this.aggregateResults(testResults);\n return this.lastRunResult;\n }\n\n private aggregateResults(\n testResults: Map<string, EvalRunResult>\n ): EvalSuiteResult {\n const results = Array.from(testResults.values());\n\n // Aggregate iterations\n const allIterations: IterationResult[] = results.flatMap(\n (r) => r.iterationDetails\n );\n const totalIterations = allIterations.length;\n const totalSuccesses = allIterations.filter((r) => r.passed).length;\n const totalFailures = totalIterations - totalSuccesses;\n\n // Aggregate latencies\n const allLatencies: LatencyBreakdown[] = results.flatMap(\n (r) => r.latency.perIteration\n );\n\n const defaultStats: LatencyStats = {\n min: 0,\n max: 0,\n mean: 0,\n p50: 0,\n p95: 0,\n count: 0,\n };\n\n const e2eValues = allLatencies.map((l) => l.e2eMs);\n const llmValues = allLatencies.map((l) => l.llmMs);\n const mcpValues = allLatencies.map((l) => l.mcpMs);\n\n // Token usage\n const totalTokens = results.reduce((sum, r) => sum + r.tokenUsage.total, 0);\n const perTestTokens = results.map((r) => r.tokenUsage.total);\n\n return {\n tests: testResults,\n aggregate: {\n iterations: totalIterations,\n successes: totalSuccesses,\n failures: totalFailures,\n accuracy: totalIterations > 0 ? totalSuccesses / totalIterations : 0,\n tokenUsage: {\n total: totalTokens,\n perTest: perTestTokens,\n },\n latency: {\n e2e:\n e2eValues.length > 0\n ? calculateLatencyStats(e2eValues)\n : defaultStats,\n llm:\n llmValues.length > 0\n ? calculateLatencyStats(llmValues)\n : defaultStats,\n mcp:\n mcpValues.length > 0\n ? calculateLatencyStats(mcpValues)\n : defaultStats,\n },\n },\n };\n }\n\n /**\n * Get the aggregate accuracy across all tests\n */\n accuracy(): number {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n return this.lastRunResult.aggregate.accuracy;\n }\n\n /**\n * Get the aggregate recall (same as accuracy in basic context)\n */\n recall(): number {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n return this.accuracy();\n }\n\n /**\n * Get the aggregate precision (same as accuracy in basic context)\n */\n precision(): number {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n return this.accuracy();\n }\n\n /**\n * Get the aggregate true positive rate (same as recall)\n */\n truePositiveRate(): number {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n return this.recall();\n }\n\n /**\n * Get the aggregate false positive rate\n */\n falsePositiveRate(): number {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n const { failures, iterations } = this.lastRunResult.aggregate;\n return iterations > 0 ? failures / iterations : 0;\n }\n\n /**\n * Get the average token use per iteration across all tests\n */\n averageTokenUse(): number {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n const { total } = this.lastRunResult.aggregate.tokenUsage;\n const { iterations } = this.lastRunResult.aggregate;\n return iterations > 0 ? total / iterations : 0;\n }\n\n /**\n * Get the full suite results\n */\n getResults(): EvalSuiteResult | null {\n return this.lastRunResult;\n }\n\n /**\n * Get the name of the suite\n */\n getName(): string {\n return this.name;\n }\n\n /**\n * Get the number of tests in the suite\n */\n size(): number {\n return this.tests.size;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/mcp-client-manager/constants.ts","../src/mcp-client-manager/error-utils.ts","../src/mcp-client-manager/errors.ts","../src/mcp-client-manager/transport-utils.ts","../src/mcp-client-manager/notification-handlers.ts","../src/mcp-client-manager/elicitation.ts","../src/mcp-client-manager/tasks.ts","../src/mcp-client-manager/tool-converters.ts","../src/mcp-client-manager/MCPClientManager.ts","../src/model-factory.ts","../src/tool-extraction.ts","../src/PromptResult.ts","../src/TestAgent.ts","../src/validators.ts","../src/percentiles.ts","../src/telemetry.ts","../src/EvalTest.ts","../src/EvalSuite.ts"],"names":["DEFAULT_REQUEST_TIMEOUT_MSEC","ProgressNotificationSchema","ElicitRequestSchema","z","CallToolResultSchema","dynamicTool","jsonSchema","defineTool","CreateTaskResultSchema","StreamableHTTPClientTransport","ResourceListChangedNotificationSchema","ResourceUpdatedNotificationSchema","PromptListChangedNotificationSchema","Client","StdioClientTransport","getDefaultEnvironment","SSEClientTransport","openai","createOpenAI","anthropic","createAnthropic","deepseek","createDeepSeek","google","createGoogleGenerativeAI","createOllama","mistral","createMistral","createOpenRouter","xai","createXai","azure","createAzure","generateText","stepCountIs","PostHog"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Default values and constants for MCPClientManager\n */\n\nimport { DEFAULT_REQUEST_TIMEOUT_MSEC } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\n\n/** Default client version to report to servers */\nexport const DEFAULT_CLIENT_VERSION = \"1.0.0\";\n\n/** Default request timeout (from MCP SDK) */\nexport const DEFAULT_TIMEOUT = DEFAULT_REQUEST_TIMEOUT_MSEC;\n\n/** Timeout for initial HTTP transport attempt before falling back to SSE */\nexport const HTTP_CONNECT_TIMEOUT = 3000;\n","/**\n * Error handling utilities for MCPClientManager\n */\n\n/**\n * Checks if an error indicates that a method is not available/implemented by the server.\n * Used for graceful degradation when servers don't support certain MCP features.\n *\n * @param error - The error to check\n * @param method - The MCP method name (e.g., \"tools/list\", \"resources/list\")\n * @returns True if the error indicates the method is unavailable\n */\nexport function isMethodUnavailableError(\n error: unknown,\n method: string\n): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const message = error.message.toLowerCase();\n\n // Build set of tokens from the method name\n const methodTokens = new Set<string>();\n methodTokens.add(method.toLowerCase());\n for (const part of method.split(/[/:._-]/)) {\n if (part) {\n methodTokens.add(part.toLowerCase());\n }\n }\n\n // Common error indicators for unavailable methods\n const indicators = [\n \"method not found\",\n \"not implemented\",\n \"unsupported\",\n \"does not support\",\n \"unimplemented\",\n ];\n\n const indicatorMatch = indicators.some((indicator) =>\n message.includes(indicator)\n );\n\n if (!indicatorMatch) {\n return false;\n }\n\n // Check if error mentions the method (or just assume it does if indicator matched)\n if (Array.from(methodTokens).some((token) => message.includes(token))) {\n return true;\n }\n\n // If we got an indicator match, assume it's about this method\n return true;\n}\n\n/**\n * Formats an error for display in error messages.\n *\n * @param error - The error to format\n * @returns A string representation of the error\n */\nexport function formatError(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n}\n","/**\n * Custom error classes for MCP SDK\n */\n\n/**\n * Base error class for all MCP SDK errors\n */\nexport class MCPError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n options?: { cause?: unknown }\n ) {\n super(message, options);\n this.name = \"MCPError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Authentication error - thrown for 401, token expired, invalid token, etc.\n */\nexport class MCPAuthError extends MCPError {\n constructor(\n message: string,\n public readonly statusCode?: number,\n options?: { cause?: unknown }\n ) {\n super(message, \"AUTH_ERROR\", options);\n this.name = \"MCPAuthError\";\n }\n}\n\n/**\n * Type guard to check if an error is an MCPAuthError\n */\nexport function isMCPAuthError(error: unknown): error is MCPAuthError {\n return error instanceof MCPAuthError;\n}\n\n/**\n * Type guard for errors with a numeric code property (like StreamableHTTPError, SseError)\n */\nfunction hasNumericCode(error: unknown): error is Error & { code: number } {\n return (\n error instanceof Error &&\n \"code\" in error &&\n typeof (error as { code: unknown }).code === \"number\"\n );\n}\n\n/**\n * Checks if an error is an authentication-related error.\n * Detects auth errors by:\n * 1. Error class name (UnauthorizedError from MCP SDK)\n * 2. HTTP status codes (401, 403) from transport errors\n * 3. Common auth-related patterns in error messages (case-insensitive)\n */\nexport function isAuthError(error: unknown): {\n isAuth: boolean;\n statusCode?: number;\n} {\n if (!(error instanceof Error)) {\n return { isAuth: false };\n }\n\n // Check for MCP SDK's UnauthorizedError by class name\n // (We check by name to avoid importing from @modelcontextprotocol/sdk)\n if (error.name === \"UnauthorizedError\") {\n return { isAuth: true, statusCode: 401 };\n }\n\n // Check for our own MCPAuthError by name\n if (error.name === \"MCPAuthError\") {\n const statusCode =\n \"statusCode\" in error && typeof error.statusCode === \"number\"\n ? error.statusCode\n : undefined;\n return { isAuth: true, statusCode };\n }\n\n // Check for transport errors with HTTP status codes (StreamableHTTPError, SseError)\n if (hasNumericCode(error)) {\n const code = error.code;\n if (code === 401 || code === 403) {\n return { isAuth: true, statusCode: code };\n }\n }\n\n // Fall back to message pattern matching (case-insensitive)\n const message = error.message.toLowerCase();\n const authPatterns = [\n \"unauthorized\",\n \"invalid_token\",\n \"invalid token\",\n \"token expired\",\n \"token has expired\",\n \"access denied\",\n \"authentication failed\",\n \"authentication required\",\n \"not authenticated\",\n \"forbidden\",\n ];\n\n if (authPatterns.some((pattern) => message.includes(pattern))) {\n return { isAuth: true };\n }\n\n // Check for HTTP status codes in error messages (e.g., \"HTTP 401\" or \"status: 401\")\n const statusMatch = message.match(/\\b(status[:\\s]*)?401\\b|\\bhttp\\s*401\\b/i);\n if (statusMatch) {\n return { isAuth: true, statusCode: 401 };\n }\n\n const forbiddenMatch = message.match(\n /\\b(status[:\\s]*)?403\\b|\\bhttp\\s*403\\b/i\n );\n if (forbiddenMatch) {\n return { isAuth: true, statusCode: 403 };\n }\n\n return { isAuth: false };\n}\n","/**\n * Transport utilities for MCPClientManager\n */\n\nimport type { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport type { TransportSendOptions } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport type {\n JSONRPCMessage,\n MessageExtraInfo,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { StreamableHTTPClientTransportOptions } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport type { RpcLogger } from \"./types.js\";\n\n/**\n * Normalizes headers from various formats (Headers, string[][], or plain object)\n * into a plain Record<string, string>.\n *\n * @param headers - Headers in any supported format\n * @returns Plain object with header key-value pairs\n */\nfunction normalizeHeaders(\n headers: HeadersInit | undefined\n): Record<string, string> {\n if (!headers) {\n return {};\n }\n\n // If it's already a plain object (not Headers or array), return as-is\n if (\n typeof headers === \"object\" &&\n !Array.isArray(headers) &&\n !(headers instanceof Headers)\n ) {\n return headers as Record<string, string>;\n }\n\n // Convert Headers or string[][] to a plain object\n const normalized: Record<string, string> = {};\n const headersObj = new Headers(headers);\n headersObj.forEach((value, key) => {\n normalized[key] = value;\n });\n return normalized;\n}\n\n/**\n * Checks if headers contain an Authorization header (case-insensitive check).\n *\n * @param headers - Normalized headers object\n * @returns The Authorization value if present, undefined otherwise\n */\nfunction getExistingAuthorization(\n headers: Record<string, string>\n): string | undefined {\n return headers[\"Authorization\"] ?? headers[\"authorization\"];\n}\n\n/**\n * Builds the requestInit object, merging accessToken into Authorization header if provided.\n *\n * @param accessToken - Optional access token for Bearer auth\n * @param requestInit - Optional existing requestInit config\n * @returns Merged requestInit with Authorization header if accessToken provided\n */\nexport function buildRequestInit(\n accessToken: string | undefined,\n requestInit: StreamableHTTPClientTransportOptions[\"requestInit\"]\n): StreamableHTTPClientTransportOptions[\"requestInit\"] {\n if (!accessToken) {\n return requestInit;\n }\n\n const existingHeaders = normalizeHeaders(requestInit?.headers);\n const existingAuth = getExistingAuthorization(existingHeaders);\n\n // Remove any lowercase 'authorization' key to avoid duplicate headers\n const { authorization: _, ...headersWithoutLowercaseAuth } = existingHeaders;\n\n return {\n ...requestInit,\n headers: {\n Authorization: existingAuth ?? `Bearer ${accessToken}`,\n ...headersWithoutLowercaseAuth,\n },\n };\n}\n\n/**\n * Creates a logging wrapper transport that logs JSON-RPC traffic.\n *\n * @param serverId - The server ID for logging context\n * @param logger - The RPC logger function\n * @param transport - The underlying transport to wrap\n * @returns A new transport that logs all messages\n */\nexport function wrapTransportForLogging(\n serverId: string,\n logger: RpcLogger,\n transport: Transport\n): Transport {\n class LoggingTransport implements Transport {\n onclose?: () => void;\n onerror?: (error: Error) => void;\n onmessage?: (message: JSONRPCMessage, extra?: MessageExtraInfo) => void;\n\n constructor(private readonly inner: Transport) {\n this.inner.onmessage = (\n message: JSONRPCMessage,\n extra?: MessageExtraInfo\n ) => {\n try {\n logger({ direction: \"receive\", message, serverId });\n } catch {\n // Ignore logger errors\n }\n this.onmessage?.(message, extra);\n };\n this.inner.onclose = () => {\n this.onclose?.();\n };\n this.inner.onerror = (error: Error) => {\n this.onerror?.(error);\n };\n }\n\n async start(): Promise<void> {\n if (typeof (this.inner as any).start === \"function\") {\n await (this.inner as any).start();\n }\n }\n\n async send(\n message: JSONRPCMessage,\n options?: TransportSendOptions\n ): Promise<void> {\n try {\n logger({ direction: \"send\", message, serverId });\n } catch {\n // Ignore logger errors\n }\n await this.inner.send(message as any, options as any);\n }\n\n async close(): Promise<void> {\n await this.inner.close();\n }\n\n get sessionId(): string | undefined {\n return (this.inner as any).sessionId;\n }\n\n setProtocolVersion?(version: string): void {\n if (typeof this.inner.setProtocolVersion === \"function\") {\n this.inner.setProtocolVersion(version);\n }\n }\n }\n\n return new LoggingTransport(transport);\n}\n\n/**\n * Creates a default console logger for JSON-RPC traffic.\n *\n * @returns A logger function that outputs to console.debug\n */\nexport function createDefaultRpcLogger(): RpcLogger {\n return ({ direction, message, serverId }) => {\n let printable: string;\n try {\n printable =\n typeof message === \"string\" ? message : JSON.stringify(message);\n } catch {\n printable = String(message);\n }\n\n console.debug(`[MCP:${serverId}] ${direction.toUpperCase()} ${printable}`);\n };\n}\n","/**\n * Notification handler management for MCPClientManager\n */\n\nimport type { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport {\n ResourceListChangedNotificationSchema,\n ResourceUpdatedNotificationSchema,\n PromptListChangedNotificationSchema,\n ProgressNotificationSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ProgressHandler } from \"./types.js\";\n\n// Type aliases for notification handling\ntype NotificationSchema = Parameters<Client[\"setNotificationHandler\"]>[0];\ntype NotificationHandler = Parameters<Client[\"setNotificationHandler\"]>[1];\n\n// Re-export notification schemas for convenience\nexport {\n ResourceListChangedNotificationSchema,\n ResourceUpdatedNotificationSchema,\n PromptListChangedNotificationSchema,\n ProgressNotificationSchema,\n};\n\nexport type { NotificationSchema, NotificationHandler };\n\n/**\n * Manages notification handlers for multiple MCP servers.\n * Allows registering multiple handlers per server and schema.\n */\nexport class NotificationManager {\n private handlers = new Map<\n string,\n Map<NotificationSchema, Set<NotificationHandler>>\n >();\n\n /**\n * Adds a notification handler for a specific server and schema.\n *\n * @param serverId - The server ID\n * @param schema - The notification schema to handle\n * @param handler - The handler function\n */\n addHandler(\n serverId: string,\n schema: NotificationSchema,\n handler: NotificationHandler\n ): void {\n const serverHandlers = this.handlers.get(serverId) ?? new Map();\n const handlersForSchema =\n serverHandlers.get(schema) ?? new Set<NotificationHandler>();\n handlersForSchema.add(handler);\n serverHandlers.set(schema, handlersForSchema);\n this.handlers.set(serverId, serverHandlers);\n }\n\n /**\n * Creates a dispatcher function that invokes all handlers for a schema.\n *\n * @param serverId - The server ID\n * @param schema - The notification schema\n * @returns A handler that dispatches to all registered handlers\n */\n createDispatcher(\n serverId: string,\n schema: NotificationSchema\n ): NotificationHandler {\n return (notification) => {\n const serverHandlers = this.handlers.get(serverId);\n const handlersForSchema = serverHandlers?.get(schema);\n if (!handlersForSchema || handlersForSchema.size === 0) {\n return;\n }\n\n for (const handler of handlersForSchema) {\n try {\n handler(notification);\n } catch {\n // Swallow individual handler errors to avoid breaking other listeners\n }\n }\n };\n }\n\n /**\n * Applies all registered handlers to a client.\n *\n * @param serverId - The server ID\n * @param client - The MCP client to configure\n */\n applyToClient(serverId: string, client: Client): void {\n const serverHandlers = this.handlers.get(serverId);\n if (!serverHandlers) {\n return;\n }\n\n for (const [schema] of serverHandlers) {\n client.setNotificationHandler(\n schema,\n this.createDispatcher(serverId, schema)\n );\n }\n }\n\n /**\n * Clears all handlers for a server.\n *\n * @param serverId - The server ID to clear\n */\n clearServer(serverId: string): void {\n this.handlers.delete(serverId);\n }\n\n /**\n * Gets handler schemas registered for a server.\n *\n * @param serverId - The server ID\n * @returns Array of registered notification schemas\n */\n getSchemas(serverId: string): NotificationSchema[] {\n const serverHandlers = this.handlers.get(serverId);\n return serverHandlers ? Array.from(serverHandlers.keys()) : [];\n }\n}\n\n/**\n * Sets up progress notification handler on a client.\n *\n * @param serverId - The server ID for context\n * @param client - The MCP client\n * @param progressHandler - The progress handler function\n */\nexport function applyProgressHandler(\n serverId: string,\n client: Client,\n progressHandler: ProgressHandler\n): void {\n client.setNotificationHandler(ProgressNotificationSchema, (notification) => {\n const params = notification.params;\n progressHandler({\n serverId,\n progressToken: params.progressToken,\n progress: params.progress,\n total: params.total,\n message: params.message,\n });\n });\n}\n","/**\n * Elicitation handler management for MCPClientManager\n */\n\nimport type { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { ElicitRequestSchema } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ElicitResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ElicitationHandler, ElicitationCallback } from \"./types.js\";\n\n// Re-export the schema for convenience\nexport { ElicitRequestSchema };\n\n/**\n * Manages elicitation handlers and callbacks for MCP servers.\n * Supports both server-specific handlers and a global callback.\n */\nexport class ElicitationManager {\n private handlers = new Map<string, ElicitationHandler>();\n private globalCallback?: ElicitationCallback;\n private pendingElicitations = new Map<\n string,\n {\n resolve: (value: ElicitResult) => void;\n reject: (error: unknown) => void;\n }\n >();\n\n /**\n * Sets a server-specific elicitation handler.\n *\n * @param serverId - The server ID\n * @param handler - The elicitation handler\n */\n setHandler(serverId: string, handler: ElicitationHandler): void {\n this.handlers.set(serverId, handler);\n }\n\n /**\n * Clears a server-specific handler.\n *\n * @param serverId - The server ID\n */\n clearHandler(serverId: string): void {\n this.handlers.delete(serverId);\n }\n\n /**\n * Gets a server-specific handler.\n *\n * @param serverId - The server ID\n * @returns The handler if set, undefined otherwise\n */\n getHandler(serverId: string): ElicitationHandler | undefined {\n return this.handlers.get(serverId);\n }\n\n /**\n * Sets the global elicitation callback.\n *\n * @param callback - The callback function\n */\n setGlobalCallback(callback: ElicitationCallback): void {\n this.globalCallback = callback;\n }\n\n /**\n * Clears the global callback.\n */\n clearGlobalCallback(): void {\n this.globalCallback = undefined;\n }\n\n /**\n * Gets the global callback.\n *\n * @returns The callback if set, undefined otherwise\n */\n getGlobalCallback(): ElicitationCallback | undefined {\n return this.globalCallback;\n }\n\n /**\n * Gets the pending elicitations map.\n * Useful for external code that needs to add resolvers.\n *\n * @returns The pending elicitations map\n */\n getPendingElicitations(): Map<\n string,\n {\n resolve: (value: ElicitResult) => void;\n reject: (error: unknown) => void;\n }\n > {\n return this.pendingElicitations;\n }\n\n /**\n * Resolves a pending elicitation by requestId.\n *\n * @param requestId - The request ID to resolve\n * @param response - The elicitation response\n * @returns True if the elicitation was found and resolved\n */\n respond(requestId: string, response: ElicitResult): boolean {\n const pending = this.pendingElicitations.get(requestId);\n if (!pending) {\n return false;\n }\n try {\n pending.resolve(response);\n return true;\n } finally {\n this.pendingElicitations.delete(requestId);\n }\n }\n\n /**\n * Applies the appropriate elicitation handler to a client.\n * Server-specific handlers take precedence over the global callback.\n *\n * @param serverId - The server ID\n * @param client - The MCP client\n */\n applyToClient(serverId: string, client: Client): void {\n const serverSpecific = this.handlers.get(serverId);\n\n if (serverSpecific) {\n client.setRequestHandler(ElicitRequestSchema, async (request) =>\n serverSpecific(request.params)\n );\n return;\n }\n\n if (this.globalCallback) {\n client.setRequestHandler(ElicitRequestSchema, async (request) => {\n const reqId = `elicit_${Date.now()}_${Math.random()\n .toString(36)\n .slice(2, 9)}`;\n\n // Extract related task ID from _meta per MCP Tasks spec (2025-11-25)\n const meta = (request.params as any)?._meta;\n const relatedTask = meta?.[\"io.modelcontextprotocol/related-task\"];\n const relatedTaskId = relatedTask?.taskId as string | undefined;\n\n return await this.globalCallback!({\n requestId: reqId,\n message: (request.params as any)?.message,\n schema:\n (request.params as any)?.requestedSchema ??\n (request.params as any)?.schema,\n relatedTaskId,\n });\n });\n }\n }\n\n /**\n * Removes elicitation handler from a client.\n *\n * @param client - The MCP client\n */\n removeFromClient(client: Client): void {\n client.removeRequestHandler(\"elicitation/create\");\n }\n\n /**\n * Clears all data for a server.\n *\n * @param serverId - The server ID\n */\n clearServer(serverId: string): void {\n this.handlers.delete(serverId);\n }\n}\n","/**\n * MCP Tasks support (experimental feature - spec 2025-11-25)\n */\n\nimport type { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport type { ServerCapabilities } from \"@modelcontextprotocol/sdk/types.js\";\nimport { z } from \"zod\";\nimport type {\n MCPTask,\n MCPListTasksResult,\n ClientRequestOptions,\n} from \"./types.js\";\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/**\n * Task object schema\n */\nexport const TaskSchema = z.object({\n taskId: z.string(),\n status: z.enum([\n \"working\",\n \"input_required\",\n \"completed\",\n \"failed\",\n \"cancelled\",\n ]),\n statusMessage: z.string().optional(),\n createdAt: z.string(),\n lastUpdatedAt: z.string(),\n ttl: z.number().nullable(),\n pollInterval: z.number().optional(),\n});\n\n/**\n * List tasks result schema\n */\nexport const ListTasksResultSchema = z.object({\n tasks: z.array(TaskSchema),\n nextCursor: z.string().optional(),\n});\n\n/**\n * Task status notification schema\n * Per spec, notification includes the full Task object\n */\nexport const TaskStatusNotificationSchema = z.object({\n method: z.literal(\"notifications/tasks/status\"),\n params: z\n .object({\n taskId: z.string(),\n status: z.enum([\n \"working\",\n \"input_required\",\n \"completed\",\n \"failed\",\n \"cancelled\",\n ]),\n statusMessage: z.string().optional(),\n createdAt: z.string(),\n lastUpdatedAt: z.string(),\n ttl: z.number().nullable(),\n pollInterval: z.number().optional(),\n })\n .optional(),\n});\n\n/**\n * Generic result schema for tasks/result\n * Per MCP spec: \"tasks/result returns exactly what the underlying request would have returned\"\n */\nexport const TaskResultSchema = z.unknown();\n\n// ============================================================================\n// Task Operations\n// ============================================================================\n\n/**\n * Lists tasks from an MCP server.\n *\n * @param client - The MCP client\n * @param cursor - Optional pagination cursor\n * @param options - Request options\n * @returns List of tasks\n */\nexport async function listTasks(\n client: Client,\n cursor?: string,\n options?: ClientRequestOptions\n): Promise<MCPListTasksResult> {\n return client.request(\n {\n method: \"tasks/list\",\n params: cursor ? { cursor } : {},\n },\n ListTasksResultSchema,\n options\n );\n}\n\n/**\n * Gets a specific task by ID.\n *\n * @param client - The MCP client\n * @param taskId - The task ID\n * @param options - Request options\n * @returns The task object\n */\nexport async function getTask(\n client: Client,\n taskId: string,\n options?: ClientRequestOptions\n): Promise<MCPTask> {\n return client.request(\n {\n method: \"tasks/get\",\n params: { taskId },\n },\n TaskSchema,\n options\n );\n}\n\n/**\n * Gets the result of a completed task.\n * Per MCP Tasks spec, returns exactly what the underlying request would have returned.\n *\n * @param client - The MCP client\n * @param taskId - The task ID\n * @param options - Request options\n * @returns The task result (type depends on original request)\n */\nexport async function getTaskResult(\n client: Client,\n taskId: string,\n options?: ClientRequestOptions\n): Promise<unknown> {\n return client.request(\n {\n method: \"tasks/result\",\n params: { taskId },\n },\n TaskResultSchema,\n options\n );\n}\n\n/**\n * Cancels a task.\n *\n * @param client - The MCP client\n * @param taskId - The task ID to cancel\n * @param options - Request options\n * @returns The updated task object\n */\nexport async function cancelTask(\n client: Client,\n taskId: string,\n options?: ClientRequestOptions\n): Promise<MCPTask> {\n return client.request(\n {\n method: \"tasks/cancel\",\n params: { taskId },\n },\n TaskSchema,\n options\n );\n}\n\n// ============================================================================\n// Capability Checks\n// ============================================================================\n\n/**\n * Checks if server supports task-augmented tool calls.\n * Checks both top-level tasks and experimental.tasks namespaces.\n *\n * @param capabilities - The server capabilities\n * @returns True if server supports task-augmented tool calls\n */\nexport function supportsTasksForToolCalls(\n capabilities: ServerCapabilities | undefined\n): boolean {\n const caps = capabilities as any;\n return Boolean(\n caps?.tasks?.requests?.tools?.call ||\n caps?.experimental?.tasks?.requests?.tools?.call\n );\n}\n\n/**\n * Checks if server supports tasks/list operation.\n *\n * @param capabilities - The server capabilities\n * @returns True if server supports listing tasks\n */\nexport function supportsTasksList(\n capabilities: ServerCapabilities | undefined\n): boolean {\n const caps = capabilities as any;\n return Boolean(caps?.tasks?.list || caps?.experimental?.tasks?.list);\n}\n\n/**\n * Checks if server supports tasks/cancel operation.\n *\n * @param capabilities - The server capabilities\n * @returns True if server supports canceling tasks\n */\nexport function supportsTasksCancel(\n capabilities: ServerCapabilities | undefined\n): boolean {\n const caps = capabilities as any;\n return Boolean(caps?.tasks?.cancel || caps?.experimental?.tasks?.cancel);\n}\n","/**\n * Tool conversion utilities for integrating MCP tools with Vercel AI SDK\n */\n\nimport type { JSONSchema7, JSONSchema7Definition } from \"json-schema\";\nimport {\n CallToolResult,\n CallToolResultSchema,\n ListToolsResult,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport {\n dynamicTool,\n jsonSchema,\n tool as defineTool,\n type Tool,\n type ToolCallOptions,\n type ToolSet,\n} from \"ai\";\n\n/**\n * Normalizes a schema to a valid JSON Schema object.\n * Many MCP tools omit the top-level type; Anthropic requires an object schema.\n *\n * @param schema - The input schema (may be incomplete)\n * @returns A normalized JSONSchema7 object\n */\nexport function ensureJsonSchemaObject(schema: unknown): JSONSchema7 {\n if (schema && typeof schema === \"object\") {\n const record = schema as Record<string, unknown>;\n const base: JSONSchema7 = record.jsonSchema\n ? ensureJsonSchemaObject(record.jsonSchema)\n : (record as JSONSchema7);\n\n // Many MCP tools omit the top-level type; Anthropic requires an object schema\n if (!(\"type\" in base) || base.type === undefined) {\n base.type = \"object\";\n }\n\n if (base.type === \"object\") {\n base.properties = (base.properties ?? {}) as Record<\n string,\n JSONSchema7Definition\n >;\n if (base.additionalProperties === undefined) {\n base.additionalProperties = false;\n }\n }\n\n return base;\n }\n\n // Return a minimal valid object schema\n return {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n } satisfies JSONSchema7;\n}\n\n/**\n * Function type for executing tool calls\n */\nexport type CallToolExecutor = (params: {\n name: string;\n args: unknown;\n options?: ToolCallOptions;\n}) => Promise<CallToolResult>;\n\n/**\n * Input schema type for tool definitions\n */\ntype ToolInputSchema = Parameters<typeof dynamicTool>[0][\"inputSchema\"];\n\n/**\n * Schema overrides for specific tools\n * Maps tool name to custom input schema definition\n */\nexport type ToolSchemaOverrides = Record<\n string,\n { inputSchema: ToolInputSchema }\n>;\n\n/**\n * Result type for converted tools\n * When explicit schemas are provided, returns typed object\n * When \"automatic\", returns generic record\n */\nexport type ConvertedToolSet<\n SCHEMAS extends ToolSchemaOverrides | \"automatic\",\n> = SCHEMAS extends ToolSchemaOverrides\n ? { [K in keyof SCHEMAS]: Tool }\n : Record<string, Tool>;\n\n/**\n * Options for tool conversion\n */\nexport interface ConvertOptions<\n TOOL_SCHEMAS extends ToolSchemaOverrides | \"automatic\",\n> {\n /** Schema overrides or \"automatic\" for dynamic conversion */\n schemas?: TOOL_SCHEMAS;\n /** Function to execute tool calls */\n callTool: CallToolExecutor;\n}\n\n/**\n * Checks whether a tool is an MCP App by inspecting its _meta for a UI resource URI.\n *\n * @param toolMeta - The tool's _meta field from listTools result\n * @returns true if the tool is an MCP App\n */\nexport function isMcpAppTool(\n toolMeta: Record<string, unknown> | undefined\n): boolean {\n if (!toolMeta) return false;\n // MCP Apps use _meta.ui.resourceUri (preferred) or legacy \"ui/resourceUri\".\n const nested = (toolMeta as { ui?: { resourceUri?: unknown } }).ui;\n if (typeof nested?.resourceUri === \"string\") return true;\n return typeof toolMeta[\"ui/resourceUri\"] === \"string\";\n}\n\n/**\n * Checks whether a tool is a ChatGPT App by inspecting its _meta for an output template.\n *\n * @param toolMeta - The tool's _meta field from listTools result\n * @returns true if the tool is a ChatGPT App\n */\nexport function isChatGPTAppTool(\n toolMeta: Record<string, unknown> | undefined\n): boolean {\n if (!toolMeta) return false;\n return typeof toolMeta[\"openai/outputTemplate\"] === \"string\";\n}\n\n/**\n * Removes only the _meta field from a tool result (shallow copy).\n *\n * @param result - The full tool call result\n * @returns A shallow copy of the result without _meta\n */\nexport function scrubMetaFromToolResult(\n result: CallToolResult\n): CallToolResult {\n if (!result) return result;\n const copy = { ...result };\n if ((copy as Record<string, unknown>)._meta) {\n delete (copy as Record<string, unknown>)._meta;\n }\n return copy;\n}\n\n/**\n * Removes only structuredContent from a tool result (shallow copy).\n *\n * @param result - The full tool call result\n * @returns A shallow copy of the result without structuredContent\n */\nexport function scrubStructuredContentFromToolResult(\n result: CallToolResult\n): CallToolResult {\n if (!result) return result;\n const copy = { ...result };\n if ((copy as Record<string, unknown>).structuredContent) {\n delete (copy as Record<string, unknown>).structuredContent;\n }\n return copy;\n}\n\n/**\n * Returns a shallow copy of a CallToolResult with _meta and structuredContent removed.\n *\n * @param result - The full tool call result\n * @returns A scrubbed shallow copy without _meta and structuredContent\n */\nexport function scrubMetaAndStructuredContentFromToolResult(\n result: CallToolResult\n): CallToolResult {\n if (!result) return result;\n return scrubMetaFromToolResult(scrubStructuredContentFromToolResult(result));\n}\n\n/**\n * Converts MCP tools to Vercel AI SDK format.\n *\n * @param listToolsResult - The result from listTools()\n * @param options - Conversion options including callTool executor\n * @returns A ToolSet compatible with Vercel AI SDK\n *\n * @example\n * ```typescript\n * const tools = await convertMCPToolsToVercelTools(listToolsResult, {\n * callTool: async ({ name, args, options }) => {\n * return await mcpClient.callTool({ name, arguments: args });\n * },\n * });\n *\n * // Use with Vercel AI SDK\n * const result = await generateText({\n * model: openai(\"gpt-4\"),\n * tools,\n * messages: [{ role: \"user\", content: \"...\" }],\n * });\n * ```\n */\nexport async function convertMCPToolsToVercelTools(\n listToolsResult: ListToolsResult,\n {\n schemas = \"automatic\",\n callTool,\n }: ConvertOptions<ToolSchemaOverrides | \"automatic\">\n): Promise<ToolSet> {\n const tools: ToolSet = {};\n\n for (const toolDescription of listToolsResult.tools) {\n const { name, description, inputSchema } = toolDescription;\n const toolMeta = toolDescription._meta as\n | Record<string, unknown>\n | undefined;\n\n // Create the execute function that delegates to the provided callTool\n const execute = async (args: unknown, options?: ToolCallOptions) => {\n options?.abortSignal?.throwIfAborted();\n const result = await callTool({ name, args, options });\n return CallToolResultSchema.parse(result);\n };\n\n // For MCP app tools, strip _meta and structuredContent before sending to the LLM.\n // For ChatGPT app tools, strip structuredContent before sending to the LLM.\n // The raw execute() return value still reaches the UI stream unchanged.\n // Runtime signature: ({ toolCallId, input, output }) => ToolResultOutput\n // Note: Type assertion needed due to slight type misalignment between CallToolResult and JSONValue\n const toModelOutput = isMcpAppTool(toolMeta)\n ? (opts: { toolCallId: string; input: unknown; output: unknown }) => {\n const scrubbed = scrubMetaAndStructuredContentFromToolResult(\n opts.output as CallToolResult\n );\n return { type: \"json\" as const, value: scrubbed as any } as any;\n }\n : isChatGPTAppTool(toolMeta)\n ? (opts: { toolCallId: string; input: unknown; output: unknown }) => {\n const scrubbed = scrubStructuredContentFromToolResult(\n opts.output as CallToolResult\n );\n return { type: \"json\" as const, value: scrubbed as any } as any;\n }\n : undefined;\n\n let vercelTool: Tool;\n\n if (schemas === \"automatic\") {\n // Automatic mode: normalize the schema and create a dynamic tool\n const normalizedInputSchema = ensureJsonSchemaObject(inputSchema);\n vercelTool = dynamicTool({\n description,\n inputSchema: jsonSchema(normalizedInputSchema),\n execute,\n ...(toModelOutput ? { toModelOutput } : {}),\n });\n } else {\n // Override mode: only include tools explicitly listed in overrides\n const overrides = schemas;\n if (!(name in overrides)) {\n continue;\n }\n vercelTool = defineTool<unknown, CallToolResult>({\n description,\n inputSchema: overrides[name].inputSchema,\n execute,\n ...(toModelOutput ? { toModelOutput } : {}),\n });\n }\n\n tools[name] = vercelTool;\n }\n\n return tools;\n}\n","/**\n * MCPClientManager - Manages multiple MCP server connections\n */\n\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport {\n getDefaultEnvironment,\n StdioClientTransport,\n} from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport {\n CallToolResultSchema,\n CreateTaskResultSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport type { RequestOptions } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport type {\n LoggingLevel,\n ServerCapabilities,\n CallToolResult,\n} from \"@modelcontextprotocol/sdk/types.js\";\n\nimport type {\n MCPClientManagerConfig,\n MCPClientManagerOptions,\n MCPServerConfig,\n StdioServerConfig,\n HttpServerConfig,\n ManagedClientState,\n MCPConnectionStatus,\n ServerSummary,\n ClientCapabilityOptions,\n ExecuteToolArguments,\n TaskOptions,\n ClientRequestOptions,\n ListResourcesParams,\n ListResourceTemplatesParams,\n ReadResourceParams,\n SubscribeResourceParams,\n UnsubscribeResourceParams,\n ListPromptsParams,\n GetPromptParams,\n ListToolsResult,\n ElicitationHandler,\n ElicitationCallback,\n ElicitResult,\n ProgressHandler,\n RpcLogger,\n Tool,\n AiSdkTool,\n} from \"./types.js\";\n\nimport {\n DEFAULT_CLIENT_VERSION,\n DEFAULT_TIMEOUT,\n HTTP_CONNECT_TIMEOUT,\n} from \"./constants.js\";\nimport { isMethodUnavailableError, formatError } from \"./error-utils.js\";\nimport { MCPAuthError, isAuthError } from \"./errors.js\";\nimport {\n buildRequestInit,\n wrapTransportForLogging,\n createDefaultRpcLogger,\n} from \"./transport-utils.js\";\nimport {\n NotificationManager,\n applyProgressHandler,\n ResourceListChangedNotificationSchema,\n ResourceUpdatedNotificationSchema,\n PromptListChangedNotificationSchema,\n type NotificationSchema,\n type NotificationHandler,\n} from \"./notification-handlers.js\";\nimport { ElicitationManager } from \"./elicitation.js\";\nimport {\n listTasks as tasksListTasks,\n getTask as tasksGetTask,\n getTaskResult as tasksGetTaskResult,\n cancelTask as tasksCancelTask,\n supportsTasksForToolCalls,\n supportsTasksList,\n supportsTasksCancel,\n TaskStatusNotificationSchema,\n} from \"./tasks.js\";\nimport {\n convertMCPToolsToVercelTools,\n type ToolSchemaOverrides,\n} from \"./tool-converters.js\";\n\n/**\n * Manages multiple MCP server connections with support for tools, resources,\n * prompts, notifications, elicitation, and tasks.\n *\n * @example\n * ```typescript\n * const manager = new MCPClientManager({\n * everything: {\n * command: \"npx\",\n * args: [\"-y\", \"@modelcontextprotocol/server-everything\"],\n * },\n * myServer: {\n * url: \"https://my-server.com/mcp\",\n * accessToken: \"my-token\",\n * },\n * });\n *\n * const tools = await manager.listTools(\"everything\");\n * const result = await manager.executeTool(\"everything\", \"add\", { a: 1, b: 2 });\n * ```\n */\nexport class MCPClientManager {\n // State management\n private readonly clientStates = new Map<string, ManagedClientState>();\n private readonly toolsMetadataCache = new Map<string, Map<string, any>>();\n\n // Managers for specific features\n private readonly notificationManager = new NotificationManager();\n private readonly elicitationManager = new ElicitationManager();\n\n // Default options\n private readonly defaultClientName: string | undefined;\n private readonly defaultClientVersion: string;\n private readonly defaultCapabilities: ClientCapabilityOptions;\n private readonly defaultTimeout: number;\n private readonly defaultLogJsonRpc: boolean;\n private readonly defaultRpcLogger?: RpcLogger;\n private readonly defaultProgressHandler?: ProgressHandler;\n\n // Progress token counter for uniqueness\n private progressTokenCounter = 0;\n\n /**\n * Creates a new MCPClientManager.\n *\n * @param servers - Configuration map of server IDs to server configs\n * @param options - Global options for the manager\n */\n constructor(\n servers: MCPClientManagerConfig = {},\n options: MCPClientManagerOptions = {}\n ) {\n this.defaultClientVersion =\n options.defaultClientVersion ?? DEFAULT_CLIENT_VERSION;\n this.defaultClientName = options.defaultClientName;\n this.defaultCapabilities = { ...(options.defaultCapabilities ?? {}) };\n this.defaultTimeout = options.defaultTimeout ?? DEFAULT_TIMEOUT;\n this.defaultLogJsonRpc = options.defaultLogJsonRpc ?? false;\n this.defaultRpcLogger = options.rpcLogger;\n this.defaultProgressHandler = options.progressHandler;\n\n // Start connecting to all configured servers\n for (const [id, config] of Object.entries(servers)) {\n void this.connectToServer(id, config);\n }\n }\n\n // ===========================================================================\n // Server Management\n // ===========================================================================\n\n /**\n * Lists all registered server IDs.\n */\n listServers(): string[] {\n return Array.from(this.clientStates.keys());\n }\n\n /**\n * Checks if a server is registered.\n */\n hasServer(serverId: string): boolean {\n return this.clientStates.has(serverId);\n }\n\n /**\n * Gets summaries for all registered servers.\n */\n getServerSummaries(): ServerSummary[] {\n return Array.from(this.clientStates.entries()).map(([serverId, state]) => ({\n id: serverId,\n status: this.getConnectionStatus(serverId),\n config: state.config,\n }));\n }\n\n /**\n * Gets the connection status for a server.\n */\n getConnectionStatus(serverId: string): MCPConnectionStatus {\n const state = this.clientStates.get(serverId);\n if (state?.promise) return \"connecting\";\n if (state?.client) return \"connected\";\n return \"disconnected\";\n }\n\n /**\n * Gets the configuration for a server.\n */\n getServerConfig(serverId: string): MCPServerConfig | undefined {\n return this.clientStates.get(serverId)?.config;\n }\n\n /**\n * Gets the capabilities reported by a server.\n */\n getServerCapabilities(serverId: string): ServerCapabilities | undefined {\n return this.clientStates.get(serverId)?.client?.getServerCapabilities();\n }\n\n /**\n * Gets the underlying MCP Client for a server.\n */\n getClient(serverId: string): Client | undefined {\n return this.clientStates.get(serverId)?.client;\n }\n\n /**\n * Gets initialization information for a connected server.\n */\n getInitializationInfo(serverId: string) {\n const state = this.clientStates.get(serverId);\n const client = state?.client;\n if (!client) return undefined;\n\n const config = state.config;\n let transportType: string;\n if (this.isStdioConfig(config)) {\n transportType = \"stdio\";\n } else {\n const url = new URL(config.url);\n transportType =\n config.preferSSE || url.pathname.endsWith(\"/sse\")\n ? \"sse\"\n : \"streamable-http\";\n }\n\n let protocolVersion: string | undefined;\n if (state.transport) {\n protocolVersion = (state.transport as any)._protocolVersion;\n }\n\n return {\n protocolVersion,\n transport: transportType,\n serverCapabilities: client.getServerCapabilities(),\n serverVersion: client.getServerVersion(),\n instructions: client.getInstructions(),\n clientCapabilities: this.buildCapabilities(config),\n };\n }\n\n // ===========================================================================\n // Connection Management\n // ===========================================================================\n\n /**\n * Connects to an MCP server.\n *\n * @param serverId - Unique identifier for the server\n * @param config - Server configuration\n * @returns The connected MCP Client\n */\n async connectToServer(\n serverId: string,\n config: MCPServerConfig\n ): Promise<Client> {\n const timeout = config.timeout ?? this.defaultTimeout;\n const existingState = this.clientStates.get(serverId);\n\n if (existingState?.client) {\n throw new Error(`MCP server \"${serverId}\" is already connected.`);\n }\n\n const state: ManagedClientState = existingState ?? { config, timeout };\n state.config = config;\n state.timeout = timeout;\n\n // Reuse existing connection promise if in-flight\n if (state.promise) {\n this.clientStates.set(serverId, state);\n return state.promise;\n }\n\n const connectionPromise = this.performConnection(\n serverId,\n config,\n timeout,\n state\n );\n state.promise = connectionPromise;\n this.clientStates.set(serverId, state);\n\n return connectionPromise;\n }\n\n /**\n * Disconnects from a server.\n */\n async disconnectServer(serverId: string): Promise<void> {\n const state = this.clientStates.get(serverId);\n if (!state?.client) return;\n\n try {\n await state.client.close();\n } catch {\n // Ignore close errors\n } finally {\n if (state.transport) {\n await this.safeCloseTransport(state.transport);\n }\n this.resetState(serverId);\n }\n }\n\n /**\n * Removes a server from the manager entirely.\n */\n async removeServer(serverId: string): Promise<void> {\n await this.disconnectServer(serverId);\n this.notificationManager.clearServer(serverId);\n this.elicitationManager.clearServer(serverId);\n }\n\n /**\n * Disconnects from all servers.\n */\n async disconnectAllServers(): Promise<void> {\n const serverIds = this.listServers();\n await Promise.all(serverIds.map((id) => this.disconnectServer(id)));\n\n for (const serverId of serverIds) {\n this.notificationManager.clearServer(serverId);\n this.elicitationManager.clearServer(serverId);\n }\n }\n\n // ===========================================================================\n // Tools\n // ===========================================================================\n\n /**\n * Lists tools available from a server.\n */\n async listTools(\n serverId: string,\n params?: Parameters<Client[\"listTools\"]>[0],\n options?: ClientRequestOptions\n ): Promise<ListToolsResult> {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n\n try {\n const result = await client.listTools(\n params,\n this.withTimeout(serverId, options)\n );\n this.cacheToolsMetadata(serverId, result.tools);\n return result;\n } catch (error) {\n if (isMethodUnavailableError(error, \"tools/list\")) {\n this.toolsMetadataCache.set(serverId, new Map());\n return { tools: [] } as ListToolsResult;\n }\n throw error;\n }\n }\n\n /**\n * Gets tools from multiple servers (or all servers if none specified).\n * Returns tools with execute functions pre-wired to call this manager.\n *\n * @param serverIds - Server IDs to get tools from (or all if omitted)\n * @returns Array of executable tools\n *\n * @example\n * ```typescript\n * const tools = await manager.getTools([\"asana\"]);\n * const agent = new TestAgent({ tools, model: \"openai/gpt-4o\", apiKey });\n * ```\n */\n async getTools(serverIds?: string[]): Promise<Tool[]> {\n const targetIds = serverIds !== undefined ? serverIds : this.listServers();\n\n const toolLists = await Promise.all(\n targetIds.map(async (serverId) => {\n await this.ensureConnected(serverId);\n const result = await this.listTools(serverId);\n\n // Attach execute function to each tool\n return result.tools.map((tool) => ({\n ...tool,\n _meta: { ...tool._meta, _serverId: serverId },\n execute: async (\n args: Record<string, unknown>,\n options?: { signal?: AbortSignal }\n ): Promise<CallToolResult> => {\n // When called without taskOptions, executeTool always returns CallToolResult\n const requestOptions = options?.signal\n ? { signal: options.signal }\n : undefined;\n return this.executeTool(\n serverId,\n tool.name,\n args,\n requestOptions\n ) as Promise<CallToolResult>;\n },\n }));\n })\n );\n\n return toolLists.flat();\n }\n\n /**\n * Gets cached tool metadata for a server.\n */\n getAllToolsMetadata(serverId: string): Record<string, Record<string, any>> {\n const metadataMap = this.toolsMetadataCache.get(serverId);\n return metadataMap ? Object.fromEntries(metadataMap) : {};\n }\n\n /**\n * Gets tools formatted for Vercel AI SDK.\n *\n * @param serverIds - Server IDs to get tools from (or all if omitted)\n * @param options - Schema options\n * @returns AiSdkTool compatible with Vercel AI SDK's generateText()\n */\n async getToolsForAiSdk(\n serverIds?: string[] | string,\n options: { schemas?: ToolSchemaOverrides | \"automatic\" } = {}\n ): Promise<AiSdkTool> {\n const ids = Array.isArray(serverIds)\n ? serverIds\n : serverIds\n ? [serverIds]\n : this.listServers();\n\n const perServerTools = await Promise.all(\n ids.map(async (id) => {\n try {\n await this.ensureConnected(id);\n const listToolsResult = await this.listTools(id);\n\n const tools = await convertMCPToolsToVercelTools(listToolsResult, {\n schemas: options.schemas,\n callTool: async ({ name, args, options: callOptions }) => {\n const requestOptions = callOptions?.abortSignal\n ? { signal: callOptions.abortSignal }\n : undefined;\n const result = await this.executeTool(\n id,\n name,\n (args ?? {}) as ExecuteToolArguments,\n requestOptions\n );\n return CallToolResultSchema.parse(result);\n },\n });\n\n // Attach server ID metadata to each tool\n for (const [_name, tool] of Object.entries(tools)) {\n (tool as any)._serverId = id;\n }\n return tools;\n } catch (error) {\n if (isMethodUnavailableError(error, \"tools/list\")) {\n return {} as AiSdkTool;\n }\n throw error;\n }\n })\n );\n\n // Flatten (last-in wins for name collisions)\n const flattened: AiSdkTool = {};\n for (const toolset of perServerTools) {\n Object.assign(flattened, toolset);\n }\n return flattened;\n }\n\n /**\n * Executes a tool on a server.\n *\n * @param serverId - The server ID\n * @param toolName - The tool name\n * @param args - Tool arguments\n * @param options - Request options\n * @param taskOptions - Task options for async execution\n */\n async executeTool(\n serverId: string,\n toolName: string,\n args: ExecuteToolArguments = {},\n options?: ClientRequestOptions,\n taskOptions?: TaskOptions\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n\n const mergedOptions = this.withProgressHandler(serverId, options);\n const callParams = { name: toolName, arguments: args };\n\n if (taskOptions !== undefined) {\n // Task-augmented tool call per MCP Tasks spec\n const taskValue =\n taskOptions.ttl !== undefined ? { ttl: taskOptions.ttl } : {};\n const result = await client.request(\n { method: \"tools/call\", params: { ...callParams, task: taskValue } },\n CreateTaskResultSchema,\n mergedOptions\n );\n return {\n task: result.task,\n _meta: {\n \"io.modelcontextprotocol/model-immediate-response\": `Task ${result.task.taskId} created with status: ${result.task.status}`,\n },\n };\n }\n\n return client.callTool(callParams, CallToolResultSchema, mergedOptions);\n }\n\n // ===========================================================================\n // Resources\n // ===========================================================================\n\n /**\n * Lists resources available from a server.\n */\n async listResources(\n serverId: string,\n params?: ListResourcesParams,\n options?: ClientRequestOptions\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n\n try {\n return await client.listResources(\n params,\n this.withTimeout(serverId, options)\n );\n } catch (error) {\n if (isMethodUnavailableError(error, \"resources/list\")) {\n return { resources: [] } as Awaited<\n ReturnType<Client[\"listResources\"]>\n >;\n }\n throw error;\n }\n }\n\n /**\n * Reads a resource from a server.\n */\n async readResource(\n serverId: string,\n params: ReadResourceParams,\n options?: ClientRequestOptions\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n return client.readResource(\n params,\n this.withProgressHandler(serverId, options)\n );\n }\n\n /**\n * Subscribes to resource updates.\n */\n async subscribeResource(\n serverId: string,\n params: SubscribeResourceParams,\n options?: ClientRequestOptions\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n return client.subscribeResource(\n params,\n this.withTimeout(serverId, options)\n );\n }\n\n /**\n * Unsubscribes from resource updates.\n */\n async unsubscribeResource(\n serverId: string,\n params: UnsubscribeResourceParams,\n options?: ClientRequestOptions\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n return client.unsubscribeResource(\n params,\n this.withTimeout(serverId, options)\n );\n }\n\n /**\n * Lists resource templates from a server.\n */\n async listResourceTemplates(\n serverId: string,\n params?: ListResourceTemplatesParams,\n options?: ClientRequestOptions\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n return client.listResourceTemplates(\n params,\n this.withTimeout(serverId, options)\n );\n }\n\n // ===========================================================================\n // Prompts\n // ===========================================================================\n\n /**\n * Lists prompts available from a server.\n */\n async listPrompts(\n serverId: string,\n params?: ListPromptsParams,\n options?: ClientRequestOptions\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n\n try {\n return await client.listPrompts(\n params,\n this.withTimeout(serverId, options)\n );\n } catch (error) {\n if (isMethodUnavailableError(error, \"prompts/list\")) {\n return { prompts: [] } as Awaited<ReturnType<Client[\"listPrompts\"]>>;\n }\n throw error;\n }\n }\n\n /**\n * Gets a prompt from a server.\n */\n async getPrompt(\n serverId: string,\n params: GetPromptParams,\n options?: ClientRequestOptions\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n return client.getPrompt(\n params,\n this.withProgressHandler(serverId, options)\n );\n }\n\n // ===========================================================================\n // Utility Methods\n // ===========================================================================\n\n /**\n * Pings a server to check connectivity.\n */\n pingServer(serverId: string, options?: RequestOptions): void {\n const client = this.getClientOrThrow(serverId);\n try {\n client.ping(options);\n } catch (error) {\n throw new Error(\n `Failed to ping MCP server \"${serverId}\": ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n }\n\n /**\n * Sets the logging level for a server.\n */\n async setLoggingLevel(\n serverId: string,\n level: LoggingLevel = \"debug\"\n ): Promise<void> {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n await client.setLoggingLevel(level);\n }\n\n /**\n * Gets the session ID for a Streamable HTTP server.\n */\n getSessionIdByServer(serverId: string): string | undefined {\n const state = this.clientStates.get(serverId);\n if (!state?.transport) {\n throw new Error(`Unknown MCP server \"${serverId}\".`);\n }\n if (state.transport instanceof StreamableHTTPClientTransport) {\n return state.transport.sessionId;\n }\n throw new Error(\n `Server \"${serverId}\" must be Streamable HTTP to get the session ID.`\n );\n }\n\n // ===========================================================================\n // Notification Handlers\n // ===========================================================================\n\n /**\n * Adds a notification handler for a server.\n */\n addNotificationHandler(\n serverId: string,\n schema: NotificationSchema,\n handler: NotificationHandler\n ): void {\n this.notificationManager.addHandler(serverId, schema, handler);\n\n const client = this.clientStates.get(serverId)?.client;\n if (client) {\n client.setNotificationHandler(\n schema,\n this.notificationManager.createDispatcher(serverId, schema)\n );\n }\n }\n\n /**\n * Registers a handler for resource list changes.\n */\n onResourceListChanged(serverId: string, handler: NotificationHandler): void {\n this.addNotificationHandler(\n serverId,\n ResourceListChangedNotificationSchema,\n handler\n );\n }\n\n /**\n * Registers a handler for resource updates.\n */\n onResourceUpdated(serverId: string, handler: NotificationHandler): void {\n this.addNotificationHandler(\n serverId,\n ResourceUpdatedNotificationSchema,\n handler\n );\n }\n\n /**\n * Registers a handler for prompt list changes.\n */\n onPromptListChanged(serverId: string, handler: NotificationHandler): void {\n this.addNotificationHandler(\n serverId,\n PromptListChangedNotificationSchema,\n handler\n );\n }\n\n /**\n * Registers a handler for task status changes.\n */\n onTaskStatusChanged(serverId: string, handler: NotificationHandler): void {\n this.addNotificationHandler(\n serverId,\n TaskStatusNotificationSchema,\n handler\n );\n }\n\n // ===========================================================================\n // Elicitation\n // ===========================================================================\n\n /**\n * Sets a server-specific elicitation handler.\n */\n setElicitationHandler(serverId: string, handler: ElicitationHandler): void {\n if (!this.clientStates.has(serverId)) {\n throw new Error(`Unknown MCP server \"${serverId}\".`);\n }\n this.elicitationManager.setHandler(serverId, handler);\n\n const client = this.clientStates.get(serverId)?.client;\n if (client) {\n this.elicitationManager.applyToClient(serverId, client);\n }\n }\n\n /**\n * Clears a server-specific elicitation handler.\n */\n clearElicitationHandler(serverId: string): void {\n this.elicitationManager.clearHandler(serverId);\n const client = this.clientStates.get(serverId)?.client;\n if (client) {\n if (this.elicitationManager.getGlobalCallback()) {\n this.elicitationManager.applyToClient(serverId, client);\n } else {\n this.elicitationManager.removeFromClient(client);\n }\n }\n }\n\n /**\n * Sets a global elicitation callback for all servers.\n */\n setElicitationCallback(callback: ElicitationCallback): void {\n this.elicitationManager.setGlobalCallback(callback);\n for (const [serverId, state] of this.clientStates.entries()) {\n if (state.client) {\n this.elicitationManager.applyToClient(serverId, state.client);\n }\n }\n }\n\n /**\n * Clears the global elicitation callback.\n */\n clearElicitationCallback(): void {\n this.elicitationManager.clearGlobalCallback();\n for (const [serverId, state] of this.clientStates.entries()) {\n if (!state.client) continue;\n if (this.elicitationManager.getHandler(serverId)) {\n this.elicitationManager.applyToClient(serverId, state.client);\n } else {\n this.elicitationManager.removeFromClient(state.client);\n }\n }\n }\n\n /**\n * Gets the pending elicitations map for external resolvers.\n */\n getPendingElicitations() {\n return this.elicitationManager.getPendingElicitations();\n }\n\n /**\n * Responds to a pending elicitation.\n */\n respondToElicitation(requestId: string, response: ElicitResult): boolean {\n return this.elicitationManager.respond(requestId, response);\n }\n\n // ===========================================================================\n // Tasks (MCP Tasks experimental feature)\n // ===========================================================================\n\n /**\n * Lists tasks from a server.\n */\n async listTasks(\n serverId: string,\n cursor?: string,\n options?: ClientRequestOptions\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n try {\n return await tasksListTasks(\n client,\n cursor,\n this.withTimeout(serverId, options)\n );\n } catch (error) {\n if (isMethodUnavailableError(error, \"tasks/list\")) {\n return { tasks: [] };\n }\n throw error;\n }\n }\n\n /**\n * Gets a task by ID.\n */\n async getTask(\n serverId: string,\n taskId: string,\n options?: ClientRequestOptions\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n return tasksGetTask(client, taskId, this.withTimeout(serverId, options));\n }\n\n /**\n * Gets the result of a completed task.\n */\n async getTaskResult(\n serverId: string,\n taskId: string,\n options?: ClientRequestOptions\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n return tasksGetTaskResult(\n client,\n taskId,\n this.withTimeout(serverId, options)\n );\n }\n\n /**\n * Cancels a task.\n */\n async cancelTask(\n serverId: string,\n taskId: string,\n options?: ClientRequestOptions\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientOrThrow(serverId);\n return tasksCancelTask(client, taskId, this.withTimeout(serverId, options));\n }\n\n /**\n * Checks if server supports task-augmented tool calls.\n */\n supportsTasksForToolCalls(serverId: string): boolean {\n return supportsTasksForToolCalls(this.getServerCapabilities(serverId));\n }\n\n /**\n * Checks if server supports listing tasks.\n */\n supportsTasksList(serverId: string): boolean {\n return supportsTasksList(this.getServerCapabilities(serverId));\n }\n\n /**\n * Checks if server supports canceling tasks.\n */\n supportsTasksCancel(serverId: string): boolean {\n return supportsTasksCancel(this.getServerCapabilities(serverId));\n }\n\n // ===========================================================================\n // Private Helpers\n // ===========================================================================\n\n private async performConnection(\n serverId: string,\n config: MCPServerConfig,\n timeout: number,\n state: ManagedClientState\n ): Promise<Client> {\n try {\n const client = new Client(\n {\n name: this.defaultClientName ?? serverId,\n version: config.version ?? this.defaultClientVersion,\n },\n { capabilities: this.buildCapabilities(config) }\n );\n\n // Apply handlers\n this.notificationManager.applyToClient(serverId, client);\n if (this.defaultProgressHandler) {\n applyProgressHandler(serverId, client, this.defaultProgressHandler);\n }\n this.elicitationManager.applyToClient(serverId, client);\n\n if (config.onError) {\n client.onerror = (error) => config.onError?.(error);\n }\n\n client.onclose = () => this.resetState(serverId);\n\n let transport: Transport;\n if (this.isStdioConfig(config)) {\n transport = await this.connectViaStdio(\n serverId,\n client,\n config,\n timeout\n );\n } else {\n transport = await this.connectViaHttp(\n serverId,\n client,\n config,\n timeout\n );\n }\n\n state.client = client;\n state.transport = transport;\n state.promise = undefined;\n this.clientStates.set(serverId, state);\n\n // Set logging level (ignore errors)\n this.setLoggingLevel(serverId, \"debug\").catch(() => {});\n\n return client;\n } catch (error) {\n this.resetState(serverId);\n throw error;\n }\n }\n\n private async connectViaStdio(\n serverId: string,\n client: Client,\n config: StdioServerConfig,\n timeout: number\n ): Promise<Transport> {\n const underlying = new StdioClientTransport({\n command: config.command,\n args: config.args,\n env: { ...getDefaultEnvironment(), ...(config.env ?? {}) },\n });\n\n const logger = this.resolveRpcLogger(config);\n const transport = logger\n ? wrapTransportForLogging(serverId, logger, underlying)\n : underlying;\n\n await client.connect(transport, { timeout });\n return underlying;\n }\n\n private async connectViaHttp(\n serverId: string,\n client: Client,\n config: HttpServerConfig,\n timeout: number\n ): Promise<Transport> {\n const url = new URL(config.url);\n const requestInit = buildRequestInit(\n config.accessToken,\n config.requestInit\n );\n const preferSSE = config.preferSSE ?? url.pathname.endsWith(\"/sse\");\n let streamableError: unknown;\n\n if (!preferSSE) {\n const streamableTransport = new StreamableHTTPClientTransport(url, {\n requestInit,\n reconnectionOptions: config.reconnectionOptions,\n authProvider: config.authProvider,\n sessionId: config.sessionId,\n });\n\n try {\n const logger = this.resolveRpcLogger(config);\n const wrapped = logger\n ? wrapTransportForLogging(serverId, logger, streamableTransport)\n : streamableTransport;\n await client.connect(wrapped, {\n timeout: Math.min(timeout, HTTP_CONNECT_TIMEOUT),\n });\n return streamableTransport;\n } catch (error) {\n streamableError = error;\n await this.safeCloseTransport(streamableTransport);\n }\n }\n\n const sseTransport = new SSEClientTransport(url, {\n requestInit,\n eventSourceInit: config.eventSourceInit,\n authProvider: config.authProvider,\n });\n\n try {\n const logger = this.resolveRpcLogger(config);\n const wrapped = logger\n ? wrapTransportForLogging(serverId, logger, sseTransport)\n : sseTransport;\n await client.connect(wrapped, { timeout });\n return sseTransport;\n } catch (error) {\n await this.safeCloseTransport(sseTransport);\n const streamableMessage = streamableError\n ? ` Streamable HTTP error: ${formatError(streamableError)}.`\n : \"\";\n const sseErrorMessage = formatError(error);\n const combinedErrorMessage =\n `${streamableMessage} SSE error: ${sseErrorMessage}`.trim();\n\n // Check for auth errors in both the SSE error and streamable error\n const sseAuthCheck = isAuthError(error);\n const streamableAuthCheck = streamableError\n ? isAuthError(streamableError)\n : { isAuth: false };\n\n if (sseAuthCheck.isAuth || streamableAuthCheck.isAuth) {\n const statusCode =\n sseAuthCheck.statusCode ?? streamableAuthCheck.statusCode;\n throw new MCPAuthError(\n `Authentication failed for MCP server \"${serverId}\": ${combinedErrorMessage}`,\n statusCode,\n { cause: error }\n );\n }\n\n throw new Error(\n `Failed to connect to MCP server \"${serverId}\" using HTTP transports.${streamableMessage} SSE error: ${sseErrorMessage}.`\n );\n }\n }\n\n private async safeCloseTransport(transport: Transport): Promise<void> {\n try {\n await transport.close();\n } catch {\n // Ignore close errors\n }\n }\n\n private async ensureConnected(serverId: string): Promise<void> {\n const state = this.clientStates.get(serverId);\n if (state?.client) return;\n\n if (!state) {\n throw new Error(`Unknown MCP server \"${serverId}\".`);\n }\n if (state.promise) {\n await state.promise;\n return;\n }\n await this.connectToServer(serverId, state.config);\n }\n\n private getClientOrThrow(serverId: string): Client {\n const state = this.clientStates.get(serverId);\n if (!state?.client) {\n throw new Error(`MCP server \"${serverId}\" is not connected.`);\n }\n return state.client;\n }\n\n private resetState(serverId: string): void {\n this.clientStates.delete(serverId);\n this.toolsMetadataCache.delete(serverId);\n }\n\n private withTimeout(\n serverId: string,\n options?: RequestOptions\n ): RequestOptions {\n const state = this.clientStates.get(serverId);\n const timeout = state?.timeout ?? this.defaultTimeout;\n\n if (!options) return { timeout };\n if (options.timeout === undefined) return { ...options, timeout };\n return options;\n }\n\n private withProgressHandler(\n serverId: string,\n options?: RequestOptions\n ): RequestOptions {\n const mergedOptions = this.withTimeout(serverId, options);\n\n if (!mergedOptions.onprogress && this.defaultProgressHandler) {\n const progressToken = `${serverId}-request-${Date.now()}-${++this.progressTokenCounter}`;\n mergedOptions.onprogress = (progress) => {\n this.defaultProgressHandler!({\n serverId,\n progressToken,\n progress: progress.progress,\n total: progress.total,\n message: progress.message,\n });\n };\n }\n\n return mergedOptions;\n }\n\n private buildCapabilities(config: MCPServerConfig): ClientCapabilityOptions {\n const capabilities: ClientCapabilityOptions = {\n ...this.defaultCapabilities,\n ...(config.capabilities ?? {}),\n };\n if (!capabilities.elicitation) {\n capabilities.elicitation = {};\n }\n // Add extensions here\n return capabilities;\n }\n\n private resolveRpcLogger(config: MCPServerConfig): RpcLogger | undefined {\n if (config.rpcLogger) return config.rpcLogger;\n if (config.logJsonRpc || this.defaultLogJsonRpc)\n return createDefaultRpcLogger();\n if (this.defaultRpcLogger) return this.defaultRpcLogger;\n return undefined;\n }\n\n private cacheToolsMetadata(\n serverId: string,\n tools: Array<{ name: string; _meta?: any }>\n ): void {\n const metadataMap = new Map<string, any>();\n for (const tool of tools) {\n if (tool._meta) {\n metadataMap.set(tool.name, tool._meta);\n }\n }\n this.toolsMetadataCache.set(serverId, metadataMap);\n }\n\n private isStdioConfig(config: MCPServerConfig): config is StdioServerConfig {\n return \"command\" in config;\n }\n}\n","/**\n * Model factory for creating AI SDK language models from provider/model strings.\n * Supports both built-in providers and user-defined custom providers.\n */\n\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createAzure } from \"@ai-sdk/azure\";\nimport { createDeepSeek } from \"@ai-sdk/deepseek\";\nimport { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { createMistral } from \"@ai-sdk/mistral\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createXai } from \"@ai-sdk/xai\";\nimport { createOpenRouter } from \"@openrouter/ai-sdk-provider\";\nimport { createOllama } from \"ollama-ai-provider-v2\";\nimport type { LLMProvider, CustomProvider } from \"./types.js\";\n\n/**\n * Custom base URLs for built-in providers that support them.\n */\nexport interface BaseUrls {\n ollama?: string;\n azure?: string;\n anthropic?: string;\n openai?: string;\n}\n\n/**\n * Options for creating a model.\n */\nexport interface CreateModelOptions {\n apiKey: string;\n baseUrls?: BaseUrls;\n /** Custom providers registry (name -> config) */\n customProviders?:\n | Map<string, CustomProvider>\n | Record<string, CustomProvider>;\n}\n\n/** Built-in providers list */\nconst BUILT_IN_PROVIDERS: LLMProvider[] = [\n \"anthropic\",\n \"openai\",\n \"azure\",\n \"deepseek\",\n \"google\",\n \"ollama\",\n \"mistral\",\n \"openrouter\",\n \"xai\",\n];\n\n/**\n * Result of parsing an LLM string\n */\nexport type ParsedLLMString =\n | { type: \"builtin\"; provider: LLMProvider; model: string }\n | { type: \"custom\"; providerName: string; model: string };\n\n/**\n * Parse an LLM string into provider and model components.\n * Supports both built-in providers and custom provider names.\n *\n * @param llmString - String in format \"provider/model\" (e.g., \"openai/gpt-4o\" or \"my-litellm/gpt-4\")\n * @param customProviderNames - Optional set of registered custom provider names for validation\n * @returns Parsed result with type discriminator\n */\nexport function parseLLMString(\n llmString: string,\n customProviderNames?: Set<string>\n): ParsedLLMString {\n const parts = llmString.split(\"/\");\n if (parts.length < 2) {\n throw new Error(\n `Invalid LLM string format: \"${llmString}\". Expected format: \"provider/model\" (e.g., \"openai/gpt-4o\")`\n );\n }\n\n const providerName = parts[0];\n const model = parts.slice(1).join(\"/\"); // Handle models with slashes in name\n\n // Check if it's a built-in provider\n if (BUILT_IN_PROVIDERS.includes(providerName as LLMProvider)) {\n return {\n type: \"builtin\",\n provider: providerName as LLMProvider,\n model,\n };\n }\n\n // Check if it's a registered custom provider\n if (customProviderNames?.has(providerName)) {\n return {\n type: \"custom\",\n providerName,\n model,\n };\n }\n\n // Unknown provider\n const allProviders = customProviderNames\n ? [...BUILT_IN_PROVIDERS, ...customProviderNames]\n : BUILT_IN_PROVIDERS;\n\n throw new Error(\n `Unknown LLM provider: \"${providerName}\". Supported providers: ${allProviders.join(\", \")}`\n );\n}\n\n/**\n * Model type returned by provider factories.\n */\nexport type ProviderLanguageModel = ReturnType<ReturnType<typeof createOpenAI>>;\n\n/**\n * Create a model from a custom provider configuration.\n */\nfunction createModelFromCustomProvider(\n customProvider: CustomProvider,\n model: string,\n runtimeApiKey?: string\n): ProviderLanguageModel {\n // Resolve API key: runtime > config > env var\n const apiKey =\n runtimeApiKey ||\n customProvider.apiKey ||\n (customProvider.apiKeyEnvVar\n ? process.env[customProvider.apiKeyEnvVar]\n : undefined) ||\n \"\";\n\n switch (customProvider.protocol) {\n case \"openai-compatible\": {\n const openai = createOpenAI({\n apiKey,\n baseURL: customProvider.baseUrl,\n });\n // Use .chat() for providers that need Chat Completions API (like LiteLLM)\n return customProvider.useChatCompletions\n ? openai.chat(model)\n : openai(model);\n }\n\n case \"anthropic-compatible\": {\n const anthropic = createAnthropic({\n apiKey,\n baseURL: customProvider.baseUrl,\n });\n return anthropic(model) as ProviderLanguageModel;\n }\n\n default: {\n const _exhaustiveCheck: never = customProvider.protocol;\n throw new Error(`Unknown protocol: ${_exhaustiveCheck}`);\n }\n }\n}\n\n/**\n * Create a language model from an LLM string.\n * @param llmString - String in format \"provider/model\" (e.g., \"openai/gpt-4o\" or \"my-provider/model\")\n * @param options - API key, optional base URLs, and custom providers registry\n * @returns AI SDK language model instance\n */\nexport function createModelFromString(\n llmString: string,\n options: CreateModelOptions\n): ProviderLanguageModel {\n const { apiKey, baseUrls, customProviders } = options;\n\n // Convert custom providers to Map if provided as object\n const customProvidersMap =\n customProviders instanceof Map\n ? customProviders\n : customProviders\n ? new Map(Object.entries(customProviders))\n : new Map<string, CustomProvider>();\n\n const customProviderNames = new Set(customProvidersMap.keys());\n const parsed = parseLLMString(llmString, customProviderNames);\n\n // Handle custom providers\n if (parsed.type === \"custom\") {\n const customProvider = customProvidersMap.get(parsed.providerName);\n if (!customProvider) {\n throw new Error(\n `Custom provider \"${parsed.providerName}\" not found in registry`\n );\n }\n return createModelFromCustomProvider(customProvider, parsed.model, apiKey);\n }\n\n // Handle built-in providers\n const { provider, model } = parsed;\n\n switch (provider) {\n case \"anthropic\": {\n const anthropic = createAnthropic({\n apiKey,\n ...(baseUrls?.anthropic && { baseURL: baseUrls.anthropic }),\n });\n return anthropic(model) as ProviderLanguageModel;\n }\n\n case \"openai\": {\n const openai = createOpenAI({\n apiKey,\n ...(baseUrls?.openai && { baseURL: baseUrls.openai }),\n });\n return openai(model);\n }\n\n case \"deepseek\": {\n const deepseek = createDeepSeek({ apiKey });\n return deepseek(model) as ProviderLanguageModel;\n }\n\n case \"google\": {\n const google = createGoogleGenerativeAI({ apiKey });\n return google(model) as ProviderLanguageModel;\n }\n\n case \"ollama\": {\n // Normalize the base URL to ensure it ends with /api\n const raw = baseUrls?.ollama || \"http://127.0.0.1:11434/api\";\n const normalized = /\\/api\\/?$/.test(raw)\n ? raw\n : `${raw.replace(/\\/+$/, \"\")}/api`;\n const ollama = createOllama({ baseURL: normalized });\n return ollama(model) as unknown as ProviderLanguageModel;\n }\n\n case \"mistral\": {\n const mistral = createMistral({ apiKey });\n return mistral(model) as ProviderLanguageModel;\n }\n\n case \"openrouter\": {\n const openrouter = createOpenRouter({ apiKey });\n return openrouter(model) as unknown as ProviderLanguageModel;\n }\n\n case \"xai\": {\n const xai = createXai({ apiKey });\n return xai(model) as ProviderLanguageModel;\n }\n\n case \"azure\": {\n const azure = createAzure({\n apiKey,\n baseURL: baseUrls?.azure,\n });\n return azure(model) as ProviderLanguageModel;\n }\n\n default: {\n const _exhaustiveCheck: never = provider;\n throw new Error(`Unhandled provider: ${_exhaustiveCheck}`);\n }\n }\n}\n\n/**\n * Parse a comma-separated string of model IDs into an array.\n * Handles whitespace and empty entries.\n */\nexport function parseModelIds(modelIdsString: string): string[] {\n return modelIdsString\n .split(\",\")\n .map((id) => id.trim())\n .filter((id) => id.length > 0);\n}\n\n/**\n * Create a CustomProvider configuration from user input.\n * This is a helper for building the configuration from form inputs.\n */\nexport function createCustomProvider(config: {\n name: string;\n protocol: \"openai-compatible\" | \"anthropic-compatible\";\n baseUrl: string;\n modelIds: string | string[];\n apiKey?: string;\n apiKeyEnvVar?: string;\n useChatCompletions?: boolean;\n}): CustomProvider {\n const modelIds = Array.isArray(config.modelIds)\n ? config.modelIds\n : parseModelIds(config.modelIds);\n\n if (modelIds.length === 0) {\n throw new Error(\"At least one model ID is required\");\n }\n\n if (!config.name || config.name.includes(\"/\")) {\n throw new Error(\"Provider name is required and cannot contain '/'\");\n }\n\n if (!config.baseUrl) {\n throw new Error(\"Base URL is required\");\n }\n\n return {\n name: config.name,\n protocol: config.protocol,\n baseUrl: config.baseUrl,\n modelIds,\n ...(config.apiKey && { apiKey: config.apiKey }),\n ...(config.apiKeyEnvVar && { apiKeyEnvVar: config.apiKeyEnvVar }),\n ...(config.useChatCompletions && {\n useChatCompletions: config.useChatCompletions,\n }),\n };\n}\n\n/**\n * Preset configurations for common OpenAI-compatible providers.\n * Users can use these as starting points and customize as needed.\n */\nexport const PROVIDER_PRESETS = {\n /** LiteLLM proxy - requires useChatCompletions */\n litellm: (\n baseUrl = \"http://localhost:4000\",\n modelIds: string[]\n ): CustomProvider => ({\n name: \"litellm\",\n protocol: \"openai-compatible\",\n baseUrl,\n modelIds,\n apiKeyEnvVar: \"LITELLM_API_KEY\",\n useChatCompletions: true,\n }),\n} as const;\n","/**\n * Tool extraction utilities for AI SDK generateText results\n */\n\nimport { GenerateTextResult, ToolSet } from \"ai\";\nimport type { ToolCall } from \"./types.js\";\n\n/**\n * Extract all tool calls from an AI SDK generateText result.\n * Collects tool calls from all steps in the agentic loop.\n *\n * @param result - The result from AI SDK's generateText\n * @returns Array of ToolCall objects with toolName and arguments\n */\nexport function extractToolCalls(\n result: GenerateTextResult<ToolSet, never>\n): ToolCall[] {\n const toolCalls: ToolCall[] = [];\n\n // Extract from steps (multi-step agentic loop)\n if (result.steps && Array.isArray(result.steps)) {\n for (const step of result.steps) {\n if (step.toolCalls && Array.isArray(step.toolCalls)) {\n for (const tc of step.toolCalls) {\n toolCalls.push({\n toolName: tc.toolName,\n arguments: tc.input ?? {},\n });\n }\n }\n }\n }\n\n // If no steps, check top-level toolCalls (single-step result)\n if (\n toolCalls.length === 0 &&\n result.toolCalls &&\n Array.isArray(result.toolCalls)\n ) {\n for (const tc of result.toolCalls) {\n toolCalls.push({\n toolName: tc.toolName,\n arguments: tc.input ?? {},\n });\n }\n }\n\n return toolCalls;\n}\n\n/**\n * Extract tool names from an AI SDK generateText result.\n * Convenience function that returns just the tool names.\n *\n * @param result - The result from AI SDK's generateText\n * @returns Array of tool names that were called\n */\nexport function extractToolNames(\n result: GenerateTextResult<ToolSet, never>\n): string[] {\n return extractToolCalls(result).map((tc) => tc.toolName);\n}\n","/**\n * PromptResult class - wraps the result of a TestAgent prompt\n */\n\nimport type {\n ToolCall,\n TokenUsage,\n PromptResultData,\n LatencyBreakdown,\n CoreMessage,\n CoreUserMessage,\n CoreAssistantMessage,\n CoreToolMessage,\n} from \"./types.js\";\n\n/**\n * Represents the result of a TestAgent prompt.\n * Provides convenient methods to inspect tool calls, token usage, and errors.\n */\nexport class PromptResult {\n /** The original prompt/query that was sent */\n readonly prompt: string;\n\n /** The text response from the LLM */\n readonly text: string;\n\n /** The full conversation history */\n private readonly _messages: CoreMessage[];\n\n /** Latency breakdown (e2e, llm, mcp) */\n private readonly _latency: LatencyBreakdown;\n\n /** Tool calls made during the prompt */\n private readonly _toolCalls: ToolCall[];\n\n /** Token usage statistics */\n private readonly _usage: TokenUsage;\n\n /** Error message if the prompt failed */\n private readonly _error?: string;\n\n /**\n * Create a new PromptResult\n * @param data - The raw prompt result data\n */\n constructor(data: PromptResultData) {\n this.prompt = data.prompt;\n this._messages = data.messages;\n this.text = data.text;\n this._latency = data.latency;\n this._toolCalls = data.toolCalls;\n this._usage = data.usage;\n this._error = data.error;\n }\n\n /**\n * Get the original query/prompt that was sent.\n *\n * @returns The original prompt string\n */\n getPrompt(): string {\n return this.prompt;\n }\n\n /**\n * Get the full conversation history (user, assistant, tool messages).\n * Returns a copy to prevent external modification.\n *\n * @returns Array of CoreMessage objects\n */\n getMessages(): CoreMessage[] {\n return [...this._messages];\n }\n\n /**\n * Get only user messages from the conversation.\n *\n * @returns Array of CoreUserMessage objects\n */\n getUserMessages(): CoreUserMessage[] {\n return this._messages.filter(\n (m): m is CoreUserMessage => m.role === \"user\"\n );\n }\n\n /**\n * Get only assistant messages from the conversation.\n *\n * @returns Array of CoreAssistantMessage objects\n */\n getAssistantMessages(): CoreAssistantMessage[] {\n return this._messages.filter(\n (m): m is CoreAssistantMessage => m.role === \"assistant\"\n );\n }\n\n /**\n * Get only tool result messages from the conversation.\n *\n * @returns Array of CoreToolMessage objects\n */\n getToolMessages(): CoreToolMessage[] {\n return this._messages.filter(\n (m): m is CoreToolMessage => m.role === \"tool\"\n );\n }\n\n /**\n * Get the end-to-end latency in milliseconds.\n * This is the total wall-clock time for the prompt.\n *\n * @returns End-to-end latency in milliseconds\n */\n e2eLatencyMs(): number {\n return this._latency.e2eMs;\n }\n\n /**\n * Get the LLM API latency in milliseconds.\n * This is the time spent waiting for LLM responses (excluding tool execution).\n *\n * @returns LLM latency in milliseconds\n */\n llmLatencyMs(): number {\n return this._latency.llmMs;\n }\n\n /**\n * Get the MCP tool execution latency in milliseconds.\n * This is the time spent executing MCP tools.\n *\n * @returns MCP tool latency in milliseconds\n */\n mcpLatencyMs(): number {\n return this._latency.mcpMs;\n }\n\n /**\n * Get the full latency breakdown.\n *\n * @returns LatencyBreakdown object with e2eMs, llmMs, and mcpMs\n */\n getLatency(): LatencyBreakdown {\n return { ...this._latency };\n }\n\n /**\n * Get the names of all tools that were called during this prompt.\n * Returns a standard string[] that can be used with .includes().\n *\n * @returns Array of tool names\n */\n toolsCalled(): string[] {\n return this._toolCalls.map((tc) => tc.toolName);\n }\n\n /**\n * Check if a specific tool was called during this prompt.\n * Case-sensitive exact match.\n *\n * @param toolName - The name of the tool to check for\n * @returns true if the tool was called\n */\n hasToolCall(toolName: string): boolean {\n return this._toolCalls.some((tc) => tc.toolName === toolName);\n }\n\n /**\n * Get all tool calls with their arguments.\n *\n * @returns Array of ToolCall objects\n */\n getToolCalls(): ToolCall[] {\n return [...this._toolCalls];\n }\n\n /**\n * Get the arguments passed to a specific tool call.\n * Returns undefined if the tool was not called.\n * If the tool was called multiple times, returns the first call's arguments.\n *\n * @param toolName - The name of the tool\n * @returns The arguments object or undefined\n */\n getToolArguments(toolName: string): Record<string, unknown> | undefined {\n const call = this._toolCalls.find((tc) => tc.toolName === toolName);\n return call?.arguments;\n }\n\n /**\n * Get the total number of tokens used.\n *\n * @returns Total tokens (input + output)\n */\n totalTokens(): number {\n return this._usage.totalTokens;\n }\n\n /**\n * Get the number of input tokens used.\n *\n * @returns Input token count\n */\n inputTokens(): number {\n return this._usage.inputTokens;\n }\n\n /**\n * Get the number of output tokens used.\n *\n * @returns Output token count\n */\n outputTokens(): number {\n return this._usage.outputTokens;\n }\n\n /**\n * Get the full token usage statistics.\n *\n * @returns TokenUsage object\n */\n getUsage(): TokenUsage {\n return { ...this._usage };\n }\n\n /**\n * Check if this prompt resulted in an error.\n *\n * @returns true if there was an error\n */\n hasError(): boolean {\n return this._error !== undefined;\n }\n\n /**\n * Get the error message if the prompt failed.\n *\n * @returns The error message or undefined\n */\n getError(): string | undefined {\n return this._error;\n }\n\n /**\n * Create a PromptResult from raw data.\n * Factory method for convenience.\n *\n * @param data - The raw prompt result data\n * @returns A new PromptResult instance\n */\n static from(data: PromptResultData): PromptResult {\n return new PromptResult(data);\n }\n\n /**\n * Create an error PromptResult.\n * Factory method for error cases.\n *\n * @param error - The error message\n * @param latency - The latency breakdown or e2e time in milliseconds\n * @returns A new PromptResult instance with error state\n */\n static error(\n error: string,\n latency: LatencyBreakdown | number = 0,\n prompt: string = \"\"\n ): PromptResult {\n const latencyBreakdown: LatencyBreakdown =\n typeof latency === \"number\"\n ? { e2eMs: latency, llmMs: 0, mcpMs: 0 }\n : latency;\n\n return new PromptResult({\n prompt,\n messages: [],\n text: \"\",\n toolCalls: [],\n usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n latency: latencyBreakdown,\n error,\n });\n }\n\n /**\n * Format the conversation trace as a JSON string.\n * Useful for debugging failed evaluations.\n *\n * @returns A JSON string of the conversation messages\n */\n formatTrace(): string {\n return JSON.stringify(this._messages, null, 2);\n }\n}\n","/**\n * TestAgent - Runs LLM prompts with tool calling for evals\n */\n\nimport { generateText, stepCountIs, dynamicTool, jsonSchema } from \"ai\";\nimport type { ToolSet, ModelMessage, UserModelMessage } from \"ai\";\nimport { CallToolResultSchema } from \"@modelcontextprotocol/sdk/types.js\";\nimport { createModelFromString } from \"./model-factory.js\";\nimport type { CreateModelOptions } from \"./model-factory.js\";\nimport { extractToolCalls } from \"./tool-extraction.js\";\nimport { PromptResult } from \"./PromptResult.js\";\nimport type { CustomProvider } from \"./types.js\";\nimport type { Tool, AiSdkTool } from \"./mcp-client-manager/types.js\";\nimport { ensureJsonSchemaObject } from \"./mcp-client-manager/tool-converters.js\";\n\n/**\n * Configuration for creating a TestAgent\n */\nexport interface TestAgentConfig {\n /** Tools to provide to the LLM (Tool[] from manager.getTools() or AiSdkTool from manager.getToolsForAiSdk()) */\n tools: Tool[] | AiSdkTool;\n /** LLM provider and model string (e.g., \"openai/gpt-4o\", \"anthropic/claude-3-5-sonnet-20241022\") */\n model: string;\n /** API key for the LLM provider */\n apiKey: string;\n /** System prompt for the LLM (default: \"You are a helpful assistant.\") */\n systemPrompt?: string;\n /** Temperature for LLM responses (0-2). If undefined, uses model default. Some models (e.g., reasoning models) don't support temperature. */\n temperature?: number;\n /** Maximum number of agentic steps/tool calls (default: 10) */\n maxSteps?: number;\n /** Custom providers registry for non-standard LLM providers */\n customProviders?:\n | Map<string, CustomProvider>\n | Record<string, CustomProvider>;\n}\n\n/**\n * Options for the prompt() method\n */\nexport interface PromptOptions {\n /** Previous PromptResult(s) to include as conversation context for multi-turn conversations */\n context?: PromptResult | PromptResult[];\n}\n\n/**\n * Type guard to check if tools is Tool[] (from getTools())\n */\nfunction isToolArray(tools: Tool[] | AiSdkTool): tools is Tool[] {\n return Array.isArray(tools);\n}\n\n/**\n * Converts Tool[] to AI SDK ToolSet format\n */\nfunction convertToToolSet(tools: Tool[]): ToolSet {\n const toolSet: ToolSet = {};\n for (const tool of tools) {\n // Filter out app-only tools (visibility: [\"app\"]) per SEP-1865\n const visibility = (tool._meta?.ui as any)?.visibility as\n | Array<\"model\" | \"app\">\n | undefined;\n if (visibility && visibility.length === 1 && visibility[0] === \"app\") {\n continue;\n }\n\n const converted = dynamicTool({\n description: tool.description,\n inputSchema: jsonSchema(ensureJsonSchemaObject(tool.inputSchema)),\n execute: async (args, options) => {\n options?.abortSignal?.throwIfAborted?.();\n const result = await tool.execute(args as Record<string, unknown>);\n return CallToolResultSchema.parse(result);\n },\n });\n\n // Preserve _serverId like getToolsForAiSdk() does\n if (tool._meta?._serverId) {\n (converted as any)._serverId = tool._meta._serverId;\n }\n\n toolSet[tool.name] = converted;\n }\n return toolSet;\n}\n\n/**\n * Agent for running LLM prompts with tool calling.\n * Wraps the AI SDK generateText function with proper tool integration.\n *\n * @example\n * ```typescript\n * const manager = new MCPClientManager({\n * everything: { command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-everything\"] },\n * });\n * await manager.connectToServer(\"everything\");\n *\n * const agent = new TestAgent({\n * tools: await manager.getToolsForAiSdk([\"everything\"]),\n * model: \"openai/gpt-4o\",\n * apiKey: process.env.OPENAI_API_KEY!,\n * });\n *\n * const result = await agent.prompt(\"Add 2 and 3\");\n * console.log(result.toolsCalled()); // [\"add\"]\n * console.log(result.text); // \"The result of adding 2 and 3 is 5.\"\n * ```\n */\nexport class TestAgent {\n private readonly tools: ToolSet;\n private readonly model: string;\n private readonly apiKey: string;\n private systemPrompt: string;\n private temperature: number | undefined;\n private readonly maxSteps: number;\n private readonly customProviders?:\n | Map<string, CustomProvider>\n | Record<string, CustomProvider>;\n\n /** The result of the last prompt (for toolsCalled() convenience method) */\n private lastResult: PromptResult | undefined;\n\n /** History of all prompt results during a test execution */\n private promptHistory: PromptResult[] = [];\n\n /**\n * Create a new TestAgent\n * @param config - Agent configuration\n */\n constructor(config: TestAgentConfig) {\n // Convert Tool[] to ToolSet if needed\n this.tools = isToolArray(config.tools)\n ? convertToToolSet(config.tools)\n : config.tools;\n this.model = config.model;\n this.apiKey = config.apiKey;\n this.systemPrompt = config.systemPrompt ?? \"You are a helpful assistant.\";\n this.temperature = config.temperature;\n this.maxSteps = config.maxSteps ?? 10;\n this.customProviders = config.customProviders;\n }\n\n /**\n * Create instrumented tools that track execution latency.\n * @param onLatency - Callback to report latency for each tool execution\n * @returns ToolSet with instrumented execute functions\n */\n private createInstrumentedTools(onLatency: (ms: number) => void): ToolSet {\n const instrumented: ToolSet = {};\n for (const [name, tool] of Object.entries(this.tools)) {\n // Only instrument tools that have an execute function\n if (tool.execute) {\n const originalExecute = tool.execute;\n instrumented[name] = {\n ...tool,\n execute: async (args: any, options: any) => {\n const start = Date.now();\n try {\n return await originalExecute(args, options);\n } finally {\n onLatency(Date.now() - start);\n }\n },\n };\n } else {\n // Pass through tools without execute function unchanged\n instrumented[name] = tool;\n }\n }\n return instrumented;\n }\n\n /**\n * Build an array of ModelMessages from previous PromptResult(s) for multi-turn context.\n * @param context - Single PromptResult or array of PromptResults to include as context\n * @returns Array of ModelMessages representing the conversation history\n */\n private buildContextMessages(\n context: PromptResult | PromptResult[] | undefined\n ): ModelMessage[] {\n if (!context) {\n return [];\n }\n\n const results = Array.isArray(context) ? context : [context];\n const messages: ModelMessage[] = [];\n\n for (const result of results) {\n // Get all messages from this prompt result (user message + assistant/tool responses)\n messages.push(...result.getMessages());\n }\n\n return messages;\n }\n\n /**\n * Run a prompt with the LLM, allowing tool calls.\n * Never throws - errors are returned in the PromptResult.\n *\n * @param message - The user message to send to the LLM\n * @param options - Optional settings including context for multi-turn conversations\n * @returns PromptResult with text response, tool calls, token usage, and latency breakdown\n *\n * @example\n * // Single-turn (default)\n * const result = await agent.prompt(\"Show me workspaces\");\n *\n * @example\n * // Multi-turn with context\n * const r1 = await agent.prompt(\"Show me workspaces\");\n * const r2 = await agent.prompt(\"Now show tasks\", { context: r1 });\n *\n * @example\n * // Multi-turn with multiple context results\n * const r1 = await agent.prompt(\"Show workspaces\");\n * const r2 = await agent.prompt(\"Pick the first\", { context: r1 });\n * const r3 = await agent.prompt(\"Show tasks\", { context: [r1, r2] });\n */\n async prompt(\n message: string,\n options?: PromptOptions\n ): Promise<PromptResult> {\n const startTime = Date.now();\n let totalMcpMs = 0;\n let lastStepEndTime = startTime;\n let totalLlmMs = 0;\n let stepMcpMs = 0; // MCP time within current step\n\n try {\n const modelOptions: CreateModelOptions = {\n apiKey: this.apiKey,\n customProviders: this.customProviders,\n };\n const model = createModelFromString(this.model, modelOptions);\n\n // Instrument tools to track MCP execution time\n const instrumentedTools = this.createInstrumentedTools((ms) => {\n totalMcpMs += ms;\n stepMcpMs += ms; // Accumulate per-step for LLM calculation\n });\n\n // Build messages array if context is provided for multi-turn\n const contextMessages = this.buildContextMessages(options?.context);\n const userMessage: UserModelMessage = { role: \"user\", content: message };\n\n // Cast model to any to handle AI SDK version compatibility\n const result = await generateText({\n model: model as any,\n tools: instrumentedTools,\n system: this.systemPrompt,\n // Use messages array for multi-turn, simple prompt for single-turn\n ...(contextMessages.length > 0\n ? { messages: [...contextMessages, userMessage] }\n : { prompt: message }),\n // Only include temperature if explicitly set (some models like reasoning models don't support it)\n ...(this.temperature !== undefined && {\n temperature: this.temperature,\n }),\n // Use stopWhen with stepCountIs for controlling max agentic steps\n // AI SDK v6+ uses this instead of maxSteps\n stopWhen: stepCountIs(this.maxSteps),\n onStepFinish: () => {\n const now = Date.now();\n const stepDuration = now - lastStepEndTime;\n // LLM time for this step = step duration - MCP time in this step\n totalLlmMs += Math.max(0, stepDuration - stepMcpMs);\n lastStepEndTime = now;\n stepMcpMs = 0; // Reset for next step\n },\n });\n\n const e2eMs = Date.now() - startTime;\n const toolCalls = extractToolCalls(result);\n const usage = result.totalUsage ?? result.usage;\n const inputTokens = usage?.inputTokens ?? 0;\n const outputTokens = usage?.outputTokens ?? 0;\n\n const messages: ModelMessage[] = [];\n messages.push(userMessage);\n\n // Add response messages (assistant + tool messages from agentic loop)\n if (result.response?.messages) {\n messages.push(...result.response.messages);\n }\n\n this.lastResult = PromptResult.from({\n prompt: message,\n messages,\n text: result.text,\n toolCalls,\n usage: {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n },\n latency: { e2eMs, llmMs: totalLlmMs, mcpMs: totalMcpMs },\n });\n\n this.promptHistory.push(this.lastResult);\n return this.lastResult;\n } catch (error) {\n const e2eMs = Date.now() - startTime;\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n this.lastResult = PromptResult.error(\n errorMessage,\n {\n e2eMs,\n llmMs: totalLlmMs,\n mcpMs: totalMcpMs,\n },\n message\n );\n this.promptHistory.push(this.lastResult);\n return this.lastResult;\n }\n }\n\n /**\n * Get the names of tools called in the last prompt.\n * Convenience method for quick checks in eval functions.\n *\n * @returns Array of tool names from the last prompt, or empty array if no prompt has been run\n */\n toolsCalled(): string[] {\n if (!this.lastResult) {\n return [];\n }\n return this.lastResult.toolsCalled();\n }\n\n /**\n * Create a new TestAgent with modified options.\n * Useful for creating variants for different test scenarios.\n *\n * @param options - Partial config to override\n * @returns A new TestAgent instance with the merged configuration\n */\n withOptions(options: Partial<TestAgentConfig>): TestAgent {\n return new TestAgent({\n tools: options.tools ?? this.tools,\n model: options.model ?? this.model,\n apiKey: options.apiKey ?? this.apiKey,\n systemPrompt: options.systemPrompt ?? this.systemPrompt,\n temperature: options.temperature ?? this.temperature,\n maxSteps: options.maxSteps ?? this.maxSteps,\n customProviders: options.customProviders ?? this.customProviders,\n });\n }\n\n /**\n * Get the configured tools\n */\n getTools(): ToolSet {\n return this.tools;\n }\n\n /**\n * Get the LLM provider/model string\n */\n getModel(): string {\n return this.model;\n }\n\n /**\n * Get the API key\n */\n getApiKey(): string {\n return this.apiKey;\n }\n\n /**\n * Get the current system prompt\n */\n getSystemPrompt(): string {\n return this.systemPrompt;\n }\n\n /**\n * Set a new system prompt\n */\n setSystemPrompt(prompt: string): void {\n this.systemPrompt = prompt;\n }\n\n /**\n * Get the current temperature (undefined means model default)\n */\n getTemperature(): number | undefined {\n return this.temperature;\n }\n\n /**\n * Set the temperature (must be between 0 and 2)\n */\n setTemperature(temperature: number): void {\n if (temperature < 0 || temperature > 2) {\n throw new Error(\"Temperature must be between 0 and 2\");\n }\n this.temperature = temperature;\n }\n\n /**\n * Get the max steps configuration\n */\n getMaxSteps(): number {\n return this.maxSteps;\n }\n\n /**\n * Get the result of the last prompt\n */\n getLastResult(): PromptResult | undefined {\n return this.lastResult;\n }\n\n /**\n * Reset the prompt history.\n * Call this before each test iteration to clear previous results.\n */\n resetPromptHistory(): void {\n this.promptHistory = [];\n }\n\n /**\n * Get the history of all prompt results since the last reset.\n * Returns a copy of the array to prevent external modification.\n */\n getPromptHistory(): PromptResult[] {\n return [...this.promptHistory];\n }\n}\n","/**\n * Validators for matching tool calls in eval tests\n *\n * All matching is case-sensitive and uses exact strings only (no wildcards).\n */\n\nimport type { ToolCall } from \"./types.js\";\n\n/**\n * Exact match - all expected tools must be present in exact order.\n * Case-sensitive exact string comparison.\n *\n * @param expected - The expected tool names in order\n * @param actual - The actual tool names that were called\n * @returns true if actual matches expected exactly\n *\n * @example\n * matchToolCalls(['add', 'multiply'], ['add', 'multiply']) // true\n * matchToolCalls(['add', 'multiply'], ['multiply', 'add']) // false (wrong order)\n * matchToolCalls(['add'], ['add', 'multiply']) // false (extra tool)\n */\nexport function matchToolCalls(expected: string[], actual: string[]): boolean {\n if (expected.length !== actual.length) {\n return false;\n }\n\n for (let i = 0; i < expected.length; i++) {\n if (expected[i] !== actual[i]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Subset match - all expected tools must be present, order doesn't matter.\n * Case-sensitive exact string comparison.\n *\n * @param expected - The expected tool names (any order)\n * @param actual - The actual tool names that were called\n * @returns true if all expected tools are present in actual\n *\n * @example\n * matchToolCallsSubset(['add', 'multiply'], ['multiply', 'add']) // true\n * matchToolCallsSubset(['add'], ['add', 'multiply']) // true\n * matchToolCallsSubset(['add', 'subtract'], ['add', 'multiply']) // false (missing subtract)\n */\nexport function matchToolCallsSubset(\n expected: string[],\n actual: string[]\n): boolean {\n for (const tool of expected) {\n if (!actual.includes(tool)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Any match - at least one expected tool must be present.\n * Case-sensitive exact string comparison.\n *\n * @param expected - The expected tool names (at least one must match)\n * @param actual - The actual tool names that were called\n * @returns true if at least one expected tool is present in actual\n *\n * @example\n * matchAnyToolCall(['add', 'subtract'], ['multiply', 'add']) // true\n * matchAnyToolCall(['add', 'subtract'], ['multiply', 'divide']) // false\n * matchAnyToolCall([], ['add']) // false (empty expected)\n */\nexport function matchAnyToolCall(\n expected: string[],\n actual: string[]\n): boolean {\n if (expected.length === 0) {\n return false;\n }\n\n for (const tool of expected) {\n if (actual.includes(tool)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Count match - check if a specific tool was called exactly N times.\n * Case-sensitive exact string comparison.\n *\n * @param toolName - The tool name to count\n * @param actual - The actual tool names that were called\n * @param count - The expected number of times the tool should be called\n * @returns true if the tool was called exactly count times\n *\n * @example\n * matchToolCallCount('add', ['add', 'add', 'multiply'], 2) // true\n * matchToolCallCount('add', ['add', 'multiply'], 2) // false\n */\nexport function matchToolCallCount(\n toolName: string,\n actual: string[],\n count: number\n): boolean {\n const actualCount = actual.filter((t) => t === toolName).length;\n return actualCount === count;\n}\n\n/**\n * No tools match - check that no tools were called.\n *\n * @param actual - The actual tool names that were called\n * @returns true if no tools were called\n *\n * @example\n * matchNoToolCalls([]) // true\n * matchNoToolCalls(['add']) // false\n */\nexport function matchNoToolCalls(actual: string[]): boolean {\n return actual.length === 0;\n}\n\n// === Argument-based validators (Phase 2.5) ===\n\n/**\n * Deep equality check that is key-order independent for objects.\n * Handles objects, arrays, and primitives.\n */\nfunction deepEqual(a: unknown, b: unknown): boolean {\n // Handle primitives and null\n if (a === b) {\n return true;\n }\n\n // Handle null/undefined cases\n if (a === null || b === null || a === undefined || b === undefined) {\n return false;\n }\n\n // Handle different types\n if (typeof a !== typeof b) {\n return false;\n }\n\n // Handle arrays\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n\n // Handle array vs non-array mismatch\n if (Array.isArray(a) || Array.isArray(b)) {\n return false;\n }\n\n // Handle objects (key-order independent)\n if (typeof a === \"object\" && typeof b === \"object\") {\n const aKeys = Object.keys(a as Record<string, unknown>);\n const bKeys = Object.keys(b as Record<string, unknown>);\n\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n\n for (const key of aKeys) {\n if (\n !Object.prototype.hasOwnProperty.call(b, key) ||\n !deepEqual(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key]\n )\n ) {\n return false;\n }\n }\n return true;\n }\n\n return false;\n}\n\n/**\n * Check if tool was called with exact arguments (deep equality).\n * Returns true if any call to the tool has exactly matching arguments.\n * Case-sensitive for tool names.\n *\n * @param toolName - The tool name to match\n * @param expectedArgs - The expected arguments (exact match)\n * @param toolCalls - The actual tool calls made\n * @returns true if any call to the tool has exactly matching arguments\n *\n * @example\n * matchToolCallWithArgs('add', {a: 2, b: 3}, toolCalls) // true if add({a:2, b:3}) was called\n * matchToolCallWithArgs('add', {a: 2}, [{toolName:'add', arguments:{a:2, b:3}}]) // false (extra arg)\n */\nexport function matchToolCallWithArgs(\n toolName: string,\n expectedArgs: Record<string, unknown>,\n toolCalls: ToolCall[]\n): boolean {\n for (const call of toolCalls) {\n if (call.toolName === toolName && deepEqual(call.arguments, expectedArgs)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if tool was called with at least these arguments (partial match).\n * Allows extra arguments in the actual call.\n * Case-sensitive for tool names.\n *\n * @param toolName - The tool name to match\n * @param expectedArgs - The expected arguments (partial match)\n * @param toolCalls - The actual tool calls made\n * @returns true if any call to the tool contains all expected arguments\n *\n * @example\n * matchToolCallWithPartialArgs('add', {a: 2}, [{toolName:'add', arguments:{a:2, b:3}}]) // true\n * matchToolCallWithPartialArgs('add', {a: 2, c: 5}, [{toolName:'add', arguments:{a:2, b:3}}]) // false\n */\nexport function matchToolCallWithPartialArgs(\n toolName: string,\n expectedArgs: Record<string, unknown>,\n toolCalls: ToolCall[]\n): boolean {\n for (const call of toolCalls) {\n if (call.toolName !== toolName) {\n continue;\n }\n\n let allMatch = true;\n for (const [key, expectedValue] of Object.entries(expectedArgs)) {\n if (\n !(key in call.arguments) ||\n !deepEqual(call.arguments[key], expectedValue)\n ) {\n allMatch = false;\n break;\n }\n }\n\n if (allMatch) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if a specific argument has a specific value in any call to the tool.\n * Case-sensitive for tool names.\n *\n * @param toolName - The tool name to match\n * @param argKey - The argument key to check\n * @param expectedValue - The expected value for the argument\n * @param toolCalls - The actual tool calls made\n * @returns true if any call to the tool has the specified argument value\n *\n * @example\n * matchToolArgument('add', 'a', 2, toolCalls) // true if any add() call had a=2\n */\nexport function matchToolArgument(\n toolName: string,\n argKey: string,\n expectedValue: unknown,\n toolCalls: ToolCall[]\n): boolean {\n for (const call of toolCalls) {\n if (\n call.toolName === toolName &&\n argKey in call.arguments &&\n deepEqual(call.arguments[argKey], expectedValue)\n ) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if argument value matches a predicate function.\n * Useful for partial matches, type checks, or range validation.\n * Case-sensitive for tool names.\n *\n * @param toolName - The tool name to match\n * @param argKey - The argument key to check\n * @param predicate - Function that tests the argument value\n * @param toolCalls - The actual tool calls made\n * @returns true if any call to the tool has an argument value that passes the predicate\n *\n * @example\n * matchToolArgumentWith('echo', 'message', (v) => typeof v === 'string' && v.includes('hello'), toolCalls)\n * matchToolArgumentWith('add', 'a', (v) => typeof v === 'number' && v > 0, toolCalls)\n */\nexport function matchToolArgumentWith(\n toolName: string,\n argKey: string,\n predicate: (value: unknown) => boolean,\n toolCalls: ToolCall[]\n): boolean {\n for (const call of toolCalls) {\n if (call.toolName === toolName && argKey in call.arguments) {\n if (predicate(call.arguments[argKey])) {\n return true;\n }\n }\n }\n return false;\n}\n","/**\n * Percentile calculation utilities for latency statistics\n */\n\n/**\n * Calculate a specific percentile from sorted values.\n *\n * @param sortedValues - Array of numbers sorted in ascending order\n * @param percentile - The percentile to calculate (0-100)\n * @returns The percentile value\n * @throws Error if array is empty or percentile is out of range\n */\nexport function calculatePercentile(\n sortedValues: number[],\n percentile: number\n): number {\n if (sortedValues.length === 0) {\n throw new Error(\"Cannot calculate percentile of empty array\");\n }\n if (percentile < 0 || percentile > 100) {\n throw new Error(\"Percentile must be between 0 and 100\");\n }\n\n const index = (percentile / 100) * (sortedValues.length - 1);\n const lowerIndex = Math.floor(index);\n const upperIndex = Math.ceil(index);\n\n if (lowerIndex === upperIndex) {\n return sortedValues[lowerIndex];\n }\n\n // Linear interpolation between the two values\n const weight = index - lowerIndex;\n return (\n sortedValues[lowerIndex] * (1 - weight) + sortedValues[upperIndex] * weight\n );\n}\n\n/**\n * Statistics for latency values\n */\nexport interface LatencyStats {\n /** Minimum value */\n min: number;\n /** Maximum value */\n max: number;\n /** Mean (average) value */\n mean: number;\n /** 50th percentile (median) */\n p50: number;\n /** 95th percentile */\n p95: number;\n /** Number of values */\n count: number;\n}\n\n/**\n * Calculate comprehensive latency statistics for a set of values.\n *\n * @param values - Array of latency values (milliseconds)\n * @returns LatencyStats object with min, max, mean, p50, p95, and count\n * @throws Error if array is empty\n */\nexport function calculateLatencyStats(values: number[]): LatencyStats {\n if (values.length === 0) {\n throw new Error(\"Cannot calculate stats of empty array\");\n }\n\n const sorted = [...values].sort((a, b) => a - b);\n const sum = values.reduce((acc, val) => acc + val, 0);\n\n return {\n min: sorted[0],\n max: sorted[sorted.length - 1],\n mean: sum / values.length,\n p50: calculatePercentile(sorted, 50),\n p95: calculatePercentile(sorted, 95),\n count: values.length,\n };\n}\n","import { PostHog } from \"posthog-node\";\n\nexport const posthog = new PostHog(\n \"phc_dTOPniyUNU2kD8Jx8yHMXSqiZHM8I91uWopTMX6EBE9\",\n {\n host: \"https://us.i.posthog.com\",\n }\n);\n","import type { TestAgent } from \"./TestAgent.js\";\nimport type { PromptResult } from \"./PromptResult.js\";\nimport type { LatencyBreakdown } from \"./types.js\";\nimport { calculateLatencyStats, type LatencyStats } from \"./percentiles.js\";\nimport { posthog } from \"./telemetry.js\";\n\n/**\n * Configuration for an EvalTest\n *\n * All tests use the multi-turn pattern with a test function that receives a TestAgent.\n */\nexport interface EvalTestConfig {\n name: string;\n test: (agent: TestAgent) => boolean | Promise<boolean>;\n}\n\n/**\n * Options for running an EvalTest\n */\nexport interface EvalTestRunOptions {\n iterations: number;\n concurrency?: number; // default: 5\n retries?: number; // default: 0\n timeoutMs?: number; // default: 30000\n onProgress?: (completed: number, total: number) => void;\n /** Called with a failure report if any iterations fail */\n onFailure?: (report: string) => void;\n}\n\n/**\n * Result details for a single iteration\n */\nexport interface IterationResult {\n passed: boolean;\n latencies: LatencyBreakdown[];\n tokens: { total: number; input: number; output: number };\n error?: string;\n retryCount?: number;\n /** The prompt results from this iteration */\n prompts?: PromptResult[];\n}\n\n/**\n * Result of running an EvalTest\n */\nexport interface EvalRunResult {\n iterations: number;\n successes: number;\n failures: number;\n results: boolean[];\n iterationDetails: IterationResult[];\n tokenUsage: {\n total: number;\n input: number;\n output: number;\n perIteration: { total: number; input: number; output: number }[];\n };\n latency: {\n e2e: LatencyStats;\n llm: LatencyStats;\n mcp: LatencyStats;\n perIteration: LatencyBreakdown[];\n };\n}\n\n/**\n * Semaphore for controlling concurrency\n */\nclass Semaphore {\n private permits: number;\n private waiting: (() => void)[] = [];\n\n constructor(permits: number) {\n this.permits = permits;\n }\n\n async acquire(): Promise<void> {\n if (this.permits > 0) {\n this.permits--;\n return;\n }\n await new Promise<void>((resolve) => this.waiting.push(resolve));\n }\n\n release(): void {\n const next = this.waiting.shift();\n if (next) {\n next();\n } else {\n this.permits++;\n }\n }\n}\n\n/**\n * Timeout wrapper for promises\n */\nfunction withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`Operation timed out after ${ms}ms`));\n }, ms);\n\n promise\n .then((value) => {\n clearTimeout(timer);\n resolve(value);\n })\n .catch((error) => {\n clearTimeout(timer);\n reject(error);\n });\n });\n}\n\n/**\n * Sleep for a given number of milliseconds\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * EvalTest - Runs a single test scenario with iterations\n *\n * Can be run standalone or as part of an EvalSuite.\n *\n * @example\n * ```ts\n * const test = new EvalTest({\n * name: \"addition\",\n * test: async (agent) => {\n * const result = await agent.prompt(\"Add 2+3\");\n * return result.hasToolCall(\"add\");\n * },\n * });\n * await test.run(agent, { iterations: 30 });\n * console.log(test.accuracy()); // 0.97\n * ```\n */\nexport class EvalTest {\n private config: EvalTestConfig;\n private lastRunResult: EvalRunResult | null = null;\n\n constructor(config: EvalTestConfig) {\n if (!config.test) {\n throw new Error(\"Invalid config: must provide 'test' function\");\n }\n this.config = config;\n }\n\n /**\n * Run this test with the given agent and options\n */\n async run(\n agent: TestAgent,\n options: EvalTestRunOptions\n ): Promise<EvalRunResult> {\n posthog.capture({\n event: \"eval_test_run_triggered\",\n properties: {\n iterations: options.iterations,\n concurrency: options.concurrency ?? 5,\n },\n });\n const concurrency = options.concurrency ?? 5;\n const retries = options.retries ?? 0;\n const timeoutMs = options.timeoutMs ?? 30000;\n const onProgress = options.onProgress;\n\n const semaphore = new Semaphore(concurrency);\n let completedCount = 0;\n\n const testFn = this.config.test;\n const iterationResults: IterationResult[] = [];\n const total = options.iterations;\n\n const runSingleIteration = async (): Promise<IterationResult> => {\n await semaphore.acquire();\n try {\n let lastError: string | undefined;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n // Create a fresh agent clone for this iteration to avoid race conditions\n // when multiple iterations run concurrently\n const iterationAgent = agent.withOptions({});\n\n const passed = await withTimeout(\n Promise.resolve(testFn(iterationAgent)),\n timeoutMs\n );\n\n // Get metrics from this iteration's prompt history\n const promptResults = iterationAgent.getPromptHistory();\n const latencies = promptResults.map((r) => r.getLatency());\n const tokens = {\n total: promptResults.reduce((sum, r) => sum + r.totalTokens(), 0),\n input: promptResults.reduce((sum, r) => sum + r.inputTokens(), 0),\n output: promptResults.reduce(\n (sum, r) => sum + r.outputTokens(),\n 0\n ),\n };\n\n return {\n passed,\n latencies:\n latencies.length > 0\n ? latencies\n : [{ e2eMs: 0, llmMs: 0, mcpMs: 0 }],\n tokens,\n retryCount: attempt,\n prompts: promptResults,\n };\n } catch (error) {\n lastError = error instanceof Error ? error.message : String(error);\n\n if (attempt < retries) {\n await sleep(100 * Math.pow(2, attempt));\n }\n }\n }\n\n return {\n passed: false,\n latencies: [{ e2eMs: 0, llmMs: 0, mcpMs: 0 }],\n tokens: { total: 0, input: 0, output: 0 },\n error: lastError,\n retryCount: retries,\n };\n } finally {\n semaphore.release();\n const completed = ++completedCount;\n if (onProgress) {\n onProgress(completed, total);\n }\n }\n };\n\n const promises = Array.from({ length: options.iterations }, () =>\n runSingleIteration()\n );\n const results = await Promise.all(promises);\n iterationResults.push(...results);\n\n const runResult = this.aggregateResults(iterationResults);\n\n // Call onFailure callback if there are any failures\n if (options.onFailure && runResult.failures > 0) {\n options.onFailure(this.getFailureReport());\n }\n\n return runResult;\n }\n\n private aggregateResults(iterations: IterationResult[]): EvalRunResult {\n const allLatencies = iterations.flatMap((r) => r.latencies);\n\n // Handle empty latencies array\n const defaultStats: LatencyStats = {\n min: 0,\n max: 0,\n mean: 0,\n p50: 0,\n p95: 0,\n count: 0,\n };\n\n const e2eValues = allLatencies.map((l) => l.e2eMs);\n const llmValues = allLatencies.map((l) => l.llmMs);\n const mcpValues = allLatencies.map((l) => l.mcpMs);\n\n const successes = iterations.filter((r) => r.passed).length;\n const failures = iterations.filter((r) => !r.passed).length;\n\n this.lastRunResult = {\n iterations: iterations.length,\n successes,\n failures,\n results: iterations.map((r) => r.passed),\n iterationDetails: iterations,\n tokenUsage: {\n total: iterations.reduce((sum, r) => sum + r.tokens.total, 0),\n input: iterations.reduce((sum, r) => sum + r.tokens.input, 0),\n output: iterations.reduce((sum, r) => sum + r.tokens.output, 0),\n perIteration: iterations.map((r) => r.tokens),\n },\n latency: {\n e2e:\n e2eValues.length > 0\n ? calculateLatencyStats(e2eValues)\n : defaultStats,\n llm:\n llmValues.length > 0\n ? calculateLatencyStats(llmValues)\n : defaultStats,\n mcp:\n mcpValues.length > 0\n ? calculateLatencyStats(mcpValues)\n : defaultStats,\n perIteration: allLatencies,\n },\n };\n\n return this.lastRunResult;\n }\n\n /**\n * Get the accuracy of the last run (success rate)\n */\n accuracy(): number {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n return this.lastRunResult.successes / this.lastRunResult.iterations;\n }\n\n /**\n * Get the recall (true positive rate) of the last run\n */\n recall(): number {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n // In a basic eval context, recall equals accuracy\n return this.accuracy();\n }\n\n /**\n * Get the precision of the last run\n */\n precision(): number {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n // In a basic eval context, precision equals accuracy\n return this.accuracy();\n }\n\n /**\n * Get the true positive rate (same as recall)\n */\n truePositiveRate(): number {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n return this.recall();\n }\n\n /**\n * Get the false positive rate\n */\n falsePositiveRate(): number {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n return this.lastRunResult.failures / this.lastRunResult.iterations;\n }\n\n /**\n * Get the average token use per iteration\n */\n averageTokenUse(): number {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n if (this.lastRunResult.iterations === 0) {\n return 0;\n }\n return this.lastRunResult.tokenUsage.total / this.lastRunResult.iterations;\n }\n\n /**\n * Get the full results of the last run\n */\n getResults(): EvalRunResult | null {\n return this.lastRunResult;\n }\n\n /**\n * Get the name of this test\n */\n getName(): string {\n return this.config.name;\n }\n\n /**\n * Get the configuration of this test\n */\n getConfig(): EvalTestConfig {\n return this.config;\n }\n\n /**\n * Get all iteration details from the last run\n */\n getAllIterations(): IterationResult[] {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n return [...this.lastRunResult.iterationDetails];\n }\n\n /**\n * Get only the failed iterations from the last run\n */\n getFailedIterations(): IterationResult[] {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n return this.lastRunResult.iterationDetails.filter((r) => !r.passed);\n }\n\n /**\n * Get only the successful iterations from the last run\n */\n getSuccessfulIterations(): IterationResult[] {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n return this.lastRunResult.iterationDetails.filter((r) => r.passed);\n }\n\n /**\n * Get a failure report with traces from all failed iterations.\n * Useful for debugging why evaluations failed.\n *\n * @returns A formatted string with failure details\n */\n getFailureReport(): string {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n\n const failedIterations = this.getFailedIterations();\n if (failedIterations.length === 0) {\n return \"No failures.\";\n }\n\n const reports = failedIterations.map((iteration, index) => {\n const header = `=== Failed Iteration ${index + 1}/${failedIterations.length} ===`;\n const error = iteration.error ? `Error: ${iteration.error}` : \"\";\n const traces = (iteration.prompts ?? [])\n .map((p, i) => `--- Prompt ${i + 1} ---\\n${p.formatTrace()}`)\n .join(\"\\n\\n\");\n\n return [header, error, traces].filter(Boolean).join(\"\\n\");\n });\n\n return reports.join(\"\\n\\n\");\n }\n}\n","import type { TestAgent } from \"./TestAgent.js\";\nimport type { LatencyBreakdown } from \"./types.js\";\nimport { calculateLatencyStats, type LatencyStats } from \"./percentiles.js\";\nimport type {\n EvalTest,\n EvalTestRunOptions,\n EvalRunResult,\n IterationResult,\n} from \"./EvalTest.js\";\n\n/**\n * Configuration for an EvalSuite\n */\nexport interface EvalSuiteConfig {\n name?: string;\n}\n\n/**\n * Result for a single test within the suite\n */\nexport interface TestResult {\n name: string;\n result: EvalRunResult;\n}\n\n/**\n * Result of running an EvalSuite\n */\nexport interface EvalSuiteResult {\n tests: Map<string, EvalRunResult>;\n aggregate: {\n iterations: number;\n successes: number;\n failures: number;\n accuracy: number;\n tokenUsage: {\n total: number;\n perTest: number[];\n };\n latency: {\n e2e: LatencyStats;\n llm: LatencyStats;\n mcp: LatencyStats;\n };\n };\n}\n\n/**\n * EvalSuite - Groups multiple EvalTests and provides aggregate metrics\n *\n * @example\n * ```ts\n * const suite = new EvalSuite({ name: \"Math\" });\n * suite.add(new EvalTest({\n * name: \"addition\",\n * test: async (agent) => {\n * const r = await agent.prompt(\"Add 2+3\");\n * return r.hasToolCall(\"add\");\n * },\n * }));\n * suite.add(new EvalTest({\n * name: \"multiply\",\n * test: async (agent) => {\n * const r = await agent.prompt(\"Multiply 4*5\");\n * return r.hasToolCall(\"multiply\");\n * },\n * }));\n *\n * await suite.run(agent, { iterations: 30 });\n * console.log(suite.accuracy()); // Aggregate: 0.95\n * console.log(suite.get(\"addition\").accuracy()); // Individual: 0.97\n * ```\n */\nexport class EvalSuite {\n private name: string;\n private tests: Map<string, EvalTest> = new Map();\n private lastRunResult: EvalSuiteResult | null = null;\n\n constructor(config?: EvalSuiteConfig) {\n this.name = config?.name ?? \"EvalSuite\";\n }\n\n /**\n * Add a test to the suite\n */\n add(test: EvalTest): void {\n const name = test.getName();\n if (this.tests.has(name)) {\n throw new Error(`Test with name \"${name}\" already exists in suite`);\n }\n this.tests.set(name, test);\n }\n\n /**\n * Get a test by name\n */\n get(name: string): EvalTest | undefined {\n return this.tests.get(name);\n }\n\n /**\n * Get all tests in the suite\n */\n getAll(): EvalTest[] {\n return Array.from(this.tests.values());\n }\n\n /**\n * Run all tests in the suite with the given agent and options\n */\n async run(\n agent: TestAgent,\n options: EvalTestRunOptions\n ): Promise<EvalSuiteResult> {\n const testResults = new Map<string, EvalRunResult>();\n\n // Track total progress across all tests\n const totalIterations = this.tests.size * options.iterations;\n let completedIterations = 0;\n\n // Run each test sequentially to avoid overwhelming the system\n for (const [name, test] of this.tests) {\n const testOptions: EvalTestRunOptions = {\n ...options,\n onProgress: options.onProgress\n ? (completed, _total) => {\n // Calculate overall progress\n const overallCompleted = completedIterations + completed;\n options.onProgress!(overallCompleted, totalIterations);\n }\n : undefined,\n };\n\n const result = await test.run(agent, testOptions);\n testResults.set(name, result);\n completedIterations += options.iterations;\n }\n\n // Aggregate results\n this.lastRunResult = this.aggregateResults(testResults);\n return this.lastRunResult;\n }\n\n private aggregateResults(\n testResults: Map<string, EvalRunResult>\n ): EvalSuiteResult {\n const results = Array.from(testResults.values());\n\n // Aggregate iterations\n const allIterations: IterationResult[] = results.flatMap(\n (r) => r.iterationDetails\n );\n const totalIterations = allIterations.length;\n const totalSuccesses = allIterations.filter((r) => r.passed).length;\n const totalFailures = totalIterations - totalSuccesses;\n\n // Aggregate latencies\n const allLatencies: LatencyBreakdown[] = results.flatMap(\n (r) => r.latency.perIteration\n );\n\n const defaultStats: LatencyStats = {\n min: 0,\n max: 0,\n mean: 0,\n p50: 0,\n p95: 0,\n count: 0,\n };\n\n const e2eValues = allLatencies.map((l) => l.e2eMs);\n const llmValues = allLatencies.map((l) => l.llmMs);\n const mcpValues = allLatencies.map((l) => l.mcpMs);\n\n // Token usage\n const totalTokens = results.reduce((sum, r) => sum + r.tokenUsage.total, 0);\n const perTestTokens = results.map((r) => r.tokenUsage.total);\n\n return {\n tests: testResults,\n aggregate: {\n iterations: totalIterations,\n successes: totalSuccesses,\n failures: totalFailures,\n accuracy: totalIterations > 0 ? totalSuccesses / totalIterations : 0,\n tokenUsage: {\n total: totalTokens,\n perTest: perTestTokens,\n },\n latency: {\n e2e:\n e2eValues.length > 0\n ? calculateLatencyStats(e2eValues)\n : defaultStats,\n llm:\n llmValues.length > 0\n ? calculateLatencyStats(llmValues)\n : defaultStats,\n mcp:\n mcpValues.length > 0\n ? calculateLatencyStats(mcpValues)\n : defaultStats,\n },\n },\n };\n }\n\n /**\n * Get the aggregate accuracy across all tests\n */\n accuracy(): number {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n return this.lastRunResult.aggregate.accuracy;\n }\n\n /**\n * Get the aggregate recall (same as accuracy in basic context)\n */\n recall(): number {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n return this.accuracy();\n }\n\n /**\n * Get the aggregate precision (same as accuracy in basic context)\n */\n precision(): number {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n return this.accuracy();\n }\n\n /**\n * Get the aggregate true positive rate (same as recall)\n */\n truePositiveRate(): number {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n return this.recall();\n }\n\n /**\n * Get the aggregate false positive rate\n */\n falsePositiveRate(): number {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n const { failures, iterations } = this.lastRunResult.aggregate;\n return iterations > 0 ? failures / iterations : 0;\n }\n\n /**\n * Get the average token use per iteration across all tests\n */\n averageTokenUse(): number {\n if (!this.lastRunResult) {\n throw new Error(\"No run results available. Call run() first.\");\n }\n const { total } = this.lastRunResult.aggregate.tokenUsage;\n const { iterations } = this.lastRunResult.aggregate;\n return iterations > 0 ? total / iterations : 0;\n }\n\n /**\n * Get the full suite results\n */\n getResults(): EvalSuiteResult | null {\n return this.lastRunResult;\n }\n\n /**\n * Get the name of the suite\n */\n getName(): string {\n return this.name;\n }\n\n /**\n * Get the number of tests in the suite\n */\n size(): number {\n return this.tests.size;\n }\n}\n"]}
|