{"version":3,"sources":["../../src/errors/ontology-errors.ts","../../src/errors/index.ts","../../src/client/paths.ts","../../src/client/arrow-ipc.ts","../../src/auth/index.ts","../../src/utils/fetcher.ts","../../src/client/websocket.ts","../../src/client/index.ts","../../src/validators/validation.ts"],"names":["ArrowConnectionStatus","encoder","attempt","callbacks","createArrowClient"],"mappings":"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","file":"index.mjs","sourcesContent":["import { HTTPError, MCPError } from './index';\n\n/**\n * Base class for ontology-related errors\n */\nexport class OntologyError extends MCPError {\n  constructor(message: string, options?: ErrorOptions) {\n    super(message, options);\n    this.name = 'OntologyError';\n  }\n}\n\n/**\n * Error thrown when an entity is not found in the ontology\n */\nexport class OntologyEntityNotFoundError extends OntologyError {\n  entityUri: string;\n\n  constructor(entityUri: string, message?: string, options?: ErrorOptions) {\n    super(message || `Entity not found: ${entityUri}`, options);\n    this.name = 'OntologyEntityNotFoundError';\n    this.entityUri = entityUri;\n  }\n}\n\n/**\n * Error thrown when an invalid query is attempted\n */\nexport class OntologySparqlError extends OntologyError {\n  query: string;\n\n  constructor(query: string, message?: string, options?: ErrorOptions) {\n    super(message || `Invalid SPARQL query: ${query}`, options);\n    this.name = 'OntologySparqlError';\n    this.query = query;\n  }\n}\n\n/**\n * Error thrown when a modification operation fails\n */\nexport class OntologyModificationError extends OntologyError {\n  operation: string;\n  entityUri?: string;\n\n  constructor(operation: string, entityUri?: string, message?: string, options?: ErrorOptions) {\n    super(\n      message ||\n      `Failed to ${operation}${entityUri ? ` entity: ${entityUri}` : ''}`,\n      options\n    );\n    this.name = 'OntologyModificationError';\n    this.operation = operation;\n    this.entityUri = entityUri;\n  }\n}\n\n/**\n * Error thrown when pagination parameters are invalid\n */\nexport class OntologyPaginationError extends OntologyError {\n  cursor?: string;\n\n  constructor(cursor?: string, message?: string, options?: ErrorOptions) {\n    super(\n      message ||\n      `Invalid pagination${cursor ? ` cursor: ${cursor}` : ''}`,\n      options\n    );\n    this.name = 'OntologyPaginationError';\n    this.cursor = cursor;\n  }\n}\n\n/**\n * Parse error responses from the ontology server and convert them to appropriate error types\n */\nexport function parseOntologyError(error: Error | HTTPError): Error {\n  // If it's already an OntologyError, just return it\n  if (error instanceof OntologyError) {\n    return error;\n  }\n\n  // Handle HTTP errors\n  if (error instanceof HTTPError) {\n    const errorData = (error as any).data;\n    const status = error.status;\n    const message = errorData?.message || error.message;\n\n    // Parse based on status code and error response pattern\n    if (status === 404) {\n      const entityUriMatch = message.match(/Entity not found: (.+)/);\n      if (entityUriMatch) {\n        return new OntologyEntityNotFoundError(entityUriMatch[1], message, { cause: error });\n      }\n    } else if (status === 400) {\n      // Check for SPARQL syntax errors\n      if (message.includes('SPARQL') || message.includes('query')) {\n        const queryMatch = message.match(/query: (.+)/);\n        const query = queryMatch ? queryMatch[1] : 'unknown query';\n        return new OntologySparqlError(query, message, { cause: error });\n      }\n\n      // Check for pagination errors\n      if (message.includes('cursor') || message.includes('pagination')) {\n        const cursorMatch = message.match(/cursor: (.+)/);\n        const cursor = cursorMatch ? cursorMatch[1] : undefined;\n        return new OntologyPaginationError(cursor, message, { cause: error });\n      }\n    }\n\n    // Check for modification errors\n    if (message.includes('Failed to')) {\n      const operationMatch = message.match(/Failed to (\\w+)/);\n      const entityUriMatch = message.match(/entity: (.+)/);\n\n      if (operationMatch) {\n        return new OntologyModificationError(\n          operationMatch[1],\n          entityUriMatch ? entityUriMatch[1] : undefined,\n          message,\n          { cause: error }\n        );\n      }\n    }\n  }\n\n  // Default to generic OntologyError if no specific pattern is matched\n  return new OntologyError(error.message, { cause: error });\n}\n","/**\n * Base error class for all MCP SDK errors\n */\nexport class MCPError extends Error {\n  status?: number;\n  code?: string;\n  cause?: unknown;\n\n  constructor(message: string, options?: { status?: number; code?: string; cause?: unknown }) {\n    super(message);\n    this.name = 'MCPError';\n    this.status = options?.status;\n    this.code = options?.code;\n    this.cause = options?.cause;\n\n    // Ensures proper prototype chain for instanceof checks\n    Object.setPrototypeOf(this, MCPError.prototype);\n  }\n\n  /**\n   * Creates a formatted error message with all available details\n   */\n  toFormattedString(): string {\n    const parts = [\n      `[${this.name}] ${this.message}`,\n      this.code ? `Code: ${this.code}` : null,\n      this.status ? `Status: ${this.status}` : null,\n      this.cause ? `Cause: ${this.cause instanceof Error ? this.cause.message : String(this.cause)}` : null,\n    ].filter(Boolean);\n\n    return parts.join(' | ');\n  }\n}\n\n/**\n * Error thrown when there's a network-related issue\n */\nexport class NetworkError extends MCPError {\n  constructor(message: string, options?: { code?: string; cause?: unknown }) {\n    super(message, { status: 0, code: options?.code || 'NETWORK_ERROR', cause: options?.cause });\n    this.name = 'NetworkError';\n\n    Object.setPrototypeOf(this, NetworkError.prototype);\n  }\n}\n\n/**\n * Error thrown when a request times out\n */\nexport class TimeoutError extends MCPError {\n  constructor(message = 'Request timed out', options?: { code?: string; cause?: unknown }) {\n    super(message, { status: 0, code: options?.code || 'TIMEOUT', cause: options?.cause });\n    this.name = 'TimeoutError';\n\n    Object.setPrototypeOf(this, TimeoutError.prototype);\n  }\n}\n\n/**\n * Error thrown when a request receives a 4xx or 5xx response\n */\nexport class HTTPError extends MCPError {\n  response: Response;\n\n  constructor(message: string, response: Response, options?: { code?: string; cause?: unknown }) {\n    super(message, {\n      status: response.status,\n      code: options?.code || `HTTP_${response.status}`,\n      cause: options?.cause\n    });\n    this.name = 'HTTPError';\n    this.response = response;\n\n    Object.setPrototypeOf(this, HTTPError.prototype);\n  }\n}\n\n/**\n * Error thrown when there's an authentication or authorization issue\n */\nexport class AuthError extends MCPError {\n  response?: Response;\n\n  constructor(message: string, options?: { status?: number; code?: string; cause?: unknown; response?: Response }) {\n    super(message, {\n      status: options?.status || 401,\n      code: options?.code || 'AUTH_ERROR',\n      cause: options?.cause\n    });\n    this.name = 'AuthError';\n    this.response = options?.response;\n\n    Object.setPrototypeOf(this, AuthError.prototype);\n  }\n}\n\n/**\n * Error thrown when user is unauthorized to access a resource\n */\nexport class UnauthorizedError extends AuthError {\n  constructor(message: string, options?: { code?: string; cause?: unknown; response?: Response }) {\n    super(message, {\n      status: 401,\n      code: options?.code || 'UNAUTHORIZED',\n      cause: options?.cause,\n      response: options?.response\n    });\n    this.name = 'UnauthorizedError';\n\n    Object.setPrototypeOf(this, UnauthorizedError.prototype);\n  }\n}\n\n/**\n * Error thrown when a tenant is not found\n */\nexport class TenantNotFoundError extends HTTPError {\n  constructor(message: string, options?: { code?: string; cause?: unknown }) {\n    // Create a mock Response object since we don't have the actual one\n    const mockResponse = new Response(null, { status: 404 });\n    \n    super(message, mockResponse, {\n      code: options?.code || 'TENANT_NOT_FOUND',\n      cause: options?.cause\n    });\n    this.name = 'TenantNotFoundError';\n\n    Object.setPrototypeOf(this, TenantNotFoundError.prototype);\n  }\n}\n\n/**\n * Error thrown when there's an issue with WebSocket connection\n */\nexport class WebSocketError extends MCPError {\n  event?: Event;\n\n  constructor(message: string, options?: { event?: Event; code?: string; cause?: unknown }) {\n    super(message, {\n      code: options?.code || 'WEBSOCKET_ERROR',\n      cause: options?.cause\n    });\n    this.name = 'WebSocketError';\n    this.event = options?.event;\n\n    Object.setPrototypeOf(this, WebSocketError.prototype);\n  }\n}\n\n/**\n * Error thrown when there's an issue with parsing a response\n */\nexport class ParseError extends MCPError {\n  data?: unknown;\n\n  constructor(message: string, options?: { data?: unknown; code?: string; cause?: unknown }) {\n    super(message, {\n      code: options?.code || 'PARSE_ERROR',\n      cause: options?.cause\n    });\n    this.name = 'ParseError';\n    this.data = options?.data;\n\n    Object.setPrototypeOf(this, ParseError.prototype);\n  }\n}\n\n/**\n * Error thrown when validation fails (e.g., with zod or other validators)\n */\nexport class ValidationError extends MCPError {\n  errors?: unknown;\n\n  constructor(message: string, options?: { errors?: unknown; code?: string; cause?: unknown }) {\n    super(message, {\n      code: options?.code || 'VALIDATION_ERROR',\n      cause: options?.cause\n    });\n    this.name = 'ValidationError';\n    this.errors = options?.errors;\n\n    Object.setPrototypeOf(this, ValidationError.prototype);\n  }\n}\n\n/**\n * Create appropriate error instance from an unknown error\n */\nexport function createError(error: unknown): MCPError {\n  if (error instanceof MCPError) {\n    return error;\n  }\n\n  if (error instanceof Error) {\n    return new MCPError(error.message, { cause: error });\n  }\n\n  return new MCPError(String(error));\n}\n\n// Export ontology error classes\nexport {\n  OntologyError,\n  OntologyEntityNotFoundError,\n  OntologySparqlError,\n  OntologyModificationError,\n  OntologyPaginationError,\n  parseOntologyError\n} from './ontology-errors';\n\n/**\n * Create appropriate HTTP error based on response status\n */\nexport function createHttpError(response: Response): MCPError {\n  const status = response.status;\n  let message = `HTTP Error ${status}`;\n  let code = `HTTP_${status}`;\n\n  // Add specific error messages for common HTTP status codes\n  if (status === 400) {\n    message = 'Bad Request: The request was invalid';\n    return new HTTPError(message, response);\n  } else if (status === 401) {\n    message = 'Unauthorized: Authentication is required';\n    return new AuthError(message, { status, code, response });\n  } else if (status === 403) {\n    message = 'Forbidden: You don\\'t have permission to access this resource';\n    return new AuthError(message, { status, code, response });\n  } else if (status === 404) {\n    message = 'Not Found: The requested resource does not exist';\n    return new HTTPError(message, response);\n  } else if (status === 429) {\n    message = 'Too Many Requests: Rate limit exceeded';\n    return new HTTPError(message, response);\n  } else if (status >= 500) {\n    message = 'Server Error: Something went wrong on the server';\n    return new HTTPError(message, response);\n  }\n\n  return new HTTPError(message, response);\n}\n","/**\n * Type-safe path parameter extraction\n * Extracts path parameters from a string literal type\n * e.g. \"/users/:id\" -> { id: string }\n */\nexport type PathParams<P extends string> = string extends P\n  ? Record<string, string>\n  : P extends `${infer _}:${infer Param}/${infer Rest}`\n  ? { [K in Param]: string } & PathParams<`/${Rest}`>\n  : P extends `${infer _}:${infer Param}`\n  ? { [K in Param]: string }\n  : {};\n\n/**\n * API Endpoints\n * Type-safe API endpoint definitions\n */\nexport const ApiEndpoints = {\n  // Ontology endpoints\n  Ontologies: '/ontologies' as const,\n  OntologyById: '/ontologies/:id' as const,\n\n  // User endpoints\n  CurrentUser: '/users/me' as const,\n  UserById: '/users/:id' as const,\n\n  // Authentication endpoints\n  Login: '/auth/login' as const,\n  Logout: '/auth/logout' as const,\n  RefreshToken: '/auth/refresh' as const,\n\n  // Tenant endpoints\n  CurrentTenant: '/tenants/current' as const,\n  TenantById: '/tenants/:id' as const,\n\n  // MCP context endpoints\n  ResolveContext: '/resolve' as const,\n  WebSocketResolve: '/resolve_ws' as const,\n\n  // Tools endpoints\n  ToolsList: '/tools/list' as const,\n  ToolsExecute: '/tools/execute' as const,\n  ToolsStream: '/tools/stream' as const,\n\n  // JSON-RPC endpoint\n  JsonRPC: '/mcp' as const\n};\n\n/**\n * Creates a URL path by replacing parameters in the path template\n *\n * @example\n * ```ts\n * const path = buildPath('/users/:id', { id: '123' }); // '/users/123'\n * ```\n */\nexport function buildPath(\n  pathTemplate: string,\n  params?: Record<string, string>\n): string {\n  if (!params) return pathTemplate;\n\n  let result = pathTemplate;\n\n  for (const [key, value] of Object.entries(params)) {\n    result = result.replace(`:${key}`, encodeURIComponent(String(value)));\n  }\n\n  return result;\n}\n\n/**\n * Creates a full URL by combining base URL with a path\n * @param baseUrl Base URL\n * @param path Path to append\n * @returns Full URL\n */\nexport function createFullUrl(baseUrl: string, path: string): string {\n  // Normalize baseUrl to ensure it doesn't end with a slash\n  const normalizedBaseUrl = baseUrl.endsWith('/')\n    ? baseUrl.slice(0, -1)\n    : baseUrl;\n\n  // Normalize path to ensure it starts with a slash\n  const normalizedPath = path.startsWith('/')\n    ? path\n    : `/${path}`;\n\n  return `${normalizedBaseUrl}${normalizedPath}`;\n}\n","/**\n * Arrow IPC over WebSocket transport implementation\n *\n * This file implements a client for the Arrow IPC protocol, allowing efficient\n * binary data transfer between client and server for large datasets.\n */\n\nimport { MCPOptions } from './types';\nimport { MCPError, WebSocketError } from '../errors';\nimport { createFullUrl } from './paths';\n\n// Import specific Arrow classes to fix type issues\nimport {\n  Field,\n  Schema,\n  Utf8,\n  Binary,\n  Int32,\n  Struct,\n  RecordBatch,\n  RecordBatchReader,\n  RecordBatchStreamWriter,\n  Table,\n  Vector\n} from 'apache-arrow';\n\n/**\n * RPC format used by MCP for JSON-RPC 2.0 style communication\n */\nexport interface MCPRPC {\n  jsonrpc: string;         // JSON-RPC version (always \"2.0\")\n  id?: string | number;    // Message ID for request/response matching\n  method?: string;         // Method to call\n  params?: any;            // Method parameters\n  result?: any;            // Method result\n  error?: {                // Error information\n    code: number;\n    message: string;\n    data?: any;\n  };\n}\n\n/**\n * Arrow IPC message structure\n */\nexport interface ArrowMessage extends MCPRPC {\n  binaryData?: Uint8Array; // Binary Arrow IPC data\n}\n\n/**\n * Arrow IPC event handlers\n */\nexport interface ArrowEventHandlers {\n  onOpen?: (event: Event) => void;\n  onMessage?: (message: ArrowMessage) => void;\n  onBinaryMessage?: (buffer: ArrayBuffer) => void;\n  onError?: (event: Event) => void;\n  onClose?: (event: CloseEvent) => void;\n  onStatusChange?: (status: ArrowConnectionStatus) => void;\n}\n\n/**\n * Arrow IPC connection status\n */\nexport enum ArrowConnectionStatus {\n  DISCONNECTED = 0,\n  CONNECTING = 1,\n  CONNECTED = 2,\n  CLOSING = 3,\n  ERROR = 4,\n  RECONNECTING = 5\n}\n\n/**\n * Arrow query options\n */\nexport interface ArrowQueryOptions {\n  format?: 'arrow' | 'json';  // Preferred response format\n  timeout?: number;          // Query timeout in milliseconds\n  maxRows?: number;          // Maximum number of rows to return\n}\n\n/**\n * Arrow stream consumer callback\n */\nexport type ArrowStreamConsumer = (chunk: Uint8Array) => void;\n\n/**\n * Arrow query result\n */\nexport interface ArrowQueryResult {\n  query: string;           // The executed query\n  schema: any;             // Arrow schema information\n  rowCount: number;        // Total number of rows\n  data?: ArrayBuffer;      // Arrow record batch data if available\n  json?: any[];            // JSON data if requested\n}\n\n/**\n * MCP Resource types\n */\nexport interface MCPResource {\n  uri: string;\n  name: string;\n  description?: string;\n}\n\n/**\n * MCP Resource content\n */\nexport interface MCPResourceContent {\n  uri: string;\n  text: string;\n  mimeType: string;\n}\n\n/**\n * MCP Tool schema\n */\nexport interface MCPToolSchema {\n  type: string;\n  properties: Record<string, any>;\n  required?: string[];\n}\n\n/**\n * MCP Tool definition\n */\nexport interface MCPTool {\n  id: string;\n  name: string;\n  description: string;\n  schema: MCPToolSchema;\n}\n\n/**\n * Server capabilities\n */\nexport interface MCPCapabilities {\n  protocolVersion: string;\n  capabilities: {\n    prompts?: any;\n    resources?: any;\n    tools?: any;\n    experimental?: any;\n  };\n  serverInfo: {\n    name: string;\n    version: string;\n  };\n}\n\n/**\n * Arrow IPC client for efficient binary data transfer\n */\nexport class MCPArrowClient {\n  private ws: WebSocket | null = null;\n  private baseUrl: string;\n  private apiKey?: string;\n  private token?: string;\n  private tenantId?: string;\n  private status: ArrowConnectionStatus = ArrowConnectionStatus.DISCONNECTED;\n  private handlers: ArrowEventHandlers = {};\n  private messageQueue: ArrowMessage[] = [];\n  private pendingRequests: Map<string, {\n    resolve: (result: any) => void,\n    reject: (error: Error) => void,\n    timer?: ReturnType<typeof setTimeout>\n  }> = new Map();\n  private defaultTimeout: number = 30000;\n  private reconnectAttempts: number = 0;\n  private maxReconnectAttempts: number = 5;\n  private reconnectDelay: number = 1000;\n  private autoReconnect: boolean = true;\n  private connectionPath: string = '/arrow';\n  private connectionRetryTimer: ReturnType<typeof setTimeout> | null = null;\n  private manualClose: boolean = false;\n  private lastConnectionTime: number = 0;\n  private nextMessageId: number = 1;\n  private streamTimeout?: number;\n  // Heartbeat properties\n  private heartbeatInterval: number = 15000; // 15 seconds\n  private heartbeatTimer: ReturnType<typeof setTimeout> | null = null;\n  private missedHeartbeats: number = 0;\n  private maxMissedHeartbeats: number = 3;\n  private lastHeartbeatResponse: number = 0;\n\n  /**\n   * Event listener map for custom events\n   */\n  private eventListeners: Map<string, Set<(message: ArrowMessage) => void>> = new Map();\n\n  /**\n   * Add an event listener for a specific event type\n   */\n  private addEventListener(event: string, handler: (message: ArrowMessage) => void): void {\n    if (!this.eventListeners.has(event)) {\n      this.eventListeners.set(event, new Set());\n    }\n    this.eventListeners.get(event)?.add(handler);\n  }\n\n  /**\n   * Remove an event listener\n   */\n  private removeEventListener(event: string, handler: (message: ArrowMessage) => void): void {\n    if (this.eventListeners.has(event)) {\n      this.eventListeners.get(event)?.delete(handler);\n    }\n  }\n\n  /**\n   * Trigger event handlers for a specific event\n   */\n  private triggerEvent(event: string, message: ArrowMessage): void {\n    if (this.eventListeners.has(event)) {\n      for (const handler of this.eventListeners.get(event) || []) {\n        try {\n          handler(message);\n        } catch (error) {\n          console.error(`Error in ${event} event handler:`, error);\n        }\n      }\n    }\n  }\n\n  /**\n   * Creates a new Arrow IPC client\n   */\n  constructor(options: MCPOptions & { autoReconnect?: boolean, maxReconnectAttempts?: number, streamTimeout?: number }) {\n    // Convert HTTP URL to WebSocket URL if needed\n    let wsBaseUrl = options.baseUrl || 'https://api.mcp.ai';\n    wsBaseUrl = wsBaseUrl.replace(/^http/, 'ws');\n\n    this.baseUrl = wsBaseUrl;\n    this.apiKey = options.apiKey;\n    this.token = options.token;\n    this.tenantId = options.tenantId;\n    this.autoReconnect = options.autoReconnect !== false;\n\n    if (options.maxReconnectAttempts !== undefined) {\n      this.maxReconnectAttempts = options.maxReconnectAttempts;\n    }\n\n    if (options.defaultTimeout) {\n      this.defaultTimeout = options.defaultTimeout;\n    }\n\n    if (options.streamTimeout) {\n      this.streamTimeout = options.streamTimeout;\n    }\n  }\n\n  /**\n   * Connect to the Arrow IPC WebSocket endpoint\n   */\n  connect(path: string = '/arrow', handlers: ArrowEventHandlers = {}): void {\n    if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n      console.warn('Arrow WebSocket is already connected. Disconnect first to reconnect.');\n      return;\n    }\n\n    // Save the connection path for reconnection\n    this.connectionPath = path;\n\n    // Reset manual close flag\n    this.manualClose = false;\n\n    // Update status\n    this.setStatus(ArrowConnectionStatus.CONNECTING);\n\n    // Store handlers\n    this.handlers = handlers;\n\n    // Set last connection time\n    this.lastConnectionTime = Date.now();\n\n    // Create the full WebSocket URL\n    const url = new URL(createFullUrl(this.baseUrl, path));\n\n    // Add auth params as query parameters\n    if (this.apiKey) {\n      url.searchParams.append('apiKey', this.apiKey);\n    }\n    if (this.token) {\n      url.searchParams.append('token', this.token);\n    }\n    if (this.tenantId) {\n      url.searchParams.append('tenantId', this.tenantId);\n    }\n\n    // Create WebSocket\n    try {\n      this.ws = new WebSocket(url.toString());\n\n      // Set binary type to arraybuffer\n      this.ws.binaryType = 'arraybuffer';\n\n      // Set up event handlers\n      this.ws.onopen = this.handleOpen.bind(this);\n      this.ws.onmessage = this.handleMessage.bind(this);\n      this.ws.onerror = this.handleError.bind(this);\n      this.ws.onclose = this.handleClose.bind(this);\n    } catch (error) {\n      this.handleConnectionError(error);\n    }\n  }\n\n  /**\n   * Update and notify about status changes\n   */\n  private setStatus(newStatus: ArrowConnectionStatus): void {\n    if (this.status !== newStatus) {\n      this.status = newStatus;\n\n      // Notify handler if exists\n      if (this.handlers.onStatusChange) {\n        try {\n          this.handlers.onStatusChange(newStatus);\n        } catch (error) {\n          console.error('Error in Arrow status change handler:', error);\n        }\n      }\n    }\n  }\n\n  /**\n   * Handle WebSocket open event\n   */\n  private handleOpen(event: Event): void {\n    console.log('Arrow WebSocket connection opened');\n\n    // Update status\n    this.setStatus(ArrowConnectionStatus.CONNECTED);\n\n    // Reset reconnect attempts\n    this.reconnectAttempts = 0;\n\n    // Call the open handler\n    if (this.handlers.onOpen) {\n      try {\n        this.handlers.onOpen(event);\n      } catch (error) {\n        console.error('Error in Arrow open handler:', error);\n      }\n    }\n\n    // Process the message queue\n    this.processQueue();\n\n    // Start heartbeat\n    this.startHeartbeat();\n  }\n\n  /**\n   * Start heartbeat mechanism to keep connection alive\n   */\n  private startHeartbeat(): void {\n    // Clear any existing heartbeat timer\n    if (this.heartbeatTimer) {\n      clearTimeout(this.heartbeatTimer);\n      this.heartbeatTimer = null;\n    }\n\n    // Reset missed heartbeats counter\n    this.missedHeartbeats = 0;\n\n    // Start a new heartbeat timer\n    this.heartbeatTimer = setInterval(() => {\n      this.sendHeartbeat();\n    }, this.heartbeatInterval);\n\n    // Send an initial heartbeat immediately\n    this.sendHeartbeat();\n  }\n\n  /**\n   * Stop heartbeat mechanism\n   */\n  private stopHeartbeat(): void {\n    if (this.heartbeatTimer) {\n      clearTimeout(this.heartbeatTimer);\n      this.heartbeatTimer = null;\n    }\n  }\n\n  /**\n   * Send a heartbeat ping\n   */\n  private sendHeartbeat(): void {\n    // Only send if WebSocket is open\n    if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n      return;\n    }\n\n    // Check if we've missed too many heartbeats\n    if (this.missedHeartbeats >= this.maxMissedHeartbeats) {\n      console.warn(`Missed ${this.missedHeartbeats} heartbeats, reconnecting...`);\n\n      // Force close and reconnect\n      try {\n        this.ws.close();\n      } catch (e) {\n        console.error('Error closing WebSocket during heartbeat failure:', e);\n      }\n\n      // Attempt to reconnect if allowed\n      if (this.autoReconnect && !this.manualClose) {\n        this.attemptReconnect();\n      }\n\n      return;\n    }\n\n    // Increment missed heartbeats (will be reset when we get a response)\n    this.missedHeartbeats++;\n\n    // Send ping message\n    try {\n      console.debug('Ping sent');\n\n      const pingMessage = {\n        jsonrpc: '2.0',\n        method: 'ping',\n        id: `ping-${Date.now()}`\n      };\n\n      this.ws.send(JSON.stringify(pingMessage));\n    } catch (error) {\n      console.error('Error sending heartbeat:', error);\n    }\n  }\n\n  /**\n   * Handle a WebSocket message event\n   */\n  private handleMessage(event: MessageEvent): void {\n    try {\n      // Reset missed heartbeats on any message received\n      this.missedHeartbeats = 0;\n      this.lastHeartbeatResponse = Date.now();\n\n      // Check if we have a binary message\n      if (event.data instanceof ArrayBuffer) {\n        // Log received binary data\n        const dataSize = event.data.byteLength;\n        console.log(`Received binary data (${dataSize} bytes)`);\n\n        // If we have a binary message handler, call it directly with the raw data\n        if (this.handlers.onBinaryMessage) {\n          try {\n            this.handlers.onBinaryMessage(event.data);\n          } catch (error) {\n            console.error('Error in binary message handler:', error);\n          }\n        }\n\n        try {\n          // Decode the Arrow IPC message\n          const message = this.decodeMessage(event.data);\n\n          // For ping messages, send a pong response\n          if (message.method === 'ping') {\n            if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n              // Respond with a pong message\n              const pongMessage = {\n                jsonrpc: '2.0',\n                method: 'pong',\n                id: message.id\n              };\n\n              try {\n                this.ws.send(JSON.stringify(pongMessage));\n              } catch (e) {\n                console.warn('Failed to send pong response:', e);\n              }\n            }\n\n            // Skip further processing for ping messages\n            return;\n          }\n\n          // Check for error messages and log them\n          if (message.error) {\n            console.warn('Received error message:', message.error);\n          }\n\n          // Trigger any event listeners for the 'message' event\n          this.triggerEvent('message', message);\n\n          // Process the decoded message\n          this.processMessage(message);\n        } catch (decodeError) {\n          console.error('Error decoding binary message:', decodeError);\n        }\n      } else if (typeof event.data === 'string') {\n        // Handle plain text messages (JSON)\n        try {\n          const message = JSON.parse(event.data) as ArrowMessage;\n\n          // If it's a pong message, we don't need to process it further\n          if (message.method === 'pong' ||\n              (message.id && String(message.id).startsWith('ping-'))) {\n            // Just a heartbeat response, no need for further processing\n            console.debug('Pong received');\n            return;\n          }\n\n          // Trigger message handlers\n          if (this.handlers.onMessage) {\n            try {\n              this.handlers.onMessage(message);\n            } catch (error) {\n              console.error('Error in message handler:', error);\n            }\n          }\n\n          // Trigger any event listeners for the 'message' event\n          this.triggerEvent('message', message);\n\n          // Process the message\n          this.processMessage(message);\n        } catch (error) {\n          console.error('Error parsing JSON message:', error, 'Raw data:', event.data);\n        }\n      } else {\n        console.warn('Received unsupported message type:', typeof event.data);\n      }\n    } catch (error) {\n      console.error('Error handling WebSocket message:', error);\n    }\n  }\n\n  /**\n   * Handle WebSocket error event\n   */\n  private handleError(event: Event): void {\n    console.error('Arrow WebSocket error:', event);\n\n    // Update status\n    this.setStatus(ArrowConnectionStatus.ERROR);\n\n    // Call the error handler\n    if (this.handlers.onError) {\n      try {\n        this.handlers.onError(event);\n      } catch (error) {\n        console.error('Error in Arrow error handler:', error);\n      }\n    }\n\n    // Attempt to reconnect if allowed\n    if (this.autoReconnect && !this.manualClose) {\n      this.attemptReconnect();\n    }\n  }\n\n  /**\n   * Handle WebSocket close event\n   */\n  private handleClose(event: CloseEvent): void {\n    console.log('Arrow WebSocket connection closed:', event);\n\n    // Update status\n    this.setStatus(ArrowConnectionStatus.DISCONNECTED);\n\n    // Stop heartbeat\n    this.stopHeartbeat();\n\n    // Call the close handler\n    if (this.handlers.onClose) {\n      try {\n        this.handlers.onClose(event);\n      } catch (error) {\n        console.error('Error in Arrow close handler:', error);\n      }\n    }\n\n    // Reject all pending requests\n    for (const [id, request] of this.pendingRequests.entries()) {\n      this.pendingRequests.delete(id);\n\n      if (request.timer) {\n        clearTimeout(request.timer);\n      }\n\n      request.reject(new WebSocketError('Connection closed', {\n        code: `CLOSE_${event.code}`,\n        cause: event\n      }));\n    }\n\n    // Attempt to reconnect if allowed and not cleanly closed\n    if (this.autoReconnect && !this.manualClose && event.code !== 1000) {\n      this.attemptReconnect();\n    }\n  }\n\n  /**\n   * Handle connection error\n   */\n  private handleConnectionError(error: any): void {\n    console.error('Arrow WebSocket connection error:', error);\n\n    // Update status\n    this.setStatus(ArrowConnectionStatus.ERROR);\n\n    // Attempt to reconnect if allowed\n    if (this.autoReconnect && !this.manualClose) {\n      this.attemptReconnect();\n    }\n  }\n\n  /**\n   * Send a message over the WebSocket\n   */\n  private async sendArrowMessage(message: MCPRPC): Promise<any> {\n    // Generate a unique message ID if not provided\n    if (message.id === undefined) {\n      message.id = this.nextMessageId++;\n    }\n\n    // Ensure we're working with strings for message IDs in the map\n    const id = String(message.id);\n\n    return new Promise((resolve, reject) => {\n      // Check if the WebSocket is open\n      if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n        // Queue the message for later\n        this.queueMessage({\n          ...message\n        });\n\n        // Set up a timer for the request\n        const timer = setTimeout(() => {\n          // Remove from pending requests\n          this.pendingRequests.delete(id);\n\n          // Reject with timeout error\n          reject(new WebSocketError('WebSocket not connected', {\n            code: 'CONNECTION_ERROR',\n          }));\n        }, this.defaultTimeout);\n\n        // Add to pending requests\n        this.pendingRequests.set(id, {\n          resolve,\n          reject,\n          timer,\n        });\n\n        // Try to reconnect if allowed\n        if (this.status !== ArrowConnectionStatus.CONNECTING && this.autoReconnect && !this.manualClose) {\n          this.attemptReconnect();\n        }\n\n        return;\n      }\n\n      try {\n        // Convert message to Arrow format - this would require proper Arrow serialization\n        const data = this.encodeMessage(message);\n\n        // Set up a timer for the request\n        const timer = setTimeout(() => {\n          // Remove from pending requests\n          this.pendingRequests.delete(id);\n\n          // Reject with timeout error\n          reject(new MCPError('Request timed out', {\n            code: 'TIMEOUT',\n          }));\n        }, this.defaultTimeout);\n\n        // Add to pending requests\n        this.pendingRequests.set(id, {\n          resolve,\n          reject,\n          timer,\n        });\n\n        // Send the bytes\n        this.ws.send(data);\n      } catch (error) {\n        reject(new MCPError('Failed to send message', {\n          cause: error,\n        }));\n      }\n    });\n  }\n\n  /**\n   * Encode a message to binary format\n   */\n  private encodeMessage(message: MCPRPC): ArrayBuffer {\n    try {\n      // Check if we already have binary data to send\n      if ('binaryData' in message &&\n          (message as ArrowMessage).binaryData instanceof Uint8Array &&\n          (message as ArrowMessage).binaryData) {\n        // If we have binary data, we need to create a composite message\n        // with JSON header and binary payload separated by a delimiter\n\n        // Convert the message to JSON without the binaryData\n        const { binaryData, ...jsonPart } = message as ArrowMessage & { binaryData: Uint8Array };\n        const jsonString = JSON.stringify(jsonPart);\n\n        // Create the header delimiter\n        const headerDelimiter = new Uint8Array([0, 65, 82, 82, 79, 87, 58]); // \\0ARROW:\n\n        // Convert the JSON string to a Uint8Array\n        const encoder = new TextEncoder();\n        const jsonBytes = encoder.encode(jsonString);\n\n        // Create the composite message buffer\n        const totalLength = jsonBytes.length + headerDelimiter.length + binaryData.length;\n        const result = new Uint8Array(totalLength);\n\n        // Copy the JSON part\n        result.set(jsonBytes, 0);\n\n        // Copy the delimiter\n        result.set(headerDelimiter, jsonBytes.length);\n\n        // Copy the binary data\n        result.set(binaryData, jsonBytes.length + headerDelimiter.length);\n\n        return result.buffer;\n      }\n\n      // If there's no binary data, just encode as JSON\n      const encoder = new TextEncoder();\n      const encodedData = encoder.encode(JSON.stringify(message));\n\n      // Use the binary JSON format for compatibility with more servers\n      return encodedData.buffer as ArrayBuffer;\n    } catch (error) {\n      console.error('Error encoding message:', error);\n      throw new MCPError('Failed to encode message', {\n        code: 'ENCODING_ERROR',\n        cause: error\n      });\n    }\n  }\n\n  /**\n   * Decode an Arrow IPC message from binary data\n   */\n  private decodeMessage(buffer: ArrayBuffer): ArrowMessage {\n    try {\n      // First try to decode as JSON text message (simpler approach)\n      const decoder = new TextDecoder();\n      const text = decoder.decode(new Uint8Array(buffer));\n\n      try {\n        // Try to parse as JSON\n        const jsonMessage = JSON.parse(text) as ArrowMessage;\n\n        // If we could parse it as JSON, use that\n        if (jsonMessage && typeof jsonMessage === 'object') {\n          return jsonMessage;\n        }\n      } catch (jsonError) {\n        // Not valid JSON, continue with binary approach\n        console.debug('Not valid JSON, trying binary parse');\n      }\n\n      // If we're here, it's likely an Arrow binary message\n      // We need to separate the metadata (JSON header) from the binary payload\n\n      // First, check if there's a header delimiter (null byte + \"ARROW:\")\n      const headerDelimiter = new Uint8Array([0, 65, 82, 82, 79, 87, 58]); // \\0ARROW:\n      const data = new Uint8Array(buffer);\n\n      // Log debug info about the binary data\n      console.debug(`Received binary data (${data.length} bytes)`);\n\n      // Search for the delimiter\n      let delimiterIndex = -1;\n      for (let i = 0; i <= data.length - headerDelimiter.length; i++) {\n        let match = true;\n        for (let j = 0; j < headerDelimiter.length; j++) {\n          if (data[i + j] !== headerDelimiter[j]) {\n            match = false;\n            break;\n          }\n        }\n        if (match) {\n          delimiterIndex = i;\n          break;\n        }\n      }\n\n      let message: ArrowMessage;\n\n      if (delimiterIndex > 0) {\n        // Extract and parse the JSON header part\n        const headerPart = new Uint8Array(buffer, 0, delimiterIndex);\n        const headerText = decoder.decode(headerPart);\n        try {\n          message = JSON.parse(headerText) as ArrowMessage;\n        } catch (e) {\n          console.error('Failed to parse Arrow IPC header:', e);\n          message = { jsonrpc: '2.0' };\n        }\n\n        // Extract the binary data part (skip the delimiter)\n        const binaryDataStart = delimiterIndex + headerDelimiter.length;\n        const binaryData = new Uint8Array(buffer, binaryDataStart);\n\n        // Attach the binary data to the message\n        message.binaryData = binaryData;\n      } else {\n        // No delimiter found, create a ping response message\n        // This handles server heartbeats and other binary data we can't parse\n\n        // Check if this might be a ping/pong message (typically very small)\n        if (data.length < 10) {\n          console.debug('Received likely heartbeat/ping message');\n          message = {\n            jsonrpc: '2.0',\n            method: 'ping',\n            id: String(Date.now())\n          };\n        } else {\n          // For larger unknown binary data, log more information for debugging\n          console.warn(`Received unrecognized binary format (${data.length} bytes): ${data.slice(0, 20)}`);\n\n          // Create a default message with the binary data attached\n          message = {\n            jsonrpc: '2.0',\n            id: String(Date.now()),\n            binaryData: data\n          };\n        }\n      }\n\n      return message;\n    } catch (error) {\n      console.error('Error decoding message:', error);\n      // Return a default message instead of throwing\n      return {\n        jsonrpc: '2.0',\n        error: {\n          code: -32700,\n          message: 'Failed to decode binary message'\n        }\n      };\n    }\n  }\n\n  /**\n   * Queue a message for later\n   */\n  private queueMessage(message: ArrowMessage): void {\n    console.log('Queueing message for later:', message);\n    this.messageQueue.push(message);\n\n    // Try to reconnect if allowed\n    if (this.status !== ArrowConnectionStatus.CONNECTING && this.autoReconnect && !this.manualClose) {\n      this.attemptReconnect();\n    }\n  }\n\n  /**\n   * Process the message queue\n   */\n  private processQueue(): void {\n    if (this.messageQueue.length === 0) {\n      return;\n    }\n\n    console.log(`Processing ${this.messageQueue.length} queued messages`);\n\n    const queue = [...this.messageQueue];\n    this.messageQueue = [];\n\n    for (const message of queue) {\n      // Send the message if possible\n      if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n        this.sendArrowMessage(message).catch(console.error);\n      } else {\n        // Re-queue the message\n        this.messageQueue.push(message);\n      }\n    }\n  }\n\n  /**\n   * Attempt to reconnect to the WebSocket\n   */\n  private attemptReconnect(): void {\n    // Check if we've reached the maximum number of reconnect attempts\n    if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n      console.error(`Maximum reconnect attempts (${this.maxReconnectAttempts}) reached. Giving up.`);\n      return;\n    }\n\n    // Check if we're already connecting or reconnecting\n    if (this.status === ArrowConnectionStatus.CONNECTING || this.status === ArrowConnectionStatus.RECONNECTING) {\n      return;\n    }\n\n    // Set status to reconnecting\n    this.setStatus(ArrowConnectionStatus.RECONNECTING);\n\n    // Calculate delay with exponential backoff\n    const delay = Math.min(this.reconnectDelay * Math.pow(1.5, this.reconnectAttempts), 30000);\n\n    // Increment reconnect attempts\n    this.reconnectAttempts++;\n\n    console.log(`Attempting to reconnect in ${delay}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`);\n\n    // Set up a timer for reconnection\n    this.connectionRetryTimer = setTimeout(() => {\n      this.connectionRetryTimer = null;\n      this.connect(this.connectionPath, this.handlers);\n    }, delay);\n  }\n\n  /**\n   * Generate a unique message ID\n   */\n  private generateMessageId(): number {\n    return this.nextMessageId++;\n  }\n\n  /**\n   * Get server capabilities\n   */\n  async getCapabilities(): Promise<MCPCapabilities> {\n    return this.sendArrowMessage({\n      jsonrpc: \"2.0\",\n      method: \"capabilities\",\n      params: {},\n      id: this.generateMessageId()\n    });\n  }\n\n  /**\n   * List available resources\n   */\n  async listResources(): Promise<{ resources: MCPResource[] }> {\n    return this.sendArrowMessage({\n      jsonrpc: \"2.0\",\n      method: \"listResources\",\n      params: {},\n      id: this.generateMessageId()\n    });\n  }\n\n  /**\n   * Get a specific resource\n   */\n  async getResource(uri: string): Promise<{ contents: MCPResourceContent[] }> {\n    return this.sendArrowMessage({\n      jsonrpc: \"2.0\",\n      method: \"getResource\",\n      params: { uri },\n      id: this.generateMessageId()\n    });\n  }\n\n  /**\n   * List available tools\n   */\n  async listTools(): Promise<{ tools: MCPTool[] }> {\n    return this.sendArrowMessage({\n      jsonrpc: \"2.0\",\n      method: \"listTools\",\n      params: {},\n      id: this.generateMessageId()\n    });\n  }\n\n  /**\n   * Get the current connection status\n   */\n  getStatus(): ArrowConnectionStatus {\n    return this.status;\n  }\n\n  /**\n   * Disconnect from the WebSocket\n   */\n  disconnect(): void {\n    if (!this.ws) {\n      return;\n    }\n\n    console.log('Disconnecting Arrow WebSocket');\n\n    // Set manual close flag\n    this.manualClose = true;\n\n    // Stop heartbeat\n    this.stopHeartbeat();\n\n    // Update status\n    this.setStatus(ArrowConnectionStatus.CLOSING);\n\n    try {\n      this.ws.close();\n    } catch (error) {\n      console.error('Error closing WebSocket:', error);\n    } finally {\n      this.ws = null;\n      this.setStatus(ArrowConnectionStatus.DISCONNECTED);\n    }\n\n    // Clear reconnect timer if exists\n    if (this.connectionRetryTimer) {\n      clearTimeout(this.connectionRetryTimer);\n      this.connectionRetryTimer = null;\n    }\n  }\n\n  /**\n   * Send a request to a model (like Claude) through the MCP server\n   */\n  async sendRequest(options: {\n    path: string;\n    method?: 'GET' | 'POST' | 'PUT' | 'DELETE';\n    body?: any;\n    responseType?: 'json' | 'arrow';\n    metrics?: boolean;\n    onChunk?: (chunk: any) => void;\n  }): Promise<{\n    data: any;\n    status: number;\n    headers: Record<string, string>;\n    metrics?: {\n      totalTime: number;\n      serializationTime: number;\n      networkTime: number;\n      deserializationTime: number;\n    }\n  }> {\n    const startTime = performance.now();\n    let serializationTime = 0;\n    let networkStart = 0;\n    let networkEnd = 0;\n    let deserializationTime = 0;\n\n    try {\n      // Start serialization timing\n      const serializationStart = performance.now();\n\n      // Set default method if not provided\n      const method = options.method || 'POST';\n      const responseType = options.responseType || 'json';\n\n      // Check if we need streaming (indicated by both onChunk and stream: true in body)\n      const isStreaming = options.onChunk && options.body?.stream;\n\n      // Prepare the request parameters\n      const params = {\n        path: options.path,\n        method: method,\n        body: options.body || {},\n        responseType: responseType,\n        stream: isStreaming\n      };\n\n      // End serialization timing\n      serializationTime = performance.now() - serializationStart;\n\n      // Start network timing\n      networkStart = performance.now();\n\n      if (isStreaming) {\n        // For streaming, we need to set up a special message handler\n        const messageId = this.generateMessageId();\n\n        // Create a promise that will resolve when streaming is complete\n        const streamingPromise = new Promise<any>((resolve, reject) => {\n          // Set up a message handler for streaming responses\n          const streamHandler = (message: ArrowMessage) => {\n            if (message.id === messageId && message.method === 'streamChunk') {\n              // Call the onChunk callback with the chunk data\n              options.onChunk?.(message.params);\n            } else if (message.id === messageId && message.method === 'streamEnd') {\n              // Streaming is complete, remove the handler and resolve\n              this.removeEventListener('message', streamHandler);\n\n              // End network timing\n              networkEnd = performance.now();\n\n              // Resolve with the final response\n              resolve(message.params?.result || {});\n            } else if (message.id === messageId && message.error) {\n              // Error occurred, remove the handler and reject\n              this.removeEventListener('message', streamHandler);\n              reject(new MCPError('Streaming error', {\n                code: 'STREAM_ERROR',\n                cause: message.error\n              }));\n            }\n          };\n\n          // Add the stream handler to listen for streaming chunks\n          this.addEventListener('message', streamHandler);\n\n          // Set up a timeout for the streaming request\n          const timer = setTimeout(() => {\n            this.removeEventListener('message', streamHandler);\n            reject(new MCPError('Stream request timed out', { code: 'TIMEOUT' }));\n          }, this.streamTimeout || 60000);\n\n          // Send the initial request to start streaming\n          this.sendArrowMessage({\n            jsonrpc: \"2.0\",\n            method: \"startStream\",\n            params,\n            id: messageId\n          }).catch(error => {\n            this.removeEventListener('message', streamHandler);\n            clearTimeout(timer);\n            reject(error);\n          });\n        });\n\n        // Wait for the streaming to complete\n        const response = await streamingPromise;\n\n        // Calculate deserializationTime (minimal for streaming)\n        deserializationTime = 0;\n\n        // Create the result object\n        const result: {\n          data: any;\n          status: number;\n          headers: Record<string, string>;\n          metrics?: {\n            totalTime: number;\n            serializationTime: number;\n            networkTime: number;\n            deserializationTime: number;\n          }\n        } = {\n          data: response.data || {},\n          status: response.status || 200,\n          headers: response.headers || {}\n        };\n\n        // Add metrics if requested\n        if (options.metrics) {\n          result.metrics = {\n            totalTime: performance.now() - startTime,\n            serializationTime,\n            networkTime: networkEnd - networkStart,\n            deserializationTime\n          };\n        }\n\n        return result;\n      } else {\n        // For non-streaming requests, use the regular sendArrowMessage\n        const response = await this.sendArrowMessage({\n          jsonrpc: \"2.0\",\n          method: \"sendRequest\",\n          params,\n          id: this.generateMessageId()\n        });\n\n        // End network timing\n        networkEnd = performance.now();\n\n        // Start deserialization timing\n        const deserializationStart = performance.now();\n\n        // Create the result object with the correct type that includes optional metrics\n        const result: {\n          data: any;\n          status: number;\n          headers: Record<string, string>;\n          metrics?: {\n            totalTime: number;\n            serializationTime: number;\n            networkTime: number;\n            deserializationTime: number;\n          }\n        } = {\n          data: response.data || {},\n          status: response.status || 200,\n          headers: response.headers || {}\n        };\n\n        // End deserialization timing\n        deserializationTime = performance.now() - deserializationStart;\n\n        // Add metrics if requested\n        if (options.metrics) {\n          result.metrics = {\n            totalTime: performance.now() - startTime,\n            serializationTime,\n            networkTime: networkEnd - networkStart,\n            deserializationTime\n          };\n        }\n\n        return result;\n      }\n    } catch (error) {\n      console.error('Error in sendRequest:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Check server health\n   */\n  async checkHealth(): Promise<boolean> {\n    try {\n      // Try to ping the server via HTTP first (easier than WebSocket)\n      const healthUrl = new URL(this.baseUrl.replace('ws://', 'http://').replace('wss://', 'https://'));\n      healthUrl.pathname = '/health';\n\n      // Use fetch API for the HTTP health check\n      const response = await fetch(healthUrl.toString(), {\n        method: 'GET',\n        headers: {\n          'Accept': 'application/json',\n        }\n      });\n\n      if (response.ok) {\n        const data = await response.json();\n        return data.status === 'ok';\n      }\n\n      // If HTTP check fails, try WebSocket connection\n      if (this.status !== ArrowConnectionStatus.CONNECTED) {\n        return false;\n      }\n\n      // Try to get capabilities as a WebSocket health check\n      await this.getCapabilities();\n      return true;\n    } catch (error) {\n      console.error('Health check failed:', error);\n      return false;\n    }\n  }\n\n  /**\n   * Get server connection status as string\n   */\n  getConnectionStatusText(): string {\n    switch (this.status) {\n      case ArrowConnectionStatus.CONNECTED:\n        return 'Connected';\n      case ArrowConnectionStatus.CONNECTING:\n        return 'Connecting';\n      case ArrowConnectionStatus.DISCONNECTED:\n        return 'Disconnected';\n      case ArrowConnectionStatus.ERROR:\n        return 'Error';\n      case ArrowConnectionStatus.RECONNECTING:\n        return 'Reconnecting';\n      case ArrowConnectionStatus.CLOSING:\n        return 'Closing';\n      default:\n        return 'Unknown';\n    }\n  }\n\n  /**\n   * Process an incoming message\n   */\n  private processMessage(message: ArrowMessage): void {\n    // Find the corresponding pending request\n    const id = String(message.id || '');\n    const pendingRequest = this.pendingRequests.get(id);\n\n    if (pendingRequest) {\n      // Clear the timeout\n      if (pendingRequest.timer) {\n        clearTimeout(pendingRequest.timer);\n      }\n\n      // Remove from pending requests\n      this.pendingRequests.delete(id);\n\n      // Check for errors\n      if (message.error) {\n        pendingRequest.reject(new MCPError(message.error.message || 'Unknown error', {\n          code: String(message.error.code),\n          cause: message.error.data\n        }));\n      } else {\n        // Process the result, which might include binary data\n        let result = message.result;\n\n        // If binary data is present, try to process it using Arrow\n        if (message.binaryData && message.binaryData.length > 0) {\n          try {\n            // Try to process as Arrow data\n            // Add the binary data to the result for the consumer to process\n            if (!result) {\n              result = {};\n            }\n\n            if (typeof result === 'object') {\n              // Add the binary data buffer to the result\n              result.arrowData = message.binaryData.buffer;\n\n              // Try to extract schema information if available in the message\n              if (message.params?.schema) {\n                result.schema = message.params.schema;\n              }\n            }\n          } catch (error) {\n            console.warn('Error processing Arrow binary data:', error);\n            // Still resolve with the original result\n          }\n        }\n\n        // Resolve with the result\n        pendingRequest.resolve(result);\n      }\n    }\n\n    // If this is a streaming message, we don't need to call the message handler\n    // again as it's already handled by specific stream event listeners\n    if (message.method === 'streamChunk' || message.method === 'streamEnd') {\n      return;\n    }\n\n    // Notify handler for other messages\n    if (this.handlers.onMessage) {\n      try {\n        this.handlers.onMessage(message);\n      } catch (error) {\n        console.error('Error in message handler:', error);\n      }\n    }\n  }\n}\n\n/**\n * Create an Arrow IPC client\n */\nexport function createArrowClient(options: MCPOptions): MCPArrowClient {\n  return new MCPArrowClient(options);\n}\n\n// Add default export for easier importing\nexport default MCPArrowClient;\n","interface AuthOptions {\n  apiKey?: string;\n  token?: string;\n  tenantId?: string;\n}\n\nexport function createAuthHeaders(options: AuthOptions): Record<string, string> {\n  const headers: Record<string, string> = {};\n\n  if (options.apiKey) {\n    headers['X-API-Key'] = options.apiKey;\n  }\n\n  if (options.token) {\n    headers['Authorization'] = `Bearer ${options.token}`;\n  }\n\n  if (options.tenantId) {\n    headers['X-Tenant-ID'] = options.tenantId;\n  }\n\n  return headers;\n}\n","import { MCPCacheConfig, MCPCacheOptions, MCPRequestParams, MCPResponse } from '../client/types';\nimport {\n  AuthError,\n  HTTPError,\n  MCPError,\n  NetworkError,\n  ParseError,\n  TimeoutError,\n  createHttpError\n} from '../errors';\n\ntype NextFetchOptions = RequestInit & {\n  next?: { revalidate?: number | false; tags?: string[] }\n};\n\ntype RetryOptions = {\n  /**\n   * Maximum number of retry attempts for failed requests (default: 0)\n   */\n  retries?: number;\n  /**\n   * Backoff factor for exponential backoff between retries (default: 2)\n   */\n  retryBackoffFactor?: number;\n  /**\n   * Initial retry delay in milliseconds (default: 300)\n   */\n  retryInitialDelay?: number;\n  /**\n   * Maximum retry delay in milliseconds (default: 10000)\n   */\n  retryMaxDelay?: number;\n  /**\n   * HTTP status codes that should trigger a retry (default: [408, 429, 500, 502, 503, 504])\n   */\n  retryStatusCodes?: number[];\n  /**\n   * Custom function to determine if a request should be retried\n   */\n  shouldRetry?: (error: MCPError, attemptCount: number) => boolean;\n}\n\nexport type FetchOptions = RequestInit & {\n  /**\n   * Request timeout in milliseconds (default: 10000)\n   */\n  timeout?: number;\n  /**\n   * Options for retry behavior\n   */\n  retry?: boolean | RetryOptions;\n  /**\n   * Next.js cache configuration\n   */\n  cache?: MCPCacheOptions;\n  /**\n   * Next.js revalidate option\n   */\n  revalidate?: number | false;\n  /**\n   * Next.js cache tags\n   */\n  tags?: string[];\n};\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\n/**\n * Default retry status codes that should trigger a retry\n */\nconst DEFAULT_RETRY_STATUS_CODES = [408, 429, 500, 502, 503, 504];\n\n/**\n * Creates fetch parameters for Next.js API routes\n */\nexport function createFetchParams(\n  url: string,\n  options: FetchOptions = {}\n): { url: string; options: NextFetchOptions } {\n  const {\n    cache,\n    revalidate,\n    tags,\n    ...fetchOptions\n  } = options;\n\n  // Create a copy of options to add Next.js specific options\n  const nextFetchOptions: NextFetchOptions = { ...fetchOptions };\n\n  // Add Next.js App Router cache configuration\n  if (typeof cache === 'boolean') {\n    nextFetchOptions.cache = cache ? 'force-cache' : 'no-store';\n  } else if (typeof cache === 'string') {\n    nextFetchOptions.cache = cache;\n  } else if (cache && typeof cache === 'object') {\n    // Using Next.js App Router cache config\n    nextFetchOptions.next = nextFetchOptions.next || {};\n\n    const cacheConfig = cache as MCPCacheConfig;\n    if (cacheConfig.maxAge !== undefined) {\n      nextFetchOptions.next.revalidate = cacheConfig.maxAge;\n    }\n\n    if (cacheConfig.tag) {\n      nextFetchOptions.next.tags = Array.isArray(cacheConfig.tag) ? cacheConfig.tag : [cacheConfig.tag];\n    }\n  }\n\n  // Add revalidate option if provided\n  if (revalidate !== undefined) {\n    nextFetchOptions.next = nextFetchOptions.next || {};\n    nextFetchOptions.next.revalidate = revalidate;\n  }\n\n  // Add tags if provided\n  if (tags && tags.length > 0) {\n    nextFetchOptions.next = nextFetchOptions.next || {};\n    nextFetchOptions.next.tags = tags;\n  }\n\n  return { url, options: nextFetchOptions };\n}\n\n/**\n * Enhanced fetch utility with timeout, retries, and improved error handling\n */\nexport async function fetcher<T>(\n  url: string,\n  options: FetchOptions = {}\n): Promise<MCPResponse<T>> {\n  const {\n    timeout = 10000,\n    retry = false,\n    ...fetchOptions\n  } = options;\n\n  // Initialize retry options\n  const retryOptions: RetryOptions = retry === true ? {} : (retry || {});\n  const {\n    retries = 0,\n    retryBackoffFactor = 2,\n    retryInitialDelay = 300,\n    retryMaxDelay = 10000,\n    retryStatusCodes = DEFAULT_RETRY_STATUS_CODES,\n    shouldRetry\n  } = retryOptions;\n\n  // Create an AbortController for timeout handling\n  const controller = new AbortController();\n  const { signal } = controller;\n\n  // Set up timeout\n  let timeoutId: NodeJS.Timeout | null = null;\n  if (timeout > 0) {\n    timeoutId = setTimeout(() => {\n      controller.abort();\n    }, timeout);\n  }\n\n  // Merge AbortSignal with any existing one\n  const originalSignal = fetchOptions.signal;\n  if (originalSignal) {\n    originalSignal.addEventListener('abort', () => {\n      controller.abort(originalSignal.reason);\n      if (timeoutId) clearTimeout(timeoutId);\n    });\n  }\n\n  // Merge fetch options\n  const mergedOptions = {\n    ...fetchOptions,\n    signal\n  };\n\n  // Configure for Next.js\n  const { url: parsedUrl, options: nextOptions } = createFetchParams(url, {\n    ...mergedOptions,\n    cache: options.cache,\n    revalidate: options.revalidate,\n    tags: options.tags\n  });\n\n  // Helper to clear timeout\n  const clearTimeoutIfExists = () => {\n    if (timeoutId !== null) {\n      clearTimeout(timeoutId);\n      timeoutId = null;\n    }\n  };\n\n  // Custom retry function\n  const customShouldRetry = (error: MCPError, attempt: number): boolean => {\n    // Don't retry if we've reached the maximum attempts\n    if (attempt >= retries) return false;\n\n    // Use custom retry logic if provided\n    if (shouldRetry) return shouldRetry(error, attempt);\n\n    // Default retry logic\n    if (error instanceof TimeoutError) return true;\n    if (error instanceof NetworkError) return true;\n    if (error instanceof HTTPError && retryStatusCodes.includes(error.status || 0)) return true;\n\n    return false;\n  };\n\n  let attempt = 0;\n  let lastError: MCPError | null = null;\n\n  // Retry loop\n  while (attempt <= retries) {\n    try {\n      const response = await fetch(parsedUrl, nextOptions);\n      clearTimeoutIfExists();\n\n      // Handle HTTP errors\n      if (!response.ok) {\n        throw createHttpError(response);\n      }\n\n      let data: T;\n      const contentType = response.headers.get('content-type');\n\n      // Parse response based on content type\n      try {\n        if (contentType && contentType.includes('application/json')) {\n          data = await response.json();\n        } else {\n          // For non-JSON responses, try to parse as JSON first, then as text\n          try {\n            data = await response.json();\n          } catch {\n            const text = await response.text();\n            // If the response is empty or whitespace, return an empty object\n            data = text.trim() ? (text as unknown as T) : ({} as T);\n          }\n        }\n      } catch (error) {\n        throw new ParseError('Failed to parse response', {\n          cause: error,\n          data: await response.text().catch(() => undefined)\n        });\n      }\n\n      return {\n        data,\n        status: response.status,\n        headers: response.headers,\n        response\n      };\n    } catch (error) {\n      clearTimeoutIfExists();\n\n      // Convert error to MCPError\n      let mcpError: MCPError;\n\n      if (error instanceof MCPError) {\n        mcpError = error;\n      } else if (error instanceof DOMException && error.name === 'AbortError') {\n        mcpError = new TimeoutError('Request timed out', { cause: error });\n      } else if (error instanceof TypeError && error.message.includes('fetch')) {\n        mcpError = new NetworkError('Network error occurred', { cause: error });\n      } else if (error instanceof Error) {\n        mcpError = new MCPError(error.message, { cause: error });\n      } else {\n        mcpError = new MCPError(String(error));\n      }\n\n      lastError = mcpError;\n\n      // Check if we should retry\n      if (!customShouldRetry(mcpError, attempt)) {\n        throw mcpError;\n      }\n\n      // Calculate backoff delay\n      const delay = Math.min(\n        retryInitialDelay * Math.pow(retryBackoffFactor, attempt),\n        retryMaxDelay\n      );\n\n      // Log retry (only in development)\n      if (process.env.NODE_ENV !== 'production') {\n        console.warn(`Retry attempt ${attempt + 1}/${retries} for ${parsedUrl} after ${delay}ms delay`);\n      }\n\n      // Wait before retry\n      await sleep(delay);\n      attempt++;\n    }\n  }\n\n  // If we've exhausted all retries, throw the last error\n  if (lastError) {\n    throw lastError;\n  }\n\n  // This should never happen, but TypeScript needs it\n  throw new MCPError('Unknown error occurred');\n}\n","import { MCPOptions } from './types';\nimport { MCPError } from '../errors';\nimport { createFullUrl } from './paths';\n\n/**\n * WebSocket message interface\n */\nexport interface WebSocketMessage {\n  // Unique identifier for the message\n  id?: string;\n  // Message type for multiplexing\n  type?: string;\n  // Message payload\n  payload?: any;\n  // Target resource URI\n  uri?: string;\n  // Depth for ontology resolution\n  depth?: number;\n  // Any other properties\n  [key: string]: any;\n}\n\n/**\n * WebSocket event handlers\n */\nexport interface WebSocketEventHandlers {\n  // Connection opened\n  onOpen?: (event: Event) => void;\n  // Message received\n  onMessage?: (data: string, messageType?: string) => void;\n  // Error occurred\n  onError?: (event: Event) => void;\n  // Connection closed\n  onClose?: (event: CloseEvent) => void;\n  // Custom message type handlers\n  onMessageType?: Record<string, (data: any) => void>;\n  // Heartbeat response\n  onHeartbeat?: (latency: number) => void;\n  // Connection status change\n  onStatusChange?: (status: WebSocketStatus) => void;\n}\n\n/**\n * WebSocket connection status\n */\nexport enum WebSocketStatus {\n  CONNECTING = 0,\n  CONNECTED = 1,\n  CLOSING = 2,\n  CLOSED = 3,\n  RECONNECTING = 4,\n  ERROR = 5\n}\n\n/**\n * WebSocket subscription\n */\nexport interface WebSocketSubscription {\n  id: string;\n  type: string;\n  callback: (data: any) => void;\n  unsubscribe: () => void;\n}\n\n/**\n * Enhanced WebSocket client with advanced features\n */\nexport class MCPWebSocket {\n  private ws: WebSocket | null = null;\n  private baseUrl: string;\n  private apiKey?: string;\n  private token?: string;\n  private tenantId?: string;\n  private reconnectAttempts: number = 0;\n  private maxReconnectAttempts: number = 10;\n  private reconnectDelay: number = 1000;\n  private handlers: WebSocketEventHandlers = {};\n  private status: WebSocketStatus = WebSocketStatus.CLOSED;\n  private messageQueue: WebSocketMessage[] = [];\n  private subscriptions: Map<string, Set<(data: any) => void>> = new Map();\n  private heartbeatInterval?: number;\n  private heartbeatTimeout?: number;\n  private lastHeartbeatTime?: number;\n  private heartbeatDelay: number = 15000; // 15 seconds to match server's interval\n  private connectionId: string = '';\n  private binarySupport: boolean = false;\n  private connectionPath: string = '/resolve_ws';\n  private autoReconnect: boolean = true;\n  private lastConnectionTime: number = 0;\n  private connectionRetryTimer: ReturnType<typeof setTimeout> | null = null;\n  private manualClose: boolean = false;\n\n  /**\n   * Creates a new WebSocket client\n   */\n  constructor(options: MCPOptions & { autoReconnect?: boolean, maxReconnectAttempts?: number }) {\n    // Convert HTTP URL to WebSocket URL if needed\n    let wsBaseUrl = options.baseUrl || 'https://api.mcp.ai';\n    wsBaseUrl = wsBaseUrl.replace(/^http/, 'ws');\n\n    this.baseUrl = wsBaseUrl;\n    this.apiKey = options.apiKey;\n    this.token = options.token;\n    this.tenantId = options.tenantId;\n    this.autoReconnect = options.autoReconnect !== false;\n\n    if (options.maxReconnectAttempts !== undefined) {\n      this.maxReconnectAttempts = options.maxReconnectAttempts;\n    }\n  }\n\n  /**\n   * Connects to the MCP WebSocket endpoint\n   */\n  connect(path: string = '/resolve_ws', handlers: WebSocketEventHandlers = {}): void {\n    if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n      console.warn('WebSocket is already connected. Disconnect first to reconnect.');\n      return;\n    }\n\n    // Save the connection path for reconnection\n    this.connectionPath = path;\n\n    // Reset manual close flag\n    this.manualClose = false;\n\n    // Update status\n    this.setStatus(WebSocketStatus.CONNECTING);\n\n    // Store handlers\n    this.handlers = handlers;\n\n    // Set last connection time\n    this.lastConnectionTime = Date.now();\n\n    // Create the full WebSocket URL\n    const url = new URL(createFullUrl(this.baseUrl, path));\n\n    // Generate connection ID\n    this.connectionId = this.generateConnectionId();\n\n    // Add auth params as query parameters\n    if (this.apiKey) {\n      url.searchParams.append('apiKey', this.apiKey);\n    }\n    if (this.token) {\n      url.searchParams.append('token', this.token);\n    }\n    if (this.tenantId) {\n      url.searchParams.append('tenantId', this.tenantId);\n    }\n\n    // Add connection ID\n    url.searchParams.append('connectionId', this.connectionId);\n\n    // Create WebSocket\n    try {\n      this.ws = new WebSocket(url.toString());\n\n      // Setup binary data if supported\n      this.binarySupport = typeof this.ws.binaryType !== 'undefined';\n      if (this.binarySupport) {\n        this.ws.binaryType = 'arraybuffer';\n      }\n\n      // Set up event handlers\n      this.ws.onopen = this.handleOpen.bind(this);\n      this.ws.onmessage = this.handleMessage.bind(this);\n      this.ws.onerror = this.handleError.bind(this);\n      this.ws.onclose = this.handleClose.bind(this);\n    } catch (error) {\n      this.handleConnectionError(error);\n    }\n  }\n\n  /**\n   * Update and notify about status changes\n   */\n  private setStatus(newStatus: WebSocketStatus): void {\n    if (this.status !== newStatus) {\n      this.status = newStatus;\n\n      // Notify handler if exists\n      if (this.handlers.onStatusChange) {\n        try {\n          this.handlers.onStatusChange(newStatus);\n        } catch (error) {\n          console.error('Error in WebSocket status change handler:', error);\n        }\n      }\n    }\n  }\n\n  /**\n   * Handle WebSocket open event\n   */\n  private handleOpen(event: Event): void {\n    console.log('WebSocket connection opened');\n\n    // Update status\n    this.setStatus(WebSocketStatus.CONNECTED);\n\n    // Reset reconnect attempts\n    this.reconnectAttempts = 0;\n\n    // Call the open handler\n    if (this.handlers.onOpen) {\n      try {\n        this.handlers.onOpen(event);\n      } catch (error) {\n        console.error('Error in WebSocket open handler:', error);\n      }\n    }\n\n    // Start heartbeat\n    this.startHeartbeat();\n\n    // Process the message queue\n    this.processQueue();\n  }\n\n  /**\n   * Handle WebSocket message event\n   */\n  private handleMessage(event: MessageEvent): void {\n    // Get the message data\n    let data: any;\n    let messageType: string | undefined;\n\n    try {\n      // Handle binary data if needed\n      if (this.binarySupport && event.data instanceof ArrayBuffer) {\n        // Handle binary data\n        const view = new Uint8Array(event.data);\n        // Convert to string (this is just an example, might need custom binary parsing)\n        const textDecoder = new TextDecoder();\n        data = textDecoder.decode(view);\n      } else {\n        // Handle text data\n        data = JSON.parse(event.data);\n        messageType = data.type;\n      }\n\n      // Call the general message handler\n      if (this.handlers.onMessage) {\n        try {\n          this.handlers.onMessage(event.data, messageType);\n        } catch (error) {\n          console.error('Error in WebSocket message handler:', error);\n        }\n      }\n\n      // Call the type-specific handler if it exists\n      if (messageType && this.handlers.onMessageType && this.handlers.onMessageType[messageType]) {\n        try {\n          this.handlers.onMessageType[messageType](data);\n        } catch (error) {\n          console.error(`Error in WebSocket message type handler for ${messageType}:`, error);\n        }\n      }\n\n      // Distribute to subscriptions\n      if (messageType && this.subscriptions.has(messageType)) {\n        const callbacks = this.subscriptions.get(messageType);\n        if (callbacks) {\n          callbacks.forEach(callback => {\n            try {\n              callback(data);\n            } catch (error) {\n              console.error(`Error in WebSocket subscription callback for ${messageType}:`, error);\n            }\n          });\n        }\n      }\n\n      // Handle heartbeat response\n      if (messageType === 'heartbeat' && this.lastHeartbeatTime) {\n        const latency = Date.now() - this.lastHeartbeatTime;\n\n        if (this.handlers.onHeartbeat) {\n          try {\n            this.handlers.onHeartbeat(latency);\n          } catch (error) {\n            console.error('Error in WebSocket heartbeat handler:', error);\n          }\n        }\n      }\n    } catch (error) {\n      console.error('Error processing WebSocket message:', error);\n    }\n  }\n\n  /**\n   * Handle WebSocket error event\n   */\n  private handleError(event: Event): void {\n    console.error('WebSocket error:', event);\n\n    // Set error status\n    this.setStatus(WebSocketStatus.ERROR);\n\n    // Call the error handler\n    if (this.handlers.onError) {\n      try {\n        this.handlers.onError(event);\n      } catch (error) {\n        console.error('Error in WebSocket error handler:', error);\n      }\n    }\n  }\n\n  /**\n   * Handle WebSocket close event\n   */\n  private handleClose(event: CloseEvent): void {\n    console.log(`WebSocket closed with code ${event.code}, reason: ${event.reason}`);\n\n    // Update status\n    this.setStatus(WebSocketStatus.CLOSED);\n\n    // Stop heartbeat\n    this.stopHeartbeat();\n\n    // Call the close handler\n    if (this.handlers.onClose) {\n      try {\n        this.handlers.onClose(event);\n      } catch (error) {\n        console.error('Error in WebSocket close handler:', error);\n      }\n    }\n\n    // Attempt reconnection if not manually closed and auto-reconnect is enabled\n    if (!this.manualClose && this.autoReconnect) {\n      this.attemptReconnect();\n    }\n  }\n\n  /**\n   * Handle connection initialization error\n   */\n  private handleConnectionError(error: any): void {\n    console.error('WebSocket connection error:', error);\n\n    // Update status\n    this.setStatus(WebSocketStatus.ERROR);\n\n    // Attempt reconnection if auto-reconnect is enabled\n    if (this.autoReconnect) {\n      this.attemptReconnect();\n    }\n  }\n\n  /**\n   * Send a message over the WebSocket connection\n   */\n  send(message: WebSocketMessage): boolean {\n    // Check connection\n    if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n      // Queue the message\n      this.queueMessage(message);\n\n      // Try to connect if closed\n      if (!this.ws || this.ws.readyState === WebSocket.CLOSED) {\n        this.connect(this.connectionPath, this.handlers);\n      }\n\n      return false;\n    }\n\n    try {\n      // Add an ID if not present\n      if (!message.id) {\n        message.id = this.generateMessageId();\n      }\n\n      // Send as JSON\n      this.ws.send(JSON.stringify(message));\n      return true;\n    } catch (error) {\n      console.error('Error sending WebSocket message:', error);\n\n      // Queue the message\n      this.queueMessage(message);\n      return false;\n    }\n  }\n\n  /**\n   * Queue a message for later sending\n   */\n  private queueMessage(message: WebSocketMessage): void {\n    // Prevent queue from growing too large\n    if (this.messageQueue.length >= 100) {\n      console.warn('WebSocket message queue is full, dropping oldest message');\n      this.messageQueue.shift();\n    }\n\n    this.messageQueue.push(message);\n  }\n\n  /**\n   * Process the message queue\n   */\n  private processQueue(): void {\n    if (this.ws && this.ws.readyState === WebSocket.OPEN && this.messageQueue.length > 0) {\n      console.log(`Processing ${this.messageQueue.length} queued WebSocket messages`);\n\n      const queue = [...this.messageQueue];\n      this.messageQueue = [];\n\n      for (const message of queue) {\n        if (!this.send(message)) {\n          break;\n        }\n      }\n    }\n  }\n\n  /**\n   * Subscribe to a specific message type\n   */\n  subscribe<T = any>(type: string, callback: (data: T) => void): WebSocketSubscription {\n    // Create a subscription ID\n    const id = this.generateSubscriptionId();\n\n    // Add to the subscriptions map\n    if (!this.subscriptions.has(type)) {\n      this.subscriptions.set(type, new Set());\n    }\n\n    const callbacks = this.subscriptions.get(type)!;\n    callbacks.add(callback as any);\n\n    // Create an unsubscribe function\n    const unsubscribe = () => {\n      if (this.subscriptions.has(type)) {\n        const callbacks = this.subscriptions.get(type)!;\n        callbacks.delete(callback as any);\n\n        if (callbacks.size === 0) {\n          this.subscriptions.delete(type);\n        }\n      }\n    };\n\n    // Return the subscription object\n    return {\n      id,\n      type,\n      callback: callback as any,\n      unsubscribe\n    };\n  }\n\n  /**\n   * Send a request to resolve a URI\n   */\n  resolveUri(uri: string, depth: number = 1): boolean {\n    return this.send({\n      type: 'resolve',\n      uri,\n      depth\n    });\n  }\n\n  /**\n   * Close the WebSocket connection\n   */\n  disconnect(): void {\n    // Set manual close flag to prevent auto-reconnect\n    this.manualClose = true;\n\n    // Stop heartbeat\n    this.stopHeartbeat();\n\n    // Clear reconnect timer\n    if (this.connectionRetryTimer) {\n      clearTimeout(this.connectionRetryTimer);\n      this.connectionRetryTimer = null;\n    }\n\n    // Close WebSocket if it exists\n    if (this.ws) {\n      try {\n        // Check if it's not already closed\n        if (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING) {\n          this.setStatus(WebSocketStatus.CLOSING);\n          this.ws.close(1000, 'Client disconnect');\n        }\n      } catch (error) {\n        console.error('Error closing WebSocket:', error);\n      } finally {\n        this.ws = null;\n        this.setStatus(WebSocketStatus.CLOSED);\n      }\n    }\n  }\n\n  /**\n   * Get the current WebSocket state\n   */\n  getState(): WebSocketStatus {\n    // If we have no socket, or it's been explicitly closed, return CLOSED\n    if (!this.ws) {\n      return WebSocketStatus.CLOSED;\n    }\n\n    // Map readyState to our status enum if we're not in a special state\n    if (this.status !== WebSocketStatus.RECONNECTING && this.status !== WebSocketStatus.ERROR) {\n      switch (this.ws.readyState) {\n        case WebSocket.CONNECTING:\n          return WebSocketStatus.CONNECTING;\n        case WebSocket.OPEN:\n          return WebSocketStatus.CONNECTED;\n        case WebSocket.CLOSING:\n          return WebSocketStatus.CLOSING;\n        case WebSocket.CLOSED:\n          return WebSocketStatus.CLOSED;\n        default:\n          return WebSocketStatus.CLOSED;\n      }\n    }\n\n    // Return the current status for special states\n    return this.status;\n  }\n\n  /**\n   * Attempt to reconnect with exponential backoff\n   */\n  private attemptReconnect(): void {\n    // Clear any existing reconnect timer\n    if (this.connectionRetryTimer) {\n      clearTimeout(this.connectionRetryTimer);\n      this.connectionRetryTimer = null;\n    }\n\n    // Don't reconnect if we've exceeded the max attempts\n    if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n      console.error(`WebSocket maximum reconnection attempts (${this.maxReconnectAttempts}) reached`);\n      return;\n    }\n\n    // Don't reconnect if manually closed\n    if (this.manualClose) {\n      return;\n    }\n\n    // Calculate backoff with exponential delay and jitter\n    this.reconnectAttempts++;\n\n    const baseDelay = this.reconnectDelay;\n    const exponentialDelay = baseDelay * Math.pow(1.5, this.reconnectAttempts - 1);\n    const maxDelay = 30000; // 30 seconds max\n    const cappedDelay = Math.min(exponentialDelay, maxDelay);\n    const jitter = cappedDelay * 0.2; // 20% jitter\n    const delay = cappedDelay + (Math.random() * jitter * 2 - jitter);\n\n    this.setStatus(WebSocketStatus.RECONNECTING);\n    console.log(`WebSocket reconnecting in ${Math.round(delay)}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`);\n\n    // Set a timer to reconnect\n    this.connectionRetryTimer = setTimeout(() => {\n      this.connect(this.connectionPath, this.handlers);\n    }, delay);\n  }\n\n  /**\n   * Start the heartbeat timer\n   */\n  private startHeartbeat(): void {\n    // Stop any existing heartbeat\n    this.stopHeartbeat();\n\n    // Start a new heartbeat interval\n    this.heartbeatInterval = window.setInterval(() => {\n      // Only send heartbeat if we're connected\n      if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n        // Store the time\n        this.lastHeartbeatTime = Date.now();\n\n        // Send a heartbeat message\n        this.send({\n          type: 'heartbeat',\n          timestamp: this.lastHeartbeatTime\n        });\n\n        // Set a timeout for response\n        this.heartbeatTimeout = window.setTimeout(() => {\n          console.warn('WebSocket heartbeat timeout');\n\n          // If we're still connected, disconnect and reconnect\n          if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n            this.disconnect();\n\n            if (this.autoReconnect) {\n              this.connect(this.connectionPath, this.handlers);\n            }\n          }\n        }, 5000); // 5 second timeout\n      }\n    }, this.heartbeatDelay);\n  }\n\n  /**\n   * Stop the heartbeat timer\n   */\n  private stopHeartbeat(): void {\n    // Clear the interval\n    if (this.heartbeatInterval) {\n      clearInterval(this.heartbeatInterval);\n      this.heartbeatInterval = undefined;\n    }\n\n    // Clear the timeout\n    if (this.heartbeatTimeout) {\n      clearTimeout(this.heartbeatTimeout);\n      this.heartbeatTimeout = undefined;\n    }\n  }\n\n  /**\n   * Set the heartbeat interval\n   */\n  setHeartbeatInterval(intervalMs: number): void {\n    if (intervalMs < 1000) {\n      console.warn('Heartbeat interval too small, setting to 1000ms');\n      intervalMs = 1000;\n    }\n\n    this.heartbeatDelay = intervalMs;\n\n    // Restart heartbeat if we're connected\n    if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n      this.startHeartbeat();\n    }\n  }\n\n  /**\n   * Set the maximum number of reconnect attempts\n   */\n  setMaxReconnectAttempts(attempts: number): void {\n    this.maxReconnectAttempts = attempts;\n  }\n\n  /**\n   * Set the reconnect delay\n   */\n  setReconnectDelay(delayMs: number): void {\n    this.reconnectDelay = delayMs;\n  }\n\n  /**\n   * Generate a unique subscription ID\n   */\n  private generateSubscriptionId(): string {\n    return `sub_${Date.now()}_${Math.floor(Math.random() * 1000000)}`;\n  }\n\n  /**\n   * Generate a unique message ID\n   */\n  private generateMessageId(): string {\n    return `msg_${Date.now()}_${Math.floor(Math.random() * 1000000)}`;\n  }\n\n  /**\n   * Generate a unique connection ID\n   */\n  private generateConnectionId(): string {\n    return `conn_${Date.now()}_${Math.floor(Math.random() * 1000000)}`;\n  }\n}\n\n/**\n * Create a WebSocket client with the given options\n */\nexport function createWebSocketClient(options: MCPOptions): MCPWebSocket {\n  return new MCPWebSocket(options);\n}\n","import {\n  MCPOptions,\n  MCPResponse,\n  OntologyMetadata,\n  OntologySummary,\n  MCPCacheOptions,\n  MCPRequestParams\n} from './types';\nimport { createAuthHeaders } from '../auth';\nimport { fetcher, FetchOptions } from '../utils/fetcher';\nimport { MCPWebSocket } from './websocket';\nimport { MCPError } from '../errors';\nimport { z } from 'zod';\nimport { validate } from '../validators/validation';\nimport { ApiEndpoints, buildPath, createFullUrl } from './paths';\nimport { MCPSSEClient } from './sse';\nimport { MCPArrowClient } from './arrow-ipc';\n\nexport { MCPWebSocket } from './websocket';\n\nexport type ErrorHandler = (error: MCPError, requestInfo?: {\n  method: string;\n  url: string;\n  options?: FetchOptions;\n}) => void | Promise<void>;\n\n/**\n * Extended RequestInit with Next.js options\n */\ninterface ExtendedRequestInit extends RequestInit {\n  next?: {\n    revalidate?: number | false;\n    tags?: string[];\n  };\n}\n\n/**\n * MCP Client\n * Handles communication with the MCP API\n */\nexport class MCPClient {\n  private baseUrl: string;\n  private tenantId?: string;\n  private apiKey?: string;\n  private token?: string;\n  private defaultOptions: RequestInit;\n  private globalErrorHandlers: ErrorHandler[] = [];\n  private defaultTimeout: number;\n  private _activeTransport: 'standard' | 'websocket' | 'sse' | 'arrow' | 'none' | null = null;\n  private _arrowClient: MCPArrowClient | null = null;\n\n  /**\n   * Creates a new MCP Client\n   * @param options - Client options\n   */\n  constructor(options: MCPOptions = {}) {\n    this.baseUrl = options.baseUrl || 'https://api.mcp.ai';\n    this.tenantId = options.tenantId;\n    this.apiKey = options.apiKey;\n    this.token = options.token;\n    this.defaultOptions = options.defaultFetchOptions || {};\n    this.defaultTimeout = options.defaultTimeout || 10000;\n  }\n\n  /**\n   * Add a global error handler for all requests\n   * @param handler - Function to handle errors\n   */\n  onError(handler: ErrorHandler): void {\n    this.globalErrorHandlers.push(handler);\n  }\n\n  /**\n   * Remove a global error handler\n   * @param handler - Handler to remove\n   */\n  removeErrorHandler(handler: ErrorHandler): void {\n    this.globalErrorHandlers = this.globalErrorHandlers.filter(h => h !== handler);\n  }\n\n  /**\n   * Handles an error by calling all registered error handlers\n   */\n  private async handleError(error: MCPError, requestInfo: {\n    method: string;\n    url: string;\n    options?: FetchOptions;\n  }): Promise<void> {\n    for (const handler of this.globalErrorHandlers) {\n      try {\n        await handler(error, requestInfo);\n      } catch (handlerError) {\n        console.error('Error in MCP error handler:', handlerError);\n      }\n    }\n  }\n\n  /**\n   * Creates a full URL from a path\n   */\n  private createUrl(path: string): string {\n    return createFullUrl(this.baseUrl, path);\n  }\n\n  /**\n   * Creates auth headers for a request\n   */\n  private createHeaders(customHeaders: HeadersInit = {}): HeadersInit {\n    return {\n      ...createAuthHeaders({\n        apiKey: this.apiKey,\n        token: this.token,\n        tenantId: this.tenantId\n      }),\n      ...customHeaders\n    };\n  }\n\n  /**\n   * Makes an HTTP request to the MCP API\n   * @param url - URL to request\n   * @param options - Fetch options\n   * @returns Promise with the response data\n   */\n  async request<T = any>(\n    params: MCPRequestParams & { path: string },\n    validateFn?: (data: any) => T\n  ): Promise<MCPResponse<T>> {\n    const {\n      path,\n      method = 'GET',\n      params: queryParams,\n      body,\n      cache,\n      revalidate,\n      tags,\n      ...restParams\n    } = params;\n\n    // Build URL with query params\n    const url = new URL(path.startsWith('http') ? path : `${this.baseUrl}${path}`);\n\n    // Add query parameters\n    if (queryParams) {\n      Object.entries(queryParams).forEach(([key, value]) => {\n        if (value !== undefined && value !== null) {\n          url.searchParams.append(key, String(value));\n        }\n      });\n    }\n\n    // Build fetch options\n    const fetchOptions: ExtendedRequestInit = {\n      method,\n      headers: {\n        'Content-Type': 'application/json',\n        Accept: 'application/json',\n        ...this.defaultOptions.headers,\n      },\n      ...this.defaultOptions,\n      body,\n      ...restParams,\n    };\n\n    // Add authentication headers if available\n    if (this.token) {\n      (fetchOptions.headers as Record<string, string>)['Authorization'] = `Bearer ${this.token}`;\n    } else if (this.apiKey) {\n      (fetchOptions.headers as Record<string, string>)['X-API-Key'] = this.apiKey;\n    }\n\n    // Add tenant ID if available\n    if (this.tenantId) {\n      (fetchOptions.headers as Record<string, string>)['X-Tenant-ID'] = this.tenantId;\n    }\n\n    // Add Next.js cache options if provided\n    if (typeof cache !== 'undefined') {\n      if (typeof cache === 'boolean') {\n        fetchOptions.cache = cache ? 'force-cache' : 'no-store';\n      } else if (typeof cache === 'string') {\n        fetchOptions.cache = cache;\n      } else if (typeof cache === 'object') {\n        // Handle complex cache config\n        if (cache.maxAge !== undefined) {\n          fetchOptions.next = {\n            ...fetchOptions.next,\n            revalidate: cache.maxAge,\n          };\n        }\n        if (cache.tag) {\n          fetchOptions.next = {\n            ...fetchOptions.next,\n            tags: Array.isArray(cache.tag) ? cache.tag : [cache.tag],\n          };\n        }\n      }\n    }\n\n    // Add revalidate option if provided\n    if (revalidate !== undefined) {\n      fetchOptions.next = {\n        ...fetchOptions.next,\n        revalidate,\n      };\n    }\n\n    // Add tags if provided\n    if (tags) {\n      fetchOptions.next = {\n        ...fetchOptions.next,\n        tags,\n      };\n    }\n\n    try {\n      const response = await fetch(url.toString(), fetchOptions);\n\n      // Handle non-2xx responses\n      if (!response.ok) {\n        const errorText = await response.text();\n        let errorData;\n\n        try {\n          errorData = JSON.parse(errorText);\n        } catch (e) {\n          errorData = { message: errorText };\n        }\n\n        throw new MCPError(`HTTP error ${response.status}: ${errorData.message || ''}`, {\n          status: response.status,\n          code: errorData.code,\n        });\n      }\n\n      // Parse response as JSON\n      const contentType = response.headers.get('content-type');\n\n      let data: T;\n\n      if (contentType && contentType.includes('application/json')) {\n        data = await response.json();\n      } else {\n        data = await response.text() as unknown as T;\n      }\n\n      // Validate response data if a validation function is provided\n      if (validateFn) {\n        data = validateFn(data);\n      }\n\n      return {\n        data,\n        status: response.status,\n        headers: response.headers,\n        response,\n      };\n    } catch (error) {\n      if (error instanceof MCPError) {\n        throw error;\n      }\n\n      throw new MCPError(`Request failed: ${(error as Error).message || 'Unknown error'}`, {\n        status: 500,\n        cause: error,\n      });\n    }\n  }\n\n  /**\n   * Makes a GET request with schema validation\n   * @param path - API endpoint path\n   * @param schema - Zod schema for response validation\n   * @param params - Request parameters\n   * @returns Validated response data\n   */\n  /**\n   * Makes a simple GET request without schema validation\n   * @param path - API endpoint path\n   * @param params - Request parameters\n   * @returns Response data\n   */\n  async get<T = any>(\n    path: string,\n    params?: Omit<MCPRequestParams, 'method'>\n  ): Promise<T> {\n    const response = await this.request({ path, method: 'GET', ...params });\n    return response.data;\n  }\n\n  /**\n   * Makes a GET request with schema validation\n   * @param path - API endpoint path\n   * @param schema - Zod schema for response validation\n   * @param params - Request parameters\n   * @returns Validated response data\n   */\n  async getTyped<T>(\n    path: string,\n    schema: z.ZodType<T>,\n    params?: Omit<MCPRequestParams, 'method'>\n  ): Promise<MCPResponse<T>> {\n    return this.request(\n      { path, method: 'GET', ...params },\n      (data) => validate(data, schema)\n    );\n  }\n\n  /**\n   * Makes a POST request with schema validation\n   * @param path - API endpoint path\n   * @param schema - Zod schema for response validation\n   * @param body - Request body\n   * @param params - Request parameters\n   * @returns Validated response data\n   */\n  /**\n   * Makes a simple POST request without schema validation\n   * @param path - API endpoint path\n   * @param body - Request body\n   * @param params - Request parameters\n   * @returns Response data\n   */\n  async post<T = any>(\n    path: string,\n    body?: any,\n    params?: Omit<MCPRequestParams, 'method' | 'body'>\n  ): Promise<T> {\n    const response = await this.request({\n      path,\n      method: 'POST',\n      body: body ? JSON.stringify(body) : undefined,\n      ...params\n    });\n    return response.data;\n  }\n\n  /**\n   * Makes a POST request with schema validation\n   * @param path - API endpoint path\n   * @param schema - Zod schema for response validation\n   * @param body - Request body\n   * @param params - Request parameters\n   * @returns Validated response data\n   */\n  async postTyped<T>(\n    path: string,\n    schema: z.ZodType<T>,\n    body?: any,\n    params?: Omit<MCPRequestParams, 'method' | 'body'>\n  ): Promise<MCPResponse<T>> {\n    return this.request(\n      {\n        path,\n        method: 'POST',\n        body: body ? JSON.stringify(body) : undefined,\n        ...params\n      },\n      (data) => validate(data, schema)\n    );\n  }\n\n  /**\n   * Makes a PUT request with schema validation\n   * @param path - API endpoint path\n   * @param schema - Zod schema for response validation\n   * @param body - Request body\n   * @param params - Request parameters\n   * @returns Validated response data\n   */\n  async putTyped<T>(\n    path: string,\n    schema: z.ZodType<T>,\n    body?: any,\n    params?: Omit<MCPRequestParams, 'method' | 'body'>\n  ): Promise<MCPResponse<T>> {\n    return this.request(\n      {\n        path,\n        method: 'PUT',\n        body: body ? JSON.stringify(body) : undefined,\n        ...params\n      },\n      (data) => validate(data, schema)\n    );\n  }\n\n  /**\n   * Gets all ontologies\n   * @param options - Request parameters\n   */\n  async getOntologies(params?: Omit<MCPRequestParams, 'method'>) {\n    return this.request<OntologySummary[]>({ path: ApiEndpoints.Ontologies, ...params });\n  }\n\n  /**\n   * Gets ontology by ID\n   * @param id - Ontology ID\n   * @param params - Request parameters\n   */\n  async getOntology(id: string, params?: Omit<MCPRequestParams, 'method'>) {\n    const path = buildPath(ApiEndpoints.OntologyById, { id });\n    return this.request<OntologyMetadata>({ path, ...params });\n  }\n\n  /**\n   * Gets current user details\n   * @param params - Request parameters\n   */\n  async getCurrentUser(params?: Omit<MCPRequestParams, 'method'>) {\n    return this.request({ path: ApiEndpoints.CurrentUser, ...params });\n  }\n\n  /**\n   * Gets user by ID\n   * @param id - User ID\n   * @param params - Request parameters\n   */\n  async getUser(id: string, params?: Omit<MCPRequestParams, 'method'>) {\n    const path = buildPath(ApiEndpoints.UserById, { id });\n    return this.request({ path, ...params });\n  }\n\n  /**\n   * Gets current tenant details\n   * @param params - Request parameters\n   */\n  async getCurrentTenant(params?: Omit<MCPRequestParams, 'method'>) {\n    return this.request({ path: ApiEndpoints.CurrentTenant, ...params });\n  }\n\n  /**\n   * Gets tenant by ID\n   * @param id - Tenant ID\n   * @param params - Request parameters\n   */\n  async getTenant(id: string, params?: Omit<MCPRequestParams, 'method'>) {\n    const path = buildPath(ApiEndpoints.TenantById, { id });\n    return this.request({ path, ...params });\n  }\n\n  /**\n   * Connect to MCP using the specified transport\n   * @param transportOptions - Transport-specific options\n   */\n  async connect(transportOptions: any): Promise<void> {\n    console.log('Connecting to MCP...');\n\n    // Check if we should use the Arrow transport\n    if (transportOptions.type === 'arrow' || this._activeTransport === 'arrow') {\n      // Set active transport to arrow\n      this.setActiveTransport('arrow');\n\n      // Get or create arrow client\n      const arrowClient = this.getArrowClient(transportOptions);\n\n      // Connect using WebSocket\n      arrowClient.connect(transportOptions.path || '/arrow', {\n        onOpen: transportOptions.onOpen,\n        onMessage: transportOptions.onMessage,\n        onBinaryMessage: transportOptions.onBinaryMessage,\n        onError: transportOptions.onError,\n        onClose: transportOptions.onClose,\n        onStatusChange: transportOptions.onStatusChange\n      });\n\n      return Promise.resolve();\n    }\n\n    // Handle other transport types...\n    return Promise.resolve();\n  }\n\n  /**\n   * Disconnect from MCP\n   */\n  async disconnect(): Promise<void> {\n    console.log('Disconnecting from MCP...');\n\n    // Handle Arrow transport disconnection\n    if (this._activeTransport === 'arrow' && this._arrowClient) {\n      this._arrowClient.disconnect();\n      return Promise.resolve();\n    }\n\n    // Handle other transport types...\n    return Promise.resolve();\n  }\n\n  /**\n   * Upload an ontology file for the tenant\n   * @param file - OWL ontology file to upload\n   * @param name - Optional name for the ontology\n   * @param options - Additional fetch options\n   */\n  async uploadOntology(\n    file: File | Blob,\n    name?: string,\n    options: FetchOptions = {}\n  ): Promise<MCPResponse<OntologyMetadata>> {\n    const formData = new FormData();\n    formData.append('file', file);\n\n    if (name) {\n      formData.append('name', name);\n    }\n\n    // Create headers without content-type (browser will set it with correct boundary)\n    const headersObj = createAuthHeaders({\n      apiKey: this.apiKey,\n      token: this.token,\n      tenantId: this.tenantId\n    });\n\n    // Merge with custom headers\n    const headers = {\n      ...headersObj,\n      ...(options.headers as Record<string, string> || {})\n    };\n\n    // Remove content-type header\n    if ('Content-Type' in headers) {\n      delete headers['Content-Type'];\n    }\n\n    const url = this.createUrl('/ontologies');\n\n    try {\n      return await fetcher<OntologyMetadata>(url, {\n        method: 'POST',\n        body: formData,\n        ...this.defaultOptions,\n        ...options,\n        headers\n      });\n    } catch (error) {\n      const mcpError = error instanceof MCPError ? error : new MCPError(String(error), { cause: error });\n      await this.handleError(mcpError, {\n        method: 'POST',\n        url,\n        options\n      });\n      throw mcpError;\n    }\n  }\n\n  /**\n   * Creates a WebSocket client with the same configuration as this client\n   */\n  createWebSocketClient(): MCPWebSocket {\n    return new MCPWebSocket({\n      baseUrl: this.baseUrl,\n      apiKey: this.apiKey,\n      token: this.token,\n      tenantId: this.tenantId\n    });\n  }\n\n  /**\n   * Set cache options for all requests\n   * @param cache - Cache options to use\n   */\n  setCacheOptions(cache: MCPCacheOptions): void {\n    this.defaultOptions.cache = cache as any;\n  }\n\n  /**\n   * Fetches the list of available tools\n   * @param params Optional request parameters\n   * @returns Promise with the list of available tools\n   */\n  async getTools(params?: Omit<MCPRequestParams, 'method'>): Promise<MCPResponse<any[]>> {\n    try {\n      // Try REST-style first\n      try {\n        const response = await this.request({\n          path: buildPath(ApiEndpoints.ToolsList),\n          method: 'GET',\n          ...params\n        });\n        return response;\n      } catch (restError) {\n        console.log('REST style failed, trying JSON-RPC:', restError);\n\n        // Fallback to JSON-RPC style if REST fails\n        const response = await this.request({\n          path: buildPath(ApiEndpoints.JsonRPC),\n          method: 'POST',\n          body: JSON.stringify({\n            jsonrpc: \"2.0\",\n            method: \"listTools\",\n            params: {},\n            id: Date.now().toString()\n          }),\n          ...params\n        });\n        return response;\n      }\n    } catch (error) {\n      console.error('Error fetching tools:', error);\n      throw error instanceof MCPError\n        ? error\n        : new MCPError('Failed to fetch tools', { cause: error });\n    }\n  }\n\n  /**\n   * Executes a tool with parameters\n   * @param toolName Name of the tool to execute\n   * @param parameters Parameters for the tool\n   * @param params Optional request parameters\n   * @returns Promise with the tool execution result\n   */\n  async executeTool(\n    toolName: string,\n    parameters: Record<string, any>,\n    params?: Omit<MCPRequestParams, 'method' | 'body'>\n  ): Promise<MCPResponse<any>> {\n    try {\n      // Try REST-style first\n      try {\n        const response = await this.request({\n          path: buildPath(ApiEndpoints.ToolsExecute),\n          method: 'POST',\n          body: JSON.stringify({\n            name: toolName,\n            parameters\n          }),\n          ...params\n        });\n        return response;\n      } catch (restError) {\n        console.log('REST style failed, trying JSON-RPC:', restError);\n\n        // Fallback to JSON-RPC style if REST fails\n        const response = await this.request({\n          path: buildPath(ApiEndpoints.JsonRPC),\n          method: 'POST',\n          body: JSON.stringify({\n            jsonrpc: \"2.0\",\n            method: \"runTool\",\n            params: {\n              name: toolName,\n              arguments: parameters\n            },\n            id: Date.now().toString()\n          }),\n          ...params\n        });\n        return response;\n      }\n    } catch (error) {\n      console.error(`Error executing tool ${toolName}:`, error);\n      throw error instanceof MCPError\n        ? error\n        : new MCPError(`Failed to execute tool ${toolName}`, { cause: error });\n    }\n  }\n\n  /**\n   * Streams a tool execution with parameters\n   * @param toolName Name of the tool to execute\n   * @param parameters Parameters for the tool\n   * @param onChunk Callback for each chunk of streamed data\n   * @param params Optional request parameters\n   * @returns Promise that resolves when streaming completes\n   */\n  async streamTool(\n    toolName: string,\n    parameters: Record<string, any>,\n    onChunk: (chunk: any) => void,\n    params?: Omit<MCPRequestParams, 'method' | 'body'>\n  ): Promise<void> {\n    // For streaming, we'll use the SSE endpoint\n    const url = this.createUrl('/sse');\n\n    try {\n      const headers: Record<string, string> = {\n        Accept: 'text/event-stream',\n        ...(this.createHeaders() as Record<string, string>)\n      };\n\n      const response = await fetch(url, {\n        method: 'GET',\n        headers\n      });\n\n      if (!response.ok) {\n        let errorMessage = `HTTP error ${response.status}`;\n\n        try {\n          const errorData = await response.json();\n          errorMessage = errorData.message || errorMessage;\n        } catch {\n          // Ignore JSON parsing errors\n        }\n\n        throw new MCPError(errorMessage, { status: response.status });\n      }\n\n      if (!response.body) {\n        throw new MCPError('Response body is null');\n      }\n\n      const reader = response.body.getReader();\n      const decoder = new TextDecoder();\n\n      let clientId: string | null = null;\n      let messageEndpoint: string | null = null;\n\n      try {\n        while (true) {\n          const { done, value } = await reader.read();\n\n          if (done) {\n            break;\n          }\n\n          const chunk = decoder.decode(value, { stream: true });\n\n          // Process each line (event) separately\n          for (const line of chunk.split('\\n').filter(Boolean)) {\n            if (line.startsWith('event:')) {\n              // This is an event type\n              const eventType = line.slice(6).trim();\n\n              // If this is the endpoint event, we'll need to send our request to this endpoint\n              if (eventType === 'endpoint') {\n                continue;\n              }\n            } else if (line.startsWith('data:')) {\n              const data = line.slice(5).trim();\n\n              try {\n                const parsedData = JSON.parse(data);\n\n                // If this contains the endpoint info, store it\n                if (parsedData.endpoint) {\n                  messageEndpoint = parsedData.endpoint;\n                  clientId = messageEndpoint ? messageEndpoint.split('/').pop() || null : null;\n\n                  // Now send the actual tool execution request\n                  if (messageEndpoint) {\n                    const toolRequest = {\n                      jsonrpc: \"2.0\",\n                      method: \"runTool\",\n                      params: {\n                        name: toolName,\n                        arguments: parameters\n                      },\n                      id: Date.now().toString()\n                    };\n\n                    // Send the request to the message endpoint\n                    fetch(this.createUrl(messageEndpoint), {\n                      method: 'POST',\n                      headers: {\n                        'Content-Type': 'application/json',\n                        ...(this.createHeaders() as Record<string, string>)\n                      },\n                      body: JSON.stringify(toolRequest)\n                    }).catch(e => {\n                      console.error(\"Error sending tool request:\", e);\n                    });\n                  }\n                } else {\n                  // This is a message from the server in response to our request\n                  onChunk(parsedData);\n                }\n              } catch (error) {\n                console.warn('Error parsing SSE data:', error);\n                // Pass raw data if JSON parsing fails\n                onChunk(data);\n              }\n            }\n          }\n        }\n      } finally {\n        reader.releaseLock();\n      }\n    } catch (error) {\n      console.error(`Error streaming tool ${toolName}:`, error);\n      throw error instanceof MCPError\n        ? error\n        : new MCPError(`Failed to stream tool ${toolName}`, { cause: error });\n    }\n  }\n\n  /**\n   * Get the current active transport type\n   */\n  getActiveTransport(): 'standard' | 'websocket' | 'sse' | 'arrow' | 'none' {\n    return this._activeTransport || 'standard';\n  }\n\n  /**\n   * Set the active transport type\n   */\n  setActiveTransport(transport: 'standard' | 'websocket' | 'sse' | 'arrow' | 'none'): void {\n    this._activeTransport = transport;\n    console.log(`Active transport set to: ${transport}`);\n  }\n\n  /**\n   * Create an Arrow IPC client\n   */\n  createArrowClient(options: MCPOptions = {}): MCPArrowClient {\n    const transportOptions = {\n      ...this.getStandardOptions(),\n      ...options,\n      baseUrl: options.baseUrl || this.baseUrl,\n    };\n\n    // Import dynamically to avoid bundling issues\n    const { createArrowClient } = require('./arrow-ipc');\n    const client = createArrowClient(transportOptions);\n\n    this._arrowClient = client;\n    return client;\n  }\n\n  /**\n   * Get the Arrow IPC client, creating one if it doesn't exist\n   */\n  getArrowClient(options: MCPOptions = {}): MCPArrowClient {\n    if (!this._arrowClient) {\n      return this.createArrowClient(options);\n    }\n    return this._arrowClient;\n  }\n\n  /**\n   * Get standard options for transport clients\n   */\n  private getStandardOptions(): MCPOptions {\n    return {\n      baseUrl: this.baseUrl,\n      tenantId: this.tenantId,\n      apiKey: this.apiKey,\n      token: this.token,\n      defaultTimeout: this.defaultTimeout\n    };\n  }\n}\n","import { z } from 'zod';\nimport { ValidationError } from '../errors';\n\n/**\n * Validates data against a Zod schema and returns the validated data\n * @param schema - Zod schema to validate against\n * @param data - Data to validate\n * @returns Validated and typed data\n * @throws ValidationError if validation fails\n */\nexport function validate<T>(schema: z.ZodType<T>, data: unknown): T {\n  try {\n    return schema.parse(data);\n  } catch (error) {\n    if (error instanceof z.ZodError) {\n      throw new ValidationError(\n        `Validation failed: ${error.errors.map((e) => e.message).join(', ')}`,\n        { errors: error.format() }\n      );\n    }\n    throw error;\n  }\n}\n\n/**\n * Similar to validate, but returns a Result object with success/error state\n * instead of throwing an exception.\n */\nexport function validateSafe<T>(schema: z.ZodType<T>, data: unknown): {\n  success: boolean;\n  data?: T;\n  error?: ValidationError;\n} {\n  try {\n    return {\n      success: true,\n      data: schema.parse(data)\n    };\n  } catch (error) {\n    if (error instanceof z.ZodError) {\n      return {\n        success: false,\n        error: new ValidationError(\n          `Validation failed: ${error.errors.map((e) => e.message).join(', ')}`,\n          { errors: error.format() }\n        )\n      };\n    }\n    if (error instanceof Error) {\n      return {\n        success: false,\n        error: new ValidationError(error.message, { cause: error })\n      };\n    }\n    return {\n      success: false,\n      error: new ValidationError(`Unknown validation error: ${String(error)}`)\n    };\n  }\n}\n\n/**\n * Returns a function that will validate data against the given schema\n * @param schema - Zod schema to validate against\n * @returns Function that validates data against the schema\n */\nexport function createValidator<T>(schema: z.ZodType<T>): (data: unknown) => T {\n  return (data: unknown) => validate(schema, data);\n}\n\n/**\n * Creates a safe validator that doesn't throw exceptions\n */\nexport function createSafeValidator<T>(schema: z.ZodType<T>): (data: unknown) => {\n  success: boolean;\n  data?: T;\n  error?: ValidationError;\n} {\n  return (data: unknown) => validateSafe(schema, data);\n}\n\n/**\n * Validates an array of items against a schema\n */\nexport function validateArray<T>(schema: z.ZodType<T>, data: unknown): T[] {\n  const arraySchema = z.array(schema);\n  return validate(arraySchema, data);\n}\n\n/**\n * Validates that the response is a non-null object before further validation\n */\nexport function validateResponse<T>(schema: z.ZodType<T>, data: unknown): T {\n  // First ensure we have a non-null object\n  const baseSchema = z.object({}).required();\n  baseSchema.parse(data);\n\n  // Then validate the actual schema\n  return validate(schema, data);\n}\n"]}