{"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","../src/client/ontology-client.ts","../src/client/sse.ts","../src/index.ts","../src/client/transports/http.ts","../src/client/transports/index.ts","../src/client/tenant-service.ts","../src/client/redis-cache.ts"],"names":["ArrowConnectionStatus","encoder","attempt","callbacks","createArrowClient","handlers","resolve","reject"],"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","import { MCPClient } from './index';\nimport { HTTPError } from '../errors';\nimport {\n  OntologyEntityNotFoundError,\n  OntologyModificationError,\n  OntologyPaginationError,\n  OntologySparqlError,\n  parseOntologyError\n} from '../errors/ontology-errors';\nimport {\n  ClassInfoParams,\n  ExecuteSparqlParams,\n  ModificationResult,\n  ModifyOntologyParams,\n  OntologyClass,\n  OntologyInstance,\n  OntologyProperty,\n  OntologyStats,\n  PaginatedOntologyResponse,\n  QueryConceptParams,\n  SearchConceptsParams,\n  SparqlQueryResult\n} from './ontology-types';\n\n/**\n * Extension of the MCPClient with ontology-specific methods\n */\nexport class OntologyClient extends MCPClient {\n  /**\n   * Get statistics about the ontology\n   *\n   * @returns Ontology statistics\n   */\n  async getOntologyStats(): Promise<OntologyStats> {\n    try {\n      const result = await this.get('resources/ontology://stats');\n      // Process the content from markdown to structured data\n      const statsStr = result?.contents?.[0]?.text;\n\n      if (!statsStr) {\n        throw new Error('Invalid statistics response format');\n      }\n\n      // Parse stats from the markdown text (simple parsing example)\n      const classCountMatch = statsStr.match(/Classes:\\s*(\\d+)/);\n      const propertyCountMatch = statsStr.match(/Properties:\\s*(\\d+)/);\n      const instanceCountMatch = statsStr.match(/Instances:\\s*(\\d+)/);\n      const tripleCountMatch = statsStr.match(/Triples:\\s*(\\d+)/);\n      const lastModifiedMatch = statsStr.match(/Last modified:\\s*(.+)/);\n\n      return {\n        classCount: classCountMatch ? parseInt(classCountMatch[1]) : 0,\n        propertyCount: propertyCountMatch ? parseInt(propertyCountMatch[1]) : 0,\n        instanceCount: instanceCountMatch ? parseInt(instanceCountMatch[1]) : 0,\n        tripleCount: tripleCountMatch ? parseInt(tripleCountMatch[1]) : 0,\n        lastModified: lastModifiedMatch ? lastModifiedMatch[1] : new Date().toISOString()\n      };\n    } catch (error) {\n      // Convert to specialized error\n      if (error instanceof HTTPError) {\n        throw parseOntologyError(error);\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Get a list of classes from the ontology\n   *\n   * @param cursor Optional pagination cursor\n   * @param limit Optional limit on number of results\n   * @returns Paginated list of ontology classes\n   */\n  async getOntologyClasses(cursor?: string, limit?: number): Promise<PaginatedOntologyResponse<OntologyClass>> {\n    let uri = 'ontology://classes';\n    if (cursor) {\n      uri += `?cursor=${encodeURIComponent(cursor)}`;\n      if (limit) {\n        uri += `&limit=${limit}`;\n      }\n    } else if (limit) {\n      uri += `?limit=${limit}`;\n    }\n\n    const result = await this.get(`resources/${uri}`);\n    const classesStr = result?.contents?.[0]?.text;\n\n    // Parse the markdown to extract class information\n    // This is a simplified example - actual parsing would be more complex\n    const classes: OntologyClass[] = [];\n    const classRegex = /## (.+?)\\n\\nURI: (.+?)(?:\\n|$)/g;\n    let match;\n\n    while ((match = classRegex.exec(classesStr)) !== null) {\n      classes.push({\n        label: match[1],\n        uri: match[2]\n      });\n    }\n\n    // Check for pagination info\n    const nextCursorMatch = classesStr.match(/Next cursor: (.+?)(?:\\n|$)/);\n    const nextCursor = nextCursorMatch ? nextCursorMatch[1] : undefined;\n\n    return {\n      items: classes,\n      totalCount: classes.length,\n      nextCursor,\n      hasMore: !!nextCursor\n    };\n  }\n\n  /**\n   * Get a list of properties from the ontology\n   *\n   * @param cursor Optional pagination cursor\n   * @param limit Optional limit on number of results\n   * @returns Paginated list of ontology properties\n   */\n  async getOntologyProperties(cursor?: string, limit?: number): Promise<PaginatedOntologyResponse<OntologyProperty>> {\n    let uri = 'ontology://properties';\n    if (cursor) {\n      uri += `?cursor=${encodeURIComponent(cursor)}`;\n      if (limit) {\n        uri += `&limit=${limit}`;\n      }\n    } else if (limit) {\n      uri += `?limit=${limit}`;\n    }\n\n    const result = await this.get(`resources/${uri}`);\n    const propertiesStr = result?.contents?.[0]?.text;\n\n    // Parse the markdown to extract property information\n    // This is a simplified example - actual parsing would be more complex\n    const properties: OntologyProperty[] = [];\n    const propertyRegex = /## (.+?)\\n\\nURI: (.+?)\\nType: (.+?)(?:\\n|$)/g;\n    let match;\n\n    while ((match = propertyRegex.exec(propertiesStr)) !== null) {\n      properties.push({\n        label: match[1],\n        uri: match[2],\n        propertyType: match[3] as any\n      });\n    }\n\n    // Check for pagination info\n    const nextCursorMatch = propertiesStr.match(/Next cursor: (.+?)(?:\\n|$)/);\n    const nextCursor = nextCursorMatch ? nextCursorMatch[1] : undefined;\n\n    return {\n      items: properties,\n      totalCount: properties.length,\n      nextCursor,\n      hasMore: !!nextCursor\n    };\n  }\n\n  /**\n   * Query a specific concept from the ontology\n   *\n   * @param params Query parameters (URI and depth)\n   * @returns Details about the requested concept\n   */\n  async queryConcept(params: QueryConceptParams): Promise<any> {\n    try {\n      const result = await this.post('tools/query_concept', params);\n\n      // Check for \"No information found\" error pattern\n      if (result?.text?.includes('No information found for')) {\n        throw new OntologyEntityNotFoundError(\n          params.uri,\n          `No information found for entity: ${params.uri}`\n        );\n      }\n\n      return result;\n    } catch (error) {\n      // Handle HTTP errors\n      if (error instanceof HTTPError) {\n        throw parseOntologyError(error);\n      }\n      // Re-throw other errors\n      throw error;\n    }\n  }\n\n  /**\n   * Search for concepts in the ontology\n   *\n   * @param params Search parameters\n   * @returns Search results with pagination\n   */\n  async searchConcepts(params: SearchConceptsParams): Promise<any> {\n    return this.post('tools/search_concepts', params);\n  }\n\n  /**\n   * Execute a SPARQL query against the ontology\n   *\n   * @param params SPARQL query parameters\n   * @returns Query results\n   */\n  async executeSparql(params: ExecuteSparqlParams): Promise<SparqlQueryResult> {\n    try {\n      const result = await this.post('tools/execute_sparql', {\n        query: params.query,\n        includeNamespaces: params.includeNamespaces\n      });\n\n      // Check for error message in the result\n      if (result?.text?.includes('Error executing SPARQL')) {\n        throw new OntologySparqlError(\n          params.query,\n          result.text\n        );\n      }\n\n      // Extract the JSON result from the markdown response\n      const jsonMatch = result?.text?.match(/```json\\n([\\s\\S]*?)\\n```/);\n      if (jsonMatch) {\n        try {\n          return JSON.parse(jsonMatch[1]) as SparqlQueryResult;\n        } catch (e) {\n          throw new OntologySparqlError(\n            params.query,\n            `Failed to parse SPARQL results: ${e}`\n          );\n        }\n      }\n\n      throw new OntologySparqlError(\n        params.query,\n        'Invalid SPARQL result format'\n      );\n    } catch (error) {\n      // If it's already an OntologySparqlError, just rethrow it\n      if (error instanceof OntologySparqlError) {\n        throw error;\n      }\n\n      // Handle HTTP errors\n      if (error instanceof HTTPError) {\n        throw parseOntologyError(error);\n      }\n\n      // Convert any other error to OntologySparqlError\n      if (error instanceof Error) {\n        throw new OntologySparqlError(\n          params.query,\n          error.message,\n          { cause: error }\n        );\n      }\n\n      // Fallback for non-Error objects\n      throw new OntologySparqlError(\n        params.query,\n        String(error)\n      );\n    }\n  }\n\n  /**\n   * Get detailed information about a class\n   *\n   * @param params Class information parameters\n   * @returns Detailed class information\n   */\n  async getClassInfo(params: ClassInfoParams): Promise<OntologyClass> {\n    const result = await this.post('tools/get_class_info', params);\n\n    // Parse the class info from the markdown response\n    const classStr = result?.text;\n    if (!classStr) {\n      throw new Error('No class information returned');\n    }\n\n    // Extract class name and URI\n    const classNameMatch = classStr.match(/# Class: (.+?)(?:\\n|$)/);\n    const uriMatch = classStr.match(/URI: (.+?)(?:\\n|$)/);\n\n    if (!classNameMatch || !uriMatch) {\n      throw new Error('Invalid class information format');\n    }\n\n    const classInfo: OntologyClass = {\n      label: classNameMatch[1],\n      uri: uriMatch[1],\n      properties: [],\n      instances: []\n    };\n\n    // Extract properties\n    const propertiesSection = classStr.match(/## Properties\\n\\n([\\s\\S]*?)(?:\\n\\n##|$)/);\n    if (propertiesSection) {\n      const propertyLines = propertiesSection[1].split('\\n');\n      for (const line of propertyLines) {\n        const propMatch = line.match(/- (.+?)(?:\\s+\\(Range: (.+?)\\))?$/);\n        if (propMatch) {\n          classInfo.properties!.push({\n            label: propMatch[1],\n            uri: propMatch[1], // Simplified - actual URI would be different\n            propertyType: 'object', // Default type\n            range: propMatch[2]\n          });\n        }\n      }\n    }\n\n    // Extract instances\n    const instancesSection = classStr.match(/## Instances\\n\\n([\\s\\S]*?)(?:\\n\\n##|$)/);\n    if (instancesSection) {\n      const instanceLines = instancesSection[1].split('\\n');\n      for (const line of instanceLines) {\n        const instMatch = line.match(/- (.+?)$/);\n        if (instMatch && !line.includes('*... and')) {\n          classInfo.instances!.push({\n            label: instMatch[1],\n            uri: instMatch[1], // Simplified - actual URI would be different\n            classUri: classInfo.uri\n          });\n        }\n      }\n    }\n\n    return classInfo;\n  }\n\n  /**\n   * Modify the ontology (add, update, remove entities)\n   *\n   * @param params Modification parameters\n   * @returns Result of the modification operation\n   */\n  async modifyOntology(params: ModifyOntologyParams): Promise<ModificationResult> {\n    try {\n      const result = await this.post('tools/modify_ontology', params);\n\n      const messageText = result?.text || '';\n      const success = messageText.includes('Successfully');\n\n      // If not successful, throw an error\n      if (!success) {\n        throw new OntologyModificationError(\n          params.operation,\n          params.entityUri,\n          messageText\n        );\n      }\n\n      return {\n        success,\n        message: messageText,\n        entityUri: params.entityUri\n      };\n    } catch (error) {\n      // If it's already an OntologyModificationError, just rethrow it\n      if (error instanceof OntologyModificationError) {\n        throw error;\n      }\n\n      // Handle HTTP errors\n      if (error instanceof HTTPError) {\n        throw parseOntologyError(error);\n      }\n\n      // Convert any other error to OntologyModificationError\n      if (error instanceof Error) {\n        throw new OntologyModificationError(\n          params.operation,\n          params.entityUri,\n          error.message,\n          { cause: error }\n        );\n      }\n\n      // Fallback for non-Error objects\n      throw new OntologyModificationError(\n        params.operation,\n        params.entityUri,\n        String(error)\n      );\n    }\n  }\n}\n","import { MCPOptions } from './types';\nimport { MCPError } from '../errors';\n\ntype EventCallback = (event: MessageEvent) => void;\n\n/**\n * Options for the SSE Client\n */\nexport interface SSEOptions extends MCPOptions {\n  // Endpoint for SSE events, defaults to \"/events\"\n  eventsEndpoint?: string;\n  // Timeout in ms before reconnecting after connection loss\n  reconnectTimeout?: number;\n  // Maximum number of reconnection attempts\n  maxReconnectAttempts?: number;\n  // Additional SSE-specific options\n  sseOptions?: EventSourceInit;\n  // Event types to listen for (used for filtering)\n  eventTypes?: string[];\n  // Heartbeat interval in ms (default: 30000)\n  heartbeatInterval?: number;\n  // Connection timeout in ms (default: 10000)\n  connectionTimeout?: number;\n  // Whether to enable auto-reconnect (default: true)\n  autoReconnect?: boolean;\n}\n\n/**\n * Connection status for SSE client\n */\nexport enum SSEConnectionStatus {\n  DISCONNECTED = 'disconnected',\n  CONNECTING = 'connecting',\n  CONNECTED = 'connected',\n  RECONNECTING = 'reconnecting',\n  ERROR = 'error'\n}\n\n/**\n * SSE Client for handling Server-Sent Events\n */\nexport class MCPSSEClient {\n  private baseUrl: string;\n  private apiKey?: string;\n  private token?: string;\n  private tenantId?: string;\n  private eventSource: EventSource | null = null;\n  private eventHandlers: Map<string, Set<EventCallback>> = new Map();\n  private reconnectTimeout: number;\n  private maxReconnectAttempts: number;\n  private reconnectAttempts: number = 0;\n  private eventsEndpoint: string;\n  private sseOptions: EventSourceInit | undefined;\n  private status: SSEConnectionStatus = SSEConnectionStatus.DISCONNECTED;\n  private eventTypes: string[] | undefined;\n  private lastEventId: string | null = null;\n  private heartbeatInterval: number;\n  private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n  private connectionTimeout: number;\n  private connectionTimer: ReturnType<typeof setTimeout> | null = null;\n  private autoReconnect: boolean;\n  private statusHandlers: Set<(status: SSEConnectionStatus) => void> = new Set();\n\n  /**\n   * Create a new SSE client\n   */\n  constructor(options: SSEOptions) {\n    this.baseUrl = options.baseUrl || 'https://api.mcp.ai';\n    this.apiKey = options.apiKey;\n    this.token = options.token;\n    this.tenantId = options.tenantId;\n    this.reconnectTimeout = options.reconnectTimeout || 3000;\n    this.maxReconnectAttempts = options.maxReconnectAttempts || 10;\n    this.eventsEndpoint = options.eventsEndpoint || '/events';\n    this.sseOptions = options.sseOptions;\n    this.eventTypes = options.eventTypes;\n    this.heartbeatInterval = options.heartbeatInterval || 30000;\n    this.connectionTimeout = options.connectionTimeout || 10000;\n    this.autoReconnect = options.autoReconnect !== false;\n  }\n\n  /**\n   * Get the current connection status\n   */\n  getStatus(): SSEConnectionStatus {\n    return this.status;\n  }\n\n  /**\n   * Register a handler for connection status changes\n   */\n  onStatusChange(handler: (status: SSEConnectionStatus) => void): () => void {\n    this.statusHandlers.add(handler);\n\n    // Call immediately with current status\n    handler(this.status);\n\n    // Return function to remove handler\n    return () => {\n      this.statusHandlers.delete(handler);\n    };\n  }\n\n  /**\n   * Update connection status and notify handlers\n   */\n  private setStatus(status: SSEConnectionStatus): void {\n    if (this.status !== status) {\n      this.status = status;\n\n      // Notify all status handlers\n      for (const handler of this.statusHandlers) {\n        try {\n          handler(status);\n        } catch (error) {\n          console.error('Error in SSE status handler:', error);\n        }\n      }\n    }\n  }\n\n  /**\n   * Connect to the SSE endpoint\n   */\n  connect(): void {\n    if (this.eventSource) {\n      this.disconnect();\n    }\n\n    this.setStatus(SSEConnectionStatus.CONNECTING);\n    this.reconnectAttempts = 0;\n\n    const url = new URL(`${this.baseUrl}${this.eventsEndpoint}`);\n\n    // Add auth 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 event types filter if specified\n    if (this.eventTypes && this.eventTypes.length > 0) {\n      url.searchParams.append('events', this.eventTypes.join(','));\n    }\n\n    // Add last event ID for resuming\n    if (this.lastEventId) {\n      url.searchParams.append('lastEventId', this.lastEventId);\n    }\n\n    try {\n      // Set connection timeout\n      this.connectionTimer = setTimeout(() => {\n        if (this.status === SSEConnectionStatus.CONNECTING) {\n          console.warn('SSE connection timeout');\n          this.setStatus(SSEConnectionStatus.ERROR);\n          this.disconnect();\n          if (this.autoReconnect) {\n            this.attemptReconnect();\n          }\n        }\n      }, this.connectionTimeout);\n\n      // Create the EventSource\n      this.eventSource = new EventSource(url.toString(), this.sseOptions);\n\n      // Set up event handlers\n      this.eventSource.onopen = this.handleOpen.bind(this);\n      this.eventSource.onerror = this.handleError.bind(this);\n      this.eventSource.onmessage = this.handleMessage.bind(this);\n\n      // Register for specific event types and existing handlers\n      if (this.eventTypes) {\n        for (const eventType of this.eventTypes) {\n          this.eventSource.addEventListener(eventType, this.handleEvent.bind(this));\n        }\n      }\n\n      // Register all event types from handlers\n      for (const eventType of this.eventHandlers.keys()) {\n        this.eventSource.addEventListener(eventType, this.handleEvent.bind(this));\n      }\n    } catch (error) {\n      console.error('Error connecting to SSE endpoint:', error);\n      this.handleConnectionError(error);\n    }\n  }\n\n  /**\n   * Disconnect from the SSE endpoint\n   */\n  disconnect(): void {\n    // Clear timers\n    if (this.connectionTimer) {\n      clearTimeout(this.connectionTimer);\n      this.connectionTimer = null;\n    }\n\n    if (this.heartbeatTimer) {\n      clearInterval(this.heartbeatTimer);\n      this.heartbeatTimer = null;\n    }\n\n    if (this.eventSource) {\n      this.eventSource.close();\n      this.eventSource = null;\n\n      if (this.status !== SSEConnectionStatus.ERROR) {\n        this.setStatus(SSEConnectionStatus.DISCONNECTED);\n      }\n    }\n  }\n\n  /**\n   * Register an event handler for a specific event type\n   */\n  on(eventType: string, callback: EventCallback): () => void {\n    if (!this.eventHandlers.has(eventType)) {\n      this.eventHandlers.set(eventType, new Set());\n\n      // If connected, add the event listener\n      if (this.eventSource && this.eventSource.readyState === EventSource.OPEN) {\n        this.eventSource.addEventListener(eventType, this.handleEvent.bind(this));\n      }\n    }\n\n    const handlers = this.eventHandlers.get(eventType)!;\n    handlers.add(callback);\n\n    // Return a function to remove this handler\n    return () => {\n      if (this.eventHandlers.has(eventType)) {\n        const handlers = this.eventHandlers.get(eventType)!;\n        handlers.delete(callback);\n\n        if (handlers.size === 0) {\n          this.eventHandlers.delete(eventType);\n        }\n      }\n    };\n  }\n\n  /**\n   * Remove all event handlers for a specific event type\n   */\n  off(eventType: string): void {\n    this.eventHandlers.delete(eventType);\n  }\n\n  /**\n   * Attempt to reconnect with exponential backoff\n   */\n  private attemptReconnect(): void {\n    if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n      console.error(`SSE maximum reconnection attempts (${this.maxReconnectAttempts}) reached`);\n      this.setStatus(SSEConnectionStatus.ERROR);\n      return;\n    }\n\n    this.reconnectAttempts++;\n    this.setStatus(SSEConnectionStatus.RECONNECTING);\n\n    // Calculate backoff time (with jitter)\n    const baseDelay = this.reconnectTimeout;\n    const exponentialDelay = baseDelay * Math.pow(1.5, this.reconnectAttempts - 1);\n    const jitter = 0.2 * exponentialDelay;\n    const delay = exponentialDelay + (Math.random() * jitter);\n\n    console.log(`SSE reconnecting in ${Math.round(delay)}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`);\n\n    setTimeout(() => {\n      this.connect();\n    }, delay);\n  }\n\n  /**\n   * Start heartbeat to detect connection issues\n   */\n  private startHeartbeat(): void {\n    if (this.heartbeatTimer) {\n      clearInterval(this.heartbeatTimer);\n    }\n\n    this.heartbeatTimer = setInterval(() => {\n      if (this.eventSource && this.eventSource.readyState === EventSource.OPEN) {\n        // Dispatch a heartbeat check event\n        this.dispatchEvent('heartbeat', new MessageEvent('heartbeat', {\n          data: JSON.stringify({\n            timestamp: Date.now()\n          })\n        }));\n      } else if (this.eventSource && this.eventSource.readyState === EventSource.CLOSED) {\n        // Connection is unexpectedly closed\n        console.warn('SSE connection unexpectedly closed during heartbeat check');\n        this.disconnect();\n        if (this.autoReconnect) {\n          this.attemptReconnect();\n        }\n      }\n    }, this.heartbeatInterval);\n  }\n\n  /**\n   * Handle SSE connection open\n   */\n  private handleOpen(event: Event): void {\n    // Clear connection timeout\n    if (this.connectionTimer) {\n      clearTimeout(this.connectionTimer);\n      this.connectionTimer = null;\n    }\n\n    console.log('SSE connection opened');\n    this.setStatus(SSEConnectionStatus.CONNECTED);\n    this.reconnectAttempts = 0;\n\n    // Start heartbeat\n    this.startHeartbeat();\n\n    // Dispatch the open event\n    this.dispatchEvent('open', new MessageEvent('open'));\n  }\n\n  /**\n   * Handle SSE connection error\n   */\n  private handleError(event: Event): void {\n    console.error('SSE connection error:', event);\n\n    // Dispatch the error event\n    this.dispatchEvent('error', new MessageEvent('error'));\n\n    // Set error status\n    this.setStatus(SSEConnectionStatus.ERROR);\n\n    // Attempt to reconnect\n    if (this.autoReconnect) {\n      this.disconnect();\n      this.attemptReconnect();\n    }\n  }\n\n  /**\n   * Handle connection initialization error\n   */\n  private handleConnectionError(error: unknown): void {\n    // Clear connection timeout\n    if (this.connectionTimer) {\n      clearTimeout(this.connectionTimer);\n      this.connectionTimer = null;\n    }\n\n    // Set error status\n    this.setStatus(SSEConnectionStatus.ERROR);\n\n    // Dispatch the error event\n    this.dispatchEvent('error', new MessageEvent('error', {\n      data: error instanceof Error ? error.message : String(error)\n    }));\n\n    // Attempt to reconnect\n    if (this.autoReconnect) {\n      this.attemptReconnect();\n    }\n  }\n\n  /**\n   * Handle generic message event\n   */\n  private handleMessage(event: MessageEvent): void {\n    // Store the last event ID for resuming\n    if (event.lastEventId) {\n      this.lastEventId = event.lastEventId;\n    }\n\n    // Parse the data if it's JSON\n    try {\n      const data = JSON.parse(event.data);\n\n      // If the data has a type field, dispatch to that specific event type\n      if (data.type && typeof data.type === 'string') {\n        this.dispatchEvent(data.type, new MessageEvent(data.type, {\n          data: data.payload || data,\n          lastEventId: event.lastEventId\n        }));\n      }\n    } catch (e) {\n      // Not JSON, just pass through the raw data\n    }\n\n    // Reset reconnect attempts on successful message\n    this.reconnectAttempts = 0;\n\n    // Dispatch to the generic message handler\n    this.dispatchEvent('message', event);\n  }\n\n  /**\n   * Handle specific event type\n   */\n  private handleEvent(event: MessageEvent): void {\n    // Dispatch to handlers for this event type\n    this.dispatchEvent(event.type, event);\n  }\n\n  /**\n   * Dispatch an event to all registered handlers\n   */\n  private dispatchEvent(eventType: string, event: MessageEvent): void {\n    if (this.eventHandlers.has(eventType)) {\n      const handlers = this.eventHandlers.get(eventType)!;\n      for (const handler of handlers) {\n        try {\n          handler(event);\n        } catch (error) {\n          console.error(`Error in SSE event handler for ${eventType}:`, error);\n        }\n      }\n    }\n  }\n}\n\n/**\n * Create a new SSE client\n */\nexport function createSSEClient(options: SSEOptions): MCPSSEClient {\n  return new MCPSSEClient(options);\n}\n","/**\n * Ragatanga MCP SDK\n * Main entry point with exports of core components\n */\n\n// Re-export clients\nexport { MCPClient } from './client';\nexport { OntologyClient } from './client/ontology-client';\nexport { MCPWebSocket } from './client/websocket';\nexport { createSSEClient } from './client/sse';\nexport { MCPArrowClient } from './client/arrow-ipc';\nexport { TenantServiceClient, createTenantServiceClient } from './client/tenant-service';\nexport { MCPRedisCache, createRedisCache } from './client/redis-cache';\n\n// Re-export factory functions\nexport { createWebSocketClient } from './client/websocket';\n\n// Re-export errors\nexport {\n  MCPError,\n  NetworkError,\n  TimeoutError,\n  HTTPError,\n  AuthError,\n  WebSocketError,\n  ParseError,\n  ValidationError,\n  TenantNotFoundError,\n  UnauthorizedError\n} from './errors';\n\n// Import the MCPClient to use in createClient\nimport { MCPClient as Client } from './client';\n\n/**\n * Create an MCP client\n */\nexport function createClient(options: any) {\n  return new Client(options);\n}\n\n/**\n * Default export - create an MCP client\n */\nexport default createClient;\n","import { MCPTransport } from '../mcp-standard';\n\nexport interface HttpTransportOptions {\n  baseUrl: string;\n  apiKey?: string;\n  token?: string;\n  headers?: Record<string, string>;\n  useWebSocket?: boolean;\n}\n\nexport class HttpClientTransport implements MCPTransport {\n  private options: HttpTransportOptions;\n  private websocket: WebSocket | null = null;\n  private nextMessageId = 1;\n  private messageCallbacks = new Map<\n    number,\n    { resolve: (value: any) => void; reject: (error: Error) => void }\n  >();\n\n  constructor(options: HttpTransportOptions) {\n    this.options = options;\n  }\n\n  /**\n   * Connect to the MCP server via HTTP or WebSocket\n   */\n  async connect(): Promise<void> {\n    if (this.options.useWebSocket) {\n      return this.connectWebSocket();\n    }\n\n    // For regular HTTP, just validate the connection with a ping\n    try {\n      await this.makeHttpRequest('GET', '/ping');\n    } catch (error: any) {\n      throw new Error(`Failed to connect to MCP server: ${error.message}`);\n    }\n  }\n\n  /**\n   * Connect via WebSocket\n   */\n  private connectWebSocket(): Promise<void> {\n    if (this.websocket) {\n      return Promise.resolve();\n    }\n\n    return new Promise((resolve, reject) => {\n      let wsUrl = this.options.baseUrl.replace(/^http/, 'ws');\n      if (!wsUrl.endsWith('/ws')) {\n        wsUrl = `${wsUrl}/ws`;\n      }\n\n      try {\n        this.websocket = new WebSocket(wsUrl);\n\n        this.websocket.onopen = () => {\n          resolve();\n        };\n\n        this.websocket.onmessage = (event) => {\n          try {\n            const message = JSON.parse(event.data);\n\n            // Check if it's a response to a message we sent\n            if (message.id && this.messageCallbacks.has(message.id)) {\n              const { resolve, reject } = this.messageCallbacks.get(message.id)!;\n              this.messageCallbacks.delete(message.id);\n\n              if (message.error) {\n                reject(new Error(message.error));\n              } else {\n                resolve(message);\n              }\n            }\n          } catch (error) {\n            console.error('Error handling WebSocket message:', error);\n          }\n        };\n\n        this.websocket.onerror = (error) => {\n          reject(new Error(`WebSocket connection error: ${error}`));\n        };\n\n        this.websocket.onclose = () => {\n          this.websocket = null;\n\n          // Reject any pending messages\n          this.messageCallbacks.forEach((callbacks) => {\n            callbacks.reject(new Error('WebSocket connection closed'));\n          });\n          this.messageCallbacks.clear();\n        };\n      } catch (error) {\n        reject(error);\n      }\n    });\n  }\n\n  /**\n   * Disconnect from the MCP server\n   */\n  async disconnect(): Promise<void> {\n    if (this.websocket) {\n      return new Promise((resolve) => {\n        const socket = this.websocket;\n        this.websocket = null;\n\n        if (socket && (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING)) {\n          socket.onclose = () => {\n            resolve();\n          };\n          socket.close(1000, 'Client disconnected');\n        } else {\n          resolve();\n        }\n      });\n    }\n\n    return Promise.resolve();\n  }\n\n  /**\n   * Send a message to the MCP server\n   */\n  async send(message: any): Promise<any> {\n    if (this.websocket && this.options.useWebSocket) {\n      return this.sendWebSocket(message);\n    }\n\n    // Determine HTTP method and endpoint based on message type\n    let method = 'POST';\n    let endpoint = '/';\n\n    switch (message.type) {\n      case 'list_prompts':\n        method = 'GET';\n        endpoint = '/prompts';\n        break;\n      case 'get_prompt':\n        method = 'POST';\n        endpoint = `/prompts/${encodeURIComponent(message.prompt)}`;\n        break;\n      case 'list_resources':\n        method = 'GET';\n        endpoint = '/resources';\n        break;\n      case 'read_resource':\n        method = 'GET';\n        endpoint = `/resources?uri=${encodeURIComponent(message.uri)}`;\n        break;\n      case 'call_tool':\n        method = 'POST';\n        endpoint = `/tools/${encodeURIComponent(message.tool)}`;\n        break;\n      case 'handshake':\n        method = 'POST';\n        endpoint = '/handshake';\n        break;\n      default:\n        endpoint = '/';\n    }\n\n    return this.makeHttpRequest(method, endpoint, message);\n  }\n\n  /**\n   * Send a message via WebSocket\n   */\n  private sendWebSocket(message: any): Promise<any> {\n    if (!this.websocket || this.websocket.readyState !== WebSocket.OPEN) {\n      return Promise.reject(new Error('WebSocket is not connected'));\n    }\n\n    return new Promise((resolve, reject) => {\n      const id = this.nextMessageId++;\n\n      // Add message ID to the outgoing message\n      const outgoingMessage = {\n        id,\n        ...message\n      };\n\n      // Store the callbacks for this message\n      this.messageCallbacks.set(id, { resolve, reject });\n\n      // Send the message\n      this.websocket!.send(JSON.stringify(outgoingMessage));\n    });\n  }\n\n  /**\n   * Make an HTTP request to the MCP server\n   */\n  private async makeHttpRequest(\n    method: string,\n    endpoint: string,\n    body?: any\n  ): Promise<any> {\n    const url = `${this.options.baseUrl}${endpoint}`;\n\n    const headers: Record<string, string> = {\n      'Content-Type': 'application/json',\n      ...this.options.headers\n    };\n\n    if (this.options.apiKey) {\n      headers['X-API-Key'] = this.options.apiKey;\n    }\n\n    if (this.options.token) {\n      headers['Authorization'] = `Bearer ${this.options.token}`;\n    }\n\n    const options: RequestInit = {\n      method,\n      headers,\n      body: body ? JSON.stringify(body) : undefined\n    };\n\n    try {\n      const response = await fetch(url, options);\n\n      if (!response.ok) {\n        throw new Error(`HTTP error ${response.status}: ${response.statusText}`);\n      }\n\n      return await response.json();\n    } catch (error: any) {\n      throw new Error(`HTTP request failed: ${error.message}`);\n    }\n  }\n}\n","/**\n * Transport modules for the Ragatanga MCP SDK.\n * \n * This package contains different transport implementations for the MCP client:\n * - standard: Native MCP transport (stdio)\n * - http: HTTP REST transport\n * - websocket: WebSocket transport \n * - sse: Server-Sent Events transport\n * - arrow: Arrow IPC over WebSocket for efficient binary data transfer\n */\n\nexport { StdioClientTransport } from './stdio';\nexport type { StdioTransportOptions } from './stdio';\n\nexport { HttpClientTransport } from './http';\nexport type { HttpTransportOptions } from './http';\n\n// Re-export the specialized transports from the root client directory for backward compatibility\n// These will be properly relocated in a future update\nexport { MCPWebSocket as WebSocketClientTransport } from '../websocket';\nexport type { WebSocketEventHandlers as WebSocketTransportOptions } from '../websocket';\n\nexport { createSSEClient as SSEClientTransport } from '../sse';\nexport type { SSEOptions as SSETransportOptions } from '../sse';\n\n// Re-export Arrow IPC client as a transport option\nexport { MCPArrowClient as ArrowClientTransport } from '../arrow-ipc';\nexport type { ArrowEventHandlers as ArrowTransportOptions } from '../arrow-ipc';\n","/**\n * Tenant Service Client for Ragatanga MCP\n * \n * This module provides comprehensive support for tenant management operations\n * matching the server-side functionality in ragatanga_mcp.shared.auth_services.tenant\n */\n\nimport { MCPOptions } from './types';\nimport { HttpClientTransport } from './transports';\nimport { createFullUrl } from './paths';\nimport { MCPError, TenantNotFoundError, ValidationError, UnauthorizedError } from '../errors';\n\n// Tenant data structure\nexport interface Tenant {\n  id: string;\n  name: string;\n  description?: string;\n  created_at: string;\n  updated_at: string;\n  owner_id?: string;\n  settings?: Record<string, any>;\n  api_keys?: ApiKey[];\n  status: 'active' | 'suspended' | 'deleted';\n}\n\n// API Key data structure\nexport interface ApiKey {\n  id: string;\n  key: string;\n  name: string;\n  tenant_id: string;\n  created_at: string;\n  expires_at?: string;\n  last_used_at?: string;\n  permissions?: string[];\n}\n\n// Options for tenant creation\nexport interface CreateTenantOptions {\n  name: string;\n  description?: string;\n  owner_id?: string;\n  settings?: Record<string, any>;\n}\n\n// Options for API key creation\nexport interface CreateApiKeyOptions {\n  name: string;\n  tenant_id: string;\n  expires_at?: string;\n  permissions?: string[];\n}\n\n/**\n * Tenant Service Client\n * \n * Provides methods for managing tenants and API keys\n */\nexport class TenantServiceClient {\n  private baseUrl: string;\n  private apiKey?: string;\n  private token?: string;\n  private transport: HttpClientTransport;\n\n  constructor(options: MCPOptions) {\n    this.baseUrl = options.baseUrl || 'https://api.mcp.ai';\n    this.apiKey = options.apiKey;\n    this.token = options.token;\n    \n    this.transport = new HttpClientTransport({\n      baseUrl: this.baseUrl,\n      apiKey: this.apiKey,\n      token: this.token\n    });\n  }\n\n  /**\n   * List all tenants (admin only)\n   */\n  async listTenants(): Promise<Tenant[]> {\n    try {\n      const url = '/tenants';\n      const response = await this.transport.send({\n        type: 'list_tenants',\n        method: 'GET',\n        endpoint: url\n      });\n      \n      return response.data || response.result || [];\n    } catch (error: any) {\n      if (error.status === 401) {\n        throw new UnauthorizedError('Unauthorized to list tenants', { cause: error });\n      }\n      throw new MCPError('Failed to list tenants', { cause: error });\n    }\n  }\n\n  /**\n   * Get a tenant by ID\n   */\n  async getTenant(tenantId: string): Promise<Tenant> {\n    try {\n      const url = `/tenants/${tenantId}`;\n      const response = await this.transport.send({\n        type: 'get_tenant',\n        method: 'GET',\n        endpoint: url,\n        tenant_id: tenantId\n      });\n      \n      return response.data || response.result;\n    } catch (error: any) {\n      if (error.status === 404) {\n        throw new TenantNotFoundError(`Tenant with ID ${tenantId} not found`, { cause: error });\n      }\n      throw new MCPError(`Failed to get tenant ${tenantId}`, { cause: error });\n    }\n  }\n\n  /**\n   * Create a new tenant\n   */\n  async createTenant(options: CreateTenantOptions): Promise<Tenant> {\n    try {\n      const url = '/tenants';\n      const response = await this.transport.send({\n        type: 'create_tenant',\n        method: 'POST',\n        endpoint: url,\n        data: options\n      });\n      \n      return response.data || response.result;\n    } catch (error: any) {\n      if (error.status === 400) {\n        throw new ValidationError('Invalid tenant data', { cause: error });\n      }\n      if (error.status === 401) {\n        throw new UnauthorizedError('Unauthorized to create tenant', { cause: error });\n      }\n      throw new MCPError('Failed to create tenant', { cause: error });\n    }\n  }\n\n  /**\n   * Update an existing tenant\n   */\n  async updateTenant(tenantId: string, data: Partial<CreateTenantOptions>): Promise<Tenant> {\n    try {\n      const url = `/tenants/${tenantId}`;\n      const response = await this.transport.send({\n        type: 'update_tenant',\n        method: 'PATCH',\n        endpoint: url,\n        tenant_id: tenantId,\n        data\n      });\n      \n      return response.data || response.result;\n    } catch (error: any) {\n      if (error.status === 404) {\n        throw new TenantNotFoundError(`Tenant with ID ${tenantId} not found`, { cause: error });\n      }\n      if (error.status === 400) {\n        throw new ValidationError('Invalid tenant data', { cause: error });\n      }\n      throw new MCPError(`Failed to update tenant ${tenantId}`, { cause: error });\n    }\n  }\n\n  /**\n   * Delete a tenant\n   */\n  async deleteTenant(tenantId: string): Promise<void> {\n    try {\n      const url = `/tenants/${tenantId}`;\n      await this.transport.send({\n        type: 'delete_tenant',\n        method: 'DELETE',\n        endpoint: url,\n        tenant_id: tenantId\n      });\n    } catch (error: any) {\n      if (error.status === 404) {\n        throw new TenantNotFoundError(`Tenant with ID ${tenantId} not found`, { cause: error });\n      }\n      throw new MCPError(`Failed to delete tenant ${tenantId}`, { cause: error });\n    }\n  }\n\n  /**\n   * Get a tenant by API key\n   */\n  async getTenantByApiKey(apiKey: string): Promise<Tenant> {\n    try {\n      const url = '/tenants/by-api-key';\n      const response = await this.transport.send({\n        type: 'get_tenant_by_api_key',\n        method: 'POST',\n        endpoint: url,\n        data: { api_key: apiKey }\n      });\n      \n      return response.data || response.result;\n    } catch (error: any) {\n      if (error.status === 404) {\n        throw new TenantNotFoundError('No tenant found for this API key', { cause: error });\n      }\n      throw new MCPError('Failed to get tenant by API key', { cause: error });\n    }\n  }\n\n  /**\n   * Create a new API key for a tenant\n   */\n  async createApiKey(options: CreateApiKeyOptions): Promise<ApiKey> {\n    try {\n      const url = `/tenants/${options.tenant_id}/api-keys`;\n      const response = await this.transport.send({\n        type: 'create_api_key',\n        method: 'POST',\n        endpoint: url,\n        tenant_id: options.tenant_id,\n        data: {\n          name: options.name,\n          expires_at: options.expires_at,\n          permissions: options.permissions\n        }\n      });\n      \n      return response.data || response.result;\n    } catch (error: any) {\n      if (error.status === 404) {\n        throw new TenantNotFoundError(`Tenant with ID ${options.tenant_id} not found`, { cause: error });\n      }\n      if (error.status === 400) {\n        throw new ValidationError('Invalid API key data', { cause: error });\n      }\n      throw new MCPError('Failed to create API key', { cause: error });\n    }\n  }\n\n  /**\n   * List API keys for a tenant\n   */\n  async listApiKeys(tenantId: string): Promise<ApiKey[]> {\n    try {\n      const url = `/tenants/${tenantId}/api-keys`;\n      const response = await this.transport.send({\n        type: 'list_api_keys',\n        method: 'GET',\n        endpoint: url,\n        tenant_id: tenantId\n      });\n      \n      return response.data || response.result || [];\n    } catch (error: any) {\n      if (error.status === 404) {\n        throw new TenantNotFoundError(`Tenant with ID ${tenantId} not found`, { cause: error });\n      }\n      throw new MCPError(`Failed to list API keys for tenant ${tenantId}`, { cause: error });\n    }\n  }\n\n  /**\n   * Delete an API key\n   */\n  async deleteApiKey(tenantId: string, keyId: string): Promise<void> {\n    try {\n      const url = `/tenants/${tenantId}/api-keys/${keyId}`;\n      await this.transport.send({\n        type: 'delete_api_key',\n        method: 'DELETE',\n        endpoint: url,\n        tenant_id: tenantId,\n        key_id: keyId\n      });\n    } catch (error: any) {\n      if (error.status === 404) {\n        throw new TenantNotFoundError(`API key or tenant not found`, { cause: error });\n      }\n      throw new MCPError(`Failed to delete API key ${keyId}`, { cause: error });\n    }\n  }\n}\n\n/**\n * Create a tenant service client\n */\nexport function createTenantServiceClient(options: MCPOptions): TenantServiceClient {\n  return new TenantServiceClient(options);\n}\n\nexport default TenantServiceClient; ","/**\n * Redis Client-Side Caching Service for Ragatanga MCP SDK\n * \n * This module provides client-side caching capabilities aligned with the server's Redis implementation.\n * It handles caching query results, rate limiting state, and enables conditional requests.\n */\n\nimport { MCPOptions } from './types';\n\nexport interface RedisCacheOptions {\n  /**\n   * Enable client-side caching\n   */\n  enabled: boolean;\n  \n  /**\n   * Default TTL for cached items in seconds\n   */\n  defaultTTL: number;\n  \n  /**\n   * Maximum cache size (number of items)\n   */\n  maxSize: number;\n  \n  /**\n   * Storage type to use\n   */\n  storage: 'memory' | 'localStorage' | 'sessionStorage' | 'custom';\n  \n  /**\n   * Use etags for conditional requests\n   */\n  useEtags: boolean;\n  \n  /**\n   * Custom storage implementation if storage is 'custom'\n   */\n  customStorage?: CacheStorage;\n  \n  /**\n   * Cache namespace to avoid collisions\n   */\n  namespace: string;\n  \n  /**\n   * Debug mode\n   */\n  debug: boolean;\n}\n\n/**\n * Interface for custom cache storage implementations\n */\nexport interface CacheStorage {\n  get(key: string): Promise<string | null>;\n  set(key: string, value: string, ttl?: number): Promise<void>;\n  delete(key: string): Promise<void>;\n  clear(): Promise<void>;\n  keys(): Promise<string[]>;\n}\n\n/**\n * Cache entry object\n */\ninterface CacheEntry {\n  value: any;\n  etag?: string;\n  expires: number;\n  lastAccessed: number;\n  hitCount: number;\n}\n\n/**\n * Rate limit information\n */\nexport interface RateLimitInfo {\n  limit: number;\n  remaining: number;\n  reset: number;\n}\n\n/**\n * Cache statistics\n */\nexport interface CacheStats {\n  hits: number;\n  misses: number;\n  size: number;\n  keys: string[];\n}\n\n/**\n * Default cache options\n */\nconst DEFAULT_CACHE_OPTIONS: RedisCacheOptions = {\n  enabled: true,\n  defaultTTL: 300, // 5 minutes\n  maxSize: 100,\n  storage: 'memory',\n  useEtags: true,\n  namespace: 'ragatanga-mcp',\n  debug: false\n};\n\n/**\n * Redis-compatible client-side caching service\n */\nexport class MCPRedisCache {\n  private options: RedisCacheOptions;\n  private cache: Map<string, CacheEntry> = new Map();\n  private storage: CacheStorage;\n  private stats = {\n    hits: 0,\n    misses: 0\n  };\n  private rateLimits: Map<string, RateLimitInfo> = new Map();\n\n  /**\n   * Create a new Redis cache client\n   */\n  constructor(options: Partial<RedisCacheOptions> = {}) {\n    this.options = { ...DEFAULT_CACHE_OPTIONS, ...options };\n    \n    // Set up storage based on options\n    if (this.options.storage === 'localStorage' && typeof window !== 'undefined') {\n      this.storage = this.createLocalStorageAdapter();\n    } else if (this.options.storage === 'sessionStorage' && typeof window !== 'undefined') {\n      this.storage = this.createSessionStorageAdapter();\n    } else if (this.options.storage === 'custom' && this.options.customStorage) {\n      this.storage = this.options.customStorage;\n    } else {\n      // Default to memory storage\n      this.storage = this.createMemoryStorageAdapter();\n    }\n    \n    // Initialize cache from persistent storage if available\n    this.initFromStorage();\n  }\n\n  /**\n   * Get an item from cache\n   */\n  async get<T = any>(key: string): Promise<{ value: T | null; etag?: string }> {\n    if (!this.options.enabled) {\n      return { value: null };\n    }\n    \n    // Normalize the key with namespace\n    const cacheKey = this.normalizeKey(key);\n    \n    try {\n      // Check memory cache first\n      if (this.cache.has(cacheKey)) {\n        const entry = this.cache.get(cacheKey)!;\n        \n        // Check if expired\n        if (Date.now() > entry.expires) {\n          this.delete(key);\n          this.stats.misses++;\n          return { value: null };\n        }\n        \n        // Update stats\n        entry.hitCount++;\n        entry.lastAccessed = Date.now();\n        this.stats.hits++;\n        \n        return { \n          value: entry.value as T,\n          etag: this.options.useEtags ? entry.etag : undefined \n        };\n      }\n      \n      // Check persistent storage\n      const stored = await this.storage.get(cacheKey);\n      if (stored) {\n        try {\n          const parsed = JSON.parse(stored);\n          \n          // Check if expired\n          if (Date.now() > parsed.expires) {\n            await this.storage.delete(cacheKey);\n            this.stats.misses++;\n            return { value: null };\n          }\n          \n          // Add to memory cache\n          const entry: CacheEntry = {\n            value: parsed.value,\n            etag: parsed.etag,\n            expires: parsed.expires,\n            lastAccessed: Date.now(),\n            hitCount: parsed.hitCount + 1\n          };\n          \n          this.cache.set(cacheKey, entry);\n          this.stats.hits++;\n          \n          return { \n            value: entry.value as T,\n            etag: this.options.useEtags ? entry.etag : undefined\n          };\n        } catch (err) {\n          // Handle corrupted data\n          await this.storage.delete(cacheKey);\n        }\n      }\n      \n      // Cache miss\n      this.stats.misses++;\n      return { value: null };\n    } catch (err) {\n      if (this.options.debug) {\n        console.error('Cache error:', err);\n      }\n      return { value: null };\n    }\n  }\n\n  /**\n   * Set an item in cache\n   */\n  async set(key: string, value: any, options?: { ttl?: number; etag?: string }): Promise<void> {\n    if (!this.options.enabled) {\n      return;\n    }\n    \n    const cacheKey = this.normalizeKey(key);\n    const ttl = options?.ttl ?? this.options.defaultTTL;\n    \n    // Calculate expiration time\n    const expires = Date.now() + (ttl * 1000);\n    \n    // Create cache entry\n    const entry: CacheEntry = {\n      value,\n      etag: options?.etag,\n      expires,\n      lastAccessed: Date.now(),\n      hitCount: 0\n    };\n    \n    try {\n      // Enforce max size by removing least recently used items\n      if (this.cache.size >= this.options.maxSize) {\n        this.evictLRU();\n      }\n      \n      // Update memory cache\n      this.cache.set(cacheKey, entry);\n      \n      // Update persistent storage\n      await this.storage.set(cacheKey, JSON.stringify(entry), ttl);\n    } catch (err) {\n      if (this.options.debug) {\n        console.error('Cache set error:', err);\n      }\n    }\n  }\n\n  /**\n   * Delete an item from cache\n   */\n  async delete(key: string): Promise<void> {\n    const cacheKey = this.normalizeKey(key);\n    \n    try {\n      // Remove from memory\n      this.cache.delete(cacheKey);\n      \n      // Remove from persistent storage\n      await this.storage.delete(cacheKey);\n    } catch (err) {\n      if (this.options.debug) {\n        console.error('Cache delete error:', err);\n      }\n    }\n  }\n\n  /**\n   * Clear the entire cache\n   */\n  async clear(): Promise<void> {\n    try {\n      // Clear memory cache\n      this.cache.clear();\n      \n      // Clear persistent storage\n      await this.storage.clear();\n      \n      // Reset stats\n      this.stats.hits = 0;\n      this.stats.misses = 0;\n    } catch (err) {\n      if (this.options.debug) {\n        console.error('Cache clear error:', err);\n      }\n    }\n  }\n\n  /**\n   * Store rate limit information\n   */\n  setRateLimit(endpoint: string, info: RateLimitInfo): void {\n    this.rateLimits.set(endpoint, info);\n  }\n\n  /**\n   * Get rate limit information for an endpoint\n   */\n  getRateLimit(endpoint: string): RateLimitInfo | undefined {\n    return this.rateLimits.get(endpoint);\n  }\n\n  /**\n   * Check if an endpoint is rate limited\n   */\n  isRateLimited(endpoint: string): boolean {\n    const info = this.rateLimits.get(endpoint);\n    if (!info) return false;\n    \n    return info.remaining <= 0 && Date.now() < info.reset * 1000;\n  }\n\n  /**\n   * Get cache statistics\n   */\n  getStats(): CacheStats {\n    return {\n      hits: this.stats.hits,\n      misses: this.stats.misses,\n      size: this.cache.size,\n      keys: Array.from(this.cache.keys())\n    };\n  }\n\n  /**\n   * Normalize a cache key with namespace\n   */\n  private normalizeKey(key: string): string {\n    return `${this.options.namespace}:${key}`;\n  }\n\n  /**\n   * Evict least recently used items when cache is full\n   */\n  private evictLRU(): void {\n    if (this.cache.size < this.options.maxSize) return;\n    \n    // Convert to array for sorting\n    const entries = Array.from(this.cache.entries());\n    \n    // Sort by last accessed time (oldest first)\n    entries.sort((a, b) => a[1].lastAccessed - b[1].lastAccessed);\n    \n    // Remove the oldest 10% or at least one item\n    const removeCount = Math.max(1, Math.floor(this.options.maxSize * 0.1));\n    for (let i = 0; i < removeCount && i < entries.length; i++) {\n      this.cache.delete(entries[i][0]);\n      this.storage.delete(entries[i][0]).catch(() => {});\n    }\n  }\n\n  /**\n   * Initialize from persistent storage\n   */\n  private async initFromStorage(): Promise<void> {\n    if (!this.options.enabled) return;\n    \n    try {\n      const keys = await this.storage.keys();\n      const now = Date.now();\n      \n      // Only process keys from our namespace\n      const nsPrefix = this.options.namespace + ':';\n      const relevantKeys = keys.filter(k => k.startsWith(nsPrefix));\n      \n      for (const key of relevantKeys) {\n        const stored = await this.storage.get(key);\n        if (!stored) continue;\n        \n        try {\n          const parsed = JSON.parse(stored);\n          \n          // Skip expired items\n          if (now > parsed.expires) {\n            await this.storage.delete(key);\n            continue;\n          }\n          \n          // Add to memory cache\n          this.cache.set(key, {\n            value: parsed.value,\n            etag: parsed.etag,\n            expires: parsed.expires,\n            lastAccessed: parsed.lastAccessed,\n            hitCount: parsed.hitCount\n          });\n        } catch (err) {\n          // Remove corrupted data\n          await this.storage.delete(key);\n        }\n      }\n      \n      if (this.options.debug) {\n        console.log(`Cache initialized with ${this.cache.size} items`);\n      }\n    } catch (err) {\n      if (this.options.debug) {\n        console.error('Cache initialization error:', err);\n      }\n    }\n  }\n\n  /**\n   * Create a memory storage adapter\n   */\n  private createMemoryStorageAdapter(): CacheStorage {\n    const memoryStore = new Map<string, string>();\n    const expirations = new Map<string, NodeJS.Timeout>();\n    \n    return {\n      async get(key: string): Promise<string | null> {\n        return memoryStore.get(key) || null;\n      },\n      \n      async set(key: string, value: string, ttl?: number): Promise<void> {\n        memoryStore.set(key, value);\n        \n        // Set up expiration if TTL provided\n        if (ttl) {\n          // Clear existing timeout if any\n          if (expirations.has(key)) {\n            clearTimeout(expirations.get(key)!);\n          }\n          \n          // Set new timeout\n          const timeout = setTimeout(() => {\n            memoryStore.delete(key);\n            expirations.delete(key);\n          }, ttl * 1000);\n          \n          expirations.set(key, timeout);\n        }\n      },\n      \n      async delete(key: string): Promise<void> {\n        memoryStore.delete(key);\n        \n        if (expirations.has(key)) {\n          clearTimeout(expirations.get(key)!);\n          expirations.delete(key);\n        }\n      },\n      \n      async clear(): Promise<void> {\n        memoryStore.clear();\n        \n        // Clear all timeouts\n        for (const timeout of expirations.values()) {\n          clearTimeout(timeout);\n        }\n        expirations.clear();\n      },\n      \n      async keys(): Promise<string[]> {\n        return Array.from(memoryStore.keys());\n      }\n    };\n  }\n\n  /**\n   * Create a localStorage adapter\n   */\n  private createLocalStorageAdapter(): CacheStorage {\n    // Store reference to the cache instance to access methods\n    const self = this;\n    \n    return {\n      async get(key: string): Promise<string | null> {\n        return localStorage.getItem(key);\n      },\n      \n      async set(key: string, value: string): Promise<void> {\n        localStorage.setItem(key, value);\n      },\n      \n      async delete(key: string): Promise<void> {\n        localStorage.removeItem(key);\n      },\n      \n      async clear(): Promise<void> {\n        // Only clear keys from our namespace\n        const nsPrefix = self.options.namespace + ':';\n        \n        for (let i = 0; i < localStorage.length; i++) {\n          const key = localStorage.key(i);\n          if (key && key.startsWith(nsPrefix)) {\n            localStorage.removeItem(key);\n          }\n        }\n      },\n      \n      async keys(): Promise<string[]> {\n        const keys: string[] = [];\n        for (let i = 0; i < localStorage.length; i++) {\n          const key = localStorage.key(i);\n          if (key) keys.push(key);\n        }\n        return keys;\n      }\n    };\n  }\n\n  /**\n   * Create a sessionStorage adapter\n   */\n  private createSessionStorageAdapter(): CacheStorage {\n    // Store reference to the cache instance to access methods\n    const self = this;\n    \n    return {\n      async get(key: string): Promise<string | null> {\n        return sessionStorage.getItem(key);\n      },\n      \n      async set(key: string, value: string): Promise<void> {\n        sessionStorage.setItem(key, value);\n      },\n      \n      async delete(key: string): Promise<void> {\n        sessionStorage.removeItem(key);\n      },\n      \n      async clear(): Promise<void> {\n        // Only clear keys from our namespace\n        const nsPrefix = self.options.namespace + ':';\n        \n        for (let i = 0; i < sessionStorage.length; i++) {\n          const key = sessionStorage.key(i);\n          if (key && key.startsWith(nsPrefix)) {\n            sessionStorage.removeItem(key);\n          }\n        }\n      },\n      \n      async keys(): Promise<string[]> {\n        const keys: string[] = [];\n        for (let i = 0; i < sessionStorage.length; i++) {\n          const key = sessionStorage.key(i);\n          if (key) keys.push(key);\n        }\n        return keys;\n      }\n    };\n  }\n}\n\n/**\n * Create a new Redis cache client\n */\nexport function createRedisCache(options: Partial<RedisCacheOptions> = {}): MCPRedisCache {\n  return new MCPRedisCache(options);\n}\n\nexport default MCPRedisCache; "]}