{"version":3,"sources":["../src/compute/distributed/index.ts","../src/compute/distributed/distributed-client.ts","../src/compute/distributed/model-router.ts","../src/compute/distributed/edge-inference-adapter.ts","../src/compute/distributed/streaming-client.ts","../src/compute/distributed/connection-manager.ts","../src/compute/distributed/offline-support.ts","../src/compute/distributed/bandwidth-optimizer.ts","../src/compute/distributed/model-preloader.ts","../src/compute/distributed/cache-coordinator.ts","../src/compute/distributed/metrics-reporter.ts","../src/compute/distributed/error-recovery.ts","../src/compute/distributed/batch-scheduler.ts","../src/compute/distributed/token-budget-manager.ts","../src/compute/distributed/hooks.tsx"],"names":["DEFAULT_CONFIG"],"mappings":"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","file":"chunk-TU7VR2X6.mjs","sourcesContent":["/**\n * Distributed Inference Client\n *\n * Client-side integration with Cloudflare Workers distributed inference.\n * Provides seamless fallback between local WASM/WebGPU and remote distributed inference.\n */\n\n// Core distributed client\nexport { DistributedClient, DISTRIBUTED_PRESETS } from './distributed-client';\nexport type {\n  DistributedClientConfig,\n  DistributedInferenceOptions,\n  DistributedResult,\n  WorkerStatus,\n  ConnectionState,\n} from './distributed-client';\n\n// Model routing\nexport { ModelRouter, ROUTING_STRATEGIES } from './model-router';\nexport type {\n  ModelRouterConfig,\n  RoutingStrategy,\n  RouteDecision,\n  ModelCapabilities,\n  LatencyStats,\n} from './model-router';\n\n// Edge inference adapter\nexport {\n  EdgeInferenceAdapter,\n  createEdgeInferenceAdapter,\n} from './edge-inference-adapter';\nexport type {\n  EdgeInferenceAdapterConfig,\n  InferenceRequest,\n  InferenceResult,\n  InferenceContext,\n} from './edge-inference-adapter';\n\n// Streaming client\nexport { StreamingClient, STREAMING_PRESETS } from './streaming-client';\nexport type {\n  StreamConfig,\n  StreamState,\n  StreamEvent,\n  TokenEvent,\n  StreamStats,\n} from './streaming-client';\n\n// Connection management\nexport { ConnectionManager, CONNECTION_PRESETS } from './connection-manager';\nexport type {\n  ConnectionManagerConfig,\n  ConnectionState as ConnectionManagerState,\n  ConnectionQuality,\n  ConnectionInfo,\n} from './connection-manager';\n\n// Offline support\nexport { OfflineSupport, OFFLINE_PRESETS } from './offline-support';\nexport type {\n  OfflineSupportConfig,\n  QueuedRequest,\n  OfflineState,\n  SyncConflict,\n  OfflineModel,\n} from './offline-support';\n\n// Bandwidth optimization\nexport { BandwidthOptimizer, BANDWIDTH_PRESETS } from './bandwidth-optimizer';\nexport type {\n  BandwidthOptimizerConfig,\n  CompressionAlgorithm,\n  TransferFormat,\n  QualityLevel,\n  NetworkProfile,\n  OptimizationStrategy,\n} from './bandwidth-optimizer';\n\n// Model preloading\nexport { ModelPreloader, PRELOADER_PRESETS } from './model-preloader';\nexport type {\n  ModelPreloaderConfig,\n  PreloadPriority,\n  ModelLoadState,\n  ModelMetadata,\n  ModelLoadProgress,\n  PreloadRequest,\n} from './model-preloader';\n\n// Cache coordination\nexport { CacheCoordinator, CACHE_PRESETS } from './cache-coordinator';\nexport type {\n  CacheCoordinatorConfig,\n  CacheLayer,\n  CacheEntry,\n  InvalidationReason,\n  CacheEvent,\n  CacheStats,\n  KVCacheEntry,\n} from './cache-coordinator';\n\n// Metrics reporting\nexport { MetricsReporter, METRICS_PRESETS } from './metrics-reporter';\nexport type {\n  MetricsReporterConfig,\n  MetricType,\n  MetricValue,\n  HistogramBucket,\n  HistogramData,\n  PerformanceSummary,\n} from './metrics-reporter';\n\n// Error development\nexport {\n  ErrorRecovery,\n  CircuitBreaker,\n  RECOVERY_PRESETS,\n  createErrorRecovery,\n} from './error-recovery';\nexport type {\n  ErrorRecoveryConfig,\n  RetryConfig,\n  RetryStrategy,\n  CircuitBreakerConfig,\n  CircuitState,\n  ClassifiedError,\n  ErrorCategory,\n  ErrorSeverity,\n  Fallback,\n  ErrorPattern,\n} from './error-recovery';\n\n// Batch scheduling\nexport {\n  BatchScheduler,\n  DebouncedBatchScheduler,\n  ThrottledBatchScheduler,\n  InferenceBatchScheduler,\n  BATCH_PRESETS,\n  createBatchScheduler,\n} from './batch-scheduler';\nexport type {\n  BatchSchedulerConfig,\n  BatchItem,\n  BatchResult,\n  BatchStats,\n  InferenceRequest as BatchInferenceRequest,\n  InferenceResponse,\n} from './batch-scheduler';\n\n// Token budget management\nexport {\n  TokenBudgetManager,\n  BUDGET_PRESETS,\n  createTokenBudgetManager,\n} from './token-budget-manager';\nexport type {\n  TokenBudgetManagerConfig,\n  BudgetConfig,\n  BudgetPeriod,\n  BudgetUsage,\n  UsageRecord,\n  TokenPricing,\n  ModelPricing,\n} from './token-budget-manager';\n\n// React hooks\nexport {\n  useDistributedInference,\n  useStreamingInference,\n  useBudget,\n  useOfflineStatus,\n  useInferenceMetrics,\n  useModelStatus,\n  useEdgeworkInference,\n} from './hooks';\nexport type {\n  UseDistributedInferenceConfig,\n  InferenceRequest as HooksInferenceRequest,\n  InferenceResult as HooksInferenceResult,\n  InferenceState,\n  StreamingState,\n  BudgetState,\n  OfflineState as HooksOfflineState,\n  MetricsState,\n  ModelStatusState,\n} from './hooks';\n","/**\n * Distributed Inference Client\n *\n * Client-side integration with Cloudflare Workers distributed inference.\n * Provides seamless connection to edge workers for large model inference.\n *\n * Features:\n * - Automatic worker discovery and health monitoring\n * - Connection pooling with WebSocket/WebTransport\n * - Request multiplexing for efficient bandwidth usage\n * - Graceful degradation on network issues\n * - Real-time latency tracking and worker selection\n */\n\n/**\n * Connection state for distributed workers\n */\nexport type ConnectionState =\n  | 'disconnected'\n  | 'connecting'\n  | 'connected'\n  | 'reconnecting'\n  | 'error';\n\n/**\n * Worker health and status\n */\nexport interface WorkerStatus {\n  /** Worker endpoint URL */\n  endpoint: string;\n\n  /** Current connection state */\n  state: ConnectionState;\n\n  /** Whether worker is healthy */\n  healthy: boolean;\n\n  /** Last health check timestamp */\n  lastHealthCheck: number;\n\n  /** Average latency in ms */\n  avgLatencyMs: number;\n\n  /** Latency percentiles */\n  latencyP50: number;\n  latencyP95: number;\n  latencyP99: number;\n\n  /** Request success rate (0-1) */\n  successRate: number;\n\n  /** Current queue depth */\n  queueDepth: number;\n\n  /** Worker capabilities */\n  capabilities: {\n    maxBatchSize: number;\n    maxSeqLength: number;\n    supportsFP16: boolean;\n    supportsKVCache: boolean;\n    models: string[];\n  };\n\n  /** Worker metadata */\n  region: string;\n  workerId: string;\n}\n\n/**\n * Configuration for distributed client\n */\nexport interface DistributedClientConfig {\n  /** Worker endpoints to connect to */\n  endpoints: string[];\n\n  /** Primary coordinator endpoint */\n  coordinatorEndpoint?: string;\n\n  /** API key for authentication */\n  apiKey?: string;\n\n  /** Connection timeout in ms */\n  connectionTimeoutMs?: number;\n\n  /** Request timeout in ms */\n  requestTimeoutMs?: number;\n\n  /** Health check interval in ms */\n  healthCheckIntervalMs?: number;\n\n  /** Maximum concurrent requests per worker */\n  maxConcurrentRequests?: number;\n\n  /** Enable WebSocket connections */\n  enableWebSocket?: boolean;\n\n  /** Enable WebTransport (if available) */\n  enableWebTransport?: boolean;\n\n  /** Retry configuration */\n  retry?: {\n    maxRetries: number;\n    baseDelayMs: number;\n    maxDelayMs: number;\n    backoffMultiplier: number;\n  };\n\n  /** Callbacks */\n  onConnectionChange?: (endpoint: string, state: ConnectionState) => void;\n  onWorkerHealthChange?: (status: WorkerStatus) => void;\n  onError?: (error: Error, endpoint: string) => void;\n}\n\n/**\n * Options for distributed inference requests\n */\nexport interface DistributedInferenceOptions {\n  /** Model to use */\n  model?: string;\n\n  /** Maximum tokens to generate */\n  maxTokens?: number;\n\n  /** Temperature for sampling */\n  temperature?: number;\n\n  /** Top-p sampling */\n  topP?: number;\n\n  /** Top-k sampling */\n  topK?: number;\n\n  /** Stop sequences */\n  stopSequences?: string[];\n\n  /** Enable streaming */\n  stream?: boolean;\n\n  /** Use FP16 for hidden state transfer */\n  useFP16?: boolean;\n\n  /** Enable speculative decoding */\n  speculative?: boolean;\n\n  /** Preferred worker region */\n  preferredRegion?: string;\n\n  /** Request priority (higher = more urgent) */\n  priority?: number;\n\n  /** Timeout for this specific request */\n  timeoutMs?: number;\n\n  /** Abort signal */\n  signal?: AbortSignal;\n}\n\n/**\n * Result from distributed inference\n */\nexport interface DistributedResult {\n  /** Generated text */\n  text: string;\n\n  /** Token IDs */\n  tokens: number[];\n\n  /** Generation stats */\n  stats: {\n    totalTokens: number;\n    promptTokens: number;\n    completionTokens: number;\n    totalLatencyMs: number;\n    firstTokenLatencyMs: number;\n    tokensPerSecond: number;\n  };\n\n  /** Worker that processed the request */\n  worker: {\n    endpoint: string;\n    region: string;\n    workerId: string;\n  };\n\n  /** Speculative decoding stats (if enabled) */\n  speculative?: {\n    draftTokens: number;\n    acceptedTokens: number;\n    acceptanceRate: number;\n  };\n\n  /** Cache stats */\n  cache?: {\n    kvCacheHit: boolean;\n    embeddingCacheHit: boolean;\n    savedComputeMs: number;\n  };\n}\n\n/**\n * Latency tracking for a single worker\n */\ninterface LatencyTracker {\n  samples: number[];\n  maxSamples: number;\n  successCount: number;\n  failureCount: number;\n}\n\n/**\n * Pending request tracking\n */\ninterface PendingRequest {\n  id: string;\n  endpoint: string;\n  startTime: number;\n  resolve: (result: DistributedResult) => void;\n  reject: (error: Error) => void;\n  abortController: AbortController;\n}\n\n/**\n * WebSocket connection wrapper\n */\ninterface WorkerConnection {\n  endpoint: string;\n  socket: WebSocket | null;\n  state: ConnectionState;\n  reconnectAttempts: number;\n  lastActivity: number;\n  pendingRequests: Map<string, PendingRequest>;\n}\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG: Required<\n  Omit<\n    DistributedClientConfig,\n    | 'endpoints'\n    | 'coordinatorEndpoint'\n    | 'apiKey'\n    | 'onConnectionChange'\n    | 'onWorkerHealthChange'\n    | 'onError'\n  >\n> = {\n  connectionTimeoutMs: 10000,\n  requestTimeoutMs: 60000,\n  healthCheckIntervalMs: 30000,\n  maxConcurrentRequests: 10,\n  enableWebSocket: true,\n  enableWebTransport: false,\n  retry: {\n    maxRetries: 3,\n    baseDelayMs: 1000,\n    maxDelayMs: 30000,\n    backoffMultiplier: 2,\n  },\n};\n\n/**\n * Distributed Inference Client\n *\n * Manages connections to multiple edge workers and routes requests\n * to the optimal worker based on health, latency, and load.\n */\nexport class DistributedClient {\n  private config: DistributedClientConfig & typeof DEFAULT_CONFIG;\n  private connections: Map<string, WorkerConnection> = new Map();\n  private workerStatus: Map<string, WorkerStatus> = new Map();\n  private latencyTrackers: Map<string, LatencyTracker> = new Map();\n  private healthCheckInterval: ReturnType<typeof setInterval> | null = null;\n  private requestCounter = 0;\n  private isShutdown = false;\n\n  constructor(config: DistributedClientConfig) {\n    this.config = { ...DEFAULT_CONFIG, ...config };\n\n    // Initialize connections for all endpoints\n    for (const endpoint of config.endpoints) {\n      this.initializeWorker(endpoint);\n    }\n\n    // Start health checks\n    if (this.config.healthCheckIntervalMs > 0) {\n      this.startHealthChecks();\n    }\n  }\n\n  /**\n   * Initialize a worker connection\n   */\n  private initializeWorker(endpoint: string): void {\n    // Initialize latency tracker\n    this.latencyTrackers.set(endpoint, {\n      samples: [],\n      maxSamples: 100,\n      successCount: 0,\n      failureCount: 0,\n    });\n\n    // Initialize worker status\n    this.workerStatus.set(endpoint, {\n      endpoint,\n      state: 'disconnected',\n      healthy: false,\n      lastHealthCheck: 0,\n      avgLatencyMs: 0,\n      latencyP50: 0,\n      latencyP95: 0,\n      latencyP99: 0,\n      successRate: 1,\n      queueDepth: 0,\n      capabilities: {\n        maxBatchSize: 0,\n        maxSeqLength: 0,\n        supportsFP16: false,\n        supportsKVCache: false,\n        models: [],\n      },\n      region: 'unknown',\n      workerId: 'unknown',\n    });\n\n    // Initialize connection\n    this.connections.set(endpoint, {\n      endpoint,\n      socket: null,\n      state: 'disconnected',\n      reconnectAttempts: 0,\n      lastActivity: Date.now(),\n      pendingRequests: new Map(),\n    });\n  }\n\n  /**\n   * Connect to a worker via WebSocket\n   */\n  async connect(endpoint: string): Promise<void> {\n    const connection = this.connections.get(endpoint);\n    if (!connection) {\n      throw new Error(`Unknown endpoint: ${endpoint}`);\n    }\n\n    if (connection.state === 'connected' || connection.state === 'connecting') {\n      return;\n    }\n\n    this.updateConnectionState(endpoint, 'connecting');\n\n    try {\n      if (this.config.enableWebSocket) {\n        await this.connectWebSocket(endpoint);\n      } else {\n        // Use HTTP polling fallback\n        await this.checkHealth(endpoint);\n      }\n    } catch (error) {\n      this.updateConnectionState(endpoint, 'error');\n      this.config.onError?.(error as Error, endpoint);\n      throw error;\n    }\n  }\n\n  /**\n   * Connect via WebSocket\n   */\n  private async connectWebSocket(endpoint: string): Promise<void> {\n    const connection = this.connections.get(endpoint)!;\n    const wsUrl = endpoint.replace(/^http/, 'ws') + '/ws';\n\n    return new Promise((resolve, reject) => {\n      const timeout = setTimeout(() => {\n        reject(new Error(`Connection timeout to ${endpoint}`));\n      }, this.config.connectionTimeoutMs);\n\n      try {\n        const socket = new WebSocket(wsUrl);\n\n        socket.onopen = () => {\n          clearTimeout(timeout);\n          connection.socket = socket;\n          connection.reconnectAttempts = 0;\n          this.updateConnectionState(endpoint, 'connected');\n\n          // Send auth if available\n          if (this.config.apiKey) {\n            socket.send(\n              JSON.stringify({\n                type: 'auth',\n                apiKey: this.config.apiKey,\n              })\n            );\n          }\n\n          resolve();\n        };\n\n        socket.onmessage = (event) => {\n          this.handleMessage(endpoint, event.data);\n        };\n\n        socket.onclose = () => {\n          connection.socket = null;\n          this.updateConnectionState(endpoint, 'disconnected');\n          this.scheduleReconnect(endpoint);\n        };\n\n        socket.onerror = (error) => {\n          clearTimeout(timeout);\n          reject(new Error(`WebSocket error: ${error}`));\n        };\n      } catch (error) {\n        clearTimeout(timeout);\n        reject(error);\n      }\n    });\n  }\n\n  /**\n   * Handle incoming WebSocket message\n   */\n  private handleMessage(endpoint: string, data: string): void {\n    const connection = this.connections.get(endpoint);\n    if (!connection) return;\n\n    connection.lastActivity = Date.now();\n\n    try {\n      const message = JSON.parse(data) as any;\n\n      switch (message.type) {\n        case 'response': {\n          const pending = connection.pendingRequests.get(message.requestId);\n          if (pending) {\n            const latency = Date.now() - pending.startTime;\n            this.recordLatency(endpoint, latency, true);\n            connection.pendingRequests.delete(message.requestId);\n            pending.resolve(message.result);\n          }\n          break;\n        }\n\n        case 'error': {\n          const pending = connection.pendingRequests.get(message.requestId);\n          if (pending) {\n            this.recordLatency(endpoint, Date.now() - pending.startTime, false);\n            connection.pendingRequests.delete(message.requestId);\n            pending.reject(new Error(message.error));\n          }\n          break;\n        }\n\n        case 'stream': {\n          // Handle streaming tokens - dispatch to stream handler\n          this.dispatchStreamEvent(message.requestId, message.token);\n          break;\n        }\n\n        case 'health': {\n          this.updateWorkerStatus(endpoint, message.status);\n          break;\n        }\n\n        case 'pong': {\n          // Health check response\n          const status = this.workerStatus.get(endpoint);\n          if (status) {\n            status.lastHealthCheck = Date.now();\n            status.healthy = true;\n          }\n          break;\n        }\n      }\n    } catch (error) {\n      console.error(\n        `[DistributedClient] Failed to parse message from ${endpoint}:`,\n        error\n      );\n    }\n  }\n\n  /**\n   * Stream event handlers\n   */\n  private streamHandlers: Map<string, (token: string) => void> = new Map();\n\n  private dispatchStreamEvent(requestId: string, token: string): void {\n    const handler = this.streamHandlers.get(requestId);\n    if (handler) {\n      handler(token);\n    }\n  }\n\n  /**\n   * Schedule reconnection attempt\n   */\n  private scheduleReconnect(endpoint: string): void {\n    if (this.isShutdown) return;\n\n    const connection = this.connections.get(endpoint);\n    if (!connection) return;\n\n    const { maxRetries, baseDelayMs, maxDelayMs, backoffMultiplier } =\n      this.config.retry;\n\n    if (connection.reconnectAttempts >= maxRetries) {\n      this.updateConnectionState(endpoint, 'error');\n      return;\n    }\n\n    const delay = Math.min(\n      baseDelayMs * Math.pow(backoffMultiplier, connection.reconnectAttempts),\n      maxDelayMs\n    );\n\n    connection.reconnectAttempts++;\n    this.updateConnectionState(endpoint, 'reconnecting');\n\n    setTimeout(() => {\n      if (!this.isShutdown) {\n        this.connect(endpoint).catch(() => {\n          /* noop - error handling is done in connect() */\n        });\n      }\n    }, delay);\n  }\n\n  /**\n   * Update connection state and notify\n   */\n  private updateConnectionState(\n    endpoint: string,\n    state: ConnectionState\n  ): void {\n    const connection = this.connections.get(endpoint);\n    if (connection) {\n      connection.state = state;\n    }\n\n    const status = this.workerStatus.get(endpoint);\n    if (status) {\n      status.state = state;\n      status.healthy = state === 'connected';\n    }\n\n    this.config.onConnectionChange?.(endpoint, state);\n  }\n\n  /**\n   * Update worker status\n   */\n  private updateWorkerStatus(\n    endpoint: string,\n    update: Partial<WorkerStatus>\n  ): void {\n    const status = this.workerStatus.get(endpoint);\n    if (status) {\n      Object.assign(status, update);\n      this.config.onWorkerHealthChange?.(status);\n    }\n  }\n\n  /**\n   * Record latency sample\n   */\n  private recordLatency(\n    endpoint: string,\n    latencyMs: number,\n    success: boolean\n  ): void {\n    const tracker = this.latencyTrackers.get(endpoint);\n    if (!tracker) return;\n\n    tracker.samples.push(latencyMs);\n    if (tracker.samples.length > tracker.maxSamples) {\n      tracker.samples.shift();\n    }\n\n    if (success) {\n      tracker.successCount++;\n    } else {\n      tracker.failureCount++;\n    }\n\n    // Update worker status\n    const status = this.workerStatus.get(endpoint);\n    if (status && tracker.samples.length > 0) {\n      const sorted = [...tracker.samples].sort((a, b) => a - b);\n      status.avgLatencyMs = sorted.reduce((a, b) => a + b, 0) / sorted.length;\n      status.latencyP50 = sorted[Math.floor(sorted.length * 0.5)];\n      status.latencyP95 = sorted[Math.floor(sorted.length * 0.95)];\n      status.latencyP99 = sorted[Math.floor(sorted.length * 0.99)];\n\n      const total = tracker.successCount + tracker.failureCount;\n      status.successRate = total > 0 ? tracker.successCount / total : 1;\n    }\n  }\n\n  /**\n   * Start periodic health checks\n   */\n  private startHealthChecks(): void {\n    this.healthCheckInterval = setInterval(() => {\n      for (const endpoint of this.config.endpoints) {\n        this.checkHealth(endpoint).catch(() => {\n          /* noop - error handling is done in checkHealth */\n        });\n      }\n    }, this.config.healthCheckIntervalMs);\n  }\n\n  /**\n   * Check health of a worker\n   */\n  async checkHealth(endpoint: string): Promise<WorkerStatus> {\n    const status = this.workerStatus.get(endpoint);\n    if (!status) {\n      throw new Error(`Unknown endpoint: ${endpoint}`);\n    }\n\n    const connection = this.connections.get(endpoint);\n\n    // If WebSocket is connected, use ping/pong\n    if (connection?.socket?.readyState === WebSocket.OPEN) {\n      connection.socket.send(JSON.stringify({ type: 'ping' }));\n      status.lastHealthCheck = Date.now();\n      return status;\n    }\n\n    // Otherwise use HTTP health check\n    try {\n      const start = Date.now();\n      const response = await fetch(`${endpoint}/health`, {\n        signal: AbortSignal.timeout(5000),\n      });\n\n      const latency = Date.now() - start;\n      this.recordLatency(endpoint, latency, response.ok);\n\n      if (response.ok) {\n        const data = (await response.json()) as any;\n        this.updateWorkerStatus(endpoint, {\n          healthy: true,\n          lastHealthCheck: Date.now(),\n          capabilities: data.capabilities,\n          region: data.region,\n          workerId: data.workerId,\n          queueDepth: data.queueDepth || 0,\n        });\n      } else {\n        this.updateWorkerStatus(endpoint, { healthy: false });\n      }\n    } catch (error) {\n      this.recordLatency(endpoint, 5000, false);\n      this.updateWorkerStatus(endpoint, { healthy: false });\n    }\n\n    return status;\n  }\n\n  /**\n   * Select the best worker for a request\n   */\n  selectWorker(options: DistributedInferenceOptions = {}): string | null {\n    const healthyWorkers: Array<{ endpoint: string; score: number }> = [];\n\n    for (const [endpoint, status] of this.workerStatus) {\n      if (!status.healthy) continue;\n\n      // Check if worker supports the requested model\n      if (\n        options.model &&\n        !status.capabilities.models.includes(options.model)\n      ) {\n        continue;\n      }\n\n      // Check region preference\n      let regionBonus = 0;\n      if (\n        options.preferredRegion &&\n        status.region === options.preferredRegion\n      ) {\n        regionBonus = 100;\n      }\n\n      // Score based on latency, success rate, and queue depth\n      const latencyScore = Math.max(0, 100 - status.avgLatencyMs / 10);\n      const successScore = status.successRate * 50;\n      const queueScore = Math.max(0, 50 - status.queueDepth * 5);\n\n      const score = latencyScore + successScore + queueScore + regionBonus;\n      healthyWorkers.push({ endpoint, score });\n    }\n\n    if (healthyWorkers.length === 0) {\n      return null;\n    }\n\n    // Sort by score descending\n    healthyWorkers.sort((a, b) => b.score - a.score);\n\n    // Return best worker (with some randomization for load balancing)\n    const topN = Math.min(3, healthyWorkers.length);\n    const idx = Math.floor(Math.random() * topN);\n    return healthyWorkers[idx].endpoint;\n  }\n\n  /**\n   * Generate text using distributed inference\n   */\n  async generate(\n    prompt: string,\n    options: DistributedInferenceOptions = {}\n  ): Promise<DistributedResult> {\n    const endpoint = this.selectWorker(options);\n    if (!endpoint) {\n      throw new Error('No healthy workers available');\n    }\n\n    const requestId = `req_${++this.requestCounter}_${Date.now()}`;\n    const connection = this.connections.get(endpoint)!;\n    const startTime = Date.now();\n\n    // Try WebSocket first\n    if (connection.socket?.readyState === WebSocket.OPEN) {\n      return this.generateViaWebSocket(\n        endpoint,\n        requestId,\n        prompt,\n        options,\n        startTime\n      );\n    }\n\n    // Fall back to HTTP\n    return this.generateViaHTTP(\n      endpoint,\n      requestId,\n      prompt,\n      options,\n      startTime\n    );\n  }\n\n  /**\n   * Generate via WebSocket connection\n   */\n  private generateViaWebSocket(\n    endpoint: string,\n    requestId: string,\n    prompt: string,\n    options: DistributedInferenceOptions,\n    startTime: number\n  ): Promise<DistributedResult> {\n    const connection = this.connections.get(endpoint)!;\n\n    return new Promise((resolve, reject) => {\n      const abortController = new AbortController();\n\n      // Set up timeout\n      const timeout = setTimeout(() => {\n        connection.pendingRequests.delete(requestId);\n        abortController.abort();\n        reject(\n          new Error(\n            `Request timeout after ${\n              options.timeoutMs || this.config.requestTimeoutMs\n            }ms`\n          )\n        );\n      }, options.timeoutMs || this.config.requestTimeoutMs);\n\n      // Handle external abort\n      options.signal?.addEventListener('abort', () => {\n        clearTimeout(timeout);\n        connection.pendingRequests.delete(requestId);\n        abortController.abort();\n        reject(new Error('Request aborted'));\n      });\n\n      // Track pending request\n      connection.pendingRequests.set(requestId, {\n        id: requestId,\n        endpoint,\n        startTime,\n        resolve: (result) => {\n          clearTimeout(timeout);\n          resolve(result);\n        },\n        reject: (error) => {\n          clearTimeout(timeout);\n          reject(error);\n        },\n        abortController,\n      });\n\n      // Update queue depth\n      const status = this.workerStatus.get(endpoint);\n      if (status) {\n        status.queueDepth = connection.pendingRequests.size;\n      }\n\n      // Send request\n      connection.socket!.send(\n        JSON.stringify({\n          type: 'generate',\n          requestId,\n          prompt,\n          options: {\n            model: options.model,\n            maxTokens: options.maxTokens,\n            temperature: options.temperature,\n            topP: options.topP,\n            topK: options.topK,\n            stopSequences: options.stopSequences,\n            stream: options.stream,\n            useFP16: options.useFP16,\n            speculative: options.speculative,\n            priority: options.priority,\n          },\n        })\n      );\n    });\n  }\n\n  /**\n   * Generate via HTTP fallback\n   */\n  private async generateViaHTTP(\n    endpoint: string,\n    requestId: string,\n    prompt: string,\n    options: DistributedInferenceOptions,\n    startTime: number\n  ): Promise<DistributedResult> {\n    const abortController = new AbortController();\n\n    // Merge abort signals\n    if (options.signal) {\n      options.signal.addEventListener('abort', () => abortController.abort());\n    }\n\n    // Set up timeout\n    const timeoutId = setTimeout(() => {\n      abortController.abort();\n    }, options.timeoutMs || this.config.requestTimeoutMs);\n\n    try {\n      const response = await fetch(`${endpoint}/v1/generate`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          ...(this.config.apiKey && {\n            Authorization: `Bearer ${this.config.apiKey}`,\n          }),\n          'X-Request-ID': requestId,\n        },\n        body: JSON.stringify({\n          prompt,\n          model: options.model,\n          max_tokens: options.maxTokens,\n          temperature: options.temperature,\n          top_p: options.topP,\n          top_k: options.topK,\n          stop: options.stopSequences,\n          stream: options.stream,\n          use_fp16: options.useFP16,\n          speculative: options.speculative,\n        }),\n        signal: abortController.signal,\n      });\n\n      clearTimeout(timeoutId);\n\n      const latency = Date.now() - startTime;\n      this.recordLatency(endpoint, latency, response.ok);\n\n      if (!response.ok) {\n        const error = (await response\n          .json()\n          .catch((): unknown => ({ message: 'Unknown error' }))) as unknown;\n        const errorMessage =\n          typeof error === 'object' &&\n          error !== null &&\n          'message' in error &&\n          typeof error.message === 'string'\n            ? error.message\n            : `HTTP ${response.status}`;\n        throw new Error(errorMessage);\n      }\n\n      const data = (await response.json()) as any;\n      const status = this.workerStatus.get(endpoint)!;\n\n      return {\n        text: data.text || data.choices?.[0]?.text || '',\n        tokens: data.tokens || [],\n        stats: {\n          totalTokens: data.usage?.total_tokens || 0,\n          promptTokens: data.usage?.prompt_tokens || 0,\n          completionTokens: data.usage?.completion_tokens || 0,\n          totalLatencyMs: latency,\n          firstTokenLatencyMs: data.first_token_latency_ms || latency,\n          tokensPerSecond: data.tokens_per_second || 0,\n        },\n        worker: {\n          endpoint,\n          region: status.region,\n          workerId: status.workerId,\n        },\n        speculative: data.speculative,\n        cache: data.cache,\n      };\n    } catch (error) {\n      clearTimeout(timeoutId);\n      this.recordLatency(endpoint, Date.now() - startTime, false);\n      throw error;\n    }\n  }\n\n  /**\n   * Stream generation with token callback\n   */\n  async *stream(\n    prompt: string,\n    options: DistributedInferenceOptions = {}\n  ): AsyncGenerator<string, DistributedResult, unknown> {\n    const endpoint = this.selectWorker(options);\n    if (!endpoint) {\n      throw new Error('No healthy workers available');\n    }\n\n    const requestId = `req_${++this.requestCounter}_${Date.now()}`;\n    const startTime = Date.now();\n    const tokens: string[] = [];\n    let finalResult: DistributedResult | null = null;\n\n    const connection = this.connections.get(endpoint)!;\n\n    // Use WebSocket streaming if available\n    if (connection.socket?.readyState === WebSocket.OPEN) {\n      // Set up stream handler\n      const tokenQueue: string[] = [];\n      let resolveNext:\n        | ((value: IteratorResult<string, DistributedResult>) => void)\n        | null = null;\n      let streamComplete = false;\n\n      this.streamHandlers.set(requestId, (token: string) => {\n        if (token === '[DONE]') {\n          streamComplete = true;\n          if (resolveNext) {\n            resolveNext({ done: true, value: finalResult! });\n          }\n        } else {\n          tokens.push(token);\n          if (resolveNext) {\n            resolveNext({ done: false, value: token });\n            resolveNext = null;\n          } else {\n            tokenQueue.push(token);\n          }\n        }\n      });\n\n      // Send streaming request\n      connection.socket.send(\n        JSON.stringify({\n          type: 'generate',\n          requestId,\n          prompt,\n          options: {\n            ...options,\n            stream: true,\n          },\n        })\n      );\n\n      try {\n        while (!streamComplete) {\n          if (tokenQueue.length > 0) {\n            yield tokenQueue.shift()!;\n          } else {\n            await new Promise<IteratorResult<string, DistributedResult>>(\n              (resolve) => {\n                resolveNext = resolve;\n              }\n            );\n          }\n        }\n      } finally {\n        this.streamHandlers.delete(requestId);\n      }\n    } else {\n      // HTTP SSE fallback\n      const response = await fetch(`${endpoint}/v1/generate`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          Accept: 'text/event-stream',\n          ...(this.config.apiKey && {\n            Authorization: `Bearer ${this.config.apiKey}`,\n          }),\n          'X-Request-ID': requestId,\n        },\n        body: JSON.stringify({\n          prompt,\n          ...options,\n          stream: true,\n        }),\n        signal: options.signal,\n      });\n\n      if (!response.ok) {\n        throw new Error(`HTTP ${response.status}`);\n      }\n\n      const reader = response.body?.getReader();\n      if (!reader) {\n        throw new Error('No response body');\n      }\n\n      const decoder = new TextDecoder();\n      let buffer = '';\n\n      while (true) {\n        const { done, value } = await reader.read();\n        if (done) break;\n\n        buffer += decoder.decode(value, { stream: true });\n        const lines = buffer.split('\\n');\n        buffer = lines.pop() || '';\n\n        for (const line of lines) {\n          if (line.startsWith('data: ')) {\n            const data = line.slice(6);\n            if (data === '[DONE]') {\n              break;\n            }\n            try {\n              const parsed = JSON.parse(data);\n              if (parsed.token) {\n                tokens.push(parsed.token);\n                yield parsed.token;\n              }\n              if (parsed.result) {\n                finalResult = parsed.result;\n              }\n            } catch {\n              // Ignore parse errors\n            }\n          }\n        }\n      }\n    }\n\n    const status = this.workerStatus.get(endpoint)!;\n    const latency = Date.now() - startTime;\n    this.recordLatency(endpoint, latency, true);\n\n    return (\n      finalResult || {\n        text: tokens.join(''),\n        tokens: [],\n        stats: {\n          totalTokens: tokens.length,\n          promptTokens: 0,\n          completionTokens: tokens.length,\n          totalLatencyMs: latency,\n          firstTokenLatencyMs: 0,\n          tokensPerSecond: tokens.length / (latency / 1000),\n        },\n        worker: {\n          endpoint,\n          region: status.region,\n          workerId: status.workerId,\n        },\n      }\n    );\n  }\n\n  /**\n   * Get all worker statuses\n   */\n  getWorkerStatuses(): WorkerStatus[] {\n    return Array.from(this.workerStatus.values());\n  }\n\n  /**\n   * Get healthy worker count\n   */\n  getHealthyWorkerCount(): number {\n    return Array.from(this.workerStatus.values()).filter((s) => s.healthy)\n      .length;\n  }\n\n  /**\n   * Disconnect from a specific worker\n   */\n  disconnect(endpoint: string): void {\n    const connection = this.connections.get(endpoint);\n    if (connection?.socket) {\n      connection.socket.close();\n      connection.socket = null;\n    }\n    this.updateConnectionState(endpoint, 'disconnected');\n  }\n\n  /**\n   * Disconnect from all workers\n   */\n  disconnectAll(): void {\n    for (const endpoint of this.connections.keys()) {\n      this.disconnect(endpoint);\n    }\n  }\n\n  /**\n   * Shutdown the client\n   */\n  shutdown(): void {\n    this.isShutdown = true;\n\n    if (this.healthCheckInterval) {\n      clearInterval(this.healthCheckInterval);\n      this.healthCheckInterval = null;\n    }\n\n    this.disconnectAll();\n    this.connections.clear();\n    this.workerStatus.clear();\n    this.latencyTrackers.clear();\n    this.streamHandlers.clear();\n  }\n}\n\n/**\n * Pre-configured client presets\n */\nexport const DISTRIBUTED_PRESETS = {\n  /** Single region, low latency */\n  singleRegion: {\n    connectionTimeoutMs: 5000,\n    requestTimeoutMs: 30000,\n    healthCheckIntervalMs: 15000,\n    maxConcurrentRequests: 20,\n    enableWebSocket: true,\n    retry: {\n      maxRetries: 2,\n      baseDelayMs: 500,\n      maxDelayMs: 5000,\n      backoffMultiplier: 2,\n    },\n  },\n\n  /** Multi-region, high availability */\n  multiRegion: {\n    connectionTimeoutMs: 10000,\n    requestTimeoutMs: 60000,\n    healthCheckIntervalMs: 30000,\n    maxConcurrentRequests: 10,\n    enableWebSocket: true,\n    retry: {\n      maxRetries: 5,\n      baseDelayMs: 1000,\n      maxDelayMs: 30000,\n      backoffMultiplier: 2,\n    },\n  },\n\n  /** Development/testing */\n  development: {\n    connectionTimeoutMs: 30000,\n    requestTimeoutMs: 120000,\n    healthCheckIntervalMs: 60000,\n    maxConcurrentRequests: 5,\n    enableWebSocket: false,\n    retry: {\n      maxRetries: 1,\n      baseDelayMs: 1000,\n      maxDelayMs: 5000,\n      backoffMultiplier: 1,\n    },\n  },\n} as const;\n","/**\n * Model Router\n *\n * Intelligent routing decisions for model inference requests.\n * Determines optimal execution path based on:\n * - Model size and capabilities\n * - Device resources (memory, GPU)\n * - Network experiences\n * - User preferences\n * - Cost optimization\n */\n\n/**\n * Routing strategy type\n */\nexport type RoutingStrategy =\n  | 'local-first' // Prefer local execution, fallback to edge\n  | 'edge-first' // Prefer edge execution, fallback to local\n  | 'cost-optimized' // Minimize cost (prefer local when possible)\n  | 'latency-optimized' // Minimize latency (use fastest available)\n  | 'quality-optimized' // Maximize quality (use largest available model)\n  | 'adaptive' // Dynamically switch based on experiences\n  | 'hybrid'; // Split between local and edge\n\n/**\n * Inference source\n */\nexport type InferenceSource = 'local-wasm' | 'local-webgpu' | 'edge' | 'cloud';\n\n/**\n * Model capability requirements\n */\nexport interface ModelCapabilities {\n  /** Minimum required memory in MB */\n  minMemoryMB: number;\n\n  /** Whether WebGPU is required */\n  requiresWebGPU: boolean;\n\n  /** Whether model can run in WASM */\n  supportsWASM: boolean;\n\n  /** Maximum sequence length supported locally */\n  maxLocalSeqLength: number;\n\n  /** Model parameter count */\n  parameterCount: number;\n\n  /** Quantization format */\n  quantization: 'fp32' | 'fp16' | 'int8' | 'int4';\n\n  /** Whether streaming is supported */\n  supportsStreaming: boolean;\n}\n\n/**\n * Device capabilities detected at runtime\n */\nexport interface DeviceCapabilities {\n  /** Available memory in MB */\n  availableMemoryMB: number;\n\n  /** Whether WebGPU is available */\n  hasWebGPU: boolean;\n\n  /** WebGPU device limits (if available) */\n  webGPULimits?: {\n    maxBufferSize: number;\n    maxStorageBufferBindingSize: number;\n    maxComputeWorkgroupSizeX: number;\n  };\n\n  /** Whether WASM SIMD is available */\n  hasWASMSIMD: boolean;\n\n  /** Number of logical CPUs */\n  cpuCores: number;\n\n  /** Device type */\n  deviceType: 'desktop' | 'mobile' | 'tablet' | 'unknown';\n\n  /** Estimated compute power (relative score) */\n  computeScore: number;\n}\n\n/**\n * Network experiences\n */\nexport interface NetworkConditions {\n  /** Effective connection type */\n  effectiveType: 'slow-2g' | '2g' | '3g' | '4g' | '5g' | 'wifi' | 'unknown';\n\n  /** Estimated bandwidth in Mbps */\n  bandwidthMbps: number;\n\n  /** Round-trip time in ms */\n  rttMs: number;\n\n  /** Whether we're currently offline */\n  isOffline: boolean;\n\n  /** Whether data saver is enabled */\n  dataSaverEnabled: boolean;\n}\n\n/**\n * Latency statistics\n */\nexport interface LatencyStats {\n  /** Source type */\n  source: InferenceSource;\n\n  /** Average latency in ms */\n  avgLatencyMs: number;\n\n  /** P50 latency */\n  p50Ms: number;\n\n  /** P95 latency */\n  p95Ms: number;\n\n  /** P99 latency */\n  p99Ms: number;\n\n  /** Sample count */\n  samples: number;\n\n  /** Success rate */\n  successRate: number;\n\n  /** Tokens per second */\n  avgTokensPerSecond: number;\n}\n\n/**\n * Route decision\n */\nexport interface RouteDecision {\n  /** Primary source for inference */\n  primary: InferenceSource;\n\n  /** Alias for primary (for backwards compatibility) */\n  source?: InferenceSource;\n\n  /** Fallback sources in order of preference */\n  fallbacks: InferenceSource[];\n\n  /** Reasoning for the decision */\n  reason: string;\n\n  /** Confidence score (0-1) */\n  confidence: number;\n\n  /** Estimated latency for primary source */\n  estimatedLatencyMs: number;\n\n  /** Estimated tokens per second */\n  estimatedTPS: number;\n\n  /** Estimated cost for this routing decision */\n  estimatedCost?: number;\n\n  /** Emotion-aware quality multiplier (0-1) */\n  emotionQualityMultiplier?: number;\n\n  /** Whether to use hybrid mode */\n  hybrid?: {\n    /** Tokens to generate locally before switching */\n    localTokens: number;\n    /** Switch threshold (when to hand off to edge) */\n    switchThreshold: number;\n  };\n\n  /** Model modifications */\n  modelAdjustments?: {\n    /** Use quantized version */\n    useQuantized: boolean;\n    /** Reduce max tokens */\n    maxTokens?: number;\n    /** Use smaller batch size */\n    batchSize?: number;\n  };\n}\n\n/**\n * Model router configuration\n */\nexport interface ModelRouterConfig {\n  /** Default routing strategy */\n  defaultStrategy: RoutingStrategy;\n\n  /** Model-specific overrides */\n  modelOverrides?: Record<\n    string,\n    {\n      strategy?: RoutingStrategy;\n      preferredSource?: InferenceSource;\n      forceLocal?: boolean;\n      forceEdge?: boolean;\n    }\n  >;\n\n  /** Latency thresholds */\n  thresholds?: {\n    /** Max acceptable local latency before switching to edge */\n    maxLocalLatencyMs: number;\n    /** Max acceptable edge latency before switching to cloud */\n    maxEdgeLatencyMs: number;\n    /** Minimum tokens per second for acceptable experience */\n    minTokensPerSecond: number;\n  };\n\n  /** Cost weights for optimization */\n  costWeights?: {\n    /** Weight for edge compute costs */\n    edgeCompute: number;\n    /** Weight for bandwidth costs */\n    bandwidth: number;\n    /** Weight for latency */\n    latency: number;\n  };\n\n  /** Enable adaptive learning */\n  enableAdaptiveLearning?: boolean;\n\n  /** Callback when route decision is made */\n  onRouteDecision?: (decision: RouteDecision) => void;\n}\n\n/**\n * Initialization config for ModelRouter.\n * Includes runtime-detected capabilities and legacy aliases.\n */\nexport interface ModelRouterInitConfig extends Partial<ModelRouterConfig> {\n  /** Device capabilities (optional; can be detected if omitted) */\n  deviceCapabilities?: DeviceCapabilities;\n\n  /** Network experiences override (optional; can be detected if omitted) */\n  networkConditions?: NetworkConditions;\n\n  /** Model capability map keyed by model id */\n  modelCapabilities?: Record<string, ModelCapabilities>;\n\n  /** Legacy alias for defaultStrategy */\n  strategy?: RoutingStrategy;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: Required<\n  Omit<ModelRouterConfig, 'modelOverrides' | 'onRouteDecision'>\n> = {\n  defaultStrategy: 'adaptive',\n  thresholds: {\n    maxLocalLatencyMs: 5000,\n    maxEdgeLatencyMs: 2000,\n    minTokensPerSecond: 5,\n  },\n  costWeights: {\n    edgeCompute: 1.0,\n    bandwidth: 0.5,\n    latency: 1.5,\n  },\n  enableAdaptiveLearning: true,\n};\n\n/**\n * Model Router\n *\n * Makes intelligent routing decisions for model inference.\n */\nexport class ModelRouter {\n  private config: ModelRouterConfig & typeof DEFAULT_CONFIG;\n  private deviceCapabilities: DeviceCapabilities | null = null;\n  private networkConditions: NetworkConditions | null = null;\n  private latencyHistory: Map<InferenceSource, LatencyStats> = new Map();\n  private modelCapabilities: Map<string, ModelCapabilities> = new Map();\n\n  constructor(config: ModelRouterInitConfig = {}) {\n    const defaultStrategy =\n      config.strategy ??\n      config.defaultStrategy ??\n      DEFAULT_CONFIG.defaultStrategy;\n\n    this.config = {\n      ...DEFAULT_CONFIG,\n      ...config,\n      defaultStrategy,\n    };\n    this.initializeLatencyHistory();\n\n    // Initialize device capabilities from config if provided\n    if (config.deviceCapabilities) {\n      this.deviceCapabilities = config.deviceCapabilities;\n    }\n\n    // Initialize network experiences from config if provided\n    if (config.networkConditions) {\n      this.networkConditions = config.networkConditions;\n    }\n\n    // Register model capabilities if provided\n    if (config.modelCapabilities) {\n      for (const [modelId, caps] of Object.entries(config.modelCapabilities)) {\n        this.registerModel(modelId, caps);\n      }\n    }\n\n    // Initialize network experiences if needed\n    if (!this.networkConditions) {\n      this.detectNetworkConditions();\n    }\n  }\n\n  /**\n   * Initialize latency history with defaults\n   */\n  private initializeLatencyHistory(): void {\n    const sources: InferenceSource[] = [\n      'local-wasm',\n      'local-webgpu',\n      'edge',\n      'cloud',\n    ];\n    for (const source of sources) {\n      this.latencyHistory.set(source, {\n        source,\n        avgLatencyMs: this.getDefaultLatency(source),\n        p50Ms: this.getDefaultLatency(source),\n        p95Ms: this.getDefaultLatency(source) * 1.5,\n        p99Ms: this.getDefaultLatency(source) * 2,\n        samples: 0,\n        successRate: 1,\n        avgTokensPerSecond: this.getDefaultTPS(source),\n      });\n    }\n  }\n\n  /**\n   * Get default latency estimate for source\n   */\n  private getDefaultLatency(source: InferenceSource): number {\n    switch (source) {\n      case 'local-webgpu':\n        return 50;\n      case 'local-wasm':\n        return 200;\n      case 'edge':\n        return 100;\n      case 'cloud':\n        return 500;\n    }\n  }\n\n  /**\n   * Get default TPS estimate for source\n   */\n  private getDefaultTPS(source: InferenceSource): number {\n    switch (source) {\n      case 'local-webgpu':\n        return 30;\n      case 'local-wasm':\n        return 5;\n      case 'edge':\n        return 50;\n      case 'cloud':\n        return 100;\n    }\n  }\n\n  /**\n   * Detect device capabilities\n   */\n  async detectDeviceCapabilities(): Promise<DeviceCapabilities> {\n    const capabilities: DeviceCapabilities = {\n      availableMemoryMB: 0,\n      hasWebGPU: false,\n      hasWASMSIMD: false,\n      cpuCores: navigator.hardwareConcurrency || 4,\n      deviceType: 'unknown',\n      computeScore: 0,\n    };\n\n    // Check memory\n    if ('deviceMemory' in navigator) {\n      capabilities.availableMemoryMB =\n        (navigator as Navigator & { deviceMemory: number }).deviceMemory * 1024;\n    } else {\n      // Estimate based on performance memory (Chrome only)\n      const perfMemory = (\n        performance as Performance & { memory?: { jsHeapSizeLimit: number } }\n      ).memory;\n      if (perfMemory) {\n        capabilities.availableMemoryMB =\n          perfMemory.jsHeapSizeLimit / (1024 * 1024);\n      } else {\n        capabilities.availableMemoryMB = 2048; // Conservative default\n      }\n    }\n\n    // Check WebGPU\n    if ('gpu' in navigator) {\n      try {\n        const adapter = await navigator.gpu.requestAdapter();\n        if (adapter) {\n          capabilities.hasWebGPU = true;\n          const limits = adapter.limits;\n          capabilities.webGPULimits = {\n            maxBufferSize: limits.maxBufferSize,\n            maxStorageBufferBindingSize: limits.maxStorageBufferBindingSize,\n            maxComputeWorkgroupSizeX: limits.maxComputeWorkgroupSizeX,\n          };\n        }\n      } catch {\n        capabilities.hasWebGPU = false;\n      }\n    }\n\n    // Check WASM SIMD\n    try {\n      // Simple SIMD detection via feature test\n      capabilities.hasWASMSIMD = await this.detectWASMSIMD();\n    } catch {\n      capabilities.hasWASMSIMD = false;\n    }\n\n    // Detect device type\n    capabilities.deviceType = this.detectDeviceType();\n\n    // Calculate compute score (0-100)\n    capabilities.computeScore = this.calculateComputeScore(capabilities);\n\n    this.deviceCapabilities = capabilities;\n    return capabilities;\n  }\n\n  /**\n   * Detect WASM SIMD support\n   */\n  private async detectWASMSIMD(): Promise<boolean> {\n    // Feature detection via trying to instantiate a module with SIMD\n    const simdBytes = new Uint8Array([\n      0x00,\n      0x61,\n      0x73,\n      0x6d, // magic\n      0x01,\n      0x00,\n      0x00,\n      0x00, // version\n      0x01,\n      0x05,\n      0x01,\n      0x60,\n      0x00,\n      0x01,\n      0x7b, // type section with v128\n      0x03,\n      0x02,\n      0x01,\n      0x00, // function section\n      0x0a,\n      0x0a,\n      0x01,\n      0x08,\n      0x00,\n      0xfd,\n      0x0c,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x0b, // code section\n    ]);\n\n    try {\n      await WebAssembly.compile(simdBytes);\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Detect device type\n   */\n  private detectDeviceType(): 'desktop' | 'mobile' | 'tablet' | 'unknown' {\n    const ua = navigator.userAgent.toLowerCase();\n\n    if (/mobile|android|iphone|ipod/.test(ua)) {\n      return 'mobile';\n    }\n    if (/ipad|tablet/.test(ua)) {\n      return 'tablet';\n    }\n    if (/windows|macintosh|linux/.test(ua)) {\n      return 'desktop';\n    }\n    return 'unknown';\n  }\n\n  /**\n   * Calculate compute score\n   */\n  private calculateComputeScore(capabilities: DeviceCapabilities): number {\n    let score = 0;\n\n    // Memory contribution (max 30 points)\n    score += Math.min(30, (capabilities.availableMemoryMB / 8192) * 30);\n\n    // CPU cores contribution (max 20 points)\n    score += Math.min(20, (capabilities.cpuCores / 16) * 20);\n\n    // WebGPU contribution (30 points)\n    if (capabilities.hasWebGPU) {\n      score += 30;\n    }\n\n    // WASM SIMD contribution (10 points)\n    if (capabilities.hasWASMSIMD) {\n      score += 10;\n    }\n\n    // Device type adjustment\n    if (capabilities.deviceType === 'desktop') {\n      score *= 1.0;\n    } else if (capabilities.deviceType === 'tablet') {\n      score *= 0.7;\n    } else if (capabilities.deviceType === 'mobile') {\n      score *= 0.5;\n    }\n\n    return Math.min(100, Math.max(0, score));\n  }\n\n  /**\n   * Detect network experiences\n   */\n  detectNetworkConditions(): NetworkConditions {\n    const connection = (\n      navigator as Navigator & { connection?: NetworkInformation }\n    ).connection;\n\n    const experiences: NetworkConditions = {\n      effectiveType: 'unknown',\n      bandwidthMbps: 10, // Conservative default\n      rttMs: 100,\n      isOffline: !navigator.onLine,\n      dataSaverEnabled: false,\n    };\n\n    if (connection) {\n      experiences.effectiveType =\n        (connection.effectiveType as NetworkConditions['effectiveType']) ||\n        'unknown';\n      experiences.bandwidthMbps = connection.downlink || 10;\n      experiences.rttMs = connection.rtt || 100;\n      experiences.dataSaverEnabled = connection.saveData || false;\n    }\n\n    this.networkConditions = experiences;\n    return experiences;\n  }\n\n  /**\n   * Register model capabilities\n   */\n  registerModel(modelId: string, capabilities: ModelCapabilities): void {\n    this.modelCapabilities.set(modelId, capabilities);\n  }\n\n  /**\n   * Record latency observation\n   */\n  recordLatency(\n    source: InferenceSource,\n    latencyMs: number,\n    success: boolean,\n    tokensPerSecond?: number\n  ): void {\n    const stats = this.latencyHistory.get(source);\n    if (!stats) return;\n\n    // Exponential moving average\n    const alpha = 0.1;\n    stats.samples++;\n    stats.avgLatencyMs = stats.avgLatencyMs * (1 - alpha) + latencyMs * alpha;\n\n    if (tokensPerSecond !== undefined) {\n      stats.avgTokensPerSecond =\n        stats.avgTokensPerSecond * (1 - alpha) + tokensPerSecond * alpha;\n    }\n\n    // Update success rate\n    const successAlpha = 0.05;\n    stats.successRate =\n      stats.successRate * (1 - successAlpha) + (success ? 1 : 0) * successAlpha;\n\n    // Update percentiles (simplified approximation)\n    if (stats.samples > 10) {\n      stats.p50Ms = stats.avgLatencyMs;\n      stats.p95Ms = stats.avgLatencyMs * 1.5;\n      stats.p99Ms = stats.avgLatencyMs * 2;\n    }\n  }\n\n  /**\n   * Get route decision for a model request\n   */\n  route(\n    modelId: string,\n    options: {\n      preferLatency?: boolean;\n      preferQuality?: boolean;\n      strategy?: RoutingStrategy;\n      maxTokens?: number;\n      streamingRequired?: boolean;\n      qualityPriority?: number; // 0-1, higher = prefer quality\n      latencyPriority?: number; // 0-1, higher = prefer speed\n    } = {}\n  ): RouteDecision | null {\n    this.lastModelId = modelId;\n\n    // Ensure we have device and network info\n    if (!this.deviceCapabilities) {\n      this.detectDeviceCapabilities().catch(() => {\n        /* noop - detection may fail */\n      });\n    }\n    if (!this.networkConditions) {\n      this.detectNetworkConditions();\n    }\n\n    // Handle new preference parameters\n    let strategy = options.strategy;\n    if (!strategy) {\n      if (options.preferLatency) {\n        strategy = 'latency-optimized';\n      } else if (options.preferQuality) {\n        strategy = 'quality-optimized';\n      } else {\n        strategy =\n          this.config.modelOverrides?.[modelId]?.strategy ||\n          this.config.defaultStrategy;\n      }\n    }\n\n    const modelCaps = this.modelCapabilities.get(modelId);\n    const deviceCaps = this.deviceCapabilities;\n    const network = this.networkConditions;\n\n    if (!deviceCaps || !network) {\n      return null;\n    }\n\n    // Check for forced routing\n    const override = this.config.modelOverrides?.[modelId];\n    if (override?.forceLocal) {\n      return this.createDecision(\n        'local-webgpu',\n        [],\n        'Forced local execution',\n        1.0\n      );\n    }\n    if (override?.forceEdge) {\n      return this.createDecision(\n        'edge',\n        ['cloud'],\n        'Forced edge execution',\n        1.0\n      );\n    }\n\n    // If offline, must use local\n    if (network.isOffline) {\n      const localSource = deviceCaps.hasWebGPU ? 'local-webgpu' : 'local-wasm';\n      return this.createDecision(localSource, [], 'Device is offline', 0.9);\n    }\n\n    // Check if model can run locally\n    const canRunLocally = this.canRunLocally(modelId, deviceCaps, modelCaps);\n\n    // Route based on strategy\n    switch (strategy) {\n      case 'local-first':\n        return this.routeLocalFirst(canRunLocally, deviceCaps, network);\n\n      case 'edge-first':\n        return this.routeEdgeFirst(canRunLocally, deviceCaps, network);\n\n      case 'cost-optimized':\n        return this.routeCostOptimized(canRunLocally, deviceCaps, network);\n\n      case 'latency-optimized':\n        return this.routeLatencyOptimized(canRunLocally, deviceCaps, network);\n\n      case 'quality-optimized':\n        return this.routeQualityOptimized(canRunLocally, deviceCaps, network);\n\n      case 'hybrid':\n        return this.routeHybrid(canRunLocally, deviceCaps, network);\n\n      case 'adaptive':\n      default:\n        return this.routeAdaptive(canRunLocally, deviceCaps, network, options);\n    }\n  }\n\n  /**\n   * Async version of route for backward compatibility\n   */\n  async routeAsync(\n    modelId: string,\n    options: {\n      strategy?: RoutingStrategy;\n      maxTokens?: number;\n      streamingRequired?: boolean;\n      qualityPriority?: number;\n      latencyPriority?: number;\n    } = {}\n  ): Promise<RouteDecision> {\n    // Ensure we have device and network info\n    if (!this.deviceCapabilities) {\n      await this.detectDeviceCapabilities();\n    }\n    if (!this.networkConditions) {\n      this.detectNetworkConditions();\n    }\n\n    const result = this.route(modelId, options);\n    if (!result) {\n      throw new Error('Could not determine routing');\n    }\n    return result;\n  }\n\n  /**\n   * Check if model can run locally\n   */\n  private canRunLocally(\n    modelId: string,\n    device: DeviceCapabilities,\n    model?: ModelCapabilities\n  ): { webgpu: boolean; wasm: boolean } {\n    if (!model) {\n      // Unknown model, assume it can run if we have resources\n      return {\n        webgpu: device.hasWebGPU && device.availableMemoryMB > 500,\n        wasm: device.availableMemoryMB > 300,\n      };\n    }\n\n    const hasEnoughMemory = device.availableMemoryMB >= model.minMemoryMB;\n\n    return {\n      webgpu: device.hasWebGPU && hasEnoughMemory && !model.requiresWebGPU,\n      wasm: model.supportsWASM && hasEnoughMemory,\n    };\n  }\n\n  /**\n   * Route with local-first strategy\n   */\n  private routeLocalFirst(\n    canRunLocally: { webgpu: boolean; wasm: boolean },\n    device: DeviceCapabilities,\n    _network: NetworkConditions\n  ): RouteDecision {\n    if (canRunLocally.webgpu) {\n      return this.createDecision(\n        'local-webgpu',\n        ['local-wasm', 'edge', 'cloud'],\n        'Local WebGPU available',\n        0.9\n      );\n    }\n    if (canRunLocally.wasm) {\n      return this.createDecision(\n        'local-wasm',\n        ['edge', 'cloud'],\n        'Local WASM available',\n        0.8\n      );\n    }\n    return this.createDecision(\n      'edge',\n      ['cloud'],\n      'Local execution not available',\n      0.7\n    );\n  }\n\n  /**\n   * Route with edge-first strategy\n   */\n  private routeEdgeFirst(\n    canRunLocally: { webgpu: boolean; wasm: boolean },\n    _device: DeviceCapabilities,\n    network: NetworkConditions\n  ): RouteDecision {\n    // Poor network, fallback to local\n    if (network.rttMs > 500 || network.bandwidthMbps < 1) {\n      if (canRunLocally.webgpu) {\n        return this.createDecision(\n          'local-webgpu',\n          ['local-wasm', 'edge'],\n          'Poor network, using local',\n          0.7\n        );\n      }\n      if (canRunLocally.wasm) {\n        return this.createDecision(\n          'local-wasm',\n          ['edge'],\n          'Poor network, using local WASM',\n          0.6\n        );\n      }\n    }\n\n    const fallbacks: InferenceSource[] = [];\n    if (canRunLocally.webgpu) fallbacks.push('local-webgpu');\n    if (canRunLocally.wasm) fallbacks.push('local-wasm');\n    fallbacks.push('cloud');\n\n    return this.createDecision('edge', fallbacks, 'Edge-first strategy', 0.85);\n  }\n\n  /**\n   * Route with cost optimization\n   */\n  private routeCostOptimized(\n    canRunLocally: { webgpu: boolean; wasm: boolean },\n    _device: DeviceCapabilities,\n    network: NetworkConditions\n  ): RouteDecision {\n    // Prefer local execution (free) when available; otherwise prefer edge (cheap).\n    // Cloud remains an explicit fallback.\n    if (canRunLocally.webgpu) {\n      return this.createDecision(\n        'local-webgpu',\n        ['local-wasm', 'edge', 'cloud'],\n        'Cost optimized: local WebGPU (free)',\n        0.9\n      );\n    }\n\n    if (canRunLocally.wasm) {\n      return this.createDecision(\n        'local-wasm',\n        ['edge', 'cloud'],\n        'Cost optimized: local WASM (free)',\n        0.85\n      );\n    }\n\n    // Poor network can still force cloud last; edge first for privacy/cost.\n    const fallbacks: InferenceSource[] = ['cloud'];\n    if (network.rttMs > 800 || network.bandwidthMbps < 0.5) {\n      fallbacks.unshift('local-wasm');\n    }\n\n    return this.createDecision('edge', fallbacks, 'Cost optimized: edge', 0.75);\n  }\n\n  /**\n   * Route with latency optimization\n   */\n  private routeLatencyOptimized(\n    canRunLocally: { webgpu: boolean; wasm: boolean },\n    device: DeviceCapabilities,\n    network: NetworkConditions\n  ): RouteDecision {\n    const stats = {\n      webgpu: this.latencyHistory.get('local-webgpu')!,\n      wasm: this.latencyHistory.get('local-wasm')!,\n      edge: this.latencyHistory.get('edge')!,\n      cloud: this.latencyHistory.get('cloud')!,\n    };\n\n    // Compare expected latencies\n    const options: Array<{\n      source: InferenceSource;\n      latency: number;\n      available: boolean;\n    }> = [\n      {\n        source: 'local-webgpu',\n        latency: stats.webgpu.avgLatencyMs,\n        available: canRunLocally.webgpu,\n      },\n      {\n        source: 'local-wasm',\n        latency: stats.wasm.avgLatencyMs,\n        available: canRunLocally.wasm,\n      },\n      {\n        source: 'edge',\n        latency: stats.edge.avgLatencyMs + network.rttMs,\n        available: true,\n      },\n      {\n        source: 'cloud',\n        latency: stats.cloud.avgLatencyMs + network.rttMs * 2,\n        available: true,\n      },\n    ];\n\n    // Sort by latency, filter to available\n    const available = options\n      .filter((o) => o.available)\n      .sort((a, b) => a.latency - b.latency);\n\n    const primary = available[0];\n    const fallbacks = available.slice(1).map((o) => o.source);\n\n    return this.createDecision(\n      primary.source,\n      fallbacks,\n      `Latency optimized: ${primary.latency.toFixed(0)}ms expected`,\n      0.85,\n      primary.latency\n    );\n  }\n\n  /**\n   * Route with quality optimization\n   */\n  private routeQualityOptimized(\n    _canRunLocally: { webgpu: boolean; wasm: boolean },\n    _device: DeviceCapabilities,\n    network: NetworkConditions\n  ): RouteDecision {\n    // Prefer cloud for highest quality, then edge\n    if (network.bandwidthMbps > 5 && network.rttMs < 200) {\n      return this.createDecision(\n        'cloud',\n        ['edge'],\n        'Quality optimized: cloud',\n        0.9\n      );\n    }\n    return this.createDecision(\n      'edge',\n      ['cloud'],\n      'Quality optimized: edge',\n      0.85\n    );\n  }\n\n  /**\n   * Route with hybrid mode\n   */\n  private routeHybrid(\n    canRunLocally: { webgpu: boolean; wasm: boolean },\n    _device: DeviceCapabilities,\n    network: NetworkConditions\n  ): RouteDecision {\n    const localSource = canRunLocally.webgpu\n      ? 'local-webgpu'\n      : canRunLocally.wasm\n      ? 'local-wasm'\n      : null;\n\n    if (!localSource) {\n      return this.createDecision(\n        'edge',\n        ['cloud'],\n        'Hybrid not available, using edge',\n        0.7\n      );\n    }\n\n    // Hybrid: generate first tokens locally, then switch to edge\n    const decision = this.createDecision(\n      localSource,\n      ['edge', 'cloud'],\n      'Hybrid mode: local start, edge continuation',\n      0.85\n    );\n\n    decision.hybrid = {\n      localTokens: 10, // Generate 10 tokens locally first\n      switchThreshold: 0.5, // Switch if local TPS drops below 50% of expected\n    };\n\n    return decision;\n  }\n\n  /**\n   * Route adaptively based on all factors\n   */\n  private routeAdaptive(\n    canRunLocally: { webgpu: boolean; wasm: boolean },\n    device: DeviceCapabilities,\n    network: NetworkConditions,\n    options: { qualityPriority?: number; latencyPriority?: number }\n  ): RouteDecision {\n    const qualityWeight = options.qualityPriority ?? 0.5;\n    const latencyWeight = options.latencyPriority ?? 0.5;\n\n    const stats = {\n      webgpu: this.latencyHistory.get('local-webgpu')!,\n      wasm: this.latencyHistory.get('local-wasm')!,\n      edge: this.latencyHistory.get('edge')!,\n      cloud: this.latencyHistory.get('cloud')!,\n    };\n\n    // Score each option\n    const scores: Array<{\n      source: InferenceSource;\n      score: number;\n      available: boolean;\n    }> = [];\n\n    // Local WebGPU\n    if (canRunLocally.webgpu) {\n      const latencyScore = 1 - stats.webgpu.avgLatencyMs / 1000;\n      const qualityScore = 0.8; // Good quality\n      const costScore = 1.0; // Free\n      const reliabilityScore = stats.webgpu.successRate;\n\n      scores.push({\n        source: 'local-webgpu',\n        score:\n          latencyScore * latencyWeight +\n          qualityScore * qualityWeight +\n          costScore * 0.2 +\n          reliabilityScore * 0.1,\n        available: true,\n      });\n    }\n\n    // Local WASM\n    if (canRunLocally.wasm) {\n      const latencyScore = 1 - stats.wasm.avgLatencyMs / 1000;\n      const qualityScore = 0.6;\n      const costScore = 1.0;\n      const reliabilityScore = stats.wasm.successRate;\n\n      scores.push({\n        source: 'local-wasm',\n        score:\n          latencyScore * latencyWeight +\n          qualityScore * qualityWeight +\n          costScore * 0.2 +\n          reliabilityScore * 0.1,\n        available: true,\n      });\n    }\n\n    // Edge\n    const edgeLatency = stats.edge.avgLatencyMs + network.rttMs;\n    const edgeLatencyScore = 1 - edgeLatency / 1000;\n    const edgeQualityScore = 0.9;\n    const edgeCostScore = 0.5;\n    const edgeReliabilityScore = stats.edge.successRate;\n\n    scores.push({\n      source: 'edge',\n      score:\n        edgeLatencyScore * latencyWeight +\n        edgeQualityScore * qualityWeight +\n        edgeCostScore * 0.2 +\n        edgeReliabilityScore * 0.1,\n      available: !network.isOffline,\n    });\n\n    // Cloud\n    const cloudLatency = stats.cloud.avgLatencyMs + network.rttMs * 2;\n    const cloudLatencyScore = 1 - cloudLatency / 1000;\n    const cloudQualityScore = 1.0;\n    const cloudCostScore = 0.2;\n    const cloudReliabilityScore = stats.cloud.successRate;\n\n    scores.push({\n      source: 'cloud',\n      score:\n        cloudLatencyScore * latencyWeight +\n        cloudQualityScore * qualityWeight +\n        cloudCostScore * 0.2 +\n        cloudReliabilityScore * 0.1,\n      available: !network.isOffline,\n    });\n\n    // Sort by score\n    const sorted = scores\n      .filter((s) => s.available)\n      .sort((a, b) => b.score - a.score);\n\n    if (sorted.length === 0) {\n      throw new Error('No inference sources available');\n    }\n\n    const primary = sorted[0];\n    const fallbacks = sorted.slice(1).map((s) => s.source);\n\n    return this.createDecision(\n      primary.source,\n      fallbacks,\n      `Adaptive routing: score ${primary.score.toFixed(2)}`,\n      primary.score\n    );\n  }\n\n  /**\n   * Create route decision\n   */\n  private routingDecisionCount = 0;\n\n  private createDecision(\n    primary: InferenceSource,\n    fallbacks: InferenceSource[],\n    reason: string,\n    confidence: number,\n    estimatedLatencyMs?: number,\n    estimatedCost?: number\n  ): RouteDecision {\n    const stats = this.latencyHistory.get(primary);\n    this.routingDecisionCount++;\n\n    const cost =\n      estimatedCost ??\n      this.estimateCost(this.lastModelId || 'default', primary, 1000);\n    const decision: RouteDecision = {\n      primary,\n      source: primary,\n      fallbacks,\n      reason,\n      confidence,\n      estimatedLatencyMs: estimatedLatencyMs ?? stats?.avgLatencyMs ?? 100,\n      estimatedTPS: stats?.avgTokensPerSecond ?? 10,\n      estimatedCost: cost,\n    };\n\n    this.config.onRouteDecision?.(decision);\n    return decision;\n  }\n\n  private lastModelId: string | null = null;\n\n  /**\n   * Get latency statistics\n   */\n  getLatencyStats(): Map<InferenceSource, LatencyStats> {\n    return new Map(this.latencyHistory);\n  }\n\n  /**\n   * Get device capabilities\n   */\n  getDeviceCapabilities(): DeviceCapabilities | null {\n    return this.deviceCapabilities;\n  }\n\n  /**\n   * Get network experiences\n   */\n  getNetworkConditions(): NetworkConditions | null {\n    return this.networkConditions;\n  }\n\n  /**\n   * Estimate cost for inference on a given source\n   */\n  estimateCost(\n    modelId: string,\n    source: InferenceSource,\n    tokenCount: number\n  ): number {\n    const baseCosts: Record<InferenceSource, number> = {\n      'local-wasm': 0.0,\n      'local-webgpu': 0.0,\n      edge: 0.0001, // Very cheap per token\n      cloud: 0.001, // More expensive\n    };\n\n    const baseRate = baseCosts[source];\n    // Apply multiplier based on model size (use more specific checks first)\n    const modelMultiplier = modelId.includes('mini')\n      ? 0.5\n      : modelId.includes('gpt-4')\n      ? 2.0\n      : 1.0;\n\n    return baseRate * tokenCount * modelMultiplier;\n  }\n\n  /**\n   * Get routing statistics and metrics\n   */\n  getRoutingStats() {\n    const sourceStats: Record<InferenceSource, any> = {\n      'local-wasm': null,\n      'local-webgpu': null,\n      edge: null,\n      cloud: null,\n    };\n\n    for (const [source, latencyStats] of this.latencyHistory) {\n      sourceStats[source] = {\n        avgLatencyMs: latencyStats.avgLatencyMs,\n        p50Ms: latencyStats.p50Ms,\n        p95Ms: latencyStats.p95Ms,\n        p99Ms: latencyStats.p99Ms,\n        avgTokensPerSecond: latencyStats.avgTokensPerSecond,\n        successRate: latencyStats.successRate,\n        samples: latencyStats.samples,\n      };\n    }\n\n    return {\n      totalDecisions: this.routingDecisionCount,\n      sourceStats,\n    };\n  }\n\n  /**\n   * Update device capabilities (for testing and dynamic updates)\n   */\n  updateDeviceCapabilities(capabilities: DeviceCapabilities): void {\n    this.deviceCapabilities = capabilities;\n  }\n\n  /**\n   * Register multiple models at once\n   */\n  registerModels(models: Record<string, ModelCapabilities>): void {\n    for (const [modelId, capabilities] of Object.entries(models)) {\n      this.registerModel(modelId, capabilities);\n    }\n  }\n}\n\n/**\n * Network Information API types\n */\ninterface NetworkInformation {\n  effectiveType?: string;\n  downlink?: number;\n  rtt?: number;\n  saveData?: boolean;\n}\n\n/**\n * Pre-configured routing strategies\n */\nexport const ROUTING_STRATEGIES = {\n  /** Prioritize local execution for privacy */\n  privacy: {\n    defaultStrategy: 'local-first' as RoutingStrategy,\n    thresholds: {\n      maxLocalLatencyMs: 10000,\n      maxEdgeLatencyMs: 5000,\n      minTokensPerSecond: 2,\n    },\n  },\n\n  /** Prioritize speed */\n  performance: {\n    defaultStrategy: 'latency-optimized' as RoutingStrategy,\n    thresholds: {\n      maxLocalLatencyMs: 2000,\n      maxEdgeLatencyMs: 1000,\n      minTokensPerSecond: 20,\n    },\n  },\n\n  /** Minimize costs */\n  economy: {\n    defaultStrategy: 'cost-optimized' as RoutingStrategy,\n    thresholds: {\n      maxLocalLatencyMs: 15000,\n      maxEdgeLatencyMs: 10000,\n      minTokensPerSecond: 1,\n    },\n  },\n\n  /** Balanced approach */\n  balanced: {\n    defaultStrategy: 'adaptive' as RoutingStrategy,\n    thresholds: {\n      maxLocalLatencyMs: 5000,\n      maxEdgeLatencyMs: 2000,\n      minTokensPerSecond: 5,\n    },\n  },\n} as const;\n","/**\n * Edge Inference Adapter (Domain-Agnostic)\n *\n * Unified interface that bridges local inference engines (WebGPU, WASM)\n * with distributed edge workers. Provides seamless fallback and hybrid\n * execution patterns. Fully generic and extensible for any domain.\n *\n * Features:\n * - Domain-agnostic routing and inference\n * - Pluggable context adapters for domain customization\n * - Flexible quality scoring and routing customization\n * - Works with any model, domain, or application\n */\n\nimport type {\n  ModelRouter,\n  RouteDecision,\n  InferenceSource,\n} from './model-router';\nimport type {\n  DistributedClient,\n  DistributedResult,\n  DistributedInferenceOptions,\n} from './distributed-client';\n\n/**\n * Custom context that can be provided for domain-specific behavior\n * This is completely optional and extensible\n */\nexport interface InferenceContext {\n  /** Domain-specific context data */\n  [key: string]: unknown;\n}\n\n/**\n * Inference request options\n */\nexport interface InferenceRequest {\n  /** Input prompt */\n  prompt: string;\n\n  /** System prompt (optional) */\n  systemPrompt?: string;\n\n  /** Model ID to use */\n  modelId?: string;\n\n  /** Maximum tokens to generate */\n  maxTokens?: number;\n\n  /** Temperature for sampling */\n  temperature?: number;\n\n  /** Top-p sampling */\n  topP?: number;\n\n  /** Top-k sampling */\n  topK?: number;\n\n  /** Stop sequences */\n  stopSequences?: string[];\n\n  /** Whether to stream the response */\n  stream?: boolean;\n\n  /** Abort signal for cancellation */\n  signal?: AbortSignal;\n\n  /** Force specific inference source */\n  forceSource?: InferenceSource;\n\n  /** Priority (higher = more important) */\n  priority?: number;\n\n  /** Custom metadata */\n  metadata?: Record<string, unknown>;\n}\n\n/**\n * Inference result\n */\nexport interface InferenceResult {\n  /** Generated text */\n  text: string;\n\n  /** Model used */\n  model: string;\n\n  /** Source used for inference */\n  source: InferenceSource;\n\n  /** Token usage */\n  usage: {\n    promptTokens: number;\n    completionTokens: number;\n    totalTokens: number;\n  };\n\n  /** Timing information */\n  timing: {\n    /** Total time in ms */\n    totalMs: number;\n    /** Time to first token in ms */\n    firstTokenMs: number;\n    /** Tokens per second */\n    tokensPerSecond: number;\n  };\n\n  /** Whether result came from cache */\n  cached: boolean;\n\n  /** Finish reason */\n  finishReason: 'stop' | 'length' | 'content_filter' | 'error';\n\n  /** Original route decision */\n  routeDecision?: RouteDecision;\n}\n\n/**\n * Streaming chunk\n */\nexport interface StreamChunk {\n  /** Token text */\n  text: string;\n\n  /** Token index */\n  index: number;\n\n  /** Source being used */\n  source: InferenceSource;\n\n  /** Whether this is the final chunk */\n  done: boolean;\n\n  /** Cumulative text so far */\n  cumulative?: string;\n\n  /** Finish reason (only on last chunk) */\n  finishReason?: InferenceResult['finishReason'];\n}\n\n/**\n * Local inference engine interface\n */\nexport interface LocalInferenceEngine {\n  /** Engine type */\n  type: 'webgpu' | 'wasm';\n\n  /** Whether engine is initialized */\n  isInitialized(): boolean;\n\n  /** Initialize the engine */\n  initialize(): Promise<void>;\n\n  /** Check if model is loaded */\n  hasModel(modelId: string): boolean;\n\n  /** Load a model */\n  loadModel(modelId: string): Promise<void>;\n\n  /** Unload a model */\n  unloadModel(modelId: string): Promise<void>;\n\n  /** Generate text */\n  generate(request: InferenceRequest): Promise<InferenceResult>;\n\n  /** Stream text generation */\n  stream(\n    request: InferenceRequest\n  ): AsyncGenerator<StreamChunk, InferenceResult>;\n\n  /** Get engine status */\n  getStatus(): {\n    initialized: boolean;\n    loadedModels: string[];\n    memoryUsage: number;\n  };\n}\n\n/**\n * Adapter configuration\n */\nexport interface EdgeInferenceAdapterConfig {\n  /** Model router instance */\n  router: ModelRouter;\n\n  /** Distributed client instance */\n  distributedClient: DistributedClient;\n\n  /** Local WebGPU engine (optional) */\n  webgpuEngine?: LocalInferenceEngine;\n\n  /** Local WASM engine (optional) */\n  wasmEngine?: LocalInferenceEngine;\n\n  /** Default model ID */\n  defaultModel?: string;\n\n  /** Enable caching */\n  enableCache?: boolean;\n\n  /** Cache TTL in ms */\n  cacheTTL?: number;\n\n  /** Maximum retry attempts */\n  maxRetries?: number;\n\n  /** Retry delay in ms */\n  retryDelay?: number;\n\n  /** Enable telemetry */\n  enableTelemetry?: boolean;\n\n  /** Callback on inference complete */\n  onComplete?: (result: InferenceResult) => void;\n\n  /** Callback on error */\n  onError?: (error: Error, source: InferenceSource) => void;\n\n  /** Callback on fallback */\n  onFallback?: (\n    from: InferenceSource,\n    to: InferenceSource,\n    reason: string\n  ) => void;\n\n  /**\n   * Optional custom context for domain-specific behavior\n   * This enables extensibility without modifying the adapter\n   */\n  customContext?: InferenceContext;\n\n  /**\n   * Custom routing decision hook\n   * Allows domains to customize routing based on their needs\n   */\n  customRouting?: (\n    decision: RouteDecision,\n    context?: InferenceContext\n  ) => RouteDecision;\n\n  /**\n   * Custom quality scoring hook\n   * Allows domains to compute quality scores based on their metrics\n   */\n  customQualityScore?: (options: {\n    model: string;\n    source: InferenceSource;\n    context?: InferenceContext;\n  }) => number;\n}\n\n/**\n * Simple LRU cache for inference results\n */\nclass InferenceCache {\n  private cache: Map<string, { result: InferenceResult; timestamp: number }> =\n    new Map();\n  private maxSize: number;\n  private ttl: number;\n\n  constructor(maxSize = 100, ttl = 300000) {\n    this.maxSize = maxSize;\n    this.ttl = ttl;\n  }\n\n  /**\n   * Generate cache key\n   */\n  private key(request: InferenceRequest): string {\n    return JSON.stringify({\n      prompt: request.prompt,\n      systemPrompt: request.systemPrompt,\n      modelId: request.modelId,\n      maxTokens: request.maxTokens,\n      temperature: request.temperature,\n      topP: request.topP,\n      topK: request.topK,\n    });\n  }\n\n  /**\n   * Get cached result\n   */\n  get(request: InferenceRequest): InferenceResult | null {\n    const k = this.key(request);\n    const entry = this.cache.get(k);\n\n    if (!entry) return null;\n\n    // Check TTL\n    if (Date.now() - entry.timestamp > this.ttl) {\n      this.cache.delete(k);\n      return null;\n    }\n\n    // Move to end (LRU)\n    this.cache.delete(k);\n    this.cache.set(k, entry);\n\n    return { ...entry.result, cached: true };\n  }\n\n  /**\n   * Set cached result\n   */\n  set(request: InferenceRequest, result: InferenceResult): void {\n    const k = this.key(request);\n\n    // Evict oldest if at capacity\n    if (this.cache.size >= this.maxSize) {\n      const oldest = this.cache.keys().next().value;\n      if (oldest) this.cache.delete(oldest);\n    }\n\n    this.cache.set(k, {\n      result,\n      timestamp: Date.now(),\n    });\n  }\n\n  /**\n   * Clear cache\n   */\n  clear(): void {\n    this.cache.clear();\n  }\n}\n\n/**\n * Edge Inference Adapter\n *\n * Provides a unified interface for inference that automatically\n * routes between local and distributed execution.\n */\nexport class EdgeInferenceAdapter {\n  private config: EdgeInferenceAdapterConfig;\n  private cache: InferenceCache;\n  private initialized = false;\n  private activeRequests = 0;\n  private totalRequests = 0;\n  private successfulRequests = 0;\n\n  constructor(config: EdgeInferenceAdapterConfig) {\n    this.config = {\n      enableCache: true,\n      cacheTTL: 300000,\n      maxRetries: 3,\n      retryDelay: 1000,\n      enableTelemetry: true,\n      ...config,\n    };\n    this.cache = new InferenceCache(100, this.config.cacheTTL);\n  }\n\n  /**\n   * Initialize the adapter\n   */\n  async initialize(): Promise<void> {\n    if (this.initialized) return;\n\n    // Initialize local engines if available\n    const initPromises: Promise<void>[] = [];\n\n    if (this.config.webgpuEngine && !this.config.webgpuEngine.isInitialized()) {\n      initPromises.push(\n        this.config.webgpuEngine.initialize().catch((err) => {\n          console.warn('WebGPU engine initialization failed:', err);\n        })\n      );\n    }\n\n    if (this.config.wasmEngine && !this.config.wasmEngine.isInitialized()) {\n      initPromises.push(\n        this.config.wasmEngine.initialize().catch((err) => {\n          console.warn('WASM engine initialization failed:', err);\n        })\n      );\n    }\n\n    // Initialize router (detect device capabilities)\n    initPromises.push(\n      (async () => {\n        try {\n          await this.config.router.detectDeviceCapabilities();\n        } catch (err) {\n          console.warn('Device capability detection failed:', err);\n        }\n      })()\n    );\n\n    await Promise.all(initPromises);\n    this.initialized = true;\n  }\n\n  /**\n   * Generate text completion\n   */\n  async generate(request: InferenceRequest): Promise<InferenceResult> {\n    await this.ensureInitialized();\n\n    this.totalRequests++;\n    this.activeRequests++;\n\n    const startTime = performance.now();\n\n    try {\n      // Check cache first\n      if (this.config.enableCache && !request.stream) {\n        const cached = this.cache.get(request);\n        if (cached) {\n          this.activeRequests--;\n          this.successfulRequests++;\n          return cached;\n        }\n      }\n\n      // Get routing decision\n      const routeDecision = await this.config.router.route(\n        request.modelId || this.config.defaultModel || 'default',\n        {\n          strategy: request.forceSource ? undefined : undefined,\n          maxTokens: request.maxTokens,\n          streamingRequired: request.stream,\n        }\n      );\n\n      if (!routeDecision) {\n        throw new Error('Failed to determine inference route');\n      }\n\n      // Try inference with fallbacks\n      const result = await this.executeWithFallback(\n        request,\n        routeDecision,\n        startTime\n      );\n\n      // Cache successful results\n      if (this.config.enableCache && !request.stream) {\n        this.cache.set(request, result);\n      }\n\n      this.successfulRequests++;\n      this.config.onComplete?.(result);\n\n      return result;\n    } catch (error) {\n      this.config.onError?.(\n        error instanceof Error ? error : new Error(String(error)),\n        'edge'\n      );\n      throw error;\n    } finally {\n      this.activeRequests--;\n    }\n  }\n\n  /**\n   * Stream text generation\n   */\n  async *stream(\n    request: InferenceRequest\n  ): AsyncGenerator<StreamChunk, InferenceResult> {\n    await this.ensureInitialized();\n\n    this.totalRequests++;\n    this.activeRequests++;\n\n    const startTime = performance.now();\n    let firstTokenTime: number | null = null;\n    let tokenCount = 0;\n    let cumulativeText = '';\n\n    try {\n      // Get routing decision\n      const routeDecision = await this.config.router.route(\n        request.modelId || this.config.defaultModel || 'default',\n        {\n          maxTokens: request.maxTokens,\n          streamingRequired: true,\n        }\n      );\n\n      if (!routeDecision) {\n        throw new Error('Failed to determine inference route');\n      }\n\n      const source = request.forceSource || routeDecision.primary;\n\n      // Stream from appropriate source\n      const streamGen = this.createStreamGenerator(\n        source,\n        request,\n        routeDecision\n      );\n\n      for await (const chunk of streamGen) {\n        if (firstTokenTime === null) {\n          firstTokenTime = performance.now();\n        }\n        tokenCount++;\n        cumulativeText += chunk.text;\n\n        yield {\n          ...chunk,\n          index: tokenCount - 1,\n          source,\n          cumulative: cumulativeText,\n        };\n\n        if (chunk.done) {\n          break;\n        }\n      }\n\n      const endTime = performance.now();\n      const totalMs = endTime - startTime;\n\n      const result: InferenceResult = {\n        text: cumulativeText,\n        model: request.modelId || this.config.defaultModel || 'default',\n        source,\n        usage: {\n          promptTokens: this.estimateTokens(request.prompt),\n          completionTokens: tokenCount,\n          totalTokens: this.estimateTokens(request.prompt) + tokenCount,\n        },\n        timing: {\n          totalMs,\n          firstTokenMs: firstTokenTime ? firstTokenTime - startTime : totalMs,\n          tokensPerSecond: tokenCount / (totalMs / 1000),\n        },\n        cached: false,\n        finishReason: 'stop',\n        routeDecision: routeDecision || undefined,\n      };\n\n      // Record latency for router learning\n      this.config.router.recordLatency(\n        source,\n        totalMs,\n        true,\n        result.timing.tokensPerSecond\n      );\n\n      this.successfulRequests++;\n      this.config.onComplete?.(result);\n\n      return result;\n    } catch (error) {\n      this.config.onError?.(\n        error instanceof Error ? error : new Error(String(error)),\n        'edge'\n      );\n      throw error;\n    } finally {\n      this.activeRequests--;\n    }\n  }\n\n  /**\n   * Execute inference with fallback chain\n   */\n  private async executeWithFallback(\n    request: InferenceRequest,\n    decision: RouteDecision,\n    startTime: number\n  ): Promise<InferenceResult> {\n    const sources = [decision.primary, ...decision.fallbacks];\n    let lastError: Error | null = null;\n\n    for (const source of sources) {\n      if (request.forceSource && source !== request.forceSource) {\n        continue;\n      }\n\n      for (\n        let attempt = 0;\n        attempt < (this.config.maxRetries || 3);\n        attempt++\n      ) {\n        try {\n          const result = await this.executeOnSource(\n            source,\n            request,\n            decision,\n            startTime\n          );\n\n          // Record success\n          this.config.router.recordLatency(\n            source,\n            result.timing.totalMs,\n            true,\n            result.timing.tokensPerSecond\n          );\n\n          return result;\n        } catch (error) {\n          lastError = error instanceof Error ? error : new Error(String(error));\n\n          // Record unmet expectations\n          this.config.router.recordLatency(\n            source,\n            performance.now() - startTime,\n            false\n          );\n\n          // Wait before retry\n          if (attempt < (this.config.maxRetries || 3) - 1) {\n            await this.delay((this.config.retryDelay || 1000) * (attempt + 1));\n          }\n        }\n      }\n\n      // Notify fallback\n      if (sources.indexOf(source) < sources.length - 1) {\n        const nextSource = sources[sources.indexOf(source) + 1];\n        this.config.onFallback?.(\n          source,\n          nextSource,\n          lastError?.message || 'Unknown error'\n        );\n      }\n    }\n\n    throw lastError || new Error('All inference sources failed');\n  }\n\n  /**\n   * Execute on specific source\n   */\n  private async executeOnSource(\n    source: InferenceSource,\n    request: InferenceRequest,\n    decision: RouteDecision,\n    startTime: number\n  ): Promise<InferenceResult> {\n    switch (source) {\n      case 'local-webgpu':\n        return this.executeLocal(\n          this.config.webgpuEngine,\n          request,\n          decision,\n          startTime\n        );\n\n      case 'local-wasm':\n        return this.executeLocal(\n          this.config.wasmEngine,\n          request,\n          decision,\n          startTime\n        );\n\n      case 'edge':\n        return this.executeDistributed(request, decision, startTime);\n\n      case 'cloud':\n        return this.executeCloud(request, decision, startTime);\n\n      default:\n        throw new Error(`Unknown inference source: ${source}`);\n    }\n  }\n\n  /**\n   * Execute on local engine\n   */\n  private async executeLocal(\n    engine: LocalInferenceEngine | undefined,\n    request: InferenceRequest,\n    decision: RouteDecision,\n    startTime: number\n  ): Promise<InferenceResult> {\n    if (!engine) {\n      throw new Error('Local engine not available');\n    }\n\n    if (!engine.isInitialized()) {\n      await engine.initialize();\n    }\n\n    const modelId = request.modelId || this.config.defaultModel || 'default';\n    if (!engine.hasModel(modelId)) {\n      await engine.loadModel(modelId);\n    }\n\n    const result = await engine.generate(request);\n    result.routeDecision = decision;\n\n    return result;\n  }\n\n  /**\n   * Execute on distributed edge workers\n   */\n  private async executeDistributed(\n    request: InferenceRequest,\n    decision: RouteDecision,\n    startTime: number\n  ): Promise<InferenceResult> {\n    const options: DistributedInferenceOptions = {\n      maxTokens: request.maxTokens || 256,\n      temperature: request.temperature,\n      topP: request.topP,\n      topK: request.topK,\n      stopSequences: request.stopSequences,\n      priority: request.priority,\n    };\n\n    const distResult = await this.config.distributedClient.generate(\n      request.prompt,\n      options\n    );\n\n    const endTime = performance.now();\n    const totalMs = endTime - startTime;\n\n    return this.convertDistributedResult(\n      distResult,\n      request,\n      decision,\n      totalMs\n    );\n  }\n\n  /**\n   * Execute on cloud (OpenAI-compatible endpoint)\n   */\n  private async executeCloud(\n    request: InferenceRequest,\n    decision: RouteDecision,\n    startTime: number\n  ): Promise<InferenceResult> {\n    // For now, delegate to distributed client which can route to cloud\n    return this.executeDistributed(request, decision, startTime);\n  }\n\n  /**\n   * Convert distributed result to adapter result\n   */\n  private convertDistributedResult(\n    distResult: DistributedResult,\n    request: InferenceRequest,\n    decision: RouteDecision,\n    totalMs: number\n  ): InferenceResult {\n    return {\n      text: distResult.text,\n      model: request.modelId || this.config.defaultModel || 'default',\n      source: 'edge',\n      usage: {\n        promptTokens: distResult.stats.promptTokens,\n        completionTokens: distResult.stats.completionTokens,\n        totalTokens: distResult.stats.totalTokens,\n      },\n      timing: {\n        totalMs,\n        firstTokenMs: distResult.stats.firstTokenLatencyMs,\n        tokensPerSecond: distResult.stats.tokensPerSecond,\n      },\n      cached: distResult.cache?.kvCacheHit || false,\n      finishReason: 'stop',\n      routeDecision: decision,\n    };\n  }\n\n  /**\n   * Create stream generator for source\n   */\n  private async *createStreamGenerator(\n    source: InferenceSource,\n    request: InferenceRequest,\n    decision: RouteDecision\n  ): AsyncGenerator<StreamChunk> {\n    switch (source) {\n      case 'local-webgpu':\n      case 'local-wasm': {\n        const engine =\n          source === 'local-webgpu'\n            ? this.config.webgpuEngine\n            : this.config.wasmEngine;\n\n        if (!engine) {\n          throw new Error(`${source} engine not available`);\n        }\n\n        const streamGen = engine.stream(request);\n        for await (const chunk of streamGen) {\n          yield chunk;\n        }\n        break;\n      }\n\n      case 'edge':\n      case 'cloud': {\n        const options: DistributedInferenceOptions = {\n          maxTokens: request.maxTokens || 256,\n          temperature: request.temperature,\n          topP: request.topP,\n          topK: request.topK,\n          stopSequences: request.stopSequences,\n          priority: request.priority,\n        };\n\n        const streamGen = this.config.distributedClient.stream(\n          request.prompt,\n          options\n        );\n        let index = 0;\n\n        for await (const text of streamGen) {\n          yield {\n            text,\n            index: index++,\n            source,\n            done: false,\n          };\n        }\n\n        yield {\n          text: '',\n          index,\n          source,\n          done: true,\n          finishReason: 'stop',\n        };\n        break;\n      }\n    }\n  }\n\n  /**\n   * Estimate token count (simple approximation)\n   */\n  private estimateTokens(text: string): number {\n    // Rough estimate: ~4 chars per token for English\n    return Math.ceil(text.length / 4);\n  }\n\n  /**\n   * Delay helper\n   */\n  private delay(ms: number): Promise<void> {\n    return new Promise((resolve) => setTimeout(resolve, ms));\n  }\n\n  /**\n   * Ensure adapter is initialized\n   */\n  private async ensureInitialized(): Promise<void> {\n    if (!this.initialized) {\n      await this.initialize();\n    }\n  }\n\n  /**\n   * Get adapter statistics\n   */\n  getStats(): {\n    initialized: boolean;\n    activeRequests: number;\n    totalRequests: number;\n    successRate: number;\n    localEngines: {\n      webgpu: boolean;\n      wasm: boolean;\n    };\n  } {\n    return {\n      initialized: this.initialized,\n      activeRequests: this.activeRequests,\n      totalRequests: this.totalRequests,\n      successRate:\n        this.totalRequests > 0\n          ? this.successfulRequests / this.totalRequests\n          : 1,\n      localEngines: {\n        webgpu: this.config.webgpuEngine?.isInitialized() || false,\n        wasm: this.config.wasmEngine?.isInitialized() || false,\n      },\n    };\n  }\n\n  /**\n   * Clear cache\n   */\n  clearCache(): void {\n    this.cache.clear();\n  }\n\n  /**\n   * Get router\n   */\n  getRouter(): ModelRouter {\n    return this.config.router;\n  }\n\n  /**\n   * Get distributed client\n   */\n  getDistributedClient(): DistributedClient {\n    return this.config.distributedClient;\n  }\n\n  /**\n   * Get optimal route for a model based on current context\n   * Uses custom routing hook if provided, otherwise default routing\n   */\n  getRoute(modelId: string): RouteDecision {\n    const route = this.config.router.route(modelId, {}) || {\n      primary: 'edge',\n      source: 'edge',\n      fallbacks: ['local-wasm', 'cloud'],\n      reason: 'Default fallback',\n      confidence: 0.8,\n      estimatedLatencyMs: 1000,\n      estimatedTPS: 10,\n      estimatedCost: 0.001,\n    };\n\n    // Apply custom routing if provided\n    if (this.config.customRouting) {\n      return this.config.customRouting(route, this.config.customContext);\n    }\n\n    return route;\n  }\n\n  /**\n   * Get optimal configuration for a model\n   */\n  getOptimalConfig(\n    modelId: string,\n    options?: { quality?: 'low' | 'balanced' | 'high' }\n  ): Record<string, unknown> {\n    const quality = options?.quality || 'balanced';\n    const quantizationMap = {\n      low: 'int4',\n      balanced: 'int8',\n      high: 'fp16',\n    };\n\n    return {\n      modelId,\n      quantization: quantizationMap[quality],\n      useSpeculativeDecoding: quality !== 'low',\n      usePersistentCache: quality === 'high',\n      useAdapterComposition: quality === 'high',\n      quality,\n    };\n  }\n\n  /**\n   * Get quality score for a routing decision\n   * Uses custom quality scoring if provided, otherwise generic scoring\n   */\n  getQualityScore(options: {\n    model: string;\n    source: InferenceSource;\n    context?: InferenceContext;\n  }): number {\n    // Use custom quality scorer if provided\n    if (this.config.customQualityScore) {\n      return this.config.customQualityScore({\n        model: options.model,\n        source: options.source,\n        context: options.context || this.config.customContext,\n      });\n    }\n\n    // Generic quality scoring\n    let score = 0.8;\n\n    // Source quality\n    const sourceQuality: Record<InferenceSource, number> = {\n      'local-webgpu': 0.95,\n      'local-wasm': 0.85,\n      edge: 0.9,\n      cloud: 1.0,\n    };\n    score *= sourceQuality[options.source] || 0.8;\n\n    // Model quality (model-agnostic)\n    const modelSize = options.model.toLowerCase();\n    if (modelSize.includes('large') || modelSize.includes('4o')) score *= 1.0;\n    if (modelSize.includes('medium') || modelSize.includes('flash'))\n      score *= 0.95;\n    if (modelSize.includes('small') || modelSize.includes('mini')) score *= 0.8;\n\n    return Math.max(0, Math.min(1, score));\n  }\n\n  /**\n   * Get hybrid inference options\n   */\n  getHybridOptions(options: {\n    model: string;\n    quality?: 'low' | 'balanced' | 'high';\n  }): Record<string, unknown> {\n    const quality = options.quality || 'balanced';\n\n    return {\n      source: quality === 'high' ? 'edge' : 'local-wasm',\n      useCache: true,\n      useCompression: quality !== 'high',\n      compressionFormat: 'brotli',\n      enableTelemetry: true,\n      retryOnFailure: true,\n    };\n  }\n\n  /**\n   * Set custom context for domain-specific behavior\n   * For example: emotional context, user preferences, domain metrics\n   */\n  setContext(context: InferenceContext): void {\n    this.config.customContext = context;\n  }\n\n  /**\n   * Get current context\n   */\n  getContext(): InferenceContext | undefined {\n    return this.config.customContext;\n  }\n\n  /**\n   * Update context (backwards compatible alias)\n   * @deprecated Use setContext() instead\n   */\n  setEmotionContext(_context: unknown): void;\n  setEmotionContext(_emotion: { category: string; intensity: number }): void;\n  setEmotionContext(context: unknown): void {\n    this.setContext(context as InferenceContext);\n  }\n}\n\n/**\n * Create adapter with default configuration\n */\nexport function createEdgeInferenceAdapter(\n  router: ModelRouter,\n  distributedClient: DistributedClient,\n  options?: Partial<EdgeInferenceAdapterConfig>\n): EdgeInferenceAdapter {\n  return new EdgeInferenceAdapter({\n    router,\n    distributedClient,\n    ...options,\n  });\n}\n","/**\n * Streaming Client\n *\n * Enhanced streaming client with advanced features:\n * - Backpressure handling\n * - Automatic reconnection\n * - Token buffering\n * - Stream merging (for hybrid mode)\n * - Quality of Service guarantees\n */\n\n/**\n * Stream configuration\n */\nexport interface StreamConfig {\n  /** Buffer size for tokens */\n  bufferSize?: number;\n\n  /** Enable backpressure handling */\n  enableBackpressure?: boolean;\n\n  /** High water mark for backpressure (pause threshold) */\n  highWaterMark?: number;\n\n  /** Low water mark for backpressure (resume threshold) */\n  lowWaterMark?: number;\n\n  /** Enable automatic reconnection */\n  autoReconnect?: boolean;\n\n  /** Maximum reconnection attempts */\n  maxReconnectAttempts?: number;\n\n  /** Reconnection delay in ms */\n  reconnectDelay?: number;\n\n  /** Timeout for stream inactivity */\n  inactivityTimeout?: number;\n\n  /** Enable stream merging for hybrid mode */\n  enableMerging?: boolean;\n}\n\n/**\n * Stream state\n */\nexport type StreamState =\n  | 'connecting'\n  | 'open'\n  | 'paused'\n  | 'resuming'\n  | 'closing'\n  | 'closed'\n  | 'error'\n  | 'reconnecting';\n\n/**\n * Stream event\n */\nexport interface StreamEvent {\n  type: 'token' | 'done' | 'error' | 'state' | 'stats';\n  timestamp: number;\n  data: unknown;\n}\n\n/**\n * Token event\n */\nexport interface TokenEvent {\n  /** Token text */\n  token: string;\n\n  /** Token index */\n  index: number;\n\n  /** Latency since last token */\n  latencyMs: number;\n\n  /** Source of the token */\n  source: 'local' | 'edge' | 'cloud';\n\n  /** Logprob if available */\n  logprob?: number;\n}\n\n/**\n * Stream statistics\n */\nexport interface StreamStats {\n  /** Total tokens received */\n  tokenCount: number;\n\n  /** Total characters received */\n  charCount: number;\n\n  /** Tokens per second */\n  tokensPerSecond: number;\n\n  /** Characters per second */\n  charsPerSecond: number;\n\n  /** Average token latency */\n  avgTokenLatencyMs: number;\n\n  /** Time to first token */\n  firstTokenLatencyMs: number;\n\n  /** Total stream duration */\n  durationMs: number;\n\n  /** Reconnection count */\n  reconnectCount: number;\n\n  /** Paused count (backpressure) */\n  pausedCount: number;\n\n  /** Buffer utilization (0-1) */\n  bufferUtilization: number;\n}\n\n/**\n * Stream controller for flow control\n */\nexport interface StreamController {\n  /** Pause the stream */\n  pause(): void;\n\n  /** Resume the stream */\n  resume(): void;\n\n  /** Cancel the stream */\n  cancel(): void;\n\n  /** Get current state */\n  getState(): StreamState;\n\n  /** Get statistics */\n  getStats(): StreamStats;\n\n  /** Check if stream is active */\n  isActive(): boolean;\n}\n\n/**\n * Stream observer callbacks\n */\nexport interface StreamObserver {\n  /** Called for each token */\n  onToken?: (event: TokenEvent) => void;\n\n  /** Called when stream completes */\n  onComplete?: (stats: StreamStats) => void;\n\n  /** Called on error */\n  onError?: (error: Error) => void;\n\n  /** Called on state change */\n  onStateChange?: (state: StreamState, previousState: StreamState) => void;\n\n  /** Called on reconnection */\n  onReconnect?: (attempt: number) => void;\n\n  /** Called when backpressure activates */\n  onBackpressure?: (paused: boolean) => void;\n}\n\n/**\n * Token buffer for managing stream flow\n */\nclass TokenBuffer {\n  private buffer: TokenEvent[] = [];\n  private highWaterMark: number;\n  private lowWaterMark: number;\n  private isPaused = false;\n  private onPause?: () => void;\n  private onResume?: () => void;\n\n  constructor(\n    highWaterMark: number,\n    lowWaterMark: number,\n    onPause?: () => void,\n    onResume?: () => void\n  ) {\n    this.highWaterMark = highWaterMark;\n    this.lowWaterMark = lowWaterMark;\n    this.onPause = onPause;\n    this.onResume = onResume;\n  }\n\n  /**\n   * Add token to buffer\n   */\n  push(token: TokenEvent): boolean {\n    this.buffer.push(token);\n\n    if (!this.isPaused && this.buffer.length >= this.highWaterMark) {\n      this.isPaused = true;\n      this.onPause?.();\n      return false; // Indicates backpressure\n    }\n\n    return true;\n  }\n\n  /**\n   * Remove and return next token\n   */\n  shift(): TokenEvent | undefined {\n    const token = this.buffer.shift();\n\n    if (this.isPaused && this.buffer.length <= this.lowWaterMark) {\n      this.isPaused = false;\n      this.onResume?.();\n    }\n\n    return token;\n  }\n\n  /**\n   * Check if buffer is empty\n   */\n  isEmpty(): boolean {\n    return this.buffer.length === 0;\n  }\n\n  /**\n   * Get buffer size\n   */\n  size(): number {\n    return this.buffer.length;\n  }\n\n  /**\n   * Get buffer utilization\n   */\n  utilization(): number {\n    return this.buffer.length / this.highWaterMark;\n  }\n\n  /**\n   * Check if paused due to backpressure\n   */\n  paused(): boolean {\n    return this.isPaused;\n  }\n\n  /**\n   * Clear buffer\n   */\n  clear(): void {\n    this.buffer = [];\n    this.isPaused = false;\n  }\n}\n\n/**\n * Default stream configuration\n */\nconst DEFAULT_CONFIG: Required<StreamConfig> = {\n  bufferSize: 100,\n  enableBackpressure: true,\n  highWaterMark: 80,\n  lowWaterMark: 20,\n  autoReconnect: true,\n  maxReconnectAttempts: 3,\n  reconnectDelay: 1000,\n  inactivityTimeout: 30000,\n  enableMerging: false,\n};\n\n/**\n * Streaming Client\n *\n * Provides enhanced streaming with backpressure, reconnection,\n * and quality guarantees.\n */\nexport class StreamingClient {\n  private config: Required<StreamConfig>;\n  private state: StreamState = 'closed';\n  private buffer: TokenBuffer;\n  private stats: StreamStats;\n  private reconnectAttempts = 0;\n  private inactivityTimer: ReturnType<typeof setTimeout> | null = null;\n  private lastTokenTime = 0;\n  private abortController: AbortController | null = null;\n\n  constructor(config: StreamConfig = {}) {\n    this.config = { ...DEFAULT_CONFIG, ...config };\n    this.buffer = new TokenBuffer(\n      this.config.highWaterMark,\n      this.config.lowWaterMark,\n      () => this.handleBackpressure(true),\n      () => this.handleBackpressure(false)\n    );\n    this.stats = this.createEmptyStats();\n  }\n\n  /**\n   * Create empty stats object\n   */\n  private createEmptyStats(): StreamStats {\n    return {\n      tokenCount: 0,\n      charCount: 0,\n      tokensPerSecond: 0,\n      charsPerSecond: 0,\n      avgTokenLatencyMs: 0,\n      firstTokenLatencyMs: 0,\n      durationMs: 0,\n      reconnectCount: 0,\n      pausedCount: 0,\n      bufferUtilization: 0,\n    };\n  }\n\n  /**\n   * Stream from a source\n   */\n  async stream(\n    source: AsyncGenerator<string> | ReadableStream<string>,\n    observer: StreamObserver\n  ): Promise<StreamController> {\n    this.reset();\n    this.abortController = new AbortController();\n\n    const startTime = performance.now();\n    let firstTokenReceived = false;\n    let totalLatency = 0;\n    let previousTokenTime = startTime;\n\n    const updateState = (newState: StreamState) => {\n      const previous = this.state;\n      this.state = newState;\n      observer.onStateChange?.(newState, previous);\n    };\n\n    updateState('connecting');\n\n    // Convert source to async generator if needed\n    const generator = this.toAsyncGenerator(source);\n\n    // Start processing\n    const processStream = async () => {\n      updateState('open');\n\n      try {\n        for await (const text of generator) {\n          // Check for cancellation\n          if (this.abortController?.signal.aborted) {\n            break;\n          }\n\n          const now = performance.now();\n          const latencyMs = now - previousTokenTime;\n          previousTokenTime = now;\n\n          if (!firstTokenReceived) {\n            firstTokenReceived = true;\n            this.stats.firstTokenLatencyMs = now - startTime;\n          }\n\n          totalLatency += latencyMs;\n\n          const tokenEvent: TokenEvent = {\n            token: text,\n            index: this.stats.tokenCount,\n            latencyMs,\n            source: 'edge', // Will be set by caller\n          };\n\n          this.stats.tokenCount++;\n          this.stats.charCount += text.length;\n\n          // Add to buffer\n          if (this.config.enableBackpressure) {\n            const accepted = this.buffer.push(tokenEvent);\n            if (!accepted && this.state !== 'paused') {\n              updateState('paused');\n              this.stats.pausedCount++;\n            }\n          }\n\n          // Notify observer\n          observer.onToken?.(tokenEvent);\n\n          // Reset inactivity timer\n          this.resetInactivityTimer(observer);\n\n          // Update stats\n          const elapsed = now - startTime;\n          this.stats.durationMs = elapsed;\n          this.stats.tokensPerSecond = this.stats.tokenCount / (elapsed / 1000);\n          this.stats.charsPerSecond = this.stats.charCount / (elapsed / 1000);\n          this.stats.avgTokenLatencyMs = totalLatency / this.stats.tokenCount;\n          this.stats.bufferUtilization = this.buffer.utilization();\n        }\n\n        // Stream completed\n        updateState('closed');\n        this.clearInactivityTimer();\n        observer.onComplete?.(this.stats);\n      } catch (error) {\n        // Handle error and potentially reconnect\n        updateState('error');\n        this.clearInactivityTimer();\n\n        if (\n          this.config.autoReconnect &&\n          this.reconnectAttempts < this.config.maxReconnectAttempts\n        ) {\n          await this.attemptReconnect(observer);\n        } else {\n          observer.onError?.(\n            error instanceof Error ? error : new Error(String(error))\n          );\n        }\n      }\n    };\n\n    // Start processing in background\n    processStream();\n\n    // Return controller\n    return this.createController(observer);\n  }\n\n  /**\n   * Stream from WebSocket\n   */\n  async streamFromWebSocket(\n    ws: WebSocket,\n    observer: StreamObserver\n  ): Promise<StreamController> {\n    this.reset();\n    this.abortController = new AbortController();\n\n    const startTime = performance.now();\n    let firstTokenReceived = false;\n    let totalLatency = 0;\n    let previousTokenTime = startTime;\n\n    const updateState = (newState: StreamState) => {\n      const previous = this.state;\n      this.state = newState;\n      observer.onStateChange?.(newState, previous);\n    };\n\n    return new Promise((resolve, reject) => {\n      updateState('connecting');\n\n      ws.onopen = () => {\n        updateState('open');\n      };\n\n      ws.onmessage = (event) => {\n        if (this.abortController?.signal.aborted) {\n          ws.close();\n          return;\n        }\n\n        const now = performance.now();\n        const latencyMs = now - previousTokenTime;\n        previousTokenTime = now;\n\n        if (!firstTokenReceived) {\n          firstTokenReceived = true;\n          this.stats.firstTokenLatencyMs = now - startTime;\n        }\n\n        totalLatency += latencyMs;\n\n        let text: string;\n        try {\n          const data = JSON.parse(event.data);\n          if (data.done) {\n            updateState('closed');\n            this.clearInactivityTimer();\n            ws.close();\n            observer.onComplete?.(this.stats);\n            return;\n          }\n          text = data.token || data.text || '';\n        } catch {\n          text = event.data;\n        }\n\n        const tokenEvent: TokenEvent = {\n          token: text,\n          index: this.stats.tokenCount,\n          latencyMs,\n          source: 'edge',\n        };\n\n        this.stats.tokenCount++;\n        this.stats.charCount += text.length;\n\n        if (this.config.enableBackpressure) {\n          const accepted = this.buffer.push(tokenEvent);\n          if (!accepted && this.state !== 'paused') {\n            updateState('paused');\n            this.stats.pausedCount++;\n          }\n        }\n\n        observer.onToken?.(tokenEvent);\n        this.resetInactivityTimer(observer);\n\n        const elapsed = now - startTime;\n        this.stats.durationMs = elapsed;\n        this.stats.tokensPerSecond = this.stats.tokenCount / (elapsed / 1000);\n        this.stats.charsPerSecond = this.stats.charCount / (elapsed / 1000);\n        this.stats.avgTokenLatencyMs = totalLatency / this.stats.tokenCount;\n        this.stats.bufferUtilization = this.buffer.utilization();\n      };\n\n      ws.onerror = (error) => {\n        updateState('error');\n        this.clearInactivityTimer();\n        observer.onError?.(new Error('WebSocket error'));\n      };\n\n      ws.onclose = () => {\n        if (this.state !== 'closed') {\n          updateState('closed');\n          this.clearInactivityTimer();\n          observer.onComplete?.(this.stats);\n        }\n      };\n\n      // Resolve with controller immediately\n      resolve(this.createController(observer));\n    });\n  }\n\n  /**\n   * Stream from Server-Sent Events\n   */\n  async streamFromSSE(\n    url: string,\n    observer: StreamObserver,\n    options?: RequestInit\n  ): Promise<StreamController> {\n    this.reset();\n    this.abortController = new AbortController();\n\n    const startTime = performance.now();\n    let firstTokenReceived = false;\n    let totalLatency = 0;\n    let previousTokenTime = startTime;\n\n    const updateState = (newState: StreamState) => {\n      const previous = this.state;\n      this.state = newState;\n      observer.onStateChange?.(newState, previous);\n    };\n\n    updateState('connecting');\n\n    try {\n      const response = await fetch(url, {\n        ...options,\n        signal: this.abortController.signal,\n        headers: {\n          ...options?.headers,\n          Accept: 'text/event-stream',\n        },\n      });\n\n      if (!response.ok) {\n        throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n      }\n\n      const reader = response.body?.getReader();\n      if (!reader) {\n        throw new Error('Response body not readable');\n      }\n\n      updateState('open');\n      const decoder = new TextDecoder();\n      let buffer = '';\n\n      const processChunks = async () => {\n        try {\n          while (true) {\n            const { done, value } = await reader.read();\n\n            if (done || this.abortController?.signal.aborted) {\n              break;\n            }\n\n            buffer += decoder.decode(value, { stream: true });\n            const lines = buffer.split('\\n');\n            buffer = lines.pop() || '';\n\n            for (const line of lines) {\n              if (line.startsWith('data: ')) {\n                const data = line.slice(6);\n\n                if (data === '[DONE]') {\n                  updateState('closed');\n                  this.clearInactivityTimer();\n                  observer.onComplete?.(this.stats);\n                  return;\n                }\n\n                const now = performance.now();\n                const latencyMs = now - previousTokenTime;\n                previousTokenTime = now;\n\n                if (!firstTokenReceived) {\n                  firstTokenReceived = true;\n                  this.stats.firstTokenLatencyMs = now - startTime;\n                }\n\n                totalLatency += latencyMs;\n\n                let text: string;\n                try {\n                  const parsed = JSON.parse(data);\n                  text =\n                    parsed.token ||\n                    parsed.text ||\n                    parsed.choices?.[0]?.delta?.content ||\n                    '';\n                } catch {\n                  text = data;\n                }\n\n                if (text) {\n                  const tokenEvent: TokenEvent = {\n                    token: text,\n                    index: this.stats.tokenCount,\n                    latencyMs,\n                    source: 'edge',\n                  };\n\n                  this.stats.tokenCount++;\n                  this.stats.charCount += text.length;\n\n                  if (this.config.enableBackpressure) {\n                    const accepted = this.buffer.push(tokenEvent);\n                    if (!accepted && this.state !== 'paused') {\n                      updateState('paused');\n                      this.stats.pausedCount++;\n                    }\n                  }\n\n                  observer.onToken?.(tokenEvent);\n                  this.resetInactivityTimer(observer);\n\n                  const elapsed = now - startTime;\n                  this.stats.durationMs = elapsed;\n                  this.stats.tokensPerSecond =\n                    this.stats.tokenCount / (elapsed / 1000);\n                  this.stats.charsPerSecond =\n                    this.stats.charCount / (elapsed / 1000);\n                  this.stats.avgTokenLatencyMs =\n                    totalLatency / this.stats.tokenCount;\n                  this.stats.bufferUtilization = this.buffer.utilization();\n                }\n              }\n            }\n          }\n\n          updateState('closed');\n          this.clearInactivityTimer();\n          observer.onComplete?.(this.stats);\n        } catch (error) {\n          if (error instanceof Error && error.name === 'AbortError') {\n            updateState('closed');\n          } else {\n            updateState('error');\n            observer.onError?.(\n              error instanceof Error ? error : new Error(String(error))\n            );\n          }\n          this.clearInactivityTimer();\n        }\n      };\n\n      processChunks();\n      return this.createController(observer);\n    } catch (error) {\n      updateState('error');\n      observer.onError?.(\n        error instanceof Error ? error : new Error(String(error))\n      );\n      throw error;\n    }\n  }\n\n  /**\n   * Merge multiple streams (for hybrid mode)\n   */\n  async *mergeStreams(\n    streams: AsyncGenerator<TokenEvent>[]\n  ): AsyncGenerator<TokenEvent> {\n    if (!this.config.enableMerging) {\n      // Just yield from first stream\n      yield* streams[0];\n      return;\n    }\n\n    // Create promise race for all streams\n    const iterators = streams.map((stream) => stream[Symbol.asyncIterator]());\n    const pending = new Map<\n      number,\n      Promise<{ index: number; result: IteratorResult<TokenEvent> }>\n    >();\n\n    // Initialize all streams\n    for (let i = 0; i < iterators.length; i++) {\n      pending.set(i, this.wrapNext(iterators[i], i));\n    }\n\n    while (pending.size > 0) {\n      const { index, result } = await Promise.race(pending.values());\n\n      if (result.done) {\n        pending.delete(index);\n      } else {\n        yield result.value;\n        pending.set(index, this.wrapNext(iterators[index], index));\n      }\n    }\n  }\n\n  /**\n   * Wrap iterator.next() with index\n   */\n  private async wrapNext(\n    iterator: AsyncIterator<TokenEvent>,\n    index: number\n  ): Promise<{ index: number; result: IteratorResult<TokenEvent> }> {\n    const result = await iterator.next();\n    return { index, result };\n  }\n\n  /**\n   * Convert source to async generator\n   */\n  private async *toAsyncGenerator(\n    source: AsyncGenerator<string> | ReadableStream<string>\n  ): AsyncGenerator<string> {\n    if (source instanceof ReadableStream) {\n      const reader = source.getReader();\n      try {\n        while (true) {\n          const { done, value } = await reader.read();\n          if (done) break;\n          yield value;\n        }\n      } finally {\n        reader.releaseLock();\n      }\n    } else {\n      yield* source;\n    }\n  }\n\n  /**\n   * Handle backpressure state change\n   */\n  private handleBackpressure(paused: boolean): void {\n    if (paused) {\n      this.state = 'paused';\n    } else if (this.state === 'paused') {\n      this.state = 'resuming';\n      // Small delay before resuming\n      setTimeout(() => {\n        if (this.state === 'resuming') {\n          this.state = 'open';\n        }\n      }, 10);\n    }\n  }\n\n  /**\n   * Reset inactivity timer\n   */\n  private resetInactivityTimer(observer: StreamObserver): void {\n    this.clearInactivityTimer();\n\n    this.inactivityTimer = setTimeout(() => {\n      if (this.state === 'open' || this.state === 'paused') {\n        observer.onError?.(new Error('Stream inactivity timeout'));\n        this.state = 'error';\n      }\n    }, this.config.inactivityTimeout);\n  }\n\n  /**\n   * Clear inactivity timer\n   */\n  private clearInactivityTimer(): void {\n    if (this.inactivityTimer) {\n      clearTimeout(this.inactivityTimer);\n      this.inactivityTimer = null;\n    }\n  }\n\n  /**\n   * Attempt reconnection\n   */\n  private async attemptReconnect(observer: StreamObserver): Promise<void> {\n    this.reconnectAttempts++;\n    this.stats.reconnectCount++;\n    this.state = 'reconnecting';\n\n    observer.onReconnect?.(this.reconnectAttempts);\n\n    await new Promise((resolve) =>\n      setTimeout(resolve, this.config.reconnectDelay * this.reconnectAttempts)\n    );\n\n    // Reconnection logic would be implemented by the caller\n    // This is a placeholder for the reconnection attempt\n  }\n\n  /**\n   * Create stream controller\n   */\n  private createController(observer: StreamObserver): StreamController {\n    return {\n      pause: () => {\n        if (this.state === 'open') {\n          this.state = 'paused';\n          observer.onStateChange?.('paused', 'open');\n        }\n      },\n      resume: () => {\n        if (this.state === 'paused') {\n          this.state = 'open';\n          observer.onStateChange?.('open', 'paused');\n        }\n      },\n      cancel: () => {\n        this.abortController?.abort();\n        this.state = 'closed';\n        this.clearInactivityTimer();\n        observer.onStateChange?.('closed', this.state);\n      },\n      getState: () => this.state,\n      getStats: () => ({ ...this.stats }),\n      isActive: () =>\n        this.state === 'open' ||\n        this.state === 'paused' ||\n        this.state === 'connecting',\n    };\n  }\n\n  /**\n   * Reset client state\n   */\n  private reset(): void {\n    this.state = 'closed';\n    this.buffer.clear();\n    this.stats = this.createEmptyStats();\n    this.reconnectAttempts = 0;\n    this.lastTokenTime = 0;\n    this.clearInactivityTimer();\n    this.abortController = null;\n  }\n\n  /**\n   * Get current state\n   */\n  getState(): StreamState {\n    return this.state;\n  }\n\n  /**\n   * Get current stats\n   */\n  getStats(): StreamStats {\n    return { ...this.stats };\n  }\n}\n\n/**\n * Create preconfigured streaming client\n */\nexport const STREAMING_PRESETS = {\n  /** High performance streaming */\n  performance: {\n    bufferSize: 50,\n    enableBackpressure: false,\n    autoReconnect: true,\n    maxReconnectAttempts: 5,\n    reconnectDelay: 500,\n    inactivityTimeout: 10000,\n  } as StreamConfig,\n\n  /** Memory efficient streaming */\n  lowMemory: {\n    bufferSize: 20,\n    enableBackpressure: true,\n    highWaterMark: 15,\n    lowWaterMark: 5,\n    autoReconnect: true,\n    maxReconnectAttempts: 2,\n    reconnectDelay: 2000,\n    inactivityTimeout: 60000,\n  } as StreamConfig,\n\n  /** Reliable streaming */\n  reliable: {\n    bufferSize: 100,\n    enableBackpressure: true,\n    highWaterMark: 80,\n    lowWaterMark: 20,\n    autoReconnect: true,\n    maxReconnectAttempts: 10,\n    reconnectDelay: 1000,\n    inactivityTimeout: 120000,\n  } as StreamConfig,\n};\n","/**\n * Connection Manager\n *\n * Manages WebSocket and HTTP connections to edge workers:\n * - Connection pooling\n * - Lifecycle management\n * - Health monitoring\n * - Graceful degradation\n * - Protocol negotiation\n */\n\n/**\n * Connection type\n */\nexport type ConnectionType = 'websocket' | 'http' | 'webtransport';\n\n/**\n * Connection state\n */\nexport type ConnectionState =\n  | 'connecting'\n  | 'connected'\n  | 'authenticated'\n  | 'idle'\n  | 'active'\n  | 'draining'\n  | 'disconnecting'\n  | 'disconnected'\n  | 'error';\n\n/**\n * Connection quality\n */\nexport interface ConnectionQuality {\n  /** Round-trip time in ms */\n  rttMs: number;\n\n  /** Packet loss rate (0-1) */\n  packetLoss: number;\n\n  /** Jitter in ms */\n  jitterMs: number;\n\n  /** Quality score (0-100) */\n  score: number;\n\n  /** Last measurement timestamp */\n  measuredAt: number;\n}\n\n/**\n * Connection info\n */\nexport interface ConnectionInfo {\n  /** Connection ID */\n  id: string;\n\n  /** Worker endpoint URL */\n  endpoint: string;\n\n  /** Connection type */\n  type: ConnectionType;\n\n  /** Current state */\n  state: ConnectionState;\n\n  /** Connection quality */\n  quality: ConnectionQuality;\n\n  /** Creation timestamp */\n  createdAt: number;\n\n  /** Last activity timestamp */\n  lastActivityAt: number;\n\n  /** Request count */\n  requestCount: number;\n\n  /** Error count */\n  errorCount: number;\n\n  /** Whether connection is authenticated */\n  authenticated: boolean;\n\n  /** Metadata */\n  metadata: Record<string, unknown>;\n}\n\n/**\n * Pool configuration\n */\nexport interface PoolConfig {\n  /** Minimum connections to maintain */\n  minConnections: number;\n\n  /** Maximum connections per endpoint */\n  maxConnectionsPerEndpoint: number;\n\n  /** Maximum total connections */\n  maxTotalConnections: number;\n\n  /** Idle timeout in ms */\n  idleTimeout: number;\n\n  /** Connection timeout in ms */\n  connectionTimeout: number;\n\n  /** Maximum request age in ms */\n  maxRequestAge: number;\n\n  /** Enable connection warming */\n  enableWarming: boolean;\n\n  /** Warming interval in ms */\n  warmingInterval: number;\n\n  /** Quality check interval in ms */\n  qualityCheckInterval: number;\n\n  /** Minimum quality score (0-100) */\n  minQualityScore: number;\n}\n\n/**\n * Protocol capabilities\n */\nexport interface ProtocolCapabilities {\n  /** Supported message types */\n  messageTypes: string[];\n\n  /** Supports streaming */\n  streaming: boolean;\n\n  /** Supports binary messages */\n  binary: boolean;\n\n  /** Maximum message size */\n  maxMessageSize: number;\n\n  /** Supports compression */\n  compression: boolean;\n\n  /** Supports multiplexing */\n  multiplexing: boolean;\n\n  /** Protocol version */\n  version: string;\n}\n\n/**\n * Connection manager configuration\n */\nexport interface ConnectionManagerConfig {\n  /** Pool configuration */\n  pool: Partial<PoolConfig>;\n\n  /** Preferred connection types in order */\n  preferredTypes: ConnectionType[];\n\n  /** Authentication token provider */\n  authProvider?: () => Promise<string | null>;\n\n  /** Enable automatic quality monitoring */\n  enableQualityMonitoring: boolean;\n\n  /** Callback on connection state change */\n  onStateChange?: (\n    id: string,\n    state: ConnectionState,\n    previousState: ConnectionState\n  ) => void;\n\n  /** Callback on connection quality change */\n  onQualityChange?: (id: string, quality: ConnectionQuality) => void;\n\n  /** Callback on connection error */\n  onError?: (id: string, error: Error) => void;\n}\n\n/**\n * Default pool configuration\n */\nconst DEFAULT_POOL_CONFIG: PoolConfig = {\n  minConnections: 1,\n  maxConnectionsPerEndpoint: 4,\n  maxTotalConnections: 16,\n  idleTimeout: 60000,\n  connectionTimeout: 10000,\n  maxRequestAge: 300000,\n  enableWarming: true,\n  warmingInterval: 30000,\n  qualityCheckInterval: 15000,\n  minQualityScore: 30,\n};\n\n/**\n * Generate unique connection ID\n */\nfunction generateConnectionId(): string {\n  return `conn_${Date.now().toString(36)}_${Math.random()\n    .toString(36)\n    .slice(2, 8)}`;\n}\n\n/**\n * Managed connection wrapper\n */\nclass ManagedConnection {\n  public readonly info: ConnectionInfo;\n  private socket: WebSocket | null = null;\n  private pendingRequests: Map<\n    string,\n    {\n      resolve: (value: unknown) => void;\n      reject: (error: Error) => void;\n      timeout: ReturnType<typeof setTimeout>;\n    }\n  > = new Map();\n  private messageQueue: Array<{\n    data: unknown;\n    resolve: () => void;\n    reject: (e: Error) => void;\n  }> = [];\n  private pingInterval: ReturnType<typeof setInterval> | null = null;\n  private capabilities: ProtocolCapabilities | null = null;\n\n  constructor(\n    endpoint: string,\n    type: ConnectionType,\n    private config: ConnectionManagerConfig\n  ) {\n    this.info = {\n      id: generateConnectionId(),\n      endpoint,\n      type,\n      state: 'disconnected',\n      quality: {\n        rttMs: 0,\n        packetLoss: 0,\n        jitterMs: 0,\n        score: 100,\n        measuredAt: 0,\n      },\n      createdAt: Date.now(),\n      lastActivityAt: Date.now(),\n      requestCount: 0,\n      errorCount: 0,\n      authenticated: false,\n      metadata: {},\n    };\n  }\n\n  /**\n   * Connect to endpoint\n   */\n  async connect(): Promise<void> {\n    if (this.info.state !== 'disconnected') {\n      return;\n    }\n\n    this.updateState('connecting');\n\n    try {\n      if (this.info.type === 'websocket') {\n        await this.connectWebSocket();\n      } else {\n        // HTTP connections are stateless\n        this.updateState('connected');\n      }\n\n      // Authenticate if provider available\n      if (this.config.authProvider) {\n        await this.authenticate();\n      } else {\n        this.info.authenticated = true;\n        this.updateState('idle');\n      }\n    } catch (error) {\n      this.updateState('error');\n      throw error;\n    }\n  }\n\n  /**\n   * Connect via WebSocket\n   */\n  private connectWebSocket(): Promise<void> {\n    return new Promise((resolve, reject) => {\n      const timeout = setTimeout(() => {\n        reject(new Error('Connection timeout'));\n      }, this.getPoolConfig().connectionTimeout);\n\n      // Convert HTTP URL to WebSocket URL\n      const wsUrl = this.info.endpoint\n        .replace(/^http:/, 'ws:')\n        .replace(/^https:/, 'wss:');\n\n      this.socket = new WebSocket(wsUrl);\n\n      this.socket.onopen = () => {\n        clearTimeout(timeout);\n        this.updateState('connected');\n        this.startHeartbeat();\n        resolve();\n      };\n\n      this.socket.onerror = (event) => {\n        clearTimeout(timeout);\n        this.info.errorCount++;\n        reject(new Error('WebSocket connection error'));\n      };\n\n      this.socket.onclose = () => {\n        this.stopHeartbeat();\n        this.updateState('disconnected');\n        this.rejectPendingRequests(new Error('Connection closed'));\n      };\n\n      this.socket.onmessage = (event) => {\n        this.handleMessage(event.data);\n      };\n    });\n  }\n\n  /**\n   * Authenticate the connection\n   */\n  private async authenticate(): Promise<void> {\n    if (!this.config.authProvider) {\n      this.info.authenticated = true;\n      return;\n    }\n\n    this.updateState('connected');\n    const token = await this.config.authProvider();\n\n    if (token) {\n      if (this.socket) {\n        await this.send({ type: 'auth', token });\n      }\n      this.info.authenticated = true;\n    }\n\n    this.updateState('idle');\n  }\n\n  /**\n   * Send message and wait for response\n   */\n  async request<T>(data: unknown, timeout?: number): Promise<T> {\n    if (this.info.state !== 'idle' && this.info.state !== 'active') {\n      throw new Error(`Connection not ready: ${this.info.state}`);\n    }\n\n    this.updateState('active');\n    this.info.requestCount++;\n    this.info.lastActivityAt = Date.now();\n\n    const requestId = `req_${Date.now().toString(36)}_${Math.random()\n      .toString(36)\n      .slice(2, 8)}`;\n\n    if (this.info.type === 'websocket' && this.socket) {\n      return this.sendWebSocketRequest(requestId, data, timeout);\n    } else {\n      return this.sendHttpRequest(data, timeout);\n    }\n  }\n\n  /**\n   * Send WebSocket request\n   */\n  private sendWebSocketRequest<T>(\n    requestId: string,\n    data: unknown,\n    timeout?: number\n  ): Promise<T> {\n    return new Promise((resolve, reject) => {\n      const timeoutId = setTimeout(() => {\n        this.pendingRequests.delete(requestId);\n        reject(new Error('Request timeout'));\n      }, timeout || this.getPoolConfig().maxRequestAge);\n\n      this.pendingRequests.set(requestId, {\n        resolve: resolve as (value: unknown) => void,\n        reject,\n        timeout: timeoutId,\n      });\n\n      this.socket!.send(\n        JSON.stringify({\n          id: requestId,\n          ...(data as object),\n        })\n      );\n    });\n  }\n\n  /**\n   * Send HTTP request\n   */\n  private async sendHttpRequest<T>(\n    data: unknown,\n    timeout?: number\n  ): Promise<T> {\n    const controller = new AbortController();\n    const timeoutId = setTimeout(\n      () => controller.abort(),\n      timeout || this.getPoolConfig().maxRequestAge\n    );\n\n    try {\n      const headers: Record<string, string> = {\n        'Content-Type': 'application/json',\n      };\n\n      if (this.config.authProvider) {\n        const token = await this.config.authProvider();\n        if (token) {\n          headers['Authorization'] = `Bearer ${token}`;\n        }\n      }\n\n      const response = await fetch(this.info.endpoint, {\n        method: 'POST',\n        headers,\n        body: JSON.stringify(data),\n        signal: controller.signal,\n      });\n\n      if (!response.ok) {\n        throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n      }\n\n      return (await response.json()) as T;\n    } finally {\n      clearTimeout(timeoutId);\n      this.updateState('idle');\n    }\n  }\n\n  /**\n   * Send message (fire and forget)\n   */\n  async send(data: unknown): Promise<void> {\n    if (this.socket && this.socket.readyState === WebSocket.OPEN) {\n      this.socket.send(JSON.stringify(data));\n      this.info.lastActivityAt = Date.now();\n    } else {\n      throw new Error('WebSocket not connected');\n    }\n  }\n\n  /**\n   * Handle incoming message\n   */\n  private handleMessage(data: string | ArrayBuffer): void {\n    try {\n      const message = JSON.parse(data.toString());\n\n      // Check if this is a response to a pending request\n      if (message.id && this.pendingRequests.has(message.id)) {\n        const pending = this.pendingRequests.get(message.id)!;\n        clearTimeout(pending.timeout);\n        this.pendingRequests.delete(message.id);\n\n        if (message.error) {\n          pending.reject(new Error(message.error));\n        } else {\n          pending.resolve(message);\n        }\n\n        if (this.pendingRequests.size === 0) {\n          this.updateState('idle');\n        }\n        return;\n      }\n\n      // Handle other message types (events, etc.)\n      if (message.type === 'pong') {\n        this.updateQuality(message.rtt || 0);\n      } else if (message.type === 'capabilities') {\n        this.capabilities = message.capabilities;\n      }\n    } catch (error) {\n      this.info.errorCount++;\n    }\n  }\n\n  /**\n   * Start heartbeat\n   */\n  private startHeartbeat(): void {\n    if (this.pingInterval) return;\n\n    this.pingInterval = setInterval(() => {\n      if (this.socket && this.socket.readyState === WebSocket.OPEN) {\n        const pingTime = Date.now();\n        this.socket.send(\n          JSON.stringify({\n            type: 'ping',\n            timestamp: pingTime,\n          })\n        );\n      }\n    }, this.getPoolConfig().qualityCheckInterval);\n  }\n\n  /**\n   * Stop heartbeat\n   */\n  private stopHeartbeat(): void {\n    if (this.pingInterval) {\n      clearInterval(this.pingInterval);\n      this.pingInterval = null;\n    }\n  }\n\n  /**\n   * Update connection quality\n   */\n  private updateQuality(rttMs: number): void {\n    const previousRtt = this.info.quality.rttMs;\n    const jitter = Math.abs(rttMs - previousRtt);\n\n    this.info.quality = {\n      rttMs,\n      packetLoss: 0, // Would need to track lost pings\n      jitterMs: this.info.quality.jitterMs * 0.9 + jitter * 0.1,\n      score: this.calculateQualityScore(rttMs, jitter),\n      measuredAt: Date.now(),\n    };\n\n    this.config.onQualityChange?.(this.info.id, this.info.quality);\n  }\n\n  /**\n   * Calculate quality score\n   */\n  private calculateQualityScore(rttMs: number, jitterMs: number): number {\n    // Score based on RTT and jitter\n    let score = 100;\n\n    // Penalize high RTT\n    if (rttMs > 50) score -= Math.min(30, (rttMs - 50) / 10);\n    if (rttMs > 200) score -= Math.min(20, (rttMs - 200) / 20);\n\n    // Penalize jitter\n    if (jitterMs > 10) score -= Math.min(20, jitterMs - 10);\n\n    // Penalize high error rate\n    const errorRate =\n      this.info.requestCount > 0\n        ? this.info.errorCount / this.info.requestCount\n        : 0;\n    score -= errorRate * 30;\n\n    return Math.max(0, Math.min(100, score));\n  }\n\n  /**\n   * Reject all pending requests\n   */\n  private rejectPendingRequests(error: Error): void {\n    for (const [, pending] of this.pendingRequests) {\n      clearTimeout(pending.timeout);\n      pending.reject(error);\n    }\n    this.pendingRequests.clear();\n  }\n\n  /**\n   * Update connection state\n   */\n  private updateState(newState: ConnectionState): void {\n    const previousState = this.info.state;\n    this.info.state = newState;\n    this.config.onStateChange?.(this.info.id, newState, previousState);\n  }\n\n  /**\n   * Get pool config with defaults\n   */\n  private getPoolConfig(): PoolConfig {\n    return { ...DEFAULT_POOL_CONFIG, ...this.config.pool };\n  }\n\n  /**\n   * Disconnect\n   */\n  async disconnect(): Promise<void> {\n    if (this.info.state === 'disconnected') return;\n\n    this.updateState('disconnecting');\n    this.stopHeartbeat();\n    this.rejectPendingRequests(new Error('Connection closing'));\n\n    if (this.socket) {\n      this.socket.close();\n      this.socket = null;\n    }\n\n    this.updateState('disconnected');\n  }\n\n  /**\n   * Check if connection is healthy\n   */\n  isHealthy(): boolean {\n    const poolConfig = this.getPoolConfig();\n    const isConnected =\n      this.info.state === 'idle' || this.info.state === 'active';\n    const hasGoodQuality =\n      this.info.quality.score >= poolConfig.minQualityScore;\n    const isRecent =\n      Date.now() - this.info.lastActivityAt < poolConfig.idleTimeout;\n\n    return isConnected && hasGoodQuality && isRecent;\n  }\n\n  /**\n   * Get capabilities\n   */\n  getCapabilities(): ProtocolCapabilities | null {\n    return this.capabilities;\n  }\n}\n\n/**\n * Connection Manager\n *\n * Manages a pool of connections to edge workers.\n */\nexport class ConnectionManager {\n  private config: ConnectionManagerConfig;\n  private poolConfig: PoolConfig;\n  private connections: Map<string, ManagedConnection> = new Map();\n  private endpointConnections: Map<string, Set<string>> = new Map();\n  private warmingInterval: ReturnType<typeof setInterval> | null = null;\n  private qualityCheckInterval: ReturnType<typeof setInterval> | null = null;\n\n  constructor(config: Partial<ConnectionManagerConfig> = {}) {\n    this.config = {\n      pool: {},\n      preferredTypes: ['websocket', 'http'],\n      enableQualityMonitoring: true,\n      ...config,\n    };\n    this.poolConfig = { ...DEFAULT_POOL_CONFIG, ...this.config.pool };\n  }\n\n  /**\n   * Start the connection manager\n   */\n  start(): void {\n    if (this.poolConfig.enableWarming) {\n      this.warmingInterval = setInterval(\n        () => this.warmConnections(),\n        this.poolConfig.warmingInterval\n      );\n    }\n\n    if (this.config.enableQualityMonitoring) {\n      this.qualityCheckInterval = setInterval(\n        () => this.checkConnectionQuality(),\n        this.poolConfig.qualityCheckInterval\n      );\n    }\n  }\n\n  /**\n   * Stop the connection manager\n   */\n  async stop(): Promise<void> {\n    if (this.warmingInterval) {\n      clearInterval(this.warmingInterval);\n      this.warmingInterval = null;\n    }\n\n    if (this.qualityCheckInterval) {\n      clearInterval(this.qualityCheckInterval);\n      this.qualityCheckInterval = null;\n    }\n\n    // Close all connections\n    await Promise.all(\n      Array.from(this.connections.values()).map((conn) => conn.disconnect())\n    );\n\n    this.connections.clear();\n    this.endpointConnections.clear();\n  }\n\n  /**\n   * Get or create connection to endpoint\n   */\n  async getConnection(\n    endpoint: string,\n    type?: ConnectionType\n  ): Promise<ManagedConnection> {\n    // Check for existing healthy connection\n    const existingConnections = this.endpointConnections.get(endpoint);\n    if (existingConnections) {\n      for (const connId of existingConnections) {\n        const conn = this.connections.get(connId);\n        if (conn && conn.isHealthy()) {\n          return conn;\n        }\n      }\n    }\n\n    // Check total connection limit\n    if (this.connections.size >= this.poolConfig.maxTotalConnections) {\n      // Try to reuse least recently used connection\n      const lruConn = this.getLeastRecentlyUsedConnection();\n      if (lruConn) {\n        await lruConn.disconnect();\n        this.removeConnection(lruConn.info.id);\n      }\n    }\n\n    // Create new connection\n    const connType = type || this.config.preferredTypes[0];\n    const connection = new ManagedConnection(endpoint, connType, this.config);\n\n    await connection.connect();\n\n    this.connections.set(connection.info.id, connection);\n\n    if (!this.endpointConnections.has(endpoint)) {\n      this.endpointConnections.set(endpoint, new Set());\n    }\n    this.endpointConnections.get(endpoint)!.add(connection.info.id);\n\n    return connection;\n  }\n\n  /**\n   * Release connection back to pool\n   */\n  releaseConnection(connection: ManagedConnection): void {\n    /* noop - connection stays in pool for reuse, cleaned up by idle timeout */\n  }\n\n  /**\n   * Remove connection from pool\n   */\n  private removeConnection(connId: string): void {\n    const conn = this.connections.get(connId);\n    if (!conn) return;\n\n    this.connections.delete(connId);\n\n    const endpointConns = this.endpointConnections.get(conn.info.endpoint);\n    if (endpointConns) {\n      endpointConns.delete(connId);\n      if (endpointConns.size === 0) {\n        this.endpointConnections.delete(conn.info.endpoint);\n      }\n    }\n  }\n\n  /**\n   * Get least recently used connection\n   */\n  private getLeastRecentlyUsedConnection(): ManagedConnection | null {\n    let lru: ManagedConnection | null = null;\n    let lruTime = Infinity;\n\n    for (const conn of this.connections.values()) {\n      if (conn.info.lastActivityAt < lruTime) {\n        lruTime = conn.info.lastActivityAt;\n        lru = conn;\n      }\n    }\n\n    return lru;\n  }\n\n  /**\n   * Warm connections for known endpoints\n   */\n  private async warmConnections(): Promise<void> {\n    for (const [endpoint, connIds] of this.endpointConnections) {\n      const healthyCount = Array.from(connIds).filter((id) => {\n        const conn = this.connections.get(id);\n        return conn?.isHealthy();\n      }).length;\n\n      // Ensure minimum connections\n      if (healthyCount < this.poolConfig.minConnections) {\n        try {\n          await this.getConnection(endpoint);\n        } catch (error) {\n          // Warming unmet expectations is not critical\n          console.warn(`Failed to warm connection to ${endpoint}:`, error);\n        }\n      }\n    }\n  }\n\n  /**\n   * Check connection quality and cleanup\n   */\n  private async checkConnectionQuality(): Promise<void> {\n    const now = Date.now();\n    const toRemove: string[] = [];\n\n    for (const [id, conn] of this.connections) {\n      // Check for idle timeout\n      if (now - conn.info.lastActivityAt > this.poolConfig.idleTimeout) {\n        // Keep at least minConnections per endpoint\n        const endpointConns = this.endpointConnections.get(conn.info.endpoint);\n        if (\n          endpointConns &&\n          endpointConns.size > this.poolConfig.minConnections\n        ) {\n          toRemove.push(id);\n        }\n      }\n\n      // Check for poor quality\n      if (conn.info.quality.score < this.poolConfig.minQualityScore) {\n        toRemove.push(id);\n      }\n    }\n\n    // Remove stale connections\n    for (const id of toRemove) {\n      const conn = this.connections.get(id);\n      if (conn) {\n        await conn.disconnect();\n        this.removeConnection(id);\n      }\n    }\n  }\n\n  /**\n   * Get all connections info\n   */\n  getConnections(): ConnectionInfo[] {\n    return Array.from(this.connections.values()).map((c) => ({ ...c.info }));\n  }\n\n  /**\n   * Get connections for endpoint\n   */\n  getEndpointConnections(endpoint: string): ConnectionInfo[] {\n    const connIds = this.endpointConnections.get(endpoint);\n    if (!connIds) return [];\n\n    return Array.from(connIds)\n      .map((id) => this.connections.get(id)?.info)\n      .filter((info): info is ConnectionInfo => !!info);\n  }\n\n  /**\n   * Get pool statistics\n   */\n  getStats(): {\n    totalConnections: number;\n    healthyConnections: number;\n    activeConnections: number;\n    endpointCount: number;\n    avgQualityScore: number;\n    totalRequests: number;\n    totalErrors: number;\n  } {\n    const connections = Array.from(this.connections.values());\n    const healthyCount = connections.filter((c) => c.isHealthy()).length;\n    const activeCount = connections.filter(\n      (c) => c.info.state === 'active'\n    ).length;\n    const totalQuality = connections.reduce(\n      (sum, c) => sum + c.info.quality.score,\n      0\n    );\n    const totalRequests = connections.reduce(\n      (sum, c) => sum + c.info.requestCount,\n      0\n    );\n    const totalErrors = connections.reduce(\n      (sum, c) => sum + c.info.errorCount,\n      0\n    );\n\n    return {\n      totalConnections: connections.length,\n      healthyConnections: healthyCount,\n      activeConnections: activeCount,\n      endpointCount: this.endpointConnections.size,\n      avgQualityScore:\n        connections.length > 0 ? totalQuality / connections.length : 100,\n      totalRequests,\n      totalErrors,\n    };\n  }\n}\n\n/**\n * Pre-configured connection manager presets\n */\nexport const CONNECTION_PRESETS = {\n  /** High performance for real-time applications */\n  realtime: {\n    pool: {\n      minConnections: 2,\n      maxConnectionsPerEndpoint: 8,\n      maxTotalConnections: 32,\n      idleTimeout: 30000,\n      connectionTimeout: 5000,\n      qualityCheckInterval: 5000,\n      minQualityScore: 50,\n    },\n    preferredTypes: ['websocket'] as ConnectionType[],\n    enableQualityMonitoring: true,\n  } as Partial<ConnectionManagerConfig>,\n\n  /** Balanced for general use */\n  balanced: {\n    pool: {\n      minConnections: 1,\n      maxConnectionsPerEndpoint: 4,\n      maxTotalConnections: 16,\n      idleTimeout: 60000,\n      connectionTimeout: 10000,\n      qualityCheckInterval: 15000,\n      minQualityScore: 30,\n    },\n    preferredTypes: ['websocket', 'http'] as ConnectionType[],\n    enableQualityMonitoring: true,\n  } as Partial<ConnectionManagerConfig>,\n\n  /** Low resource for mobile/constrained devices */\n  lowResource: {\n    pool: {\n      minConnections: 1,\n      maxConnectionsPerEndpoint: 2,\n      maxTotalConnections: 4,\n      idleTimeout: 120000,\n      connectionTimeout: 15000,\n      qualityCheckInterval: 30000,\n      minQualityScore: 20,\n    },\n    preferredTypes: ['http'] as ConnectionType[],\n    enableQualityMonitoring: false,\n  } as Partial<ConnectionManagerConfig>,\n};\n","/**\n * Offline Support Module\n *\n * Provides offline-first inference capabilities:\n * - Service Worker integration\n * - Request queuing\n * - Background sync\n * - Offline model management\n * - Conflict resolution\n */\n\n/**\n * Offline state\n */\nexport type OfflineState = 'online' | 'offline' | 'syncing' | 'partial'; // Some services available\n\n/**\n * Queue priority\n */\nexport type QueuePriority = 'high' | 'typical' | 'low' | 'background';\n\n/**\n * Queued request\n */\nexport interface QueuedRequest {\n  /** Request ID */\n  id: string;\n\n  /** Request type */\n  type: 'inference' | 'sync' | 'feedback' | 'custom';\n\n  /** Request payload */\n  payload: unknown;\n\n  /** Priority */\n  priority: QueuePriority;\n\n  /** Created timestamp */\n  createdAt: number;\n\n  /** Number of retry attempts */\n  retryCount: number;\n\n  /** Maximum retries */\n  maxRetries: number;\n\n  /** Expiry timestamp (0 = never) */\n  expiresAt: number;\n\n  /** Whether request requires network */\n  requiresNetwork: boolean;\n\n  /** Callback URL for background sync */\n  callbackUrl?: string;\n\n  /** Metadata */\n  metadata: Record<string, unknown>;\n}\n\n/**\n * Sync conflict\n */\nexport interface SyncConflict {\n  /** Request ID */\n  requestId: string;\n\n  /** Local data */\n  local: unknown;\n\n  /** Remote data */\n  remote: unknown;\n\n  /** Conflict type */\n  type: 'version' | 'content' | 'deleted';\n\n  /** Resolution strategy suggestion */\n  suggestedResolution: 'local' | 'remote' | 'merge' | 'manual';\n}\n\n/**\n * Offline model info\n */\nexport interface OfflineModel {\n  /** Model ID */\n  id: string;\n\n  /** Model name */\n  name: string;\n\n  /** Model size in bytes */\n  sizeBytes: number;\n\n  /** Whether model is cached */\n  cached: boolean;\n\n  /** Cache timestamp */\n  cachedAt: number;\n\n  /** Last used timestamp */\n  lastUsedAt: number;\n\n  /** Model version */\n  version: string;\n\n  /** Whether model supports offline */\n  offlineCapable: boolean;\n\n  /** Required features */\n  requiredFeatures: ('webgpu' | 'wasm' | 'simd')[];\n}\n\n/**\n * Offline storage quota\n */\nexport interface StorageQuota {\n  /** Total quota in bytes */\n  total: number;\n\n  /** Used storage in bytes */\n  used: number;\n\n  /** Available storage in bytes */\n  available: number;\n\n  /** Persistent storage granted */\n  persistent: boolean;\n}\n\n/**\n * Offline config\n */\nexport interface OfflineSupportConfig {\n  /** Enable offline mode */\n  enabled: boolean;\n\n  /** Queue storage key */\n  queueStorageKey: string;\n\n  /** Maximum queue size */\n  maxQueueSize: number;\n\n  /** Default request expiry (ms) */\n  defaultExpiry: number;\n\n  /** Sync interval (ms) */\n  syncInterval: number;\n\n  /** Enable background sync */\n  enableBackgroundSync: boolean;\n\n  /** Service worker path */\n  serviceWorkerPath?: string;\n\n  /** Model cache name */\n  modelCacheName: string;\n\n  /** Maximum cached models */\n  maxCachedModels: number;\n\n  /** Callback on state change */\n  onStateChange?: (state: OfflineState) => void;\n\n  /** Callback on queue change */\n  onQueueChange?: (queue: QueuedRequest[]) => void;\n\n  /** Callback on sync conflict */\n  onConflict?: (\n    conflict: SyncConflict\n  ) => Promise<'local' | 'remote' | 'merge'>;\n\n  /** Callback on sync complete */\n  onSyncComplete?: (synced: number, failed: number) => void;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: OfflineSupportConfig = {\n  enabled: true,\n  queueStorageKey: 'edgework_offline_queue',\n  maxQueueSize: 100,\n  defaultExpiry: 24 * 60 * 60 * 1000, // 24 hours\n  syncInterval: 30000, // 30 seconds\n  enableBackgroundSync: true,\n  modelCacheName: 'edgework_models_v1',\n  maxCachedModels: 5,\n};\n\n/**\n * Generate unique request ID\n */\nfunction generateRequestId(): string {\n  return `req_${Date.now().toString(36)}_${Math.random()\n    .toString(36)\n    .slice(2, 8)}`;\n}\n\n/**\n * Offline Support\n *\n * Provides offline-first capabilities for edge inference.\n */\nexport class OfflineSupport {\n  private config: OfflineSupportConfig;\n  private state: OfflineState = 'online';\n  private queue: QueuedRequest[] = [];\n  private syncInterval: ReturnType<typeof setInterval> | null = null;\n  private serviceWorkerRegistration: ServiceWorkerRegistration | null = null;\n  private cachedModels: Map<string, OfflineModel> = new Map();\n\n  constructor(config: Partial<OfflineSupportConfig> = {}) {\n    this.config = { ...DEFAULT_CONFIG, ...config };\n  }\n\n  /**\n   * Initialize offline support\n   */\n  async initialize(): Promise<void> {\n    if (!this.config.enabled) return;\n\n    // Listen for online/offline events\n    window.addEventListener('online', () => this.handleOnline());\n    window.addEventListener('offline', () => this.handleOffline());\n\n    // Set initial state\n    this.state = navigator.onLine ? 'online' : 'offline';\n\n    // Load queue from storage\n    await this.loadQueue();\n\n    // Register service worker\n    if (this.config.serviceWorkerPath && 'serviceWorker' in navigator) {\n      await this.registerServiceWorker();\n    }\n\n    // Start sync interval\n    if (this.config.syncInterval > 0) {\n      this.syncInterval = setInterval(\n        () => this.syncQueue(),\n        this.config.syncInterval\n      );\n    }\n\n    // Initial sync if online\n    if (this.state === 'online' && this.queue.length > 0) {\n      await this.syncQueue();\n    }\n\n    // Load cached models info\n    await this.loadCachedModels();\n  }\n\n  /**\n   * Shutdown offline support\n   */\n  async shutdown(): Promise<void> {\n    if (this.syncInterval) {\n      clearInterval(this.syncInterval);\n      this.syncInterval = null;\n    }\n\n    window.removeEventListener('online', () => this.handleOnline());\n    window.removeEventListener('offline', () => this.handleOffline());\n\n    await this.saveQueue();\n  }\n\n  /**\n   * Register service worker\n   */\n  private async registerServiceWorker(): Promise<void> {\n    try {\n      this.serviceWorkerRegistration = await navigator.serviceWorker.register(\n        this.config.serviceWorkerPath!\n      );\n\n      // Set up message channel\n      navigator.serviceWorker.addEventListener('message', (event) => {\n        this.handleServiceWorkerMessage(event.data);\n      });\n    } catch (error) {\n      console.warn('Service worker registration failed:', error);\n    }\n  }\n\n  /**\n   * Handle service worker message\n   */\n  private handleServiceWorkerMessage(data: unknown): void {\n    if (typeof data !== 'object' || data === null) return;\n\n    const message = data as { type: string; payload?: unknown };\n\n    switch (message.type) {\n      case 'sync-complete':\n        this.handleSyncComplete(\n          message.payload as { synced: number; failed: number }\n        );\n        break;\n      case 'request-result':\n        this.handleRequestResult(\n          message.payload as { id: string; result: unknown }\n        );\n        break;\n    }\n  }\n\n  /**\n   * Handle online event\n   */\n  private async handleOnline(): Promise<void> {\n    const previousState = this.state;\n    this.state = 'online';\n    this.config.onStateChange?.(this.state);\n\n    if (previousState === 'offline' && this.queue.length > 0) {\n      await this.syncQueue();\n    }\n  }\n\n  /**\n   * Handle offline event\n   */\n  private handleOffline(): void {\n    this.state = 'offline';\n    this.config.onStateChange?.(this.state);\n  }\n\n  /**\n   * Queue a request for later processing\n   */\n  async queueRequest(\n    type: QueuedRequest['type'],\n    payload: unknown,\n    options: Partial<\n      Pick<QueuedRequest, 'priority' | 'maxRetries' | 'expiresAt' | 'metadata'>\n    > = {}\n  ): Promise<string> {\n    if (this.queue.length >= this.config.maxQueueSize) {\n      // Remove oldest low-priority request\n      const lowPriorityIndex = this.queue.findIndex(\n        (r) => r.priority === 'low' || r.priority === 'background'\n      );\n      if (lowPriorityIndex >= 0) {\n        this.queue.splice(lowPriorityIndex, 1);\n      } else {\n        throw new Error('Queue is full');\n      }\n    }\n\n    const request: QueuedRequest = {\n      id: generateRequestId(),\n      type,\n      payload,\n      priority: options.priority || 'typical',\n      createdAt: Date.now(),\n      retryCount: 0,\n      maxRetries: options.maxRetries ?? 3,\n      expiresAt: options.expiresAt ?? Date.now() + this.config.defaultExpiry,\n      requiresNetwork: type !== 'inference',\n      metadata: options.metadata || {},\n    };\n\n    this.queue.push(request);\n    this.sortQueue();\n    await this.saveQueue();\n\n    this.config.onQueueChange?.(this.queue);\n\n    // Try to sync immediately if online\n    if (this.state === 'online' && request.priority === 'high') {\n      await this.syncQueue();\n    }\n\n    return request.id;\n  }\n\n  /**\n   * Sort queue by priority\n   */\n  private sortQueue(): void {\n    const priorityOrder: Record<QueuePriority, number> = {\n      high: 0,\n      typical: 1,\n      low: 2,\n      background: 3,\n    };\n\n    this.queue.sort((a, b) => {\n      const priorityDiff =\n        priorityOrder[a.priority] - priorityOrder[b.priority];\n      if (priorityDiff !== 0) return priorityDiff;\n      return a.createdAt - b.createdAt;\n    });\n  }\n\n  /**\n   * Sync queue with server\n   */\n  async syncQueue(): Promise<{ synced: number; failed: number }> {\n    if (this.state === 'offline' || this.queue.length === 0) {\n      return { synced: 0, failed: 0 };\n    }\n\n    this.state = 'syncing';\n    this.config.onStateChange?.(this.state);\n\n    let synced = 0;\n    let failed = 0;\n    const toRemove: string[] = [];\n    const now = Date.now();\n\n    for (const request of this.queue) {\n      // Check expiry\n      if (request.expiresAt > 0 && request.expiresAt < now) {\n        toRemove.push(request.id);\n        failed++;\n        continue;\n      }\n\n      // Check retry limit\n      if (request.retryCount >= request.maxRetries) {\n        toRemove.push(request.id);\n        failed++;\n        continue;\n      }\n\n      try {\n        await this.processQueuedRequest(request);\n        toRemove.push(request.id);\n        synced++;\n      } catch (error) {\n        request.retryCount++;\n        failed++;\n\n        // If we're offline, stop trying\n        if (!navigator.onLine) {\n          break;\n        }\n      }\n    }\n\n    // Remove processed requests\n    this.queue = this.queue.filter((r) => !toRemove.includes(r.id));\n    await this.saveQueue();\n\n    this.state = navigator.onLine ? 'online' : 'offline';\n    this.config.onStateChange?.(this.state);\n    this.config.onQueueChange?.(this.queue);\n    this.config.onSyncComplete?.(synced, failed);\n\n    return { synced, failed };\n  }\n\n  /**\n   * Process a queued request\n   */\n  private async processQueuedRequest(request: QueuedRequest): Promise<unknown> {\n    if (!request.callbackUrl) {\n      // No callback URL, just discard\n      return null;\n    }\n\n    const response = await fetch(request.callbackUrl, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify(request.payload),\n    });\n\n    if (!response.ok) {\n      throw new Error(`Request failed: ${response.status}`);\n    }\n\n    return response.json();\n  }\n\n  /**\n   * Handle sync complete from service worker\n   */\n  private handleSyncComplete(payload: {\n    synced: number;\n    failed: number;\n  }): void {\n    this.config.onSyncComplete?.(payload.synced, payload.failed);\n  }\n\n  /**\n   * Handle request result from service worker\n   */\n  private handleRequestResult(_payload: { id: string; result: unknown }): void {\n    /* noop - handle results for specific requests */\n  }\n\n  /**\n   * Save queue to storage\n   */\n  private async saveQueue(): Promise<void> {\n    try {\n      localStorage.setItem(\n        this.config.queueStorageKey,\n        JSON.stringify(this.queue)\n      );\n    } catch (error) {\n      console.warn('Failed to save offline queue:', error);\n    }\n  }\n\n  /**\n   * Load queue from storage\n   */\n  private async loadQueue(): Promise<void> {\n    try {\n      const stored = localStorage.getItem(this.config.queueStorageKey);\n      if (stored) {\n        this.queue = JSON.parse(stored);\n        this.sortQueue();\n      }\n    } catch (error) {\n      console.warn('Failed to load offline queue:', error);\n      this.queue = [];\n    }\n  }\n\n  /**\n   * Load cached models info\n   */\n  private async loadCachedModels(): Promise<void> {\n    if (!('caches' in window)) return;\n\n    try {\n      const cache = await caches.open(this.config.modelCacheName);\n      const keys = await cache.keys();\n\n      for (const request of keys) {\n        const response = await cache.match(request);\n        if (response) {\n          const modelId = this.extractModelId(request.url);\n          const metadata = response.headers.get('X-Model-Metadata');\n\n          this.cachedModels.set(modelId, {\n            id: modelId,\n            name: modelId,\n            sizeBytes: parseInt(response.headers.get('Content-Length') || '0'),\n            cached: true,\n            cachedAt: new Date(response.headers.get('Date') || 0).getTime(),\n            lastUsedAt: Date.now(),\n            version: response.headers.get('X-Model-Version') || '1.0.0',\n            offlineCapable: true,\n            requiredFeatures: metadata\n              ? JSON.parse(metadata).features\n              : ['wasm'],\n          });\n        }\n      }\n    } catch (error) {\n      console.warn('Failed to load cached models:', error);\n    }\n  }\n\n  /**\n   * Extract model ID from URL\n   */\n  private extractModelId(url: string): string {\n    const parts = url.split('/');\n    return parts[parts.length - 1].replace(/\\.[^/.]+$/, '');\n  }\n\n  /**\n   * Cache a model for offline use\n   */\n  async cacheModel(\n    modelId: string,\n    modelUrl: string,\n    metadata?: Partial<OfflineModel>\n  ): Promise<void> {\n    if (!('caches' in window)) {\n      throw new Error('Cache API not available');\n    }\n\n    // Check quota\n    const quota = await this.getStorageQuota();\n    if (quota.available < (metadata?.sizeBytes || 0)) {\n      // Try to free up space\n      await this.evictOldModels(metadata?.sizeBytes || 0);\n    }\n\n    const cache = await caches.open(this.config.modelCacheName);\n\n    // Fetch and cache the model\n    const response = await fetch(modelUrl);\n    if (!response.ok) {\n      throw new Error(`Failed to fetch model: ${response.status}`);\n    }\n\n    // Add metadata headers\n    const headers = new Headers(response.headers);\n    headers.set('X-Model-Version', metadata?.version || '1.0.0');\n    headers.set(\n      'X-Model-Metadata',\n      JSON.stringify({\n        features: metadata?.requiredFeatures || ['wasm'],\n      })\n    );\n\n    const modifiedResponse = new Response(response.body, {\n      status: response.status,\n      statusText: response.statusText,\n      headers,\n    });\n\n    await cache.put(modelUrl, modifiedResponse);\n\n    // Update cached models map\n    this.cachedModels.set(modelId, {\n      id: modelId,\n      name: metadata?.name || modelId,\n      sizeBytes: parseInt(response.headers.get('Content-Length') || '0'),\n      cached: true,\n      cachedAt: Date.now(),\n      lastUsedAt: Date.now(),\n      version: metadata?.version || '1.0.0',\n      offlineCapable: true,\n      requiredFeatures: metadata?.requiredFeatures || ['wasm'],\n    });\n  }\n\n  /**\n   * Remove a cached model\n   */\n  async uncacheModel(modelId: string): Promise<void> {\n    if (!('caches' in window)) return;\n\n    const cache = await caches.open(this.config.modelCacheName);\n    const keys = await cache.keys();\n\n    for (const request of keys) {\n      if (this.extractModelId(request.url) === modelId) {\n        await cache.delete(request);\n        break;\n      }\n    }\n\n    this.cachedModels.delete(modelId);\n  }\n\n  /**\n   * Evict old models to free up space\n   */\n  private async evictOldModels(neededBytes: number): Promise<void> {\n    const models = Array.from(this.cachedModels.values()).sort(\n      (a, b) => a.lastUsedAt - b.lastUsedAt\n    );\n\n    let freedBytes = 0;\n    const toEvict: string[] = [];\n\n    for (const model of models) {\n      if (freedBytes >= neededBytes) break;\n      toEvict.push(model.id);\n      freedBytes += model.sizeBytes;\n    }\n\n    for (const modelId of toEvict) {\n      await this.uncacheModel(modelId);\n    }\n  }\n\n  /**\n   * Check if model is available offline\n   */\n  isModelAvailableOffline(modelId: string): boolean {\n    return this.cachedModels.has(modelId);\n  }\n\n  /**\n   * Get cached model info\n   */\n  getCachedModel(modelId: string): OfflineModel | undefined {\n    const model = this.cachedModels.get(modelId);\n    if (model) {\n      model.lastUsedAt = Date.now();\n    }\n    return model;\n  }\n\n  /**\n   * Get all cached models\n   */\n  getCachedModels(): OfflineModel[] {\n    return Array.from(this.cachedModels.values());\n  }\n\n  /**\n   * Get storage quota\n   */\n  async getStorageQuota(): Promise<StorageQuota> {\n    if ('storage' in navigator && 'estimate' in navigator.storage) {\n      const estimate = await navigator.storage.estimate();\n      const persistent = (await navigator.storage.persisted?.()) || false;\n\n      return {\n        total: estimate.quota || 0,\n        used: estimate.usage || 0,\n        available: (estimate.quota || 0) - (estimate.usage || 0),\n        persistent,\n      };\n    }\n\n    // Fallback estimate\n    return {\n      total: 50 * 1024 * 1024, // 50MB\n      used: 0,\n      available: 50 * 1024 * 1024,\n      persistent: false,\n    };\n  }\n\n  /**\n   * Request persistent storage\n   */\n  async requestPersistentStorage(): Promise<boolean> {\n    if ('storage' in navigator && 'persist' in navigator.storage) {\n      return navigator.storage.persist();\n    }\n    return false;\n  }\n\n  /**\n   * Get current offline state\n   */\n  getState(): OfflineState {\n    return this.state;\n  }\n\n  /**\n   * Get queued requests\n   */\n  getQueue(): QueuedRequest[] {\n    return [...this.queue];\n  }\n\n  /**\n   * Get queue size\n   */\n  getQueueSize(): number {\n    return this.queue.length;\n  }\n\n  /**\n   * Clear queue\n   */\n  async clearQueue(): Promise<void> {\n    this.queue = [];\n    await this.saveQueue();\n    this.config.onQueueChange?.(this.queue);\n  }\n\n  /**\n   * Remove specific request from queue\n   */\n  async removeFromQueue(requestId: string): Promise<boolean> {\n    const index = this.queue.findIndex((r) => r.id === requestId);\n    if (index >= 0) {\n      this.queue.splice(index, 1);\n      await this.saveQueue();\n      this.config.onQueueChange?.(this.queue);\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Trigger background sync\n   */\n  async triggerBackgroundSync(): Promise<void> {\n    if (!this.config.enableBackgroundSync || !this.serviceWorkerRegistration) {\n      return;\n    }\n\n    try {\n      const swReg = this.serviceWorkerRegistration as any;\n      await swReg.sync?.register('edgework-sync');\n    } catch (error) {\n      console.warn('Background sync registration failed:', error);\n      // Fall back to immediate sync\n      await this.syncQueue();\n    }\n  }\n}\n\n/**\n * Pre-configured offline support presets\n */\nexport const OFFLINE_PRESETS = {\n  /** Aggressive caching for fully offline apps */\n  offlineFirst: {\n    enabled: true,\n    maxQueueSize: 500,\n    defaultExpiry: 7 * 24 * 60 * 60 * 1000, // 7 days\n    syncInterval: 60000,\n    enableBackgroundSync: true,\n    maxCachedModels: 10,\n  } as Partial<OfflineSupportConfig>,\n\n  /** Light caching for mostly online apps */\n  onlineFirst: {\n    enabled: true,\n    maxQueueSize: 50,\n    defaultExpiry: 60 * 60 * 1000, // 1 hour\n    syncInterval: 10000,\n    enableBackgroundSync: false,\n    maxCachedModels: 2,\n  } as Partial<OfflineSupportConfig>,\n\n  /** No offline support */\n  disabled: {\n    enabled: false,\n  } as Partial<OfflineSupportConfig>,\n};\n","/**\n * Bandwidth Optimizer\n *\n * Optimizes network usage for model inference:\n * - FP16/FP8 transfer formats\n * - Compression algorithms\n * - Adaptive quality based on network\n * - Partial model loading\n * - Delta updates\n */\n\n/**\n * Compression algorithm\n */\nexport type CompressionAlgorithm = 'none' | 'gzip' | 'brotli' | 'lz4' | 'zstd';\n\n/**\n * Transfer format\n */\nexport type TransferFormat = 'fp32' | 'fp16' | 'fp8' | 'int8' | 'int4';\n\n/**\n * Quality level\n */\nexport type QualityLevel = 'ultra' | 'high' | 'medium' | 'low' | 'minimal';\n\n/**\n * Network profile\n */\nexport interface NetworkProfile {\n  /** Effective bandwidth in Mbps */\n  bandwidthMbps: number;\n\n  /** Round-trip time in ms */\n  rttMs: number;\n\n  /** Packet loss rate (0-1) */\n  packetLoss: number;\n\n  /** Connection type */\n  connectionType: 'wifi' | '4g' | '3g' | '2g' | 'slow-2g' | 'unknown';\n\n  /** Whether data saver is enabled */\n  dataSaver: boolean;\n\n  /** Metered connection */\n  metered: boolean;\n}\n\n/**\n * Optimization strategy\n */\nexport interface OptimizationStrategy {\n  /** Transfer format to use */\n  format: TransferFormat;\n\n  /** Compression algorithm */\n  compression: CompressionAlgorithm;\n\n  /** Quality level */\n  quality: QualityLevel;\n\n  /** Chunk size for streaming */\n  chunkSize: number;\n\n  /** Whether to prefetch next chunks */\n  prefetch: boolean;\n\n  /** Maximum concurrent requests */\n  maxConcurrent: number;\n\n  /** Use delta updates if available */\n  useDelta: boolean;\n\n  /** Estimated bandwidth saving (0-1) */\n  estimatedSaving: number;\n}\n\n/**\n * Transfer statistics\n */\nexport interface TransferStats {\n  /** Bytes sent */\n  bytesSent: number;\n\n  /** Bytes received */\n  bytesReceived: number;\n\n  /** Bytes saved by optimization */\n  bytesSaved: number;\n\n  /** Compression ratio */\n  compressionRatio: number;\n\n  /** Average transfer speed in bytes/s */\n  avgSpeed: number;\n\n  /** Transfer count */\n  transferCount: number;\n\n  /** Failed transfers */\n  failedTransfers: number;\n}\n\n/**\n * Optimizer configuration\n */\nexport interface BandwidthOptimizerConfig {\n  /** Enable automatic optimization */\n  autoOptimize: boolean;\n\n  /** Preferred compression */\n  preferredCompression: CompressionAlgorithm;\n\n  /** Preferred format */\n  preferredFormat: TransferFormat;\n\n  /** Quality thresholds */\n  qualityThresholds: {\n    ultraMinBandwidth: number; // Mbps\n    highMinBandwidth: number;\n    mediumMinBandwidth: number;\n    lowMinBandwidth: number;\n  };\n\n  /** Maximum chunk size in bytes */\n  maxChunkSize: number;\n\n  /** Minimum chunk size in bytes */\n  minChunkSize: number;\n\n  /** Enable prefetching */\n  enablePrefetch: boolean;\n\n  /** Callback on strategy change */\n  onStrategyChange?: (strategy: OptimizationStrategy) => void;\n\n  /** Callback on network change */\n  onNetworkChange?: (profile: NetworkProfile) => void;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: BandwidthOptimizerConfig = {\n  autoOptimize: true,\n  preferredCompression: 'gzip',\n  preferredFormat: 'fp16',\n  qualityThresholds: {\n    ultraMinBandwidth: 50,\n    highMinBandwidth: 20,\n    mediumMinBandwidth: 5,\n    lowMinBandwidth: 1,\n  },\n  maxChunkSize: 64 * 1024, // 64KB\n  minChunkSize: 4 * 1024, // 4KB\n  enablePrefetch: true,\n};\n\n/**\n * Bandwidth Optimizer\n *\n * Optimizes network usage for edge inference.\n */\nexport class BandwidthOptimizer {\n  private config: BandwidthOptimizerConfig;\n  private networkProfile: NetworkProfile;\n  private currentStrategy: OptimizationStrategy;\n  private stats: TransferStats;\n  private networkMonitorInterval: ReturnType<typeof setInterval> | null = null;\n\n  constructor(config: Partial<BandwidthOptimizerConfig> = {}) {\n    this.config = { ...DEFAULT_CONFIG, ...config };\n    this.networkProfile = this.detectNetworkProfile();\n    this.currentStrategy = this.calculateStrategy();\n    this.stats = this.createEmptyStats();\n  }\n\n  /**\n   * Create empty stats\n   */\n  private createEmptyStats(): TransferStats {\n    return {\n      bytesSent: 0,\n      bytesReceived: 0,\n      bytesSaved: 0,\n      compressionRatio: 1,\n      avgSpeed: 0,\n      transferCount: 0,\n      failedTransfers: 0,\n    };\n  }\n\n  /**\n   * Start network monitoring\n   */\n  startMonitoring(intervalMs = 5000): void {\n    if (this.networkMonitorInterval) return;\n\n    // Listen for connection changes\n    const connection = (\n      navigator as Navigator & { connection?: NetworkInformation }\n    ).connection;\n    if (connection) {\n      connection.addEventListener('change', () => this.handleNetworkChange());\n    }\n\n    // Periodic monitoring\n    this.networkMonitorInterval = setInterval(() => {\n      this.updateNetworkProfile();\n    }, intervalMs);\n  }\n\n  /**\n   * Stop network monitoring\n   */\n  stopMonitoring(): void {\n    if (this.networkMonitorInterval) {\n      clearInterval(this.networkMonitorInterval);\n      this.networkMonitorInterval = null;\n    }\n  }\n\n  /**\n   * Detect current network profile\n   */\n  private detectNetworkProfile(): NetworkProfile {\n    const connection = (\n      navigator as Navigator & { connection?: NetworkInformation }\n    ).connection;\n\n    const profile: NetworkProfile = {\n      bandwidthMbps: 10, // Conservative default\n      rttMs: 100,\n      packetLoss: 0,\n      connectionType: 'unknown',\n      dataSaver: false,\n      metered: false,\n    };\n\n    if (connection) {\n      profile.bandwidthMbps = connection.downlink || 10;\n      profile.rttMs = connection.rtt || 100;\n      profile.dataSaver = connection.saveData || false;\n      profile.connectionType = this.mapEffectiveType(connection.effectiveType);\n    }\n\n    return profile;\n  }\n\n  /**\n   * Map effective type to connection type\n   */\n  private mapEffectiveType(\n    effectiveType?: string\n  ): NetworkProfile['connectionType'] {\n    switch (effectiveType) {\n      case 'slow-2g':\n        return 'slow-2g';\n      case '2g':\n        return '2g';\n      case '3g':\n        return '3g';\n      case '4g':\n        return '4g';\n      default:\n        return 'unknown';\n    }\n  }\n\n  /**\n   * Update network profile\n   */\n  private updateNetworkProfile(): void {\n    const newProfile = this.detectNetworkProfile();\n\n    // Check if profile changed significantly\n    const significantChange =\n      Math.abs(newProfile.bandwidthMbps - this.networkProfile.bandwidthMbps) >\n        5 ||\n      Math.abs(newProfile.rttMs - this.networkProfile.rttMs) > 50 ||\n      newProfile.connectionType !== this.networkProfile.connectionType;\n\n    if (significantChange) {\n      this.networkProfile = newProfile;\n      this.config.onNetworkChange?.(newProfile);\n\n      if (this.config.autoOptimize) {\n        this.recalculateStrategy();\n      }\n    }\n  }\n\n  /**\n   * Handle network change event\n   */\n  private handleNetworkChange(): void {\n    this.updateNetworkProfile();\n  }\n\n  /**\n   * Calculate optimization strategy\n   */\n  private calculateStrategy(): OptimizationStrategy {\n    const { bandwidthMbps, dataSaver, metered } = this.networkProfile;\n    const thresholds = this.config.qualityThresholds;\n\n    // Determine quality level\n    let quality: QualityLevel;\n    if (dataSaver || metered) {\n      quality = 'minimal';\n    } else if (bandwidthMbps >= thresholds.ultraMinBandwidth) {\n      quality = 'ultra';\n    } else if (bandwidthMbps >= thresholds.highMinBandwidth) {\n      quality = 'high';\n    } else if (bandwidthMbps >= thresholds.mediumMinBandwidth) {\n      quality = 'medium';\n    } else if (bandwidthMbps >= thresholds.lowMinBandwidth) {\n      quality = 'low';\n    } else {\n      quality = 'minimal';\n    }\n\n    // Determine format based on quality\n    let format: TransferFormat;\n    switch (quality) {\n      case 'ultra':\n        format = 'fp32';\n        break;\n      case 'high':\n        format = 'fp16';\n        break;\n      case 'medium':\n        format = 'fp16';\n        break;\n      case 'low':\n        format = 'fp8';\n        break;\n      case 'minimal':\n        format = 'int8';\n        break;\n    }\n\n    // Use preferred format if it's more compact\n    const formatOrder: TransferFormat[] = [\n      'fp32',\n      'fp16',\n      'fp8',\n      'int8',\n      'int4',\n    ];\n    const preferredIndex = formatOrder.indexOf(this.config.preferredFormat);\n    const calculatedIndex = formatOrder.indexOf(format);\n    if (preferredIndex > calculatedIndex) {\n      format = this.config.preferredFormat;\n    }\n\n    // Determine compression\n    let compression: CompressionAlgorithm = this.config.preferredCompression;\n    if (quality === 'ultra' && bandwidthMbps > 100) {\n      compression = 'none'; // Don't compress on very fast connections\n    } else if (quality === 'minimal') {\n      compression = 'brotli'; // Maximum compression for slow connections\n    }\n\n    // Calculate chunk size\n    const chunkSize = this.calculateChunkSize(bandwidthMbps);\n\n    // Determine concurrency\n    let maxConcurrent: number;\n    if (bandwidthMbps > 20) {\n      maxConcurrent = 6;\n    } else if (bandwidthMbps > 5) {\n      maxConcurrent = 4;\n    } else {\n      maxConcurrent = 2;\n    }\n\n    return {\n      format,\n      compression,\n      quality,\n      chunkSize,\n      prefetch: this.config.enablePrefetch && quality !== 'minimal',\n      maxConcurrent,\n      useDelta: quality !== 'ultra', // Use delta for non-ultra quality\n      estimatedSaving: this.estimateSaving(format, compression),\n    };\n  }\n\n  /**\n   * Calculate optimal chunk size\n   */\n  private calculateChunkSize(bandwidthMbps: number): number {\n    // Target ~100ms per chunk for smooth streaming\n    const targetTimeMs = 100;\n    const bytesPerMs = (bandwidthMbps * 1024 * 1024) / 8 / 1000;\n    const optimalSize = Math.round(bytesPerMs * targetTimeMs);\n\n    return Math.max(\n      this.config.minChunkSize,\n      Math.min(this.config.maxChunkSize, optimalSize)\n    );\n  }\n\n  /**\n   * Estimate bandwidth saving\n   */\n  private estimateSaving(\n    format: TransferFormat,\n    compression: CompressionAlgorithm\n  ): number {\n    let saving = 0;\n\n    // Format savings (relative to fp32)\n    switch (format) {\n      case 'fp16':\n        saving += 0.5;\n        break;\n      case 'fp8':\n        saving += 0.75;\n        break;\n      case 'int8':\n        saving += 0.75;\n        break;\n      case 'int4':\n        saving += 0.875;\n        break;\n    }\n\n    // Compression savings (approximate)\n    switch (compression) {\n      case 'gzip':\n        saving += 0.1;\n        break;\n      case 'brotli':\n        saving += 0.15;\n        break;\n      case 'lz4':\n        saving += 0.05;\n        break;\n      case 'zstd':\n        saving += 0.12;\n        break;\n    }\n\n    return Math.min(0.95, saving);\n  }\n\n  /**\n   * Recalculate strategy\n   */\n  private recalculateStrategy(): void {\n    const newStrategy = this.calculateStrategy();\n\n    // Check if strategy changed\n    const changed =\n      newStrategy.format !== this.currentStrategy.format ||\n      newStrategy.compression !== this.currentStrategy.compression ||\n      newStrategy.quality !== this.currentStrategy.quality;\n\n    if (changed) {\n      this.currentStrategy = newStrategy;\n      this.config.onStrategyChange?.(newStrategy);\n    }\n  }\n\n  /**\n   * Get current strategy\n   */\n  getStrategy(): OptimizationStrategy {\n    return { ...this.currentStrategy };\n  }\n\n  /**\n   * Get network profile\n   */\n  getNetworkProfile(): NetworkProfile {\n    return { ...this.networkProfile };\n  }\n\n  /**\n   * Set manual strategy override\n   */\n  setStrategy(strategy: Partial<OptimizationStrategy>): void {\n    this.currentStrategy = { ...this.currentStrategy, ...strategy };\n    this.config.onStrategyChange?.(this.currentStrategy);\n  }\n\n  /**\n   * Optimize request headers\n   */\n  getOptimizedHeaders(): Record<string, string> {\n    const headers: Record<string, string> = {};\n\n    // Request format\n    headers['X-Transfer-Format'] = this.currentStrategy.format;\n\n    // Request compression\n    if (this.currentStrategy.compression !== 'none') {\n      switch (this.currentStrategy.compression) {\n        case 'gzip':\n          headers['Accept-Encoding'] = 'gzip';\n          break;\n        case 'brotli':\n          headers['Accept-Encoding'] = 'br';\n          break;\n        case 'zstd':\n          headers['Accept-Encoding'] = 'zstd';\n          break;\n        case 'lz4':\n          headers['Accept-Encoding'] = 'lz4';\n          break;\n      }\n    }\n\n    // Quality hint\n    headers['X-Quality-Level'] = this.currentStrategy.quality;\n\n    // Delta support\n    if (this.currentStrategy.useDelta) {\n      headers['X-Delta-Encoding'] = 'supported';\n    }\n\n    return headers;\n  }\n\n  /**\n   * Optimize request body\n   */\n  async optimizeBody(body: ArrayBuffer | Blob | string): Promise<{\n    data: ArrayBuffer | Blob | string;\n    headers: Record<string, string>;\n    originalSize: number;\n    optimizedSize: number;\n  }> {\n    const originalSize = this.getBodySize(body);\n    let data = body;\n    const headers: Record<string, string> = {};\n\n    // Apply compression if available and beneficial\n    if (originalSize > 1024 && this.currentStrategy.compression !== 'none') {\n      try {\n        const compressed = await this.compress(body);\n        if (compressed.size < originalSize * 0.9) {\n          data = compressed.data;\n          headers['Content-Encoding'] = compressed.encoding;\n        }\n      } catch (error) {\n        // Fall back to uncompressed\n      }\n    }\n\n    const optimizedSize = this.getBodySize(data);\n\n    // Update stats\n    this.stats.bytesSent += optimizedSize;\n    this.stats.bytesSaved += originalSize - optimizedSize;\n    this.stats.transferCount++;\n    this.updateCompressionRatio();\n\n    return {\n      data,\n      headers,\n      originalSize,\n      optimizedSize,\n    };\n  }\n\n  /**\n   * Get body size\n   */\n  private getBodySize(body: ArrayBuffer | Blob | string): number {\n    if (body instanceof ArrayBuffer) {\n      return body.byteLength;\n    }\n    if (body instanceof Blob) {\n      return body.size;\n    }\n    return new TextEncoder().encode(body).length;\n  }\n\n  /**\n   * Compress data\n   */\n  private async compress(data: ArrayBuffer | Blob | string): Promise<{\n    data: ArrayBuffer | Blob;\n    encoding: string;\n    size: number;\n  }> {\n    // Convert to Uint8Array\n    let bytes: Uint8Array;\n    if (data instanceof ArrayBuffer) {\n      bytes = new Uint8Array(data);\n    } else if (data instanceof Blob) {\n      bytes = new Uint8Array(await data.arrayBuffer());\n    } else {\n      bytes = new TextEncoder().encode(data);\n    }\n\n    // Use CompressionStream if available\n    if ('CompressionStream' in globalThis) {\n      const algorithm =\n        this.currentStrategy.compression === 'gzip' ? 'gzip' : 'deflate';\n      const cs = new CompressionStream(algorithm);\n      const writer = cs.writable.getWriter();\n      const reader = cs.readable.getReader();\n\n      // Cast to Uint8Array for writer.write\n      writer.write(new Uint8Array(bytes));\n      writer.close();\n\n      const chunks: Uint8Array[] = [];\n      let totalLength = 0;\n\n      while (true) {\n        const { done, value } = await reader.read();\n        if (done) break;\n        chunks.push(value);\n        totalLength += value.length;\n      }\n\n      const compressed = new Uint8Array(totalLength);\n      let offset = 0;\n      for (const chunk of chunks) {\n        compressed.set(chunk, offset);\n        offset += chunk.length;\n      }\n\n      return {\n        data: compressed.buffer as ArrayBuffer,\n        encoding: algorithm === 'gzip' ? 'gzip' : 'deflate',\n        size: compressed.length,\n      };\n    }\n\n    // Fallback: no compression\n    return {\n      data: (bytes.buffer as ArrayBuffer) || new ArrayBuffer(0),\n      encoding: 'identity',\n      size: bytes.length,\n    };\n  }\n\n  /**\n   * Decompress response\n   */\n  async decompressResponse(response: Response): Promise<ArrayBuffer> {\n    const encoding = response.headers.get('Content-Encoding');\n    const data = await response.arrayBuffer();\n\n    if (!encoding || encoding === 'identity') {\n      return data;\n    }\n\n    // Use DecompressionStream if available\n    if ('DecompressionStream' in globalThis) {\n      const algorithm = encoding === 'gzip' ? 'gzip' : 'deflate';\n      const ds = new DecompressionStream(algorithm);\n      const writer = ds.writable.getWriter();\n      const reader = ds.readable.getReader();\n\n      writer.write(new Uint8Array(data));\n      writer.close();\n\n      const chunks: Uint8Array[] = [];\n      let totalLength = 0;\n\n      while (true) {\n        const { done, value } = await reader.read();\n        if (done) break;\n        chunks.push(value);\n        totalLength += value.length;\n      }\n\n      const decompressed = new Uint8Array(totalLength);\n      let offset = 0;\n      for (const chunk of chunks) {\n        decompressed.set(chunk, offset);\n        offset += chunk.length;\n      }\n\n      return decompressed.buffer;\n    }\n\n    return data;\n  }\n\n  /**\n   * Record transfer\n   */\n  recordTransfer(bytes: number, failed = false): void {\n    if (failed) {\n      this.stats.failedTransfers++;\n    } else {\n      this.stats.bytesReceived += bytes;\n      this.stats.transferCount++;\n    }\n  }\n\n  /**\n   * Update compression ratio\n   */\n  private updateCompressionRatio(): void {\n    const totalOriginal = this.stats.bytesSent + this.stats.bytesSaved;\n    if (totalOriginal > 0) {\n      this.stats.compressionRatio = this.stats.bytesSent / totalOriginal;\n    }\n  }\n\n  /**\n   * Get transfer stats\n   */\n  getStats(): TransferStats {\n    return { ...this.stats };\n  }\n\n  /**\n   * Reset stats\n   */\n  resetStats(): void {\n    this.stats = this.createEmptyStats();\n  }\n\n  /**\n   * Get quality for current network\n   */\n  getRecommendedQuality(): QualityLevel {\n    return this.currentStrategy.quality;\n  }\n\n  /**\n   * Check if network is suitable for operation\n   */\n  isNetworkSuitable(minBandwidth: number): boolean {\n    return this.networkProfile.bandwidthMbps >= minBandwidth;\n  }\n}\n\n/**\n * Network Information API types\n */\ninterface NetworkInformation extends EventTarget {\n  effectiveType?: string;\n  downlink?: number;\n  rtt?: number;\n  saveData?: boolean;\n}\n\n/**\n * Pre-configured optimizer presets\n */\nexport const BANDWIDTH_PRESETS = {\n  /** Maximum quality, no optimization */\n  maxQuality: {\n    autoOptimize: false,\n    preferredFormat: 'fp32' as TransferFormat,\n    preferredCompression: 'none' as CompressionAlgorithm,\n  } as Partial<BandwidthOptimizerConfig>,\n\n  /** Balanced quality and bandwidth */\n  balanced: {\n    autoOptimize: true,\n    preferredFormat: 'fp16' as TransferFormat,\n    preferredCompression: 'gzip' as CompressionAlgorithm,\n  } as Partial<BandwidthOptimizerConfig>,\n\n  /** Aggressive optimization for slow networks */\n  dataSaver: {\n    autoOptimize: true,\n    preferredFormat: 'int8' as TransferFormat,\n    preferredCompression: 'brotli' as CompressionAlgorithm,\n    enablePrefetch: false,\n    qualityThresholds: {\n      ultraMinBandwidth: 100,\n      highMinBandwidth: 50,\n      mediumMinBandwidth: 10,\n      lowMinBandwidth: 2,\n    },\n  } as Partial<BandwidthOptimizerConfig>,\n};\n","/**\n * Model Preloader\n *\n * Predictive model loading and cache warming:\n * - Preload models before they're needed\n * - LRU-based model eviction\n * - Priority-based loading queue\n * - Background weight fetching\n * - Speculative prefetching\n */\n\n/**\n * Preload priority\n */\nexport type PreloadPriority =\n  | 'critical'\n  | 'high'\n  | 'typical'\n  | 'low'\n  | 'background';\n\n/**\n * Model load state\n */\nexport type ModelLoadState =\n  | 'unknown'\n  | 'queued'\n  | 'downloading'\n  | 'parsing'\n  | 'initializing'\n  | 'ready'\n  | 'error'\n  | 'evicted';\n\n/**\n * Model metadata\n */\nexport interface ModelMetadata {\n  /** Model ID */\n  id: string;\n\n  /** Human-readable name */\n  name: string;\n\n  /** Model version */\n  version: string;\n\n  /** Size in bytes */\n  sizeBytes: number;\n\n  /** Required features */\n  requiredFeatures: ('webgpu' | 'wasm' | 'simd')[];\n\n  /** Model family (for similar model detection) */\n  family?: string;\n\n  /** Tags for matching */\n  tags?: string[];\n\n  /** Model URL */\n  url?: string;\n\n  /** CDN URL (for faster loading) */\n  cdnUrl?: string;\n}\n\n/**\n * Model load progress\n */\nexport interface ModelLoadProgress {\n  /** Model ID */\n  modelId: string;\n\n  /** Current state */\n  state: ModelLoadState;\n\n  /** Download progress (0-1) */\n  downloadProgress: number;\n\n  /** Bytes downloaded */\n  bytesDownloaded: number;\n\n  /** Total bytes */\n  totalBytes: number;\n\n  /** Download speed in bytes/s */\n  speed: number;\n\n  /** Estimated time remaining in ms */\n  estimatedTimeMs: number;\n\n  /** Error if any */\n  error?: string;\n}\n\n/**\n * Preload request\n */\nexport interface PreloadRequest {\n  /** Model ID */\n  modelId: string;\n\n  /** Priority */\n  priority: PreloadPriority;\n\n  /** Requested timestamp */\n  requestedAt: number;\n\n  /** Callback on ready */\n  onReady?: () => void;\n\n  /** Callback on progress */\n  onProgress?: (progress: ModelLoadProgress) => void;\n\n  /** Callback on error */\n  onError?: (error: Error) => void;\n}\n\n/**\n * Cache entry\n */\ninterface CacheEntry {\n  /** Model ID */\n  modelId: string;\n\n  /** Model metadata */\n  metadata: ModelMetadata;\n\n  /** Load state */\n  state: ModelLoadState;\n\n  /** Loaded timestamp */\n  loadedAt: number;\n\n  /** Last accessed timestamp */\n  lastAccessedAt: number;\n\n  /** Access count */\n  accessCount: number;\n\n  /** Size in bytes */\n  sizeBytes: number;\n}\n\n/**\n * Usage pattern\n */\ninterface UsagePattern {\n  /** Model ID */\n  modelId: string;\n\n  /** Times used */\n  useCount: number;\n\n  /** Common context models (used together) */\n  contextModels: Map<string, number>;\n\n  /** Average session duration */\n  avgSessionDuration: number;\n\n  /** Last used timestamp */\n  lastUsed: number;\n}\n\n/**\n * Preloader configuration\n */\nexport interface ModelPreloaderConfig {\n  /** Maximum cache size in bytes */\n  maxCacheSize: number;\n\n  /** Maximum models to keep loaded */\n  maxModels: number;\n\n  /** Enable predictive prefetching */\n  enablePredictive: boolean;\n\n  /** Prediction confidence threshold (0-1) */\n  predictionThreshold: number;\n\n  /** Background fetch interval in ms */\n  backgroundInterval: number;\n\n  /** CDN base URL */\n  cdnBaseUrl?: string;\n\n  /** Callback on model ready */\n  onModelReady?: (modelId: string) => void;\n\n  /** Callback on model evicted */\n  onModelEvicted?: (modelId: string) => void;\n\n  /** Callback on cache full */\n  onCacheFull?: () => void;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: ModelPreloaderConfig = {\n  maxCacheSize: 500 * 1024 * 1024, // 500MB\n  maxModels: 5,\n  enablePredictive: true,\n  predictionThreshold: 0.5,\n  backgroundInterval: 60000,\n};\n\n/**\n * Priority order for sorting\n */\nconst PRIORITY_ORDER: Record<PreloadPriority, number> = {\n  critical: 0,\n  high: 1,\n  typical: 2,\n  low: 3,\n  background: 4,\n};\n\n/**\n * Model Preloader\n *\n * Manages model preloading with predictive prefetching.\n */\nexport class ModelPreloader {\n  private config: ModelPreloaderConfig;\n  private cache: Map<string, CacheEntry> = new Map();\n  private queue: PreloadRequest[] = [];\n  private activeDownloads: Map<string, AbortController> = new Map();\n  private usagePatterns: Map<string, UsagePattern> = new Map();\n  private modelRegistry: Map<string, ModelMetadata> = new Map();\n  private backgroundInterval: ReturnType<typeof setInterval> | null = null;\n  private currentCacheSize = 0;\n\n  constructor(config: Partial<ModelPreloaderConfig> = {}) {\n    this.config = { ...DEFAULT_CONFIG, ...config };\n  }\n\n  /**\n   * Start the preloader\n   */\n  start(): void {\n    if (this.backgroundInterval) return;\n\n    this.backgroundInterval = setInterval(\n      () => this.processBackgroundTasks(),\n      this.config.backgroundInterval\n    );\n\n    // Start processing queue\n    this.processQueue();\n  }\n\n  /**\n   * Stop the preloader\n   */\n  stop(): void {\n    if (this.backgroundInterval) {\n      clearInterval(this.backgroundInterval);\n      this.backgroundInterval = null;\n    }\n\n    // Cancel active downloads\n    for (const controller of this.activeDownloads.values()) {\n      controller.abort();\n    }\n    this.activeDownloads.clear();\n  }\n\n  /**\n   * Register a model\n   */\n  registerModel(metadata: ModelMetadata): void {\n    this.modelRegistry.set(metadata.id, metadata);\n  }\n\n  /**\n   * Preload a model\n   */\n  async preload(\n    modelId: string,\n    options: {\n      priority?: PreloadPriority;\n      onReady?: () => void;\n      onProgress?: (progress: ModelLoadProgress) => void;\n      onError?: (error: Error) => void;\n    } = {}\n  ): Promise<void> {\n    // Check if already loaded\n    const cached = this.cache.get(modelId);\n    if (cached && cached.state === 'ready') {\n      cached.lastAccessedAt = Date.now();\n      cached.accessCount++;\n      options.onReady?.();\n      return;\n    }\n\n    // Check if already queued\n    const existingIndex = this.queue.findIndex((r) => r.modelId === modelId);\n    if (existingIndex >= 0) {\n      // Update priority if higher\n      const existing = this.queue[existingIndex];\n      const newPriority = options.priority || 'typical';\n      if (PRIORITY_ORDER[newPriority] < PRIORITY_ORDER[existing.priority]) {\n        existing.priority = newPriority;\n        this.sortQueue();\n      }\n      // Add callbacks\n      if (options.onReady) {\n        const oldOnReady = existing.onReady;\n        existing.onReady = () => {\n          oldOnReady?.();\n          options.onReady?.();\n        };\n      }\n      return;\n    }\n\n    // Add to queue\n    const request: PreloadRequest = {\n      modelId,\n      priority: options.priority || 'typical',\n      requestedAt: Date.now(),\n      onReady: options.onReady,\n      onProgress: options.onProgress,\n      onError: options.onError,\n    };\n\n    this.queue.push(request);\n    this.sortQueue();\n\n    // Process queue\n    this.processQueue();\n  }\n\n  /**\n   * Sort queue by priority\n   */\n  private sortQueue(): void {\n    this.queue.sort((a, b) => {\n      const priorityDiff =\n        PRIORITY_ORDER[a.priority] - PRIORITY_ORDER[b.priority];\n      if (priorityDiff !== 0) return priorityDiff;\n      return a.requestedAt - b.requestedAt;\n    });\n  }\n\n  /**\n   * Process the preload queue\n   */\n  private async processQueue(): Promise<void> {\n    // Limit concurrent downloads\n    const maxConcurrent = 2;\n    while (this.activeDownloads.size < maxConcurrent && this.queue.length > 0) {\n      const request = this.queue.shift();\n      if (!request) break;\n\n      this.downloadModel(request);\n    }\n  }\n\n  /**\n   * Download a model\n   */\n  private async downloadModel(request: PreloadRequest): Promise<void> {\n    const { modelId } = request;\n\n    // Get metadata\n    const metadata = this.modelRegistry.get(modelId);\n    if (!metadata) {\n      request.onError?.(new Error(`Model not registered: ${modelId}`));\n      return;\n    }\n\n    // Check if we need to make room\n    const projectedSize = this.currentCacheSize + metadata.sizeBytes;\n    if (\n      projectedSize > this.config.maxCacheSize ||\n      this.cache.size >= this.config.maxModels\n    ) {\n      await this.evictModels(metadata.sizeBytes);\n    }\n\n    // Create abort controller\n    const controller = new AbortController();\n    this.activeDownloads.set(modelId, controller);\n\n    // Initialize cache entry\n    const entry: CacheEntry = {\n      modelId,\n      metadata,\n      state: 'downloading',\n      loadedAt: 0,\n      lastAccessedAt: Date.now(),\n      accessCount: 0,\n      sizeBytes: 0,\n    };\n    this.cache.set(modelId, entry);\n\n    try {\n      const url = metadata.cdnUrl || metadata.url;\n      if (!url) {\n        throw new Error(`No URL for model: ${modelId}`);\n      }\n\n      const response = await fetch(url, {\n        signal: controller.signal,\n      });\n\n      if (!response.ok) {\n        throw new Error(`Failed to fetch model: ${response.status}`);\n      }\n\n      const totalBytes =\n        parseInt(response.headers.get('Content-Length') || '0') ||\n        metadata.sizeBytes;\n      let downloadedBytes = 0;\n      const startTime = Date.now();\n\n      // Stream the response\n      const reader = response.body?.getReader();\n      if (!reader) {\n        throw new Error('Response body not readable');\n      }\n\n      const chunks: Uint8Array[] = [];\n\n      while (true) {\n        const { done, value } = await reader.read();\n\n        if (done) break;\n\n        chunks.push(value);\n        downloadedBytes += value.length;\n\n        // Report progress\n        const elapsed = Date.now() - startTime;\n        const speed = downloadedBytes / (elapsed / 1000);\n        const remaining = totalBytes - downloadedBytes;\n        const estimatedTime = (remaining / speed) * 1000;\n\n        request.onProgress?.({\n          modelId,\n          state: 'downloading',\n          downloadProgress: downloadedBytes / totalBytes,\n          bytesDownloaded: downloadedBytes,\n          totalBytes,\n          speed,\n          estimatedTimeMs: estimatedTime,\n        });\n      }\n\n      // Combine chunks\n      entry.state = 'parsing';\n      request.onProgress?.({\n        modelId,\n        state: 'parsing',\n        downloadProgress: 1,\n        bytesDownloaded: downloadedBytes,\n        totalBytes,\n        speed: 0,\n        estimatedTimeMs: 0,\n      });\n\n      // Store the model (in real implementation, this would parse and initialize)\n      entry.state = 'initializing';\n\n      // Simulate initialization\n      await new Promise((resolve) => setTimeout(resolve, 100));\n\n      // Mark as ready\n      entry.state = 'ready';\n      entry.loadedAt = Date.now();\n      entry.sizeBytes = downloadedBytes;\n      this.currentCacheSize += downloadedBytes;\n\n      this.config.onModelReady?.(modelId);\n      request.onReady?.();\n    } catch (error) {\n      if (error instanceof Error && error.name === 'AbortError') {\n        entry.state = 'evicted';\n      } else {\n        entry.state = 'error';\n        request.onError?.(\n          error instanceof Error ? error : new Error(String(error))\n        );\n      }\n    } finally {\n      this.activeDownloads.delete(modelId);\n      this.processQueue();\n    }\n  }\n\n  /**\n   * Evict models to make room\n   */\n  private async evictModels(neededBytes: number): Promise<void> {\n    // Get eviction candidates (LRU, not in active use)\n    const candidates = Array.from(this.cache.values())\n      .filter((e) => e.state === 'ready')\n      .sort((a, b) => {\n        // Prefer evicting less accessed models\n        const accessScore = (b.accessCount - a.accessCount) * 1000;\n        // Prefer evicting older models\n        const ageScore = a.lastAccessedAt - b.lastAccessedAt;\n        return accessScore + ageScore;\n      });\n\n    let freedBytes = 0;\n    const toEvict: string[] = [];\n\n    for (const candidate of candidates) {\n      if (\n        this.currentCacheSize - freedBytes + neededBytes <=\n          this.config.maxCacheSize &&\n        this.cache.size - toEvict.length < this.config.maxModels\n      ) {\n        break;\n      }\n      toEvict.push(candidate.modelId);\n      freedBytes += candidate.sizeBytes;\n    }\n\n    // Perform eviction\n    for (const modelId of toEvict) {\n      await this.evictModel(modelId);\n    }\n\n    if (toEvict.length > 0) {\n      this.config.onCacheFull?.();\n    }\n  }\n\n  /**\n   * Evict a specific model\n   */\n  private async evictModel(modelId: string): Promise<void> {\n    const entry = this.cache.get(modelId);\n    if (!entry) return;\n\n    // Cancel if downloading\n    const controller = this.activeDownloads.get(modelId);\n    if (controller) {\n      controller.abort();\n      this.activeDownloads.delete(modelId);\n    }\n\n    this.currentCacheSize -= entry.sizeBytes;\n    entry.state = 'evicted';\n    this.cache.delete(modelId);\n\n    this.config.onModelEvicted?.(modelId);\n  }\n\n  /**\n   * Record model usage\n   */\n  recordUsage(modelId: string, contextModelIds: string[] = []): void {\n    // Update access\n    const cached = this.cache.get(modelId);\n    if (cached) {\n      cached.lastAccessedAt = Date.now();\n      cached.accessCount++;\n    }\n\n    // Update usage pattern\n    let pattern = this.usagePatterns.get(modelId);\n    if (!pattern) {\n      pattern = {\n        modelId,\n        useCount: 0,\n        contextModels: new Map(),\n        avgSessionDuration: 0,\n        lastUsed: 0,\n      };\n      this.usagePatterns.set(modelId, pattern);\n    }\n\n    pattern.useCount++;\n    pattern.lastUsed = Date.now();\n\n    // Track context models\n    for (const contextId of contextModelIds) {\n      const count = pattern.contextModels.get(contextId) || 0;\n      pattern.contextModels.set(contextId, count + 1);\n    }\n\n    // Predictive prefetching\n    if (this.config.enablePredictive) {\n      this.triggerPredictivePrefetch(modelId);\n    }\n  }\n\n  /**\n   * Trigger predictive prefetching\n   */\n  private triggerPredictivePrefetch(currentModelId: string): void {\n    const pattern = this.usagePatterns.get(currentModelId);\n    if (!pattern) return;\n\n    // Find models commonly used together\n    const predictions: Array<{ modelId: string; confidence: number }> = [];\n\n    for (const [contextId, count] of pattern.contextModels) {\n      const confidence = count / pattern.useCount;\n      if (confidence >= this.config.predictionThreshold) {\n        predictions.push({ modelId: contextId, confidence });\n      }\n    }\n\n    // Sort by confidence and prefetch\n    predictions.sort((a, b) => b.confidence - a.confidence);\n\n    for (const prediction of predictions.slice(0, 2)) {\n      // Only prefetch if not already loaded\n      const cached = this.cache.get(prediction.modelId);\n      if (!cached || cached.state === 'evicted') {\n        this.preload(prediction.modelId, { priority: 'background' });\n      }\n    }\n  }\n\n  /**\n   * Process background tasks\n   */\n  private processBackgroundTasks(): void {\n    // Clean up evicted entries\n    for (const [modelId, entry] of this.cache) {\n      if (entry.state === 'evicted') {\n        this.cache.delete(modelId);\n      }\n    }\n\n    // Predictive loading based on time patterns\n    if (this.config.enablePredictive) {\n      this.predictBasedOnTime();\n    }\n  }\n\n  /**\n   * Predict models needed based on time\n   */\n  private predictBasedOnTime(): void {\n    // Find models used frequently at this time\n    const now = new Date();\n    const currentHour = now.getHours();\n\n    // This would use historical data in a real implementation\n    // For now, just ensure frequently used models are loaded\n    const frequentModels = Array.from(this.usagePatterns.values())\n      .filter((p) => p.useCount > 5)\n      .sort((a, b) => b.useCount - a.useCount)\n      .slice(0, 3);\n\n    for (const pattern of frequentModels) {\n      const cached = this.cache.get(pattern.modelId);\n      if (!cached || cached.state === 'evicted' || cached.state === 'error') {\n        this.preload(pattern.modelId, { priority: 'background' });\n      }\n    }\n  }\n\n  /**\n   * Check if model is ready\n   */\n  isReady(modelId: string): boolean {\n    const cached = this.cache.get(modelId);\n    return cached?.state === 'ready';\n  }\n\n  /**\n   * Get model load state\n   */\n  getState(modelId: string): ModelLoadState {\n    const cached = this.cache.get(modelId);\n    return cached?.state || 'unknown';\n  }\n\n  /**\n   * Get all cached models\n   */\n  getCachedModels(): Array<{\n    modelId: string;\n    state: ModelLoadState;\n    sizeBytes: number;\n    lastAccessed: number;\n    accessCount: number;\n  }> {\n    return Array.from(this.cache.values()).map((e) => ({\n      modelId: e.modelId,\n      state: e.state,\n      sizeBytes: e.sizeBytes,\n      lastAccessed: e.lastAccessedAt,\n      accessCount: e.accessCount,\n    }));\n  }\n\n  /**\n   * Get cache statistics\n   */\n  getStats(): {\n    totalModels: number;\n    readyModels: number;\n    cacheSize: number;\n    maxCacheSize: number;\n    queueSize: number;\n    activeDownloads: number;\n  } {\n    const readyCount = Array.from(this.cache.values()).filter(\n      (e) => e.state === 'ready'\n    ).length;\n\n    return {\n      totalModels: this.cache.size,\n      readyModels: readyCount,\n      cacheSize: this.currentCacheSize,\n      maxCacheSize: this.config.maxCacheSize,\n      queueSize: this.queue.length,\n      activeDownloads: this.activeDownloads.size,\n    };\n  }\n\n  /**\n   * Clear all cached models\n   */\n  async clearCache(): Promise<void> {\n    // Cancel all downloads\n    for (const controller of this.activeDownloads.values()) {\n      controller.abort();\n    }\n    this.activeDownloads.clear();\n\n    // Clear cache\n    this.cache.clear();\n    this.currentCacheSize = 0;\n\n    // Clear queue\n    this.queue = [];\n  }\n\n  /**\n   * Warm cache with common models\n   */\n  async warmCache(modelIds: string[]): Promise<void> {\n    for (const modelId of modelIds) {\n      await this.preload(modelId, { priority: 'high' });\n    }\n  }\n}\n\n/**\n * Pre-configured preloader presets\n */\nexport const PRELOADER_PRESETS = {\n  /** Aggressive preloading for fast devices */\n  aggressive: {\n    maxCacheSize: 1024 * 1024 * 1024, // 1GB\n    maxModels: 10,\n    enablePredictive: true,\n    predictionThreshold: 0.3,\n    backgroundInterval: 30000,\n  } as Partial<ModelPreloaderConfig>,\n\n  /** Conservative for limited devices */\n  conservative: {\n    maxCacheSize: 200 * 1024 * 1024, // 200MB\n    maxModels: 3,\n    enablePredictive: false,\n    backgroundInterval: 120000,\n  } as Partial<ModelPreloaderConfig>,\n\n  /** Balanced for typical devices */\n  balanced: {\n    maxCacheSize: 500 * 1024 * 1024, // 500MB\n    maxModels: 5,\n    enablePredictive: true,\n    predictionThreshold: 0.5,\n    backgroundInterval: 60000,\n  } as Partial<ModelPreloaderConfig>,\n};\n","/**\n * Cache Coordinator\n *\n * Coordinates caching across multiple layers:\n * - Cross-tab KV cache sharing\n * - Cache invalidation\n * - Distributed cache synchronization\n * - Cache statistics and monitoring\n */\n\n/**\n * Cache layer\n */\nexport type CacheLayer = 'memory' | 'indexeddb' | 'opfs' | 'broadcast' | 'edge';\n\n/**\n * Cache entry\n */\nexport interface CacheEntry<T = unknown> {\n  /** Cache key */\n  key: string;\n\n  /** Cached value */\n  value: T;\n\n  /** Created timestamp */\n  createdAt: number;\n\n  /** Expires at timestamp (0 = never) */\n  expiresAt: number;\n\n  /** Size in bytes */\n  sizeBytes: number;\n\n  /** Hit count */\n  hitCount: number;\n\n  /** Version for conflict resolution */\n  version: number;\n\n  /** Tags for grouped invalidation */\n  tags: string[];\n\n  /** Source layer */\n  layer: CacheLayer;\n}\n\n/**\n * Cache invalidation reason\n */\nexport type InvalidationReason =\n  | 'expired'\n  | 'evicted'\n  | 'manual'\n  | 'tag'\n  | 'broadcast'\n  | 'version';\n\n/**\n * Cache event\n */\nexport interface CacheEvent {\n  type: 'hit' | 'miss' | 'set' | 'invalidate' | 'sync';\n  key: string;\n  layer: CacheLayer;\n  timestamp: number;\n  reason?: InvalidationReason;\n}\n\n/**\n * Cache statistics\n */\nexport interface CacheStats {\n  /** Total entries */\n  totalEntries: number;\n\n  /** Total size in bytes */\n  totalSizeBytes: number;\n\n  /** Hit count */\n  hits: number;\n\n  /** Miss count */\n  misses: number;\n\n  /** Hit rate (0-1) */\n  hitRate: number;\n\n  /** Entries per layer */\n  layerStats: Record<\n    CacheLayer,\n    {\n      entries: number;\n      sizeBytes: number;\n    }\n  >;\n\n  /** Eviction count */\n  evictions: number;\n\n  /** Average entry age in ms */\n  avgAgeMs: number;\n}\n\n/**\n * KV cache entry for LLM inference\n */\nexport interface KVCacheEntry {\n  /** Model ID */\n  modelId: string;\n\n  /** Prompt hash for cache key */\n  promptHash: string;\n\n  /** Key cache tensor */\n  keys: Float32Array | ArrayBuffer;\n\n  /** Value cache tensor */\n  values: Float32Array | ArrayBuffer;\n\n  /** Sequence length */\n  seqLength: number;\n\n  /** Number of layers */\n  numLayers: number;\n\n  /** Attention heads */\n  numHeads: number;\n\n  /** Head dimension */\n  headDim: number;\n\n  /** Created at */\n  createdAt: number;\n\n  /** Size in bytes */\n  sizeBytes: number;\n}\n\n/**\n * Coordinator configuration\n */\nexport interface CacheCoordinatorConfig {\n  /** Enable cross-tab sharing */\n  enableCrossTab: boolean;\n\n  /** Broadcast channel name */\n  broadcastChannelName: string;\n\n  /** Maximum memory cache size in bytes */\n  maxMemoryCacheSize: number;\n\n  /** Maximum entries in memory */\n  maxMemoryEntries: number;\n\n  /** Default TTL in ms */\n  defaultTTL: number;\n\n  /** Enable persistent cache */\n  enablePersistent: boolean;\n\n  /** Persistent cache name */\n  persistentCacheName: string;\n\n  /** Sync interval for cross-tab in ms */\n  syncInterval: number;\n\n  /** Callback on cache event */\n  onCacheEvent?: (event: CacheEvent) => void;\n\n  /** Callback on stats update */\n  onStatsUpdate?: (stats: CacheStats) => void;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: CacheCoordinatorConfig = {\n  enableCrossTab: true,\n  broadcastChannelName: 'edgework_cache_sync',\n  maxMemoryCacheSize: 100 * 1024 * 1024, // 100MB\n  maxMemoryEntries: 1000,\n  defaultTTL: 300000, // 5 minutes\n  enablePersistent: true,\n  persistentCacheName: 'edgework_cache_v1',\n  syncInterval: 5000,\n};\n\n/**\n * Generate cache key\n */\nfunction generateKey(prefix: string, ...parts: string[]): string {\n  return `${prefix}:${parts.join(':')}`;\n}\n\n/**\n * Calculate approximate size of value\n */\nfunction calculateSize(value: unknown): number {\n  if (value === null || value === undefined) return 0;\n  if (typeof value === 'string') return value.length * 2;\n  if (typeof value === 'number') return 8;\n  if (typeof value === 'boolean') return 4;\n  if (value instanceof ArrayBuffer) return value.byteLength;\n  if (ArrayBuffer.isView(value)) return value.byteLength;\n  return JSON.stringify(value).length * 2;\n}\n\n/**\n * Memory cache layer\n */\nclass MemoryCache {\n  private cache: Map<string, CacheEntry> = new Map();\n  private maxSize: number;\n  private maxEntries: number;\n  private currentSize = 0;\n\n  constructor(maxSize: number, maxEntries: number) {\n    this.maxSize = maxSize;\n    this.maxEntries = maxEntries;\n  }\n\n  get<T>(key: string): CacheEntry<T> | null {\n    const entry = this.cache.get(key) as CacheEntry<T> | undefined;\n    if (!entry) return null;\n\n    // Check expiration\n    if (entry.expiresAt > 0 && entry.expiresAt < Date.now()) {\n      this.delete(key);\n      return null;\n    }\n\n    entry.hitCount++;\n    return entry;\n  }\n\n  set<T>(\n    key: string,\n    value: T,\n    options: {\n      ttl?: number;\n      tags?: string[];\n      version?: number;\n    } = {}\n  ): CacheEntry<T> {\n    // Remove existing\n    if (this.cache.has(key)) {\n      this.delete(key);\n    }\n\n    const sizeBytes = calculateSize(value);\n\n    // Evict if necessary\n    while (\n      (this.currentSize + sizeBytes > this.maxSize ||\n        this.cache.size >= this.maxEntries) &&\n      this.cache.size > 0\n    ) {\n      this.evictLRU();\n    }\n\n    const entry: CacheEntry<T> = {\n      key,\n      value,\n      createdAt: Date.now(),\n      expiresAt: options.ttl ? Date.now() + options.ttl : 0,\n      sizeBytes,\n      hitCount: 0,\n      version: options.version || 1,\n      tags: options.tags || [],\n      layer: 'memory',\n    };\n\n    this.cache.set(key, entry as CacheEntry);\n    this.currentSize += sizeBytes;\n\n    return entry;\n  }\n\n  delete(key: string): boolean {\n    const entry = this.cache.get(key);\n    if (entry) {\n      this.currentSize -= entry.sizeBytes;\n      this.cache.delete(key);\n      return true;\n    }\n    return false;\n  }\n\n  private evictLRU(): void {\n    // Find entry with lowest hit count\n    let lruKey: string | null = null;\n    let lruHits = Infinity;\n\n    for (const [key, entry] of this.cache) {\n      if (entry.hitCount < lruHits) {\n        lruHits = entry.hitCount;\n        lruKey = key;\n      }\n    }\n\n    if (lruKey) {\n      this.delete(lruKey);\n    }\n  }\n\n  invalidateByTag(tag: string): number {\n    let count = 0;\n    for (const [key, entry] of this.cache) {\n      if (entry.tags.includes(tag)) {\n        this.delete(key);\n        count++;\n      }\n    }\n    return count;\n  }\n\n  clear(): void {\n    this.cache.clear();\n    this.currentSize = 0;\n  }\n\n  getStats(): { entries: number; sizeBytes: number } {\n    return {\n      entries: this.cache.size,\n      sizeBytes: this.currentSize,\n    };\n  }\n\n  entries(): IterableIterator<[string, CacheEntry]> {\n    return this.cache.entries();\n  }\n}\n\n/**\n * Cache Coordinator\n *\n * Coordinates caching across memory, persistent storage, and tabs.\n */\nexport class CacheCoordinator {\n  private config: CacheCoordinatorConfig;\n  private memoryCache: MemoryCache;\n  private broadcastChannel: BroadcastChannel | null = null;\n  private syncInterval: ReturnType<typeof setInterval> | null = null;\n  private stats: CacheStats;\n  private kvCache: Map<string, KVCacheEntry> = new Map();\n\n  constructor(config: Partial<CacheCoordinatorConfig> = {}) {\n    this.config = { ...DEFAULT_CONFIG, ...config };\n    this.memoryCache = new MemoryCache(\n      this.config.maxMemoryCacheSize,\n      this.config.maxMemoryEntries\n    );\n    this.stats = this.createEmptyStats();\n  }\n\n  /**\n   * Create empty stats\n   */\n  private createEmptyStats(): CacheStats {\n    return {\n      totalEntries: 0,\n      totalSizeBytes: 0,\n      hits: 0,\n      misses: 0,\n      hitRate: 0,\n      layerStats: {\n        memory: { entries: 0, sizeBytes: 0 },\n        indexeddb: { entries: 0, sizeBytes: 0 },\n        opfs: { entries: 0, sizeBytes: 0 },\n        broadcast: { entries: 0, sizeBytes: 0 },\n        edge: { entries: 0, sizeBytes: 0 },\n      },\n      evictions: 0,\n      avgAgeMs: 0,\n    };\n  }\n\n  /**\n   * Initialize the coordinator\n   */\n  async initialize(): Promise<void> {\n    // Set up broadcast channel for cross-tab communication\n    if (this.config.enableCrossTab && 'BroadcastChannel' in globalThis) {\n      this.broadcastChannel = new BroadcastChannel(\n        this.config.broadcastChannelName\n      );\n      this.broadcastChannel.onmessage = (event) =>\n        this.handleBroadcastMessage(event.data);\n    }\n\n    // Start sync interval\n    if (this.config.syncInterval > 0) {\n      this.syncInterval = setInterval(\n        () => this.syncStats(),\n        this.config.syncInterval\n      );\n    }\n  }\n\n  /**\n   * Shutdown the coordinator\n   */\n  async shutdown(): Promise<void> {\n    if (this.syncInterval) {\n      clearInterval(this.syncInterval);\n      this.syncInterval = null;\n    }\n\n    if (this.broadcastChannel) {\n      this.broadcastChannel.close();\n      this.broadcastChannel = null;\n    }\n  }\n\n  /**\n   * Get a cached value\n   */\n  async get<T>(\n    key: string,\n    options: {\n      layers?: CacheLayer[];\n    } = {}\n  ): Promise<T | null> {\n    const layers = options.layers || ['memory', 'indexeddb'];\n\n    for (const layer of layers) {\n      const entry = await this.getFromLayer<T>(key, layer);\n      if (entry) {\n        this.stats.hits++;\n        this.emitEvent({ type: 'hit', key, layer, timestamp: Date.now() });\n        return entry.value;\n      }\n    }\n\n    this.stats.misses++;\n    this.emitEvent({\n      type: 'miss',\n      key,\n      layer: 'memory',\n      timestamp: Date.now(),\n    });\n    return null;\n  }\n\n  /**\n   * Get from specific layer\n   */\n  private async getFromLayer<T>(\n    key: string,\n    layer: CacheLayer\n  ): Promise<CacheEntry<T> | null> {\n    switch (layer) {\n      case 'memory':\n        return this.memoryCache.get<T>(key);\n\n      case 'indexeddb':\n        return this.getFromIndexedDB<T>(key);\n\n      case 'opfs':\n        return this.getFromOPFS<T>(key);\n\n      default:\n        return null;\n    }\n  }\n\n  /**\n   * Get from IndexedDB\n   */\n  private async getFromIndexedDB<T>(\n    key: string\n  ): Promise<CacheEntry<T> | null> {\n    if (!this.config.enablePersistent) return null;\n\n    try {\n      const db = await this.openDB();\n      const tx = db.transaction('cache', 'readonly');\n      const store = tx.objectStore('cache');\n\n      return new Promise((resolve, reject) => {\n        const request = store.get(key);\n        request.onsuccess = () => {\n          const entry = request.result as CacheEntry<T> | undefined;\n          if (\n            entry &&\n            (entry.expiresAt === 0 || entry.expiresAt > Date.now())\n          ) {\n            resolve(entry);\n          } else {\n            resolve(null);\n          }\n        };\n        request.onerror = () => reject(request.error);\n      });\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Get from OPFS\n   */\n  private async getFromOPFS<T>(key: string): Promise<CacheEntry<T> | null> {\n    if (!('storage' in navigator && 'getDirectory' in navigator.storage)) {\n      return null;\n    }\n\n    try {\n      const root = await navigator.storage.getDirectory();\n      const cacheDir = await root.getDirectoryHandle('cache', { create: true });\n      const fileHandle = await cacheDir.getFileHandle(`${key}.json`);\n      const file = await fileHandle.getFile();\n      const text = await file.text();\n      return JSON.parse(text);\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Set a cached value\n   */\n  async set<T>(\n    key: string,\n    value: T,\n    options: {\n      ttl?: number;\n      tags?: string[];\n      layers?: CacheLayer[];\n      broadcast?: boolean;\n    } = {}\n  ): Promise<void> {\n    const layers = options.layers || ['memory'];\n    const ttl = options.ttl || this.config.defaultTTL;\n\n    for (const layer of layers) {\n      await this.setInLayer(key, value, { ...options, ttl }, layer);\n    }\n\n    this.emitEvent({\n      type: 'set',\n      key,\n      layer: layers[0],\n      timestamp: Date.now(),\n    });\n\n    // Broadcast to other tabs\n    if (options.broadcast !== false && this.broadcastChannel) {\n      this.broadcastChannel.postMessage({\n        type: 'cache_set',\n        key,\n        value,\n        options: { ttl, tags: options.tags },\n      });\n    }\n  }\n\n  /**\n   * Set in specific layer\n   */\n  private async setInLayer<T>(\n    key: string,\n    value: T,\n    options: { ttl?: number; tags?: string[] },\n    layer: CacheLayer\n  ): Promise<void> {\n    switch (layer) {\n      case 'memory':\n        this.memoryCache.set(key, value, options);\n        break;\n\n      case 'indexeddb':\n        await this.setInIndexedDB(key, value, options);\n        break;\n\n      case 'opfs':\n        await this.setInOPFS(key, value, options);\n        break;\n    }\n  }\n\n  /**\n   * Set in IndexedDB\n   */\n  private async setInIndexedDB<T>(\n    key: string,\n    value: T,\n    options: { ttl?: number; tags?: string[] }\n  ): Promise<void> {\n    if (!this.config.enablePersistent) return;\n\n    const entry: CacheEntry<T> = {\n      key,\n      value,\n      createdAt: Date.now(),\n      expiresAt: options.ttl ? Date.now() + options.ttl : 0,\n      sizeBytes: calculateSize(value),\n      hitCount: 0,\n      version: 1,\n      tags: options.tags || [],\n      layer: 'indexeddb',\n    };\n\n    const db = await this.openDB();\n    const tx = db.transaction('cache', 'readwrite');\n    const store = tx.objectStore('cache');\n\n    return new Promise((resolve, reject) => {\n      const request = store.put(entry);\n      request.onsuccess = () => resolve();\n      request.onerror = () => reject(request.error);\n    });\n  }\n\n  /**\n   * Set in OPFS\n   */\n  private async setInOPFS<T>(\n    key: string,\n    value: T,\n    options: { ttl?: number; tags?: string[] }\n  ): Promise<void> {\n    if (!('storage' in navigator && 'getDirectory' in navigator.storage)) {\n      return;\n    }\n\n    const entry: CacheEntry<T> = {\n      key,\n      value,\n      createdAt: Date.now(),\n      expiresAt: options.ttl ? Date.now() + options.ttl : 0,\n      sizeBytes: calculateSize(value),\n      hitCount: 0,\n      version: 1,\n      tags: options.tags || [],\n      layer: 'opfs',\n    };\n\n    const root = await navigator.storage.getDirectory();\n    const cacheDir = await root.getDirectoryHandle('cache', { create: true });\n    const fileHandle = await cacheDir.getFileHandle(`${key}.json`, {\n      create: true,\n    });\n    const writable = await fileHandle.createWritable();\n    await writable.write(JSON.stringify(entry));\n    await writable.close();\n  }\n\n  /**\n   * Open IndexedDB\n   */\n  private openDB(): Promise<IDBDatabase> {\n    return new Promise((resolve, reject) => {\n      const request = indexedDB.open(this.config.persistentCacheName, 1);\n\n      request.onerror = () => reject(request.error);\n      request.onsuccess = () => resolve(request.result);\n\n      request.onupgradeneeded = () => {\n        const db = request.result;\n        if (!db.objectStoreNames.contains('cache')) {\n          db.createObjectStore('cache', { keyPath: 'key' });\n        }\n        if (!db.objectStoreNames.contains('kv_cache')) {\n          db.createObjectStore('kv_cache', { keyPath: 'promptHash' });\n        }\n      };\n    });\n  }\n\n  /**\n   * Invalidate a cached value\n   */\n  async invalidate(\n    key: string,\n    options: {\n      layers?: CacheLayer[];\n      broadcast?: boolean;\n      reason?: InvalidationReason;\n    } = {}\n  ): Promise<void> {\n    const layers = options.layers || ['memory', 'indexeddb', 'opfs'];\n\n    for (const layer of layers) {\n      await this.invalidateInLayer(key, layer);\n    }\n\n    this.emitEvent({\n      type: 'invalidate',\n      key,\n      layer: layers[0],\n      timestamp: Date.now(),\n      reason: options.reason || 'manual',\n    });\n\n    // Broadcast to other tabs\n    if (options.broadcast !== false && this.broadcastChannel) {\n      this.broadcastChannel.postMessage({\n        type: 'cache_invalidate',\n        key,\n        reason: options.reason || 'manual',\n      });\n    }\n  }\n\n  /**\n   * Invalidate in specific layer\n   */\n  private async invalidateInLayer(\n    key: string,\n    layer: CacheLayer\n  ): Promise<void> {\n    switch (layer) {\n      case 'memory':\n        this.memoryCache.delete(key);\n        break;\n\n      case 'indexeddb':\n        await this.deleteFromIndexedDB(key);\n        break;\n\n      case 'opfs':\n        await this.deleteFromOPFS(key);\n        break;\n    }\n  }\n\n  /**\n   * Delete from IndexedDB\n   */\n  private async deleteFromIndexedDB(key: string): Promise<void> {\n    if (!this.config.enablePersistent) return;\n\n    const db = await this.openDB();\n    const tx = db.transaction('cache', 'readwrite');\n    const store = tx.objectStore('cache');\n\n    return new Promise((resolve, reject) => {\n      const request = store.delete(key);\n      request.onsuccess = () => resolve();\n      request.onerror = () => reject(request.error);\n    });\n  }\n\n  /**\n   * Delete from OPFS\n   */\n  private async deleteFromOPFS(key: string): Promise<void> {\n    if (!('storage' in navigator && 'getDirectory' in navigator.storage)) {\n      return;\n    }\n\n    try {\n      const root = await navigator.storage.getDirectory();\n      const cacheDir = await root.getDirectoryHandle('cache');\n      await cacheDir.removeEntry(`${key}.json`);\n    } catch {\n      // File doesn't exist\n    }\n  }\n\n  /**\n   * Invalidate by tag\n   */\n  async invalidateByTag(\n    tag: string,\n    options: {\n      layers?: CacheLayer[];\n      broadcast?: boolean;\n    } = {}\n  ): Promise<number> {\n    let count = 0;\n\n    // Memory cache\n    count += this.memoryCache.invalidateByTag(tag);\n\n    // Broadcast to other tabs\n    if (options.broadcast !== false && this.broadcastChannel) {\n      this.broadcastChannel.postMessage({\n        type: 'cache_invalidate_tag',\n        tag,\n      });\n    }\n\n    return count;\n  }\n\n  /**\n   * Store KV cache for LLM inference\n   */\n  async storeKVCache(entry: KVCacheEntry): Promise<void> {\n    const key = generateKey('kv', entry.modelId, entry.promptHash);\n    this.kvCache.set(key, entry);\n\n    // Also persist to IndexedDB\n    if (this.config.enablePersistent) {\n      try {\n        const db = await this.openDB();\n        const tx = db.transaction('kv_cache', 'readwrite');\n        const store = tx.objectStore('kv_cache');\n        await new Promise<void>((resolve, reject) => {\n          const request = store.put(entry);\n          request.onsuccess = () => resolve();\n          request.onerror = () => reject(request.error);\n        });\n      } catch {\n        // Silently fail for persistence\n      }\n    }\n  }\n\n  /**\n   * Get KV cache for LLM inference\n   */\n  async getKVCache(\n    modelId: string,\n    promptHash: string\n  ): Promise<KVCacheEntry | null> {\n    const key = generateKey('kv', modelId, promptHash);\n\n    // Check memory first\n    const memEntry = this.kvCache.get(key);\n    if (memEntry) {\n      return memEntry;\n    }\n\n    // Check IndexedDB\n    if (this.config.enablePersistent) {\n      try {\n        const db = await this.openDB();\n        const tx = db.transaction('kv_cache', 'readonly');\n        const store = tx.objectStore('kv_cache');\n        return new Promise((resolve, reject) => {\n          const request = store.get(promptHash);\n          request.onsuccess = () => resolve(request.result || null);\n          request.onerror = () => reject(request.error);\n        });\n      } catch {\n        return null;\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * Handle broadcast message\n   */\n  private handleBroadcastMessage(data: {\n    type: string;\n    key?: string;\n    value?: unknown;\n    options?: { ttl?: number; tags?: string[] };\n    tag?: string;\n    reason?: InvalidationReason;\n  }): void {\n    switch (data.type) {\n      case 'cache_set':\n        if (data.key && data.value !== undefined) {\n          this.memoryCache.set(data.key, data.value, data.options);\n        }\n        break;\n\n      case 'cache_invalidate':\n        if (data.key) {\n          this.memoryCache.delete(data.key);\n        }\n        break;\n\n      case 'cache_invalidate_tag':\n        if (data.tag) {\n          this.memoryCache.invalidateByTag(data.tag);\n        }\n        break;\n    }\n\n    this.emitEvent({\n      type: 'sync',\n      key: data.key || '',\n      layer: 'broadcast',\n      timestamp: Date.now(),\n      reason: data.reason,\n    });\n  }\n\n  /**\n   * Emit cache event\n   */\n  private emitEvent(event: CacheEvent): void {\n    this.config.onCacheEvent?.(event);\n  }\n\n  /**\n   * Sync stats\n   */\n  private syncStats(): void {\n    const memStats = this.memoryCache.getStats();\n\n    this.stats.layerStats.memory = memStats;\n    this.stats.totalEntries = memStats.entries;\n    this.stats.totalSizeBytes = memStats.sizeBytes;\n    this.stats.hitRate =\n      this.stats.hits + this.stats.misses > 0\n        ? this.stats.hits / (this.stats.hits + this.stats.misses)\n        : 0;\n\n    this.config.onStatsUpdate?.(this.stats);\n  }\n\n  /**\n   * Get cache statistics\n   */\n  getStats(): CacheStats {\n    this.syncStats();\n    return { ...this.stats };\n  }\n\n  /**\n   * Clear all caches\n   */\n  async clear(): Promise<void> {\n    this.memoryCache.clear();\n    this.kvCache.clear();\n\n    if (this.config.enablePersistent) {\n      try {\n        const db = await this.openDB();\n\n        const tx1 = db.transaction('cache', 'readwrite');\n        tx1.objectStore('cache').clear();\n\n        const tx2 = db.transaction('kv_cache', 'readwrite');\n        tx2.objectStore('kv_cache').clear();\n      } catch {\n        // Silently fail\n      }\n    }\n\n    // Broadcast clear\n    if (this.broadcastChannel) {\n      this.broadcastChannel.postMessage({ type: 'cache_clear' });\n    }\n  }\n}\n\n/**\n * Pre-configured coordinator presets\n */\nexport const CACHE_PRESETS = {\n  /** High performance with large memory cache */\n  performance: {\n    maxMemoryCacheSize: 500 * 1024 * 1024, // 500MB\n    maxMemoryEntries: 5000,\n    defaultTTL: 600000, // 10 minutes\n    enableCrossTab: true,\n    syncInterval: 2000,\n  } as Partial<CacheCoordinatorConfig>,\n\n  /** Memory efficient */\n  lowMemory: {\n    maxMemoryCacheSize: 50 * 1024 * 1024, // 50MB\n    maxMemoryEntries: 500,\n    defaultTTL: 60000, // 1 minute\n    enableCrossTab: false,\n    syncInterval: 10000,\n  } as Partial<CacheCoordinatorConfig>,\n\n  /** Balanced */\n  balanced: {\n    maxMemoryCacheSize: 100 * 1024 * 1024, // 100MB\n    maxMemoryEntries: 1000,\n    defaultTTL: 300000, // 5 minutes\n    enableCrossTab: true,\n    syncInterval: 5000,\n  } as Partial<CacheCoordinatorConfig>,\n};\n","/**\n * Metrics Reporter\n *\n * Client-side telemetry and performance monitoring:\n * - Inference latency tracking\n * - Token throughput monitoring\n * - Error rate tracking\n * - Resource usage monitoring\n * - Custom metric support\n */\n\n/**\n * Metric type\n */\nexport type MetricType = 'counter' | 'gauge' | 'histogram' | 'timing';\n\n/**\n * Metric value\n */\nexport interface MetricValue {\n  /** Metric name */\n  name: string;\n\n  /** Metric type */\n  type: MetricType;\n\n  /** Current value */\n  value: number;\n\n  /** Unit of measurement */\n  unit?: string;\n\n  /** Labels for dimensional filtering */\n  labels: Record<string, string>;\n\n  /** Timestamp */\n  timestamp: number;\n}\n\n/**\n * Histogram bucket\n */\nexport interface HistogramBucket {\n  /** Upper bound */\n  le: number;\n\n  /** Count in bucket */\n  count: number;\n}\n\n/**\n * Histogram data\n */\nexport interface HistogramData {\n  /** Bucket counts */\n  buckets: HistogramBucket[];\n\n  /** Sum of all values */\n  sum: number;\n\n  /** Count of observations */\n  count: number;\n\n  /** Minimum value */\n  min: number;\n\n  /** Maximum value */\n  max: number;\n\n  /** Average */\n  avg: number;\n\n  /** Percentiles */\n  percentiles: {\n    p50: number;\n    p90: number;\n    p95: number;\n    p99: number;\n  };\n}\n\n/**\n * Performance summary\n */\nexport interface PerformanceSummary {\n  /** Time period in ms */\n  periodMs: number;\n\n  /** Inference metrics */\n  inference: {\n    totalRequests: number;\n    successfulRequests: number;\n    failedRequests: number;\n    avgLatencyMs: number;\n    p95LatencyMs: number;\n    tokensGenerated: number;\n    avgTokensPerSecond: number;\n  };\n\n  /** Resource metrics */\n  resources: {\n    avgMemoryUsage: number;\n    peakMemoryUsage: number;\n    avgCpuUsage: number;\n    networkBytesSent: number;\n    networkBytesReceived: number;\n  };\n\n  /** Cache metrics */\n  cache: {\n    hitRate: number;\n    missRate: number;\n    evictionCount: number;\n    cacheSize: number;\n  };\n\n  /** Error metrics */\n  errors: {\n    totalErrors: number;\n    errorRate: number;\n    errorsByType: Record<string, number>;\n  };\n}\n\n/**\n * Reporter configuration\n */\nexport interface MetricsReporterConfig {\n  /** Enable metrics collection */\n  enabled: boolean;\n\n  /** Collection interval in ms */\n  collectionInterval: number;\n\n  /** Report interval in ms */\n  reportInterval: number;\n\n  /** Endpoint for remote reporting */\n  reportEndpoint?: string;\n\n  /** API key for remote reporting */\n  apiKey?: string;\n\n  /** Enable console logging */\n  enableConsoleLogging: boolean;\n\n  /** Maximum stored metrics */\n  maxStoredMetrics: number;\n\n  /** Histogram buckets for latency */\n  latencyBuckets: number[];\n\n  /** Callback on metric collected */\n  onMetricCollected?: (metric: MetricValue) => void;\n\n  /** Callback on report generated */\n  onReportGenerated?: (summary: PerformanceSummary) => void;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: MetricsReporterConfig = {\n  enabled: true,\n  collectionInterval: 1000,\n  reportInterval: 60000,\n  enableConsoleLogging: false,\n  maxStoredMetrics: 10000,\n  latencyBuckets: [10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000],\n};\n\n/**\n * Internal metric store\n */\ninterface MetricStore {\n  counters: Map<string, { value: number; labels: Record<string, string> }>;\n  gauges: Map<string, { value: number; labels: Record<string, string> }>;\n  histograms: Map<string, { values: number[]; labels: Record<string, string> }>;\n  timings: Map<string, { values: number[]; labels: Record<string, string> }>;\n}\n\n/**\n * Metrics Reporter\n *\n * Collects and reports performance metrics.\n */\nexport class MetricsReporter {\n  private config: MetricsReporterConfig;\n  private store: MetricStore;\n  private storedMetrics: MetricValue[] = [];\n  private collectionInterval: ReturnType<typeof setInterval> | null = null;\n  private reportInterval: ReturnType<typeof setInterval> | null = null;\n  private sessionStartTime: number;\n  private lastReportTime: number;\n\n  constructor(config: Partial<MetricsReporterConfig> = {}) {\n    this.config = { ...DEFAULT_CONFIG, ...config };\n    this.store = this.createEmptyStore();\n    this.sessionStartTime = Date.now();\n    this.lastReportTime = Date.now();\n  }\n\n  /**\n   * Create empty metric store\n   */\n  private createEmptyStore(): MetricStore {\n    return {\n      counters: new Map(),\n      gauges: new Map(),\n      histograms: new Map(),\n      timings: new Map(),\n    };\n  }\n\n  /**\n   * Start metrics collection\n   */\n  start(): void {\n    if (!this.config.enabled) return;\n\n    // Start collection interval\n    this.collectionInterval = setInterval(\n      () => this.collect(),\n      this.config.collectionInterval\n    );\n\n    // Start report interval\n    this.reportInterval = setInterval(\n      () => this.generateReport(),\n      this.config.reportInterval\n    );\n  }\n\n  /**\n   * Stop metrics collection\n   */\n  stop(): void {\n    if (this.collectionInterval) {\n      clearInterval(this.collectionInterval);\n      this.collectionInterval = null;\n    }\n\n    if (this.reportInterval) {\n      clearInterval(this.reportInterval);\n      this.reportInterval = null;\n    }\n  }\n\n  /**\n   * Increment a counter\n   */\n  increment(\n    name: string,\n    value = 1,\n    labels: Record<string, string> = {}\n  ): void {\n    if (!this.config.enabled) return;\n\n    const key = this.createKey(name, labels);\n    const counter = this.store.counters.get(key) || { value: 0, labels };\n    counter.value += value;\n    this.store.counters.set(key, counter);\n\n    this.emitMetric({\n      name,\n      type: 'counter',\n      value: counter.value,\n      labels,\n      timestamp: Date.now(),\n    });\n  }\n\n  /**\n   * Set a gauge value\n   */\n  gauge(\n    name: string,\n    value: number,\n    labels: Record<string, string> = {}\n  ): void {\n    if (!this.config.enabled) return;\n\n    const key = this.createKey(name, labels);\n    this.store.gauges.set(key, { value, labels });\n\n    this.emitMetric({\n      name,\n      type: 'gauge',\n      value,\n      labels,\n      timestamp: Date.now(),\n    });\n  }\n\n  /**\n   * Record a histogram observation\n   */\n  histogram(\n    name: string,\n    value: number,\n    labels: Record<string, string> = {}\n  ): void {\n    if (!this.config.enabled) return;\n\n    const key = this.createKey(name, labels);\n    const hist = this.store.histograms.get(key) || { values: [], labels };\n    hist.values.push(value);\n\n    // Limit stored values\n    if (hist.values.length > 1000) {\n      hist.values = hist.values.slice(-1000);\n    }\n\n    this.store.histograms.set(key, hist);\n\n    this.emitMetric({\n      name,\n      type: 'histogram',\n      value,\n      labels,\n      timestamp: Date.now(),\n    });\n  }\n\n  /**\n   * Record a timing\n   */\n  timing(\n    name: string,\n    durationMs: number,\n    labels: Record<string, string> = {}\n  ): void {\n    if (!this.config.enabled) return;\n\n    const key = this.createKey(name, labels);\n    const timing = this.store.timings.get(key) || { values: [], labels };\n    timing.values.push(durationMs);\n\n    // Limit stored values\n    if (timing.values.length > 1000) {\n      timing.values = timing.values.slice(-1000);\n    }\n\n    this.store.timings.set(key, timing);\n\n    this.emitMetric({\n      name,\n      type: 'timing',\n      value: durationMs,\n      unit: 'ms',\n      labels,\n      timestamp: Date.now(),\n    });\n  }\n\n  /**\n   * Time a function execution\n   */\n  async time<T>(\n    name: string,\n    fn: () => T | Promise<T>,\n    labels: Record<string, string> = {}\n  ): Promise<T> {\n    const start = performance.now();\n    try {\n      return await fn();\n    } finally {\n      const duration = performance.now() - start;\n      this.timing(name, duration, labels);\n    }\n  }\n\n  /**\n   * Create a timer for manual timing\n   */\n  startTimer(name: string, labels: Record<string, string> = {}): () => number {\n    const start = performance.now();\n    return () => {\n      const duration = performance.now() - start;\n      this.timing(name, duration, labels);\n      return duration;\n    };\n  }\n\n  /**\n   * Record inference metrics\n   */\n  recordInference(metrics: {\n    model: string;\n    source: string;\n    success: boolean;\n    latencyMs: number;\n    tokensGenerated: number;\n    promptTokens: number;\n    error?: string;\n  }): void {\n    const labels = { model: metrics.model, source: metrics.source };\n\n    // Count request\n    this.increment('inference_requests_total', 1, labels);\n\n    if (metrics.success) {\n      this.increment('inference_success_total', 1, labels);\n      this.timing('inference_latency_ms', metrics.latencyMs, labels);\n      this.histogram('tokens_generated', metrics.tokensGenerated, labels);\n      this.histogram('prompt_tokens', metrics.promptTokens, labels);\n\n      // Calculate tokens per second\n      const tps = metrics.tokensGenerated / (metrics.latencyMs / 1000);\n      this.gauge('tokens_per_second', tps, labels);\n    } else {\n      this.increment('inference_errors_total', 1, {\n        ...labels,\n        error: metrics.error || 'unknown',\n      });\n    }\n  }\n\n  /**\n   * Record cache metrics\n   */\n  recordCacheEvent(\n    event: 'hit' | 'miss' | 'eviction',\n    labels: Record<string, string> = {}\n  ): void {\n    this.increment(`cache_${event}_total`, 1, labels);\n  }\n\n  /**\n   * Record network metrics\n   */\n  recordNetworkTransfer(\n    type: 'sent' | 'received',\n    bytes: number,\n    labels: Record<string, string> = {}\n  ): void {\n    this.increment(`network_bytes_${type}_total`, bytes, labels);\n  }\n\n  /**\n   * Record resource usage\n   */\n  recordResourceUsage(): void {\n    // Memory usage (if available)\n    const memory = (\n      performance as Performance & { memory?: { usedJSHeapSize: number } }\n    ).memory;\n    if (memory) {\n      this.gauge('memory_used_bytes', memory.usedJSHeapSize);\n    }\n\n    // Estimate CPU usage from long tasks\n    if ('PerformanceObserver' in globalThis) {\n      const entries = performance.getEntriesByType('longtask');\n      if (entries.length > 0) {\n        const recentTask = entries[entries.length - 1] as PerformanceEntry & {\n          duration: number;\n        };\n        this.gauge('cpu_long_task_duration_ms', recentTask.duration);\n      }\n    }\n  }\n\n  /**\n   * Create key from name and labels\n   */\n  private createKey(name: string, labels: Record<string, string>): string {\n    const labelStr = Object.entries(labels)\n      .sort(([a], [b]) => a.localeCompare(b))\n      .map(([k, v]) => `${k}=${v}`)\n      .join(',');\n    return labelStr ? `${name}{${labelStr}}` : name;\n  }\n\n  /**\n   * Emit a metric\n   */\n  private emitMetric(metric: MetricValue): void {\n    // Store metric\n    this.storedMetrics.push(metric);\n    if (this.storedMetrics.length > this.config.maxStoredMetrics) {\n      this.storedMetrics = this.storedMetrics.slice(\n        -this.config.maxStoredMetrics\n      );\n    }\n\n    // Callback\n    this.config.onMetricCollected?.(metric);\n\n    // Console logging\n    if (this.config.enableConsoleLogging) {\n      console.log(`[Metric] ${metric.name}: ${metric.value}`, metric.labels);\n    }\n  }\n\n  /**\n   * Collect periodic metrics\n   */\n  private collect(): void {\n    this.recordResourceUsage();\n  }\n\n  /**\n   * Calculate histogram data\n   */\n  private calculateHistogram(\n    values: number[],\n    buckets: number[]\n  ): HistogramData {\n    if (values.length === 0) {\n      return {\n        buckets: buckets.map((le) => ({ le, count: 0 })),\n        sum: 0,\n        count: 0,\n        min: 0,\n        max: 0,\n        avg: 0,\n        percentiles: { p50: 0, p90: 0, p95: 0, p99: 0 },\n      };\n    }\n\n    const sorted = [...values].sort((a, b) => a - b);\n    const sum = values.reduce((a, b) => a + b, 0);\n\n    const bucketCounts = buckets.map((le) => ({\n      le,\n      count: values.filter((v) => v <= le).length,\n    }));\n\n    const percentile = (p: number) => {\n      const idx = Math.ceil(p * sorted.length) - 1;\n      return sorted[Math.max(0, idx)];\n    };\n\n    return {\n      buckets: bucketCounts,\n      sum,\n      count: values.length,\n      min: sorted[0],\n      max: sorted[sorted.length - 1],\n      avg: sum / values.length,\n      percentiles: {\n        p50: percentile(0.5),\n        p90: percentile(0.9),\n        p95: percentile(0.95),\n        p99: percentile(0.99),\n      },\n    };\n  }\n\n  /**\n   * Generate performance report\n   */\n  generateReport(): PerformanceSummary {\n    const now = Date.now();\n    const periodMs = now - this.lastReportTime;\n    this.lastReportTime = now;\n\n    // Aggregate inference metrics\n    const successCounter = this.store.counters.get('inference_success_total');\n    const errorCounter = this.store.counters.get('inference_errors_total');\n    const latencyTiming = Array.from(this.store.timings.values())\n      .filter((_, key) => key.toString().includes('inference_latency'))\n      .flatMap((t) => t.values);\n\n    const latencyHist = this.calculateHistogram(\n      latencyTiming,\n      this.config.latencyBuckets\n    );\n\n    const tokensHistograms = Array.from(this.store.histograms.values()).filter(\n      (_, key) => key.toString().includes('tokens_generated')\n    );\n    const totalTokens = tokensHistograms.reduce(\n      (sum, h) => sum + h.values.reduce((a, b) => a + b, 0),\n      0\n    );\n\n    // Resource metrics\n    const memoryGauge = this.store.gauges.get('memory_used_bytes');\n    const allMemoryValues = this.storedMetrics\n      .filter((m) => m.name === 'memory_used_bytes')\n      .map((m) => m.value);\n\n    // Network metrics\n    const bytesSent =\n      this.store.counters.get('network_bytes_sent_total')?.value || 0;\n    const bytesReceived =\n      this.store.counters.get('network_bytes_received_total')?.value || 0;\n\n    // Cache metrics\n    const cacheHits = this.store.counters.get('cache_hit_total')?.value || 0;\n    const cacheMisses = this.store.counters.get('cache_miss_total')?.value || 0;\n    const cacheEvictions =\n      this.store.counters.get('cache_eviction_total')?.value || 0;\n\n    // Error aggregation\n    const errorsByType: Record<string, number> = {};\n    for (const [key, counter] of this.store.counters) {\n      if (key.includes('inference_errors_total')) {\n        const errorMatch = key.match(/error=([^,}]+)/);\n        if (errorMatch) {\n          errorsByType[errorMatch[1]] = counter.value;\n        }\n      }\n    }\n\n    const totalRequests =\n      (successCounter?.value || 0) + (errorCounter?.value || 0);\n\n    const summary: PerformanceSummary = {\n      periodMs,\n      inference: {\n        totalRequests,\n        successfulRequests: successCounter?.value || 0,\n        failedRequests: errorCounter?.value || 0,\n        avgLatencyMs: latencyHist.avg,\n        p95LatencyMs: latencyHist.percentiles.p95,\n        tokensGenerated: totalTokens,\n        avgTokensPerSecond: totalTokens / (periodMs / 1000),\n      },\n      resources: {\n        avgMemoryUsage:\n          allMemoryValues.length > 0\n            ? allMemoryValues.reduce((a, b) => a + b, 0) /\n              allMemoryValues.length\n            : 0,\n        peakMemoryUsage:\n          allMemoryValues.length > 0 ? Math.max(...allMemoryValues) : 0,\n        avgCpuUsage: 0, // Would need more sophisticated tracking\n        networkBytesSent: bytesSent,\n        networkBytesReceived: bytesReceived,\n      },\n      cache: {\n        hitRate:\n          cacheHits + cacheMisses > 0\n            ? cacheHits / (cacheHits + cacheMisses)\n            : 0,\n        missRate:\n          cacheHits + cacheMisses > 0\n            ? cacheMisses / (cacheHits + cacheMisses)\n            : 0,\n        evictionCount: cacheEvictions,\n        cacheSize: 0, // Would need cache coordinator integration\n      },\n      errors: {\n        totalErrors: errorCounter?.value || 0,\n        errorRate:\n          totalRequests > 0 ? (errorCounter?.value || 0) / totalRequests : 0,\n        errorsByType,\n      },\n    };\n\n    // Callback\n    this.config.onReportGenerated?.(summary);\n\n    // Send to remote endpoint\n    if (this.config.reportEndpoint) {\n      this.sendReport(summary);\n    }\n\n    return summary;\n  }\n\n  /**\n   * Send report to remote endpoint\n   */\n  private async sendReport(summary: PerformanceSummary): Promise<void> {\n    if (!this.config.reportEndpoint) return;\n\n    try {\n      const headers: Record<string, string> = {\n        'Content-Type': 'application/json',\n      };\n\n      if (this.config.apiKey) {\n        headers['Authorization'] = `Bearer ${this.config.apiKey}`;\n      }\n\n      await fetch(this.config.reportEndpoint, {\n        method: 'POST',\n        headers,\n        body: JSON.stringify({\n          timestamp: Date.now(),\n          summary,\n          metrics: this.storedMetrics.slice(-100), // Send last 100 metrics\n        }),\n      });\n    } catch (error) {\n      console.warn('Failed to send metrics report:', error);\n    }\n  }\n\n  /**\n   * Get all stored metrics\n   */\n  getStoredMetrics(): MetricValue[] {\n    return [...this.storedMetrics];\n  }\n\n  /**\n   * Get specific counter value\n   */\n  getCounter(name: string, labels: Record<string, string> = {}): number {\n    const key = this.createKey(name, labels);\n    return this.store.counters.get(key)?.value || 0;\n  }\n\n  /**\n   * Get specific gauge value\n   */\n  getGauge(name: string, labels: Record<string, string> = {}): number {\n    const key = this.createKey(name, labels);\n    return this.store.gauges.get(key)?.value || 0;\n  }\n\n  /**\n   * Get histogram data\n   */\n  getHistogramData(\n    name: string,\n    labels: Record<string, string> = {}\n  ): HistogramData | null {\n    const key = this.createKey(name, labels);\n    const hist = this.store.histograms.get(key);\n    if (!hist) return null;\n    return this.calculateHistogram(hist.values, this.config.latencyBuckets);\n  }\n\n  /**\n   * Reset all metrics\n   */\n  reset(): void {\n    this.store = this.createEmptyStore();\n    this.storedMetrics = [];\n    this.lastReportTime = Date.now();\n  }\n}\n\n/**\n * Pre-configured reporter presets\n */\nexport const METRICS_PRESETS = {\n  /** Detailed metrics for development */\n  development: {\n    enabled: true,\n    collectionInterval: 500,\n    reportInterval: 10000,\n    enableConsoleLogging: true,\n    maxStoredMetrics: 50000,\n  } as Partial<MetricsReporterConfig>,\n\n  /** Production metrics */\n  production: {\n    enabled: true,\n    collectionInterval: 5000,\n    reportInterval: 60000,\n    enableConsoleLogging: false,\n    maxStoredMetrics: 10000,\n  } as Partial<MetricsReporterConfig>,\n\n  /** Minimal metrics */\n  minimal: {\n    enabled: true,\n    collectionInterval: 30000,\n    reportInterval: 300000,\n    enableConsoleLogging: false,\n    maxStoredMetrics: 1000,\n  } as Partial<MetricsReporterConfig>,\n\n  /** Disabled */\n  disabled: {\n    enabled: false,\n  } as Partial<MetricsReporterConfig>,\n};\n","/**\n * Error development Module\n *\n * Robust error handling and development:\n * - Retry strategies (exponential backoff, jitter)\n * - Circuit breaker pattern\n * - Fallback chains\n * - Error classification and routing\n */\n\n/**\n * Error category\n */\nexport type ErrorCategory =\n  | 'network' // Network connectivity issues\n  | 'timeout' // Request/operation timeout\n  | 'rate_limit' // Rate limiting\n  | 'quota' // Resource quota exceeded\n  | 'auth' // Authentication/authorization\n  | 'validation' // Input validation\n  | 'resource' // Resource not found/unavailable\n  | 'compute' // Computation errors\n  | 'unknown'; // Uncategorized\n\n/**\n * Error severity\n */\nexport type ErrorSeverity = 'recoverable' | 'transient' | 'permanent';\n\n/**\n * Classified error\n */\nexport interface ClassifiedError {\n  /** Original error */\n  original: Error;\n\n  /** Error category */\n  category: ErrorCategory;\n\n  /** Severity level */\n  severity: ErrorSeverity;\n\n  /** Is retryable */\n  retryable: boolean;\n\n  /** Suggested retry delay in ms */\n  retryAfterMs?: number;\n\n  /** Additional context */\n  context: Record<string, unknown>;\n}\n\n/**\n * Retry strategy\n */\nexport type RetryStrategy =\n  | 'immediate'\n  | 'linear'\n  | 'exponential'\n  | 'exponential-jitter'\n  | 'fibonacci'\n  | 'custom';\n\n/**\n * Retry configuration\n */\nexport interface RetryConfig {\n  /** Maximum retry attempts */\n  maxRetries: number;\n\n  /** Base delay in ms */\n  baseDelay: number;\n\n  /** Maximum delay in ms */\n  maxDelay: number;\n\n  /** Retry strategy */\n  strategy: RetryStrategy;\n\n  /** Jitter factor (0-1) for exponential-jitter */\n  jitterFactor: number;\n\n  /** Multiplier for exponential backoff */\n  multiplier: number;\n\n  /** Only retry on specific error categories */\n  retryCategories?: ErrorCategory[];\n\n  /** Callback before retry */\n  onRetry?: (attempt: number, error: ClassifiedError, delayMs: number) => void;\n\n  /** Callback on final unmet expectations */\n  onExhausted?: (error: ClassifiedError, attempts: number) => void;\n}\n\n/**\n * Default retry configuration\n */\nconst DEFAULT_RETRY_CONFIG: RetryConfig = {\n  maxRetries: 3,\n  baseDelay: 1000,\n  maxDelay: 30000,\n  strategy: 'exponential-jitter',\n  jitterFactor: 0.2,\n  multiplier: 2,\n};\n\n/**\n * Circuit breaker state\n */\nexport type CircuitState = 'closed' | 'open' | 'half-open';\n\n/**\n * Circuit breaker configuration\n */\nexport interface CircuitBreakerConfig {\n  /** unmet expectations threshold to open circuit */\n  failureThreshold: number;\n\n  /** Success threshold to close circuit in half-open state */\n  successThreshold: number;\n\n  /** Time to wait before attempting half-open */\n  resetTimeoutMs: number;\n\n  /** Sliding window size for unmet expectations counting */\n  windowSize: number;\n\n  /** Callback on state change */\n  onStateChange?: (from: CircuitState, to: CircuitState) => void;\n}\n\n/**\n * Default circuit breaker configuration\n */\nconst DEFAULT_CIRCUIT_CONFIG: CircuitBreakerConfig = {\n  failureThreshold: 5,\n  successThreshold: 2,\n  resetTimeoutMs: 30000,\n  windowSize: 10,\n};\n\n/**\n * Fallback definition\n */\nexport interface Fallback<T> {\n  /** Fallback name */\n  name: string;\n\n  /** Fallback function */\n  fn: () => T | Promise<T>;\n\n  /** Categories this fallback handles */\n  categories?: ErrorCategory[];\n\n  /** Priority (lower = higher priority) */\n  priority: number;\n}\n\n/**\n * development configuration\n */\nexport interface ErrorRecoveryConfig {\n  /** Retry configuration */\n  retry: RetryConfig;\n\n  /** Circuit breaker configuration */\n  circuitBreaker: CircuitBreakerConfig;\n\n  /** Enable error classification */\n  enableClassification: boolean;\n\n  /** Error pattern matchers */\n  errorPatterns: ErrorPattern[];\n}\n\n/**\n * Error pattern for classification\n */\nexport interface ErrorPattern {\n  /** Pattern name */\n  name: string;\n\n  /** Message pattern (regex or string) */\n  messagePattern?: RegExp | string;\n\n  /** Error code pattern */\n  codePattern?: RegExp | string;\n\n  /** Status code range */\n  statusCodes?: number[];\n\n  /** Resulting category */\n  category: ErrorCategory;\n\n  /** Resulting severity */\n  severity: ErrorSeverity;\n\n  /** Override retryable */\n  retryable?: boolean;\n\n  /** Override retry delay */\n  retryAfterMs?: number;\n}\n\n/**\n * Default error patterns\n */\nconst DEFAULT_ERROR_PATTERNS: ErrorPattern[] = [\n  // Network errors\n  {\n    name: 'network-offline',\n    messagePattern: /network|offline|disconnected|ECONNREFUSED/i,\n    category: 'network',\n    severity: 'transient',\n    retryable: true,\n  },\n  // Timeout errors\n  {\n    name: 'timeout',\n    messagePattern: /timeout|ETIMEDOUT|deadline/i,\n    category: 'timeout',\n    severity: 'transient',\n    retryable: true,\n  },\n  // Rate limit errors\n  {\n    name: 'rate-limit',\n    statusCodes: [429],\n    category: 'rate_limit',\n    severity: 'transient',\n    retryable: true,\n    retryAfterMs: 60000,\n  },\n  // Auth errors\n  {\n    name: 'unauthorized',\n    statusCodes: [401],\n    category: 'auth',\n    severity: 'recoverable',\n    retryable: false,\n  },\n  {\n    name: 'forbidden',\n    statusCodes: [403],\n    category: 'auth',\n    severity: 'permanent',\n    retryable: false,\n  },\n  // Resource errors\n  {\n    name: 'not-found',\n    statusCodes: [404],\n    category: 'resource',\n    severity: 'permanent',\n    retryable: false,\n  },\n  // Validation errors\n  {\n    name: 'challenging-request',\n    statusCodes: [400],\n    category: 'validation',\n    severity: 'permanent',\n    retryable: false,\n  },\n  // Server errors\n  {\n    name: 'server-error',\n    statusCodes: [500, 502, 503, 504],\n    category: 'compute',\n    severity: 'transient',\n    retryable: true,\n  },\n  // Quota errors\n  {\n    name: 'quota-exceeded',\n    messagePattern: /quota|limit exceeded|insufficient/i,\n    category: 'quota',\n    severity: 'recoverable',\n    retryable: false,\n  },\n];\n\n/**\n * Circuit Breaker\n *\n * Prevents cascading failures by stopping requests when error rate is high.\n */\nexport class CircuitBreaker {\n  private config: CircuitBreakerConfig;\n  private state: CircuitState = 'closed';\n  private failures: number[] = [];\n  private successes = 0;\n  private lastFailureTime = 0;\n  private nextAttemptTime = 0;\n\n  constructor(config: Partial<CircuitBreakerConfig> = {}) {\n    this.config = { ...DEFAULT_CIRCUIT_CONFIG, ...config };\n  }\n\n  /**\n   * Get current state\n   */\n  getState(): CircuitState {\n    return this.state;\n  }\n\n  /**\n   * Check if circuit allows requests\n   */\n  canPass(): boolean {\n    const now = Date.now();\n\n    switch (this.state) {\n      case 'closed':\n        return true;\n\n      case 'open':\n        // Check if enough time has passed to try half-open\n        if (now >= this.nextAttemptTime) {\n          this.transition('half-open');\n          return true;\n        }\n        return false;\n\n      case 'half-open':\n        return true;\n    }\n  }\n\n  /**\n   * Record a successful request\n   */\n  recordSuccess(): void {\n    switch (this.state) {\n      case 'closed':\n        // Clear old failures outside window\n        this.pruneFailures();\n        break;\n\n      case 'half-open':\n        this.successes++;\n        if (this.successes >= this.config.successThreshold) {\n          this.transition('closed');\n        }\n        break;\n    }\n  }\n\n  /**\n   * Record a failed request\n   */\n  recordFailure(): void {\n    const now = Date.now();\n    this.lastFailureTime = now;\n\n    switch (this.state) {\n      case 'closed':\n        this.failures.push(now);\n        this.pruneFailures();\n\n        if (this.failures.length >= this.config.failureThreshold) {\n          this.transition('open');\n        }\n        break;\n\n      case 'half-open':\n        this.transition('open');\n        break;\n    }\n  }\n\n  /**\n   * Transition to new state\n   */\n  private transition(newState: CircuitState): void {\n    const oldState = this.state;\n    this.state = newState;\n\n    switch (newState) {\n      case 'open':\n        this.nextAttemptTime = Date.now() + this.config.resetTimeoutMs;\n        this.successes = 0;\n        break;\n\n      case 'half-open':\n        this.successes = 0;\n        break;\n\n      case 'closed':\n        this.failures = [];\n        this.successes = 0;\n        break;\n    }\n\n    this.config.onStateChange?.(oldState, newState);\n  }\n\n  /**\n   * Remove failures outside the time window\n   */\n  private pruneFailures(): void {\n    const windowStart = Date.now() - this.config.windowSize * 1000;\n    this.failures = this.failures.filter((t) => t > windowStart);\n  }\n\n  /**\n   * Reset the circuit breaker\n   */\n  reset(): void {\n    this.state = 'closed';\n    this.failures = [];\n    this.successes = 0;\n    this.lastFailureTime = 0;\n    this.nextAttemptTime = 0;\n  }\n}\n\n/**\n * Error development\n *\n * Comprehensive error handling with retry, circuit breaker, and fallback chains.\n */\nexport class ErrorRecovery {\n  private config: ErrorRecoveryConfig;\n  private circuitBreaker: CircuitBreaker;\n  private fallbacks: Map<string, Fallback<unknown>[]> = new Map();\n\n  constructor(config: Partial<ErrorRecoveryConfig> = {}) {\n    this.config = {\n      retry: { ...DEFAULT_RETRY_CONFIG, ...config.retry },\n      circuitBreaker: { ...DEFAULT_CIRCUIT_CONFIG, ...config.circuitBreaker },\n      enableClassification: config.enableClassification ?? true,\n      errorPatterns: config.errorPatterns || DEFAULT_ERROR_PATTERNS,\n    };\n\n    this.circuitBreaker = new CircuitBreaker(this.config.circuitBreaker);\n  }\n\n  /**\n   * Classify an error\n   */\n  classifyError(error: Error, statusCode?: number): ClassifiedError {\n    if (!this.config.enableClassification) {\n      return {\n        original: error,\n        category: 'unknown',\n        severity: 'recoverable',\n        retryable: true,\n        context: {},\n      };\n    }\n\n    // Match against patterns\n    for (const pattern of this.config.errorPatterns) {\n      let matches = false;\n\n      // Check message pattern\n      if (pattern.messagePattern) {\n        const regex =\n          typeof pattern.messagePattern === 'string'\n            ? new RegExp(pattern.messagePattern, 'i')\n            : pattern.messagePattern;\n        matches = regex.test(error.message);\n      }\n\n      // Check status codes\n      if (pattern.statusCodes && statusCode !== undefined) {\n        matches = matches || pattern.statusCodes.includes(statusCode);\n      }\n\n      if (matches) {\n        return {\n          original: error,\n          category: pattern.category,\n          severity: pattern.severity,\n          retryable: pattern.retryable ?? pattern.severity === 'transient',\n          retryAfterMs: pattern.retryAfterMs,\n          context: { pattern: pattern.name, statusCode },\n        };\n      }\n    }\n\n    // Default classification\n    return {\n      original: error,\n      category: 'unknown',\n      severity: 'recoverable',\n      retryable: true,\n      context: {},\n    };\n  }\n\n  /**\n   * Calculate retry delay\n   */\n  calculateDelay(\n    attempt: number,\n    config: RetryConfig = this.config.retry\n  ): number {\n    let delay: number;\n\n    switch (config.strategy) {\n      case 'immediate':\n        delay = 0;\n        break;\n\n      case 'linear':\n        delay = config.baseDelay * attempt;\n        break;\n\n      case 'exponential':\n        delay = config.baseDelay * Math.pow(config.multiplier, attempt - 1);\n        break;\n\n      case 'exponential-jitter': {\n        const exponentialDelay =\n          config.baseDelay * Math.pow(config.multiplier, attempt - 1);\n        const jitter = exponentialDelay * config.jitterFactor * Math.random();\n        delay = exponentialDelay + jitter;\n        break;\n      }\n\n      case 'fibonacci': {\n        const fib = (n: number): number =>\n          n <= 1 ? n : fib(n - 1) + fib(n - 2);\n        delay = config.baseDelay * fib(Math.min(attempt, 10));\n        break;\n      }\n\n      default:\n        delay = config.baseDelay;\n    }\n\n    return Math.min(delay, config.maxDelay);\n  }\n\n  /**\n   * Execute with retry\n   */\n  async withRetry<T>(\n    fn: () => T | Promise<T>,\n    config: Partial<RetryConfig> = {}\n  ): Promise<T> {\n    const retryConfig = { ...this.config.retry, ...config };\n    let lastError: ClassifiedError | null = null;\n\n    for (let attempt = 1; attempt <= retryConfig.maxRetries + 1; attempt++) {\n      // Check circuit breaker\n      if (!this.circuitBreaker.canPass()) {\n        throw new Error('Circuit breaker is open');\n      }\n\n      try {\n        const result = await fn();\n        this.circuitBreaker.recordSuccess();\n        return result;\n      } catch (error) {\n        const classified = this.classifyError(error as Error);\n        lastError = classified;\n\n        this.circuitBreaker.recordFailure();\n\n        // Check if retryable\n        if (!classified.retryable) {\n          throw error;\n        }\n\n        // Check if we should retry for this category\n        if (\n          retryConfig.retryCategories &&\n          !retryConfig.retryCategories.includes(classified.category)\n        ) {\n          throw error;\n        }\n\n        // Check if this was the last attempt\n        if (attempt > retryConfig.maxRetries) {\n          retryConfig.onExhausted?.(classified, attempt);\n          throw error;\n        }\n\n        // Calculate delay\n        const delay =\n          classified.retryAfterMs ?? this.calculateDelay(attempt, retryConfig);\n\n        retryConfig.onRetry?.(attempt, classified, delay);\n\n        // Wait before retry\n        await this.sleep(delay);\n      }\n    }\n\n    // Should not reach here\n    throw lastError?.original || new Error('Retry exhausted');\n  }\n\n  /**\n   * Execute with circuit breaker\n   */\n  async withCircuitBreaker<T>(fn: () => T | Promise<T>): Promise<T> {\n    if (!this.circuitBreaker.canPass()) {\n      throw new Error('Circuit breaker is open');\n    }\n\n    try {\n      const result = await fn();\n      this.circuitBreaker.recordSuccess();\n      return result;\n    } catch (error) {\n      this.circuitBreaker.recordFailure();\n      throw error;\n    }\n  }\n\n  /**\n   * Register a fallback\n   */\n  registerFallback<T>(key: string, fallback: Fallback<T>): void {\n    const existing = this.fallbacks.get(key) || [];\n    existing.push(fallback as Fallback<unknown>);\n    existing.sort((a, b) => a.priority - b.priority);\n    this.fallbacks.set(key, existing);\n  }\n\n  /**\n   * Execute with fallback chain\n   */\n  async withFallback<T>(\n    key: string,\n    primary: () => T | Promise<T>,\n    errorCategory?: ErrorCategory\n  ): Promise<T> {\n    try {\n      return await primary();\n    } catch (error) {\n      const classified = this.classifyError(error as Error);\n      const fallbacks = this.fallbacks.get(key) || [];\n\n      for (const fallback of fallbacks) {\n        // Check if fallback handles this error category\n        if (\n          fallback.categories &&\n          !fallback.categories.includes(classified.category)\n        ) {\n          continue;\n        }\n\n        // If caller specified a category filter, check it\n        if (errorCategory && classified.category !== errorCategory) {\n          throw error;\n        }\n\n        try {\n          return (await fallback.fn()) as T;\n        } catch {\n          // Try next fallback\n          continue;\n        }\n      }\n\n      // No fallback succeeded\n      throw error;\n    }\n  }\n\n  /**\n   * Execute with all development mechanisms\n   */\n  async execute<T>(\n    fn: () => T | Promise<T>,\n    options: {\n      fallbackKey?: string;\n      retryConfig?: Partial<RetryConfig>;\n    } = {}\n  ): Promise<T> {\n    const executeWithRetry = () => this.withRetry(fn, options.retryConfig);\n\n    if (options.fallbackKey) {\n      return this.withFallback(options.fallbackKey, executeWithRetry);\n    }\n\n    return executeWithRetry();\n  }\n\n  /**\n   * Get circuit breaker state\n   */\n  getCircuitState(): CircuitState {\n    return this.circuitBreaker.getState();\n  }\n\n  /**\n   * Reset circuit breaker\n   */\n  resetCircuit(): void {\n    this.circuitBreaker.reset();\n  }\n\n  /**\n   * Sleep helper\n   */\n  private sleep(ms: number): Promise<void> {\n    return new Promise((resolve) => setTimeout(resolve, ms));\n  }\n}\n\n/**\n * Pre-configured development presets\n */\nexport const RECOVERY_PRESETS = {\n  /** Aggressive retry for critical operations */\n  aggressive: {\n    retry: {\n      maxRetries: 5,\n      baseDelay: 500,\n      maxDelay: 30000,\n      strategy: 'exponential-jitter' as RetryStrategy,\n      multiplier: 1.5,\n    },\n    circuitBreaker: {\n      failureThreshold: 10,\n      successThreshold: 3,\n      resetTimeoutMs: 15000,\n    },\n  } as Partial<ErrorRecoveryConfig>,\n\n  /** Conservative retry */\n  conservative: {\n    retry: {\n      maxRetries: 2,\n      baseDelay: 2000,\n      maxDelay: 10000,\n      strategy: 'linear' as RetryStrategy,\n    },\n    circuitBreaker: {\n      failureThreshold: 3,\n      successThreshold: 1,\n      resetTimeoutMs: 60000,\n    },\n  } as Partial<ErrorRecoveryConfig>,\n\n  /** Balanced (default) */\n  balanced: {\n    retry: DEFAULT_RETRY_CONFIG,\n    circuitBreaker: DEFAULT_CIRCUIT_CONFIG,\n  } as Partial<ErrorRecoveryConfig>,\n\n  /** Fast fail for latency-sensitive operations */\n  fastFail: {\n    retry: {\n      maxRetries: 1,\n      baseDelay: 100,\n      maxDelay: 1000,\n      strategy: 'immediate' as RetryStrategy,\n    },\n    circuitBreaker: {\n      failureThreshold: 2,\n      successThreshold: 1,\n      resetTimeoutMs: 5000,\n    },\n  } as Partial<ErrorRecoveryConfig>,\n};\n\n/**\n * Convenience function to create development instance\n */\nexport function createErrorRecovery(\n  preset: keyof typeof RECOVERY_PRESETS = 'balanced',\n  overrides: Partial<ErrorRecoveryConfig> = {}\n): ErrorRecovery {\n  return new ErrorRecovery({\n    ...RECOVERY_PRESETS[preset],\n    ...overrides,\n  });\n}\n","/**\n * Batch Scheduler\n *\n * Client-side request batching for efficiency:\n * - Automatic request grouping\n * - Priority-based scheduling\n * - Optimal batch sizing\n * - Debouncing and throttling\n */\n\n/**\n * Batch item\n */\nexport interface BatchItem<T, R> {\n  /** Unique request ID */\n  id: string;\n\n  /** Request data */\n  data: T;\n\n  /** Priority (lower = higher priority) */\n  priority: number;\n\n  /** Resolve function */\n  resolve: (result: R) => void;\n\n  /** Reject function */\n  reject: (error: Error) => void;\n\n  /** Timestamp when added */\n  addedAt: number;\n\n  /** Request deadline (optional) */\n  deadline?: number;\n}\n\n/**\n * Batch result\n */\nexport interface BatchResult<R> {\n  /** Item ID */\n  id: string;\n\n  /** Success flag */\n  success: boolean;\n\n  /** Result if successful */\n  result?: R;\n\n  /** Error if failed */\n  error?: Error;\n}\n\n/**\n * Batch statistics\n */\nexport interface BatchStats {\n  /** Total items processed */\n  totalItems: number;\n\n  /** Total batches processed */\n  totalBatches: number;\n\n  /** Average batch size */\n  avgBatchSize: number;\n\n  /** Average wait time in ms */\n  avgWaitTime: number;\n\n  /** Items currently queued */\n  queuedItems: number;\n\n  /** Success rate */\n  successRate: number;\n}\n\n/**\n * Batch scheduler configuration\n */\nexport interface BatchSchedulerConfig<T, R> {\n  /** Maximum batch size */\n  maxBatchSize: number;\n\n  /** Maximum wait time before flushing (ms) */\n  maxWaitTime: number;\n\n  /** Minimum batch size before flushing */\n  minBatchSize: number;\n\n  /** Process batch function */\n  processBatch: (items: T[]) => Promise<R[]>;\n\n  /** Enable priority scheduling */\n  enablePriority: boolean;\n\n  /** Enable deadline-based scheduling */\n  enableDeadlines: boolean;\n\n  /** Callback when batch is processed */\n  onBatchProcessed?: (batchSize: number, durationMs: number) => void;\n\n  /** Callback on error */\n  onError?: (error: Error, items: T[]) => void;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: Partial<BatchSchedulerConfig<any, any>> = {\n  maxBatchSize: 32,\n  maxWaitTime: 100,\n  minBatchSize: 1,\n  enablePriority: true,\n  enableDeadlines: true,\n};\n\n/**\n * Batch Scheduler\n *\n * Groups requests into batches for efficient processing.\n */\nexport class BatchScheduler<T, R> {\n  private config: BatchSchedulerConfig<T, R>;\n  private queue: BatchItem<T, R>[] = [];\n  private flushTimer: ReturnType<typeof setTimeout> | null = null;\n  private processing = false;\n  private stats: BatchStats = {\n    totalItems: 0,\n    totalBatches: 0,\n    avgBatchSize: 0,\n    avgWaitTime: 0,\n    queuedItems: 0,\n    successRate: 1,\n  };\n  private successCount = 0;\n  private failureCount = 0;\n  private totalWaitTime = 0;\n\n  constructor(\n    config: Partial<BatchSchedulerConfig<T, R>> &\n      Pick<BatchSchedulerConfig<T, R>, 'processBatch'>\n  ) {\n    this.config = { ...DEFAULT_CONFIG, ...config } as BatchSchedulerConfig<\n      T,\n      R\n    >;\n  }\n\n  /**\n   * Add item to batch queue\n   */\n  add(data: T, priority = 5, deadline?: number): Promise<R> {\n    return new Promise((resolve, reject) => {\n      const item: BatchItem<T, R> = {\n        id: this.generateId(),\n        data,\n        priority,\n        resolve,\n        reject,\n        addedAt: Date.now(),\n        deadline,\n      };\n\n      this.queue.push(item);\n      this.stats.queuedItems = this.queue.length;\n\n      // Sort by priority if enabled\n      if (this.config.enablePriority) {\n        this.queue.sort((a, b) => a.priority - b.priority);\n      }\n\n      // Check if we should flush immediately\n      if (this.shouldFlushImmediately()) {\n        this.flush();\n      } else if (!this.flushTimer) {\n        this.scheduleFlush();\n      }\n\n      // Check for deadline-triggered flush\n      if (this.config.enableDeadlines && deadline) {\n        const timeUntilDeadline = deadline - Date.now();\n        if (timeUntilDeadline < this.config.maxWaitTime) {\n          setTimeout(() => this.flush(), Math.max(0, timeUntilDeadline - 10));\n        }\n      }\n    });\n  }\n\n  /**\n   * Add multiple items\n   */\n  addMany(items: T[], priority = 5): Promise<R[]> {\n    return Promise.all(items.map((item) => this.add(item, priority)));\n  }\n\n  /**\n   * Force flush the queue\n   */\n  async flush(): Promise<void> {\n    if (this.flushTimer) {\n      clearTimeout(this.flushTimer);\n      this.flushTimer = null;\n    }\n\n    if (this.queue.length === 0 || this.processing) {\n      return;\n    }\n\n    this.processing = true;\n\n    try {\n      while (this.queue.length > 0) {\n        await this.processBatch();\n      }\n    } finally {\n      this.processing = false;\n      this.stats.queuedItems = this.queue.length;\n    }\n  }\n\n  /**\n   * Process a single batch\n   */\n  private async processBatch(): Promise<void> {\n    // Get batch items\n    const batchSize = Math.min(this.config.maxBatchSize, this.queue.length);\n    const batch = this.queue.splice(0, batchSize);\n    this.stats.queuedItems = this.queue.length;\n\n    if (batch.length === 0) return;\n\n    const startTime = Date.now();\n\n    // Calculate wait times\n    for (const item of batch) {\n      this.totalWaitTime += startTime - item.addedAt;\n    }\n\n    try {\n      // Process the batch\n      const results = await this.config.processBatch(batch.map((b) => b.data));\n\n      // Distribute results\n      for (let i = 0; i < batch.length; i++) {\n        const item = batch[i];\n        const result = results[i];\n\n        if (result !== undefined) {\n          item.resolve(result);\n          this.successCount++;\n        } else {\n          item.reject(new Error('No result for item'));\n          this.failureCount++;\n        }\n      }\n    } catch (error) {\n      // Reject all items in batch\n      for (const item of batch) {\n        item.reject(error as Error);\n        this.failureCount++;\n      }\n\n      this.config.onError?.(\n        error as Error,\n        batch.map((b) => b.data)\n      );\n    }\n\n    const duration = Date.now() - startTime;\n\n    // Update stats\n    this.stats.totalItems += batch.length;\n    this.stats.totalBatches++;\n    this.stats.avgBatchSize = this.stats.totalItems / this.stats.totalBatches;\n    this.stats.avgWaitTime = this.totalWaitTime / this.stats.totalItems;\n    this.stats.successRate =\n      this.successCount / (this.successCount + this.failureCount);\n\n    this.config.onBatchProcessed?.(batch.length, duration);\n  }\n\n  /**\n   * Check if we should flush immediately\n   */\n  private shouldFlushImmediately(): boolean {\n    // Flush if we've reached max batch size\n    if (this.queue.length >= this.config.maxBatchSize) {\n      return true;\n    }\n\n    // Check for imminent deadlines\n    if (this.config.enableDeadlines) {\n      const now = Date.now();\n      const urgentItems = this.queue.filter(\n        (item) => item.deadline && item.deadline - now < 10\n      );\n      if (urgentItems.length > 0) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  /**\n   * Schedule a flush\n   */\n  private scheduleFlush(): void {\n    this.flushTimer = setTimeout(() => {\n      this.flushTimer = null;\n      this.flush();\n    }, this.config.maxWaitTime);\n  }\n\n  /**\n   * Generate unique ID\n   */\n  private generateId(): string {\n    return `batch-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n  }\n\n  /**\n   * Get current statistics\n   */\n  getStats(): BatchStats {\n    return { ...this.stats };\n  }\n\n  /**\n   * Get queue length\n   */\n  getQueueLength(): number {\n    return this.queue.length;\n  }\n\n  /**\n   * Clear the queue\n   */\n  clear(): void {\n    // Reject all pending items\n    for (const item of this.queue) {\n      item.reject(new Error('Queue cleared'));\n    }\n    this.queue = [];\n    this.stats.queuedItems = 0;\n\n    if (this.flushTimer) {\n      clearTimeout(this.flushTimer);\n      this.flushTimer = null;\n    }\n  }\n\n  /**\n   * Reset statistics\n   */\n  resetStats(): void {\n    this.stats = {\n      totalItems: 0,\n      totalBatches: 0,\n      avgBatchSize: 0,\n      avgWaitTime: 0,\n      queuedItems: this.queue.length,\n      successRate: 1,\n    };\n    this.successCount = 0;\n    this.failureCount = 0;\n    this.totalWaitTime = 0;\n  }\n}\n\n/**\n * Debounced batch scheduler\n *\n * Waits for a quiet period before processing.\n */\nexport class DebouncedBatchScheduler<T, R> extends BatchScheduler<T, R> {\n  private debounceTimeout: ReturnType<typeof setTimeout> | null = null;\n  private debounceMs: number;\n\n  constructor(\n    config: Partial<BatchSchedulerConfig<T, R>> &\n      Pick<BatchSchedulerConfig<T, R>, 'processBatch'>,\n    debounceMs = 50\n  ) {\n    super(config);\n    this.debounceMs = debounceMs;\n  }\n\n  /**\n   * Add with debouncing\n   */\n  override add(data: T, priority = 5, deadline?: number): Promise<R> {\n    // Clear existing debounce timer\n    if (this.debounceTimeout) {\n      clearTimeout(this.debounceTimeout);\n    }\n\n    // Set new debounce timer\n    this.debounceTimeout = setTimeout(() => {\n      this.debounceTimeout = null;\n      this.flush();\n    }, this.debounceMs);\n\n    return super.add(data, priority, deadline);\n  }\n}\n\n/**\n * Throttled batch scheduler\n *\n * Limits batch processing rate.\n */\nexport class ThrottledBatchScheduler<T, R> extends BatchScheduler<T, R> {\n  private lastProcessTime = 0;\n  private throttleMs: number;\n  private throttleTimer: ReturnType<typeof setTimeout> | null = null;\n\n  constructor(\n    config: Partial<BatchSchedulerConfig<T, R>> &\n      Pick<BatchSchedulerConfig<T, R>, 'processBatch'>,\n    throttleMs = 100\n  ) {\n    super(config);\n    this.throttleMs = throttleMs;\n  }\n\n  /**\n   * Flush with throttling\n   */\n  override async flush(): Promise<void> {\n    const now = Date.now();\n    const timeSinceLastProcess = now - this.lastProcessTime;\n\n    if (timeSinceLastProcess < this.throttleMs) {\n      // Schedule delayed flush\n      if (!this.throttleTimer) {\n        this.throttleTimer = setTimeout(() => {\n          this.throttleTimer = null;\n          this.lastProcessTime = Date.now();\n          super.flush();\n        }, this.throttleMs - timeSinceLastProcess);\n      }\n      return;\n    }\n\n    this.lastProcessTime = now;\n    return super.flush();\n  }\n}\n\n/**\n * Inference batch scheduler\n *\n * Specialized for inference requests.\n */\nexport interface InferenceRequest {\n  /** Model ID */\n  model: string;\n\n  /** Input prompt */\n  prompt: string;\n\n  /** Max tokens */\n  maxTokens?: number;\n\n  /** Temperature */\n  temperature?: number;\n}\n\nexport interface InferenceResponse {\n  /** Generated text */\n  text: string;\n\n  /** Tokens used */\n  tokensUsed: number;\n\n  /** Latency in ms */\n  latencyMs: number;\n}\n\nexport class InferenceBatchScheduler extends BatchScheduler<\n  InferenceRequest,\n  InferenceResponse\n> {\n  constructor(\n    batchInference: (\n      requests: InferenceRequest[]\n    ) => Promise<InferenceResponse[]>,\n    config: Partial<\n      Omit<\n        BatchSchedulerConfig<InferenceRequest, InferenceResponse>,\n        'processBatch'\n      >\n    > = {}\n  ) {\n    super({\n      ...config,\n      processBatch: batchInference,\n      maxBatchSize: config.maxBatchSize ?? 8, // Smaller batches for inference\n      maxWaitTime: config.maxWaitTime ?? 50, // Lower latency\n    });\n  }\n\n  /**\n   * Queue an inference request\n   */\n  infer(request: InferenceRequest): Promise<InferenceResponse> {\n    return this.add(request, 5);\n  }\n\n  /**\n   * Queue high-priority inference\n   */\n  inferUrgent(request: InferenceRequest): Promise<InferenceResponse> {\n    return this.add(request, 1);\n  }\n\n  /**\n   * Queue low-priority (background) inference\n   */\n  inferBackground(request: InferenceRequest): Promise<InferenceResponse> {\n    return this.add(request, 10);\n  }\n}\n\n/**\n * Pre-configured batch presets\n */\nexport const BATCH_PRESETS = {\n  /** Low latency - small batches, fast flush */\n  lowLatency: {\n    maxBatchSize: 4,\n    maxWaitTime: 25,\n    minBatchSize: 1,\n    enablePriority: true,\n    enableDeadlines: true,\n  } as Partial<BatchSchedulerConfig<unknown, unknown>>,\n\n  /** High throughput - larger batches, longer wait */\n  highThroughput: {\n    maxBatchSize: 64,\n    maxWaitTime: 200,\n    minBatchSize: 8,\n    enablePriority: true,\n    enableDeadlines: false,\n  } as Partial<BatchSchedulerConfig<unknown, unknown>>,\n\n  /** Balanced */\n  balanced: {\n    maxBatchSize: 32,\n    maxWaitTime: 100,\n    minBatchSize: 1,\n    enablePriority: true,\n    enableDeadlines: true,\n  } as Partial<BatchSchedulerConfig<unknown, unknown>>,\n\n  /** Realtime - immediate processing */\n  realtime: {\n    maxBatchSize: 1,\n    maxWaitTime: 0,\n    minBatchSize: 1,\n    enablePriority: false,\n    enableDeadlines: false,\n  } as Partial<BatchSchedulerConfig<unknown, unknown>>,\n};\n\n/**\n * Create a batch scheduler with preset\n */\nexport function createBatchScheduler<T, R>(\n  processBatch: (items: T[]) => Promise<R[]>,\n  preset: keyof typeof BATCH_PRESETS = 'balanced',\n  overrides: Partial<BatchSchedulerConfig<T, R>> = {}\n): BatchScheduler<T, R> {\n  return new BatchScheduler({\n    ...BATCH_PRESETS[preset],\n    ...overrides,\n    processBatch,\n  });\n}\n","/**\n * Token Budget Manager\n *\n * Token counting, cost estimation, and rate limiting:\n * - Token counting for prompts and completions\n * - Cost estimation per model\n * - Budget enforcement\n * - Usage tracking and alerts\n */\n\n/**\n * Token pricing (per 1000 tokens)\n */\nexport interface TokenPricing {\n  /** Input token price per 1K tokens */\n  inputPer1K: number;\n\n  /** Output token price per 1K tokens */\n  outputPer1K: number;\n\n  /** Currency */\n  currency: string;\n}\n\n/**\n * Model pricing configuration\n */\nexport interface ModelPricing {\n  /** Model ID */\n  modelId: string;\n\n  /** Model display name */\n  displayName: string;\n\n  /** Token pricing */\n  pricing: TokenPricing;\n\n  /** Max context window */\n  maxContextTokens: number;\n\n  /** Max output tokens */\n  maxOutputTokens: number;\n}\n\n/**\n * Usage record\n */\nexport interface UsageRecord {\n  /** Timestamp */\n  timestamp: number;\n\n  /** Model used */\n  modelId: string;\n\n  /** Input tokens */\n  inputTokens: number;\n\n  /** Output tokens */\n  outputTokens: number;\n\n  /** Estimated cost */\n  estimatedCost: number;\n\n  /** Request ID */\n  requestId?: string;\n\n  /** Metadata */\n  metadata?: Record<string, unknown>;\n}\n\n/**\n * Budget period\n */\nexport type BudgetPeriod =\n  | 'hourly'\n  | 'daily'\n  | 'weekly'\n  | 'monthly'\n  | 'unlimited';\n\n/**\n * Budget configuration\n */\nexport interface BudgetConfig {\n  /** Budget period */\n  period: BudgetPeriod;\n\n  /** Maximum cost per period */\n  maxCost?: number;\n\n  /** Maximum tokens per period */\n  maxTokens?: number;\n\n  /** Maximum requests per period */\n  maxRequests?: number;\n\n  /** Alert threshold (0-1) */\n  alertThreshold: number;\n\n  /** Callback when alert threshold reached */\n  onAlert?: (usage: BudgetUsage) => void;\n\n  /** Callback when budget exceeded */\n  onBudgetExceeded?: (usage: BudgetUsage) => void;\n}\n\n/**\n * Budget usage\n */\nexport interface BudgetUsage {\n  /** Period start */\n  periodStart: number;\n\n  /** Period end */\n  periodEnd: number;\n\n  /** Total cost */\n  totalCost: number;\n\n  /** Total tokens */\n  totalTokens: number;\n\n  /** Total requests */\n  totalRequests: number;\n\n  /** Cost limit */\n  costLimit?: number;\n\n  /** Token limit */\n  tokenLimit?: number;\n\n  /** Request limit */\n  requestLimit?: number;\n\n  /** Cost usage percentage */\n  costUsagePercent: number;\n\n  /** Token usage percentage */\n  tokenUsagePercent: number;\n\n  /** Request usage percentage */\n  requestUsagePercent: number;\n\n  /** Is over budget */\n  isOverBudget: boolean;\n\n  /** Alert triggered */\n  alertTriggered: boolean;\n}\n\n/**\n * Token budget manager configuration\n */\nexport interface TokenBudgetManagerConfig {\n  /** Budget configuration */\n  budget: BudgetConfig;\n\n  /** Model pricing */\n  modelPricing: ModelPricing[];\n\n  /** Default model ID */\n  defaultModelId?: string;\n\n  /** Token estimator (characters to tokens ratio) */\n  tokenEstimatorRatio: number;\n\n  /** Maximum stored usage records */\n  maxStoredRecords: number;\n\n  /** Persist usage to storage */\n  persistUsage: boolean;\n\n  /** Storage key prefix */\n  storageKeyPrefix: string;\n}\n\n/**\n * Default model pricing\n */\nconst DEFAULT_MODEL_PRICING: ModelPricing[] = [\n  // Llama 3.2 (local - free)\n  {\n    modelId: 'llama-3.2-1b',\n    displayName: 'Llama 3.2 1B',\n    pricing: { inputPer1K: 0, outputPer1K: 0, currency: 'USD' },\n    maxContextTokens: 128000,\n    maxOutputTokens: 4096,\n  },\n  {\n    modelId: 'llama-3.2-3b',\n    displayName: 'Llama 3.2 3B',\n    pricing: { inputPer1K: 0, outputPer1K: 0, currency: 'USD' },\n    maxContextTokens: 128000,\n    maxOutputTokens: 4096,\n  },\n  // Phi-3 (local - free)\n  {\n    modelId: 'phi-3-mini',\n    displayName: 'Phi-3 Mini',\n    pricing: { inputPer1K: 0, outputPer1K: 0, currency: 'USD' },\n    maxContextTokens: 128000,\n    maxOutputTokens: 4096,\n  },\n  // Edge compute (subsidized pricing)\n  {\n    modelId: 'edge-7b',\n    displayName: 'Edge 7B',\n    pricing: { inputPer1K: 0.00005, outputPer1K: 0.0001, currency: 'USD' },\n    maxContextTokens: 32768,\n    maxOutputTokens: 4096,\n  },\n  // Cloud fallback (standard pricing)\n  {\n    modelId: 'cloud-70b',\n    displayName: 'Cloud 70B',\n    pricing: { inputPer1K: 0.0008, outputPer1K: 0.0024, currency: 'USD' },\n    maxContextTokens: 128000,\n    maxOutputTokens: 4096,\n  },\n];\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: TokenBudgetManagerConfig = {\n  budget: {\n    period: 'monthly',\n    alertThreshold: 0.8,\n  },\n  modelPricing: DEFAULT_MODEL_PRICING,\n  tokenEstimatorRatio: 4, // ~4 chars per token\n  maxStoredRecords: 10000,\n  persistUsage: true,\n  storageKeyPrefix: 'edgework-budget-',\n};\n\n/**\n * Token Budget Manager\n *\n * Manages token usage, costs, and budgets.\n */\nexport class TokenBudgetManager {\n  private config: TokenBudgetManagerConfig;\n  private usageRecords: UsageRecord[] = [];\n  private periodUsage: BudgetUsage;\n  private alertTriggered = false;\n\n  constructor(config: Partial<TokenBudgetManagerConfig> = {}) {\n    this.config = {\n      ...DEFAULT_CONFIG,\n      ...config,\n      budget: { ...DEFAULT_CONFIG.budget, ...config.budget },\n      modelPricing: config.modelPricing || DEFAULT_MODEL_PRICING,\n    };\n\n    this.periodUsage = this.initializePeriodUsage();\n\n    // Load persisted usage\n    if (this.config.persistUsage && typeof localStorage !== 'undefined') {\n      this.loadPersistedUsage();\n    }\n  }\n\n  /**\n   * Initialize period usage\n   */\n  private initializePeriodUsage(): BudgetUsage {\n    const { start, end } = this.getPeriodBounds();\n\n    return {\n      periodStart: start,\n      periodEnd: end,\n      totalCost: 0,\n      totalTokens: 0,\n      totalRequests: 0,\n      costLimit: this.config.budget.maxCost,\n      tokenLimit: this.config.budget.maxTokens,\n      requestLimit: this.config.budget.maxRequests,\n      costUsagePercent: 0,\n      tokenUsagePercent: 0,\n      requestUsagePercent: 0,\n      isOverBudget: false,\n      alertTriggered: false,\n    };\n  }\n\n  /**\n   * Get period bounds\n   */\n  private getPeriodBounds(): { start: number; end: number } {\n    const now = new Date();\n    let start: Date;\n    let end: Date;\n\n    switch (this.config.budget.period) {\n      case 'hourly':\n        start = new Date(\n          now.getFullYear(),\n          now.getMonth(),\n          now.getDate(),\n          now.getHours(),\n          0,\n          0,\n          0\n        );\n        end = new Date(start.getTime() + 60 * 60 * 1000);\n        break;\n\n      case 'daily':\n        start = new Date(\n          now.getFullYear(),\n          now.getMonth(),\n          now.getDate(),\n          0,\n          0,\n          0,\n          0\n        );\n        end = new Date(start.getTime() + 24 * 60 * 60 * 1000);\n        break;\n\n      case 'weekly': {\n        const dayOfWeek = now.getDay();\n        start = new Date(\n          now.getFullYear(),\n          now.getMonth(),\n          now.getDate() - dayOfWeek,\n          0,\n          0,\n          0,\n          0\n        );\n        end = new Date(start.getTime() + 7 * 24 * 60 * 60 * 1000);\n        break;\n      }\n\n      case 'monthly':\n        start = new Date(now.getFullYear(), now.getMonth(), 1, 0, 0, 0, 0);\n        end = new Date(now.getFullYear(), now.getMonth() + 1, 1, 0, 0, 0, 0);\n        break;\n\n      case 'unlimited':\n      default:\n        start = new Date(0);\n        end = new Date(8640000000000000); // Max date\n        break;\n    }\n\n    return { start: start.getTime(), end: end.getTime() };\n  }\n\n  /**\n   * Estimate tokens from text\n   */\n  estimateTokens(text: string): number {\n    // Simple estimation based on character count\n    // More accurate would be to use actual tokenizer\n    return Math.ceil(text.length / this.config.tokenEstimatorRatio);\n  }\n\n  /**\n   * Get model pricing\n   */\n  getModelPricing(modelId: string): ModelPricing | undefined {\n    return this.config.modelPricing.find((p) => p.modelId === modelId);\n  }\n\n  /**\n   * Calculate cost\n   */\n  calculateCost(\n    modelId: string,\n    inputTokens: number,\n    outputTokens: number\n  ): number {\n    const pricing = this.getModelPricing(modelId);\n    if (!pricing) return 0;\n\n    const inputCost = (inputTokens / 1000) * pricing.pricing.inputPer1K;\n    const outputCost = (outputTokens / 1000) * pricing.pricing.outputPer1K;\n\n    return inputCost + outputCost;\n  }\n\n  /**\n   * Estimate cost before request\n   */\n  estimateCost(\n    modelId: string,\n    prompt: string,\n    maxOutputTokens?: number\n  ): {\n    inputTokens: number;\n    outputTokens: number;\n    estimatedCost: number;\n    maxCost: number;\n  } {\n    const pricing = this.getModelPricing(modelId);\n    const inputTokens = this.estimateTokens(prompt);\n    const outputTokens = maxOutputTokens || pricing?.maxOutputTokens || 1024;\n\n    const estimatedOutputTokens = Math.min(\n      outputTokens,\n      Math.ceil(outputTokens * 0.5)\n    ); // Estimate 50% usage\n    const maxCost = this.calculateCost(modelId, inputTokens, outputTokens);\n    const estimatedCost = this.calculateCost(\n      modelId,\n      inputTokens,\n      estimatedOutputTokens\n    );\n\n    return {\n      inputTokens,\n      outputTokens: estimatedOutputTokens,\n      estimatedCost,\n      maxCost,\n    };\n  }\n\n  /**\n   * Check if request is within budget\n   */\n  checkBudget(\n    modelId: string,\n    prompt: string,\n    maxOutputTokens?: number\n  ): {\n    allowed: boolean;\n    reason?: string;\n    remainingBudget: BudgetUsage;\n  } {\n    // Check if period has changed\n    this.checkPeriodReset();\n\n    const estimate = this.estimateCost(modelId, prompt, maxOutputTokens);\n    const usage = this.periodUsage;\n\n    // Check cost limit\n    if (usage.costLimit !== undefined) {\n      if (usage.totalCost + estimate.maxCost > usage.costLimit) {\n        return {\n          allowed: false,\n          reason: `Cost budget exceeded: ${usage.totalCost.toFixed(\n            4\n          )} + ${estimate.maxCost.toFixed(4)} > ${usage.costLimit.toFixed(4)}`,\n          remainingBudget: usage,\n        };\n      }\n    }\n\n    // Check token limit\n    if (usage.tokenLimit !== undefined) {\n      const totalTokens = estimate.inputTokens + estimate.outputTokens;\n      if (usage.totalTokens + totalTokens > usage.tokenLimit) {\n        return {\n          allowed: false,\n          reason: `Token budget exceeded: ${usage.totalTokens} + ${totalTokens} > ${usage.tokenLimit}`,\n          remainingBudget: usage,\n        };\n      }\n    }\n\n    // Check request limit\n    if (usage.requestLimit !== undefined) {\n      if (usage.totalRequests + 1 > usage.requestLimit) {\n        return {\n          allowed: false,\n          reason: `Request budget exceeded: ${usage.totalRequests} + 1 > ${usage.requestLimit}`,\n          remainingBudget: usage,\n        };\n      }\n    }\n\n    return { allowed: true, remainingBudget: usage };\n  }\n\n  /**\n   * Record usage\n   */\n  recordUsage(\n    modelId: string,\n    inputTokens: number,\n    outputTokens: number,\n    requestId?: string,\n    metadata?: Record<string, unknown>\n  ): UsageRecord {\n    // Check if period has changed\n    this.checkPeriodReset();\n\n    const cost = this.calculateCost(modelId, inputTokens, outputTokens);\n    const totalTokens = inputTokens + outputTokens;\n\n    const record: UsageRecord = {\n      timestamp: Date.now(),\n      modelId,\n      inputTokens,\n      outputTokens,\n      estimatedCost: cost,\n      requestId,\n      metadata,\n    };\n\n    // Store record\n    this.usageRecords.push(record);\n    if (this.usageRecords.length > this.config.maxStoredRecords) {\n      this.usageRecords = this.usageRecords.slice(\n        -this.config.maxStoredRecords\n      );\n    }\n\n    // Update period usage\n    this.periodUsage.totalCost += cost;\n    this.periodUsage.totalTokens += totalTokens;\n    this.periodUsage.totalRequests += 1;\n\n    // Update percentages\n    this.updateUsagePercentages();\n\n    // Check alerts\n    this.checkAlerts();\n\n    // Persist\n    if (this.config.persistUsage) {\n      this.persistUsage();\n    }\n\n    return record;\n  }\n\n  /**\n   * Update usage percentages\n   */\n  private updateUsagePercentages(): void {\n    const usage = this.periodUsage;\n\n    usage.costUsagePercent = usage.costLimit\n      ? (usage.totalCost / usage.costLimit) * 100\n      : 0;\n\n    usage.tokenUsagePercent = usage.tokenLimit\n      ? (usage.totalTokens / usage.tokenLimit) * 100\n      : 0;\n\n    usage.requestUsagePercent = usage.requestLimit\n      ? (usage.totalRequests / usage.requestLimit) * 100\n      : 0;\n\n    usage.isOverBudget =\n      usage.costUsagePercent > 100 ||\n      usage.tokenUsagePercent > 100 ||\n      usage.requestUsagePercent > 100;\n  }\n\n  /**\n   * Check for budget alerts\n   */\n  private checkAlerts(): void {\n    const usage = this.periodUsage;\n    const threshold = this.config.budget.alertThreshold * 100;\n\n    const shouldAlert =\n      usage.costUsagePercent >= threshold ||\n      usage.tokenUsagePercent >= threshold ||\n      usage.requestUsagePercent >= threshold;\n\n    if (shouldAlert && !this.alertTriggered) {\n      this.alertTriggered = true;\n      usage.alertTriggered = true;\n      this.config.budget.onAlert?.(usage);\n    }\n\n    if (usage.isOverBudget) {\n      this.config.budget.onBudgetExceeded?.(usage);\n    }\n  }\n\n  /**\n   * Check if period has reset\n   */\n  private checkPeriodReset(): void {\n    const now = Date.now();\n    if (now >= this.periodUsage.periodEnd) {\n      this.periodUsage = this.initializePeriodUsage();\n      this.alertTriggered = false;\n\n      // Filter records to current period\n      this.usageRecords = this.usageRecords.filter(\n        (r) => r.timestamp >= this.periodUsage.periodStart\n      );\n    }\n  }\n\n  /**\n   * Get current usage\n   */\n  getCurrentUsage(): BudgetUsage {\n    this.checkPeriodReset();\n    return { ...this.periodUsage };\n  }\n\n  /**\n   * Get usage history\n   */\n  getUsageHistory(limit?: number): UsageRecord[] {\n    const records = [...this.usageRecords];\n    if (limit) {\n      return records.slice(-limit);\n    }\n    return records;\n  }\n\n  /**\n   * Get usage by model\n   */\n  getUsageByModel(): Map<\n    string,\n    { tokens: number; cost: number; requests: number }\n  > {\n    this.checkPeriodReset();\n\n    const byModel = new Map<\n      string,\n      { tokens: number; cost: number; requests: number }\n    >();\n\n    for (const record of this.usageRecords) {\n      if (record.timestamp < this.periodUsage.periodStart) continue;\n\n      const existing = byModel.get(record.modelId) || {\n        tokens: 0,\n        cost: 0,\n        requests: 0,\n      };\n      existing.tokens += record.inputTokens + record.outputTokens;\n      existing.cost += record.estimatedCost;\n      existing.requests += 1;\n      byModel.set(record.modelId, existing);\n    }\n\n    return byModel;\n  }\n\n  /**\n   * Get remaining budget\n   */\n  getRemainingBudget(): {\n    cost: number | null;\n    tokens: number | null;\n    requests: number | null;\n  } {\n    this.checkPeriodReset();\n    const usage = this.periodUsage;\n\n    return {\n      cost: usage.costLimit\n        ? Math.max(0, usage.costLimit - usage.totalCost)\n        : null,\n      tokens: usage.tokenLimit\n        ? Math.max(0, usage.tokenLimit - usage.totalTokens)\n        : null,\n      requests: usage.requestLimit\n        ? Math.max(0, usage.requestLimit - usage.totalRequests)\n        : null,\n    };\n  }\n\n  /**\n   * Set budget limits\n   */\n  setBudgetLimits(limits: {\n    maxCost?: number;\n    maxTokens?: number;\n    maxRequests?: number;\n  }): void {\n    if (limits.maxCost !== undefined) {\n      this.config.budget.maxCost = limits.maxCost;\n      this.periodUsage.costLimit = limits.maxCost;\n    }\n    if (limits.maxTokens !== undefined) {\n      this.config.budget.maxTokens = limits.maxTokens;\n      this.periodUsage.tokenLimit = limits.maxTokens;\n    }\n    if (limits.maxRequests !== undefined) {\n      this.config.budget.maxRequests = limits.maxRequests;\n      this.periodUsage.requestLimit = limits.maxRequests;\n    }\n\n    this.updateUsagePercentages();\n    this.checkAlerts();\n\n    if (this.config.persistUsage) {\n      this.persistUsage();\n    }\n  }\n\n  /**\n   * Add model pricing\n   */\n  addModelPricing(pricing: ModelPricing): void {\n    const existing = this.config.modelPricing.findIndex(\n      (p) => p.modelId === pricing.modelId\n    );\n    if (existing >= 0) {\n      this.config.modelPricing[existing] = pricing;\n    } else {\n      this.config.modelPricing.push(pricing);\n    }\n  }\n\n  /**\n   * Persist usage to storage\n   */\n  private persistUsage(): void {\n    if (typeof localStorage === 'undefined') return;\n\n    try {\n      const data = {\n        periodUsage: this.periodUsage,\n        usageRecords: this.usageRecords.slice(-1000), // Keep last 1000\n      };\n\n      localStorage.setItem(\n        `${this.config.storageKeyPrefix}usage`,\n        JSON.stringify(data)\n      );\n    } catch {\n      // Storage full or unavailable\n    }\n  }\n\n  /**\n   * Load persisted usage\n   */\n  private loadPersistedUsage(): void {\n    try {\n      const data = localStorage.getItem(`${this.config.storageKeyPrefix}usage`);\n      if (!data) return;\n\n      const parsed = JSON.parse(data);\n\n      // Check if period is still valid\n      const { start, end } = this.getPeriodBounds();\n      if (\n        parsed.periodUsage.periodStart === start &&\n        parsed.periodUsage.periodEnd === end\n      ) {\n        this.periodUsage = parsed.periodUsage;\n        this.usageRecords = parsed.usageRecords || [];\n      }\n    } catch {\n      // Invalid or missing data\n    }\n  }\n\n  /**\n   * Reset usage\n   */\n  resetUsage(): void {\n    this.periodUsage = this.initializePeriodUsage();\n    this.usageRecords = [];\n    this.alertTriggered = false;\n\n    if (this.config.persistUsage && typeof localStorage !== 'undefined') {\n      localStorage.removeItem(`${this.config.storageKeyPrefix}usage`);\n    }\n  }\n}\n\n/**\n * Pre-configured budget presets\n */\nexport const BUDGET_PRESETS = {\n  /** Free tier */\n  free: {\n    budget: {\n      period: 'monthly' as BudgetPeriod,\n      maxCost: 0,\n      maxTokens: 100000,\n      maxRequests: 1000,\n      alertThreshold: 0.8,\n    },\n  } as Partial<TokenBudgetManagerConfig>,\n\n  /** Basic tier */\n  basic: {\n    budget: {\n      period: 'monthly' as BudgetPeriod,\n      maxCost: 5,\n      maxTokens: 1000000,\n      maxRequests: 10000,\n      alertThreshold: 0.8,\n    },\n  } as Partial<TokenBudgetManagerConfig>,\n\n  /** Pro tier */\n  pro: {\n    budget: {\n      period: 'monthly' as BudgetPeriod,\n      maxCost: 50,\n      maxTokens: 10000000,\n      maxRequests: 100000,\n      alertThreshold: 0.9,\n    },\n  } as Partial<TokenBudgetManagerConfig>,\n\n  /** Enterprise - unlimited */\n  enterprise: {\n    budget: {\n      period: 'unlimited' as BudgetPeriod,\n      alertThreshold: 0.95,\n    },\n  } as Partial<TokenBudgetManagerConfig>,\n\n  /** Development - tracking only */\n  development: {\n    budget: {\n      period: 'daily' as BudgetPeriod,\n      alertThreshold: 0.5,\n    },\n  } as Partial<TokenBudgetManagerConfig>,\n};\n\n/**\n * Create a token budget manager with preset\n */\nexport function createTokenBudgetManager(\n  preset: keyof typeof BUDGET_PRESETS = 'basic',\n  overrides: Partial<TokenBudgetManagerConfig> = {}\n): TokenBudgetManager {\n  return new TokenBudgetManager({\n    ...BUDGET_PRESETS[preset],\n    ...overrides,\n  });\n}\n","/**\n * React Hooks for Distributed Inference\n *\n * Enhanced hooks for edge/distributed inference:\n * - useDistributedInference - Core distributed inference hook\n * - useModelRouter - Intelligent routing hook\n * - useStreamingInference - Real-time streaming hook\n * - useBudget - Token budget management hook\n * - useOfflineStatus - Offline status and sync hook\n * - useInferenceMetrics - Performance metrics hook\n */\n\nimport { useState, useEffect, useCallback, useRef, useMemo } from 'react';\n\n// Import types (actual implementations would come from the distributed modules)\nimport type { RouteDecision, RoutingStrategy } from './model-router';\nimport type { BudgetUsage, UsageRecord } from './token-budget-manager';\nimport type { PerformanceSummary, MetricValue } from './metrics-reporter';\nimport type { CircuitState, ClassifiedError } from './error-recovery';\n\n/**\n * Distributed inference configuration\n */\nexport interface UseDistributedInferenceConfig {\n  /** Model ID */\n  model: string;\n\n  /** Initial routing strategy */\n  routingStrategy?: RoutingStrategy;\n\n  /** Enable offline support */\n  enableOffline?: boolean;\n\n  /** Enable metrics collection */\n  enableMetrics?: boolean;\n\n  /** Maximum retries */\n  maxRetries?: number;\n\n  /** Timeout in ms */\n  timeout?: number;\n}\n\n/**\n * Inference request\n */\nexport interface InferenceRequest {\n  /** Input prompt */\n  prompt: string;\n\n  /** System prompt */\n  systemPrompt?: string;\n\n  /** Max tokens */\n  maxTokens?: number;\n\n  /** Temperature */\n  temperature?: number;\n\n  /** Top P */\n  topP?: number;\n\n  /** Stop sequences */\n  stopSequences?: string[];\n}\n\n/**\n * Inference result\n */\nexport interface InferenceResult {\n  /** Generated text */\n  text: string;\n\n  /** Tokens used */\n  tokensUsed: number;\n\n  /** Source (local/edge/cloud) */\n  source: 'local' | 'edge' | 'cloud';\n\n  /** Latency in ms */\n  latencyMs: number;\n\n  /** Model used */\n  model: string;\n\n  /** Finish reason */\n  finishReason: 'stop' | 'length' | 'error';\n}\n\n/**\n * Inference state\n */\nexport interface InferenceState {\n  /** Is loading/generating */\n  isLoading: boolean;\n\n  /** Current result */\n  result: InferenceResult | null;\n\n  /** Current error */\n  error: Error | null;\n\n  /** Is online */\n  isOnline: boolean;\n\n  /** Current routing decision */\n  routingDecision: RouteDecision | null;\n\n  /** Circuit breaker state */\n  circuitState: CircuitState;\n}\n\n/**\n * useDistributedInference Hook\n *\n * Core hook for distributed inference with automatic routing.\n */\nexport function useDistributedInference(config: UseDistributedInferenceConfig) {\n  const [state, setState] = useState<InferenceState>({\n    isLoading: false,\n    result: null,\n    error: null,\n    isOnline: typeof navigator !== 'undefined' ? navigator.onLine : true,\n    routingDecision: null,\n    circuitState: 'closed',\n  });\n\n  // Track online status\n  useEffect(() => {\n    if (typeof window === 'undefined') return;\n\n    const handleOnline = () => setState((s) => ({ ...s, isOnline: true }));\n    const handleOffline = () => setState((s) => ({ ...s, isOnline: false }));\n\n    window.addEventListener('online', handleOnline);\n    window.addEventListener('offline', handleOffline);\n\n    return () => {\n      window.removeEventListener('online', handleOnline);\n      window.removeEventListener('offline', handleOffline);\n    };\n  }, []);\n\n  /**\n   * Generate inference\n   */\n  const generate = useCallback(\n    async (request: InferenceRequest): Promise<InferenceResult | null> => {\n      setState((s) => ({ ...s, isLoading: true, error: null }));\n\n      try {\n        // This would use the actual EdgeInferenceAdapter\n        // For now, we'll mock the flow\n        const startTime = performance.now();\n\n        // Simulate routing decision\n        const routingDecision: RouteDecision = {\n          primary: state.isOnline ? 'edge' : 'local-wasm',\n          fallbacks: state.isOnline\n            ? ['local-wasm', 'local-webgpu']\n            : ['local-wasm'],\n          reason: state.isOnline\n            ? 'Edge inference preferred'\n            : 'Offline - using local',\n          confidence: 0.9,\n          estimatedLatencyMs: state.isOnline ? 200 : 100,\n          estimatedTPS: 50,\n          estimatedCost: state.isOnline ? 0.001 : 0,\n        };\n\n        setState((s) => ({ ...s, routingDecision }));\n\n        // Simulate inference (in real implementation, this calls EdgeInferenceAdapter)\n        await new Promise((resolve) => setTimeout(resolve, 100));\n\n        const result: InferenceResult = {\n          text: `Generated response for: ${request.prompt.slice(0, 50)}...`,\n          tokensUsed: Math.ceil(request.prompt.length / 4) + 50,\n          source: (routingDecision.primary === 'edge' ? 'edge' : 'local') as\n            | 'local'\n            | 'edge'\n            | 'cloud',\n          latencyMs: performance.now() - startTime,\n          model: config.model,\n          finishReason: 'stop',\n        };\n\n        setState((s) => ({ ...s, isLoading: false, result }));\n        return result;\n      } catch (error) {\n        setState((s) => ({\n          ...s,\n          isLoading: false,\n          error: error as Error,\n        }));\n        return null;\n      }\n    },\n    [config.model, state.isOnline]\n  );\n\n  /**\n   * Reset state\n   */\n  const reset = useCallback(() => {\n    setState({\n      isLoading: false,\n      result: null,\n      error: null,\n      isOnline: typeof navigator !== 'undefined' ? navigator.onLine : true,\n      routingDecision: null,\n      circuitState: 'closed',\n    });\n  }, []);\n\n  return {\n    ...state,\n    generate,\n    reset,\n  };\n}\n\n/**\n * Streaming inference state\n */\nexport interface StreamingState {\n  /** Is streaming */\n  isStreaming: boolean;\n\n  /** Tokens received so far */\n  tokens: string[];\n\n  /** Current text */\n  text: string;\n\n  /** Error if any */\n  error: Error | null;\n\n  /** Stream finished */\n  isComplete: boolean;\n\n  /** Tokens per second */\n  tokensPerSecond: number;\n}\n\n/**\n * useStreamingInference Hook\n *\n * Real-time streaming inference with backpressure handling.\n */\nexport function useStreamingInference(config: UseDistributedInferenceConfig) {\n  const [state, setState] = useState<StreamingState>({\n    isStreaming: false,\n    tokens: [],\n    text: '',\n    error: null,\n    isComplete: false,\n    tokensPerSecond: 0,\n  });\n\n  const abortControllerRef = useRef<AbortController | null>(null);\n  const tokenTimestampsRef = useRef<number[]>([]);\n\n  /**\n   * Stream inference\n   */\n  const stream = useCallback(async function* (\n    request: InferenceRequest\n  ): AsyncGenerator<string> {\n    setState((s) => ({\n      ...s,\n      isStreaming: true,\n      tokens: [],\n      text: '',\n      error: null,\n      isComplete: false,\n    }));\n\n    abortControllerRef.current = new AbortController();\n    tokenTimestampsRef.current = [];\n\n    try {\n      // Simulate streaming (real implementation uses StreamingClient)\n      const words = `Generated streaming response for: ${request.prompt}`.split(\n        ' '\n      );\n\n      for (const word of words) {\n        if (abortControllerRef.current?.signal.aborted) break;\n\n        await new Promise((resolve) => setTimeout(resolve, 50));\n\n        const token = word + ' ';\n        tokenTimestampsRef.current.push(Date.now());\n\n        // Calculate tokens per second\n        const recentTokens = tokenTimestampsRef.current.filter(\n          (t) => Date.now() - t < 1000\n        );\n        const tps = recentTokens.length;\n\n        setState((s) => ({\n          ...s,\n          tokens: [...s.tokens, token],\n          text: s.text + token,\n          tokensPerSecond: tps,\n        }));\n\n        yield token;\n      }\n\n      setState((s) => ({ ...s, isStreaming: false, isComplete: true }));\n    } catch (error) {\n      setState((s) => ({\n        ...s,\n        isStreaming: false,\n        error: error as Error,\n      }));\n      throw error;\n    }\n  },\n  []);\n\n  /**\n   * Stop streaming\n   */\n  const stop = useCallback(() => {\n    abortControllerRef.current?.abort();\n    setState((s) => ({ ...s, isStreaming: false }));\n  }, []);\n\n  /**\n   * Reset state\n   */\n  const reset = useCallback(() => {\n    stop();\n    setState({\n      isStreaming: false,\n      tokens: [],\n      text: '',\n      error: null,\n      isComplete: false,\n      tokensPerSecond: 0,\n    });\n  }, [stop]);\n\n  return {\n    ...state,\n    stream,\n    stop,\n    reset,\n  };\n}\n\n/**\n * Budget state\n */\nexport interface BudgetState {\n  /** Current usage */\n  usage: BudgetUsage | null;\n\n  /** Recent usage records */\n  recentRecords: UsageRecord[];\n\n  /** Is over budget */\n  isOverBudget: boolean;\n\n  /** Alert triggered */\n  alertTriggered: boolean;\n\n  /** Remaining budget */\n  remaining: {\n    cost: number | null;\n    tokens: number | null;\n    requests: number | null;\n  };\n}\n\n/**\n * useBudget Hook\n *\n * Token budget management and tracking.\n */\nexport function useBudget() {\n  const [state, setState] = useState<BudgetState>({\n    usage: null,\n    recentRecords: [],\n    isOverBudget: false,\n    alertTriggered: false,\n    remaining: {\n      cost: null,\n      tokens: null,\n      requests: null,\n    },\n  });\n\n  /**\n   * Check if request is within budget\n   */\n  const checkBudget = useCallback(\n    (\n      modelId: string,\n      prompt: string,\n      maxOutputTokens?: number\n    ): { allowed: boolean; reason?: string } => {\n      // This would use actual TokenBudgetManager\n      const estimatedTokens =\n        Math.ceil(prompt.length / 4) + (maxOutputTokens || 1024);\n\n      if (\n        state.remaining.tokens !== null &&\n        estimatedTokens > state.remaining.tokens\n      ) {\n        return {\n          allowed: false,\n          reason: `Estimated ${estimatedTokens} tokens exceeds remaining budget of ${state.remaining.tokens}`,\n        };\n      }\n\n      return { allowed: true };\n    },\n    [state.remaining]\n  );\n\n  /**\n   * Record usage\n   */\n  const recordUsage = useCallback(\n    (modelId: string, inputTokens: number, outputTokens: number): void => {\n      const record: UsageRecord = {\n        timestamp: Date.now(),\n        modelId,\n        inputTokens,\n        outputTokens,\n        estimatedCost: 0, // Would calculate from pricing\n      };\n\n      setState((s) => ({\n        ...s,\n        recentRecords: [...s.recentRecords.slice(-99), record],\n      }));\n    },\n    []\n  );\n\n  /**\n   * Set budget limits\n   */\n  const setBudgetLimits = useCallback(\n    (limits: {\n      maxCost?: number;\n      maxTokens?: number;\n      maxRequests?: number;\n    }): void => {\n      setState((s) => ({\n        ...s,\n        remaining: {\n          cost: limits.maxCost ?? s.remaining.cost,\n          tokens: limits.maxTokens ?? s.remaining.tokens,\n          requests: limits.maxRequests ?? s.remaining.requests,\n        },\n      }));\n    },\n    []\n  );\n\n  return {\n    ...state,\n    checkBudget,\n    recordUsage,\n    setBudgetLimits,\n  };\n}\n\n/**\n * Offline state\n */\nexport interface OfflineState {\n  /** Is online */\n  isOnline: boolean;\n\n  /** Is syncing */\n  isSyncing: boolean;\n\n  /** Pending requests count */\n  pendingRequests: number;\n\n  /** Last sync time */\n  lastSyncTime: number | null;\n\n  /** Sync error */\n  syncError: Error | null;\n\n  /** Cached models */\n  cachedModels: string[];\n}\n\n/**\n * useOfflineStatus Hook\n *\n * Offline status and sync management.\n */\nexport function useOfflineStatus() {\n  const [state, setState] = useState<OfflineState>({\n    isOnline: typeof navigator !== 'undefined' ? navigator.onLine : true,\n    isSyncing: false,\n    pendingRequests: 0,\n    lastSyncTime: null,\n    syncError: null,\n    cachedModels: [],\n  });\n\n  // Track online status\n  useEffect(() => {\n    if (typeof window === 'undefined') return;\n\n    const handleOnline = () => {\n      setState((s) => ({ ...s, isOnline: true }));\n      // Trigger sync when coming online\n      triggerSync();\n    };\n\n    const handleOffline = () => {\n      setState((s) => ({ ...s, isOnline: false }));\n    };\n\n    window.addEventListener('online', handleOnline);\n    window.addEventListener('offline', handleOffline);\n\n    return () => {\n      window.removeEventListener('online', handleOnline);\n      window.removeEventListener('offline', handleOffline);\n    };\n  }, []);\n\n  /**\n   * Trigger sync\n   */\n  const triggerSync = useCallback(async (): Promise<void> => {\n    if (!state.isOnline) return;\n\n    setState((s) => ({ ...s, isSyncing: true, syncError: null }));\n\n    try {\n      // This would use actual OfflineSupport\n      await new Promise((resolve) => setTimeout(resolve, 1000));\n\n      setState((s) => ({\n        ...s,\n        isSyncing: false,\n        pendingRequests: 0,\n        lastSyncTime: Date.now(),\n      }));\n    } catch (error) {\n      setState((s) => ({\n        ...s,\n        isSyncing: false,\n        syncError: error as Error,\n      }));\n    }\n  }, [state.isOnline]);\n\n  /**\n   * Queue offline request\n   */\n  const queueRequest = useCallback((): void => {\n    setState((s) => ({\n      ...s,\n      pendingRequests: s.pendingRequests + 1,\n    }));\n  }, []);\n\n  /**\n   * Cache model for offline use\n   */\n  const cacheModel = useCallback(async (modelId: string): Promise<void> => {\n    // This would use actual ModelPreloader/OfflineSupport\n    await new Promise((resolve) => setTimeout(resolve, 500));\n\n    setState((s) => ({\n      ...s,\n      cachedModels: [...new Set([...s.cachedModels, modelId])],\n    }));\n  }, []);\n\n  /**\n   * Check if model is cached\n   */\n  const isModelCached = useCallback(\n    (modelId: string): boolean => {\n      return state.cachedModels.includes(modelId);\n    },\n    [state.cachedModels]\n  );\n\n  return {\n    ...state,\n    triggerSync,\n    queueRequest,\n    cacheModel,\n    isModelCached,\n  };\n}\n\n/**\n * Metrics state\n */\nexport interface MetricsState {\n  /** Performance summary */\n  summary: PerformanceSummary | null;\n\n  /** Recent metrics */\n  recentMetrics: MetricValue[];\n\n  /** Is collecting */\n  isCollecting: boolean;\n}\n\n/**\n * useInferenceMetrics Hook\n *\n * Performance metrics and monitoring.\n */\nexport function useInferenceMetrics(\n  options: {\n    collectionInterval?: number;\n    autoStart?: boolean;\n  } = {}\n) {\n  const { collectionInterval = 5000, autoStart = true } = options;\n\n  const [state, setState] = useState<MetricsState>({\n    summary: null,\n    recentMetrics: [],\n    isCollecting: false,\n  });\n\n  const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n  /**\n   * Start collecting\n   */\n  const start = useCallback(() => {\n    if (intervalRef.current) return;\n\n    setState((s) => ({ ...s, isCollecting: true }));\n\n    intervalRef.current = setInterval(() => {\n      // This would use actual MetricsReporter\n      // For now, generate mock summary\n      const summary: PerformanceSummary = {\n        periodMs: collectionInterval,\n        inference: {\n          totalRequests: Math.floor(Math.random() * 100),\n          successfulRequests: Math.floor(Math.random() * 95),\n          failedRequests: Math.floor(Math.random() * 5),\n          avgLatencyMs: 50 + Math.random() * 100,\n          p95LatencyMs: 100 + Math.random() * 200,\n          tokensGenerated: Math.floor(Math.random() * 10000),\n          avgTokensPerSecond: 20 + Math.random() * 30,\n        },\n        resources: {\n          avgMemoryUsage: 50 + Math.random() * 50,\n          peakMemoryUsage: 70 + Math.random() * 30,\n          avgCpuUsage: 10 + Math.random() * 40,\n          networkBytesSent: Math.floor(Math.random() * 100000),\n          networkBytesReceived: Math.floor(Math.random() * 500000),\n        },\n        cache: {\n          hitRate: 0.6 + Math.random() * 0.3,\n          missRate: 0.1 + Math.random() * 0.2,\n          evictionCount: Math.floor(Math.random() * 10),\n          cacheSize: Math.floor(Math.random() * 1000000),\n        },\n        errors: {\n          totalErrors: Math.floor(Math.random() * 5),\n          errorRate: Math.random() * 0.05,\n          errorsByType: {},\n        },\n      };\n\n      setState((s) => ({\n        ...s,\n        summary,\n      }));\n    }, collectionInterval);\n  }, [collectionInterval]);\n\n  /**\n   * Stop collecting\n   */\n  const stop = useCallback(() => {\n    if (intervalRef.current) {\n      clearInterval(intervalRef.current);\n      intervalRef.current = null;\n    }\n    setState((s) => ({ ...s, isCollecting: false }));\n  }, []);\n\n  /**\n   * Record a metric\n   */\n  const recordMetric = useCallback(\n    (\n      name: string,\n      value: number,\n      labels: Record<string, string> = {}\n    ): void => {\n      const metric: MetricValue = {\n        name,\n        type: 'gauge',\n        value,\n        labels,\n        timestamp: Date.now(),\n      };\n\n      setState((s) => ({\n        ...s,\n        recentMetrics: [...s.recentMetrics.slice(-99), metric],\n      }));\n    },\n    []\n  );\n\n  // Auto-start if configured\n  useEffect(() => {\n    if (autoStart) {\n      start();\n    }\n\n    return () => {\n      if (intervalRef.current) {\n        clearInterval(intervalRef.current);\n      }\n    };\n  }, [autoStart, start]);\n\n  return {\n    ...state,\n    start,\n    stop,\n    recordMetric,\n  };\n}\n\n/**\n * Model status state\n */\nexport interface ModelStatusState {\n  /** Model ID */\n  modelId: string | null;\n\n  /** Is loaded */\n  isLoaded: boolean;\n\n  /** Is loading */\n  isLoading: boolean;\n\n  /** Download progress (0-100) */\n  downloadProgress: number;\n\n  /** Load error */\n  error: Error | null;\n\n  /** Backend type */\n  backend: 'webgpu' | 'wasm' | 'remote' | null;\n\n  /** Model size in bytes */\n  sizeBytes: number | null;\n}\n\n/**\n * useModelStatus Hook\n *\n * Track model loading and status.\n */\nexport function useModelStatus() {\n  const [state, setState] = useState<ModelStatusState>({\n    modelId: null,\n    isLoaded: false,\n    isLoading: false,\n    downloadProgress: 0,\n    error: null,\n    backend: null,\n    sizeBytes: null,\n  });\n\n  /**\n   * Load model\n   */\n  const loadModel = useCallback(async (modelId: string): Promise<void> => {\n    setState((s) => ({\n      ...s,\n      modelId,\n      isLoading: true,\n      downloadProgress: 0,\n      error: null,\n    }));\n\n    try {\n      // Simulate loading with progress\n      for (let i = 0; i <= 100; i += 10) {\n        await new Promise((resolve) => setTimeout(resolve, 50));\n        setState((s) => ({ ...s, downloadProgress: i }));\n      }\n\n      // Detect backend\n      const hasWebGPU = typeof navigator !== 'undefined' && 'gpu' in navigator;\n\n      setState((s) => ({\n        ...s,\n        isLoaded: true,\n        isLoading: false,\n        backend: hasWebGPU ? 'webgpu' : 'wasm',\n        sizeBytes: 100 * 1024 * 1024, // Mock 100MB\n      }));\n    } catch (error) {\n      setState((s) => ({\n        ...s,\n        isLoading: false,\n        error: error as Error,\n      }));\n    }\n  }, []);\n\n  /**\n   * Unload model\n   */\n  const unloadModel = useCallback((): void => {\n    setState({\n      modelId: null,\n      isLoaded: false,\n      isLoading: false,\n      downloadProgress: 0,\n      error: null,\n      backend: null,\n      sizeBytes: null,\n    });\n  }, []);\n\n  return {\n    ...state,\n    loadModel,\n    unloadModel,\n  };\n}\n\n/**\n * Combined edgework hook for convenience\n */\nexport function useEdgeworkInference(config: UseDistributedInferenceConfig) {\n  const inference = useDistributedInference(config);\n  const streaming = useStreamingInference(config);\n  const budget = useBudget();\n  const offline = useOfflineStatus();\n  const metrics = useInferenceMetrics({ autoStart: config.enableMetrics });\n  const model = useModelStatus();\n\n  return useMemo(\n    () => ({\n      // Inference state\n      isLoading: inference.isLoading,\n      result: inference.result,\n      error: inference.error,\n      generate: inference.generate,\n\n      // Streaming\n      isStreaming: streaming.isStreaming,\n      streamText: streaming.text,\n      stream: streaming.stream,\n      stopStream: streaming.stop,\n\n      // Budget\n      usage: budget.usage,\n      checkBudget: budget.checkBudget,\n      recordUsage: budget.recordUsage,\n\n      // Offline\n      isOnline: offline.isOnline,\n      isSyncing: offline.isSyncing,\n      pendingRequests: offline.pendingRequests,\n      cacheModel: offline.cacheModel,\n\n      // Metrics\n      metrics: metrics.summary,\n\n      // Model\n      isModelLoaded: model.isLoaded,\n      loadModel: model.loadModel,\n      modelBackend: model.backend,\n    }),\n    [inference, streaming, budget, offline, metrics.summary, model]\n  );\n}\n"]}