{"version":3,"sources":["../src/coordination/leader-election.ts","../src/coordination/shared-bridge.ts","../src/coordination/tab-channel.ts","../src/core/budget.ts","../src/core/capabilities.ts","../src/core/errors.ts","../src/core/lifecycle.ts","../src/core/registry.ts","../src/core/scheduler.ts","../src/core/pool.ts","../src/streaming/progress-emitter.ts","../src/streaming/token-stream.ts"],"names":["LOCK_NAME","LeaderElection","_LeaderElection","resolved","resolve","timeout","err","state","held","l","pending","callback","role","listener","SharedWorkerBridge","workerUrl","sw","event","msg","transfer","CHANNEL_NAME","KNOWN_MESSAGE_TYPES","isValidMessage","data","TabChannel","MemoryBudget","maxMB","requiredMB","toEvict","freed","id","size","modelId","memoryMB","idx","WASM_SIMD_PROBE","WASM_THREADS_PROBE","detectWasm","detectWebGpu","gpu","adapter","info","isFallback","detectSharedWorker","detectBroadcastChannel","detectWebLocks","cachedReport","detectCapabilities","webgpu","wasm","clearCapabilitiesCache","InferisError","_InferisError","message","code","instance","result","ModelLoadError","ModelNotReadyError","ModelDisposedError","InferenceError","BudgetExceededError","requestedMB","budgetMB","TaskTimeoutError","reqId","timeoutMs","WorkerError","workerId","DeviceLostError","reason","EnvironmentError","InvalidStateTransitionError","from","to","TRANSITIONS","transition","canTransition","isAcceptingInference","isTerminal","ModelRegistry","task","modelName","config","entry","device","e","PRIORITY_WEIGHT","Scheduler","_models","load","priority","queue","taskIdx","concurrencyPerWorker","affinityWorker","leastLoadedWorker","leastLoad","models","t","total","q","p","DEFAULT_MAX_WORKERS","DEFAULT_MAX_MEMORY_MB","DEFAULT_TASK_TIMEOUT_MS","PRIORITY_ORDER","WorkerPool","_WorkerPool","caps","full","pool","i","worker","req","existing","s","estimatedMB","tempAdapter","evictId","reject","workerEntry","_estMem","_onProgress","workerConfig","registry","dispose","runInference","streamInference","input","options","signal","onLoadAbort","unsub","deferred","a","b","onAbort","val","w","_p","_s","workerOptions","c","controller","ms","crashedModelIds","defaultDevice","createPool","ProgressEmitter","readableToAsyncIter","stream","reader","done","value","collectStream","results","chunk","collectStreamText"],"mappings":"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","file":"index.cjs","sourcesContent":["const LOCK_NAME = 'inferis:leader';\n\ntype RoleChangeCallback = (role: 'leader' | 'follower') => void;\n\n/**\n * Leader election via Web Locks API.\n *\n * @remarks\n * One tab holds the lock and acts as the \"leader\" — it owns the worker pool.\n * All other tabs are \"followers\" and proxy their requests through BroadcastChannel.\n *\n * When the leader tab closes, the lock is released automatically by the browser,\n * and the next tab in the lock queue is promoted to leader.\n *\n * Web Locks + BroadcastChannel combined coverage: ~96% of modern browsers.\n *\n * iOS Safari and older Android Chrome do not support SharedWorker but DO support\n * Web Locks, making this tier 2 a reliable cross-mobile fallback.\n */\nexport class LeaderElection {\n  private role: 'leader' | 'follower' | 'unknown' = 'unknown';\n  private readonly listeners = new Set<RoleChangeCallback>();\n  private abortController: AbortController | null = null;\n\n  /**\n   * Start leader election. Resolves once the role is determined.\n   * The lock is held for the lifetime of the tab.\n   */\n  async start(): Promise<'leader' | 'follower'> {\n    if (!this.isSupported()) {\n      this.setRole('leader');\n      return 'leader';\n    }\n\n    this.abortController = new AbortController();\n    let resolved = false;\n\n    return new Promise<'leader' | 'follower'>((resolve) => {\n      const timeout = setTimeout(() => {\n        if (!resolved) {\n          resolved = true;\n          this.setRole('leader');\n          resolve('leader');\n        }\n      }, 5000);\n\n      navigator.locks.request(\n        LOCK_NAME,\n        { signal: this.abortController!.signal },\n        async () => {\n          if (!resolved) {\n            resolved = true;\n            clearTimeout(timeout);\n            this.setRole('leader');\n            resolve('leader');\n          }\n          await this.holdLock();\n        },\n      ).catch((err: Error) => {\n        if (err.name !== 'AbortError') {\n          void err;\n        }\n      });\n\n      navigator.locks.query().then((state) => {\n        if (resolved)\n          return;\n        const held = state.held?.some(l => l.name === LOCK_NAME) ?? false;\n        const pending = state.pending?.some(l => l.name === LOCK_NAME) ?? false;\n        if (held || pending) {\n          resolved = true;\n          clearTimeout(timeout);\n          this.setRole('follower');\n          resolve('follower');\n        }\n      }).catch(() => {\n        // locks.query() may not be available\n      });\n    });\n  }\n\n  private holdLock(): Promise<void> {\n    return new Promise<void>((resolve) => {\n      if (this.abortController) {\n        this.abortController.signal.addEventListener('abort', () => resolve(), { once: true });\n      }\n    });\n  }\n\n  /**\n   * Release the lock and stop the election. Used for cleanup.\n   */\n  stop(): void {\n    this.abortController?.abort();\n    this.abortController = null;\n  }\n\n  /**\n   * Subscribe to role changes.\n   * @returns unsubscribe function\n   */\n  onRoleChange(callback: RoleChangeCallback): () => void {\n    this.listeners.add(callback);\n    return () => this.listeners.delete(callback);\n  }\n\n  get currentRole(): 'leader' | 'follower' | 'unknown' {\n    return this.role;\n  }\n\n  get isLeader(): boolean {\n    return this.role === 'leader';\n  }\n\n  private setRole(role: 'leader' | 'follower'): void {\n    this.role = role;\n    for (const listener of this.listeners) {\n      try {\n        listener(role);\n      }\n      catch { /* noop */ }\n    }\n  }\n\n  /**\n   * Check if the Web Locks API is available.\n   */\n  static isSupported(): boolean {\n    return typeof navigator !== 'undefined' && 'locks' in navigator;\n  }\n\n  isSupported(): boolean {\n    return LeaderElection.isSupported();\n  }\n}\n","import type { MainToWorkerMessage, WorkerToMainMessage } from '../core/types.js';\n\ntype MessageListener = (msg: WorkerToMainMessage) => void;\n\n/**\n * Bridge to a SharedWorker.\n *\n * @remarks\n * SharedWorker allows all tabs from the same origin to share one worker process.\n * One worker holds all model instances, eliminating per-tab model duplication.\n *\n * Tier 1 coordination (~58% browser coverage):\n * - Chrome 4+, Edge 79+, Firefox 29+, Safari 16+\n * - NOT supported on iOS Safari < 16 or Android Chrome\n *\n * If SharedWorker is unavailable, fall back to LeaderElection (tier 2)\n * or per-tab dedicated workers (tier 3).\n */\nexport class SharedWorkerBridge {\n  private readonly port: MessagePort;\n  private readonly listeners = new Set<MessageListener>();\n\n  constructor(workerUrl: URL | string) {\n    const sw = new SharedWorker(workerUrl, { type: 'module' });\n    this.port = sw.port;\n\n    sw.onerror = (event: ErrorEvent) => {\n      console.error('[SharedWorkerBridge] worker error:', event.message);\n    };\n\n    this.port.onmessage = (event: MessageEvent<WorkerToMainMessage>) => {\n      for (const listener of this.listeners) {\n        try {\n          listener(event.data);\n        }\n        catch {\n          // listeners must not throw\n        }\n      }\n    };\n\n    this.port.onmessageerror = (event: MessageEvent) => {\n      console.error('[SharedWorkerBridge] port deserialization error:', event);\n    };\n\n    this.port.start();\n  }\n\n  /**\n   * Send a message to the shared worker.\n   */\n  postMessage(msg: MainToWorkerMessage, transfer?: Transferable[]): void {\n    if (transfer?.length) {\n      this.port.postMessage(msg, transfer);\n    }\n    else {\n      this.port.postMessage(msg);\n    }\n  }\n\n  /**\n   * Subscribe to incoming messages from the shared worker.\n   * @returns unsubscribe function\n   */\n  on(listener: MessageListener): () => void {\n    this.listeners.add(listener);\n    return () => this.listeners.delete(listener);\n  }\n\n  /**\n   * Disconnect from the shared worker. The worker itself stays alive\n   * as long as other tabs are connected.\n   */\n  disconnect(): void {\n    this.listeners.clear();\n    this.port.close();\n  }\n\n  /**\n   * Check if SharedWorker is available in the current environment.\n   */\n  static isSupported(): boolean {\n    return typeof SharedWorker !== 'undefined';\n  }\n}\n","const CHANNEL_NAME = 'inferis:bus';\n\nconst KNOWN_MESSAGE_TYPES = new Set([\n  'leader-elected',\n  'leader-gone',\n  'request',\n  'response',\n  'stream-chunk',\n  'stream-end',\n  'stream-error',\n]);\n\nexport type TabChannelMessage\n  = | { type: 'leader-elected'; tabId: string }\n    | { type: 'leader-gone'; tabId: string }\n    | { type: 'request'; tabId: string; reqId: string; payload: unknown }\n    | { type: 'response'; reqId: string; payload: unknown; error?: { message: string; name: string } }\n    | { type: 'stream-chunk'; reqId: string; chunk: unknown }\n    | { type: 'stream-end'; reqId: string }\n    | { type: 'stream-error'; reqId: string; error: { message: string; name: string } };\n\ntype TabChannelListener = (msg: TabChannelMessage) => void;\n\nfunction isValidMessage(data: unknown): data is TabChannelMessage {\n  return (\n    typeof data === 'object'\n    && data !== null\n    && 'type' in data\n    && typeof (data as Record<string, unknown>).type === 'string'\n    && KNOWN_MESSAGE_TYPES.has((data as Record<string, unknown>).type as string)\n  );\n}\n\n/**\n * Thin wrapper over BroadcastChannel for cross-tab coordination.\n *\n * @remarks\n * BroadcastChannel has ~96% browser coverage and works on both desktop\n * and mobile. Messages are NOT delivered to the sender tab.\n */\nexport class TabChannel {\n  private readonly channel: BroadcastChannel;\n  private readonly listeners = new Set<TabChannelListener>();\n\n  constructor() {\n    this.channel = new BroadcastChannel(CHANNEL_NAME);\n    this.channel.onmessage = (event: MessageEvent) => {\n      if (!isValidMessage(event.data))\n        return;\n      for (const listener of this.listeners) {\n        try {\n          listener(event.data);\n        }\n        catch {\n          // listeners must not throw\n        }\n      }\n    };\n  }\n\n  /**\n   * Broadcast a message to all other tabs.\n   */\n  send(msg: TabChannelMessage): void {\n    this.channel.postMessage(msg);\n  }\n\n  /**\n   * Subscribe to incoming messages.\n   * @returns unsubscribe function\n   */\n  on(listener: TabChannelListener): () => void {\n    this.listeners.add(listener);\n    return () => this.listeners.delete(listener);\n  }\n\n  /**\n   * Close the channel and remove all listeners.\n   */\n  close(): void {\n    this.listeners.clear();\n    this.channel.close();\n  }\n\n  /**\n   * Check if BroadcastChannel is available in the current environment.\n   */\n  static isSupported(): boolean {\n    return typeof BroadcastChannel !== 'undefined';\n  }\n}\n","/**\n * LRU-based memory budget tracker.\n *\n * Tracks approximate memory usage across loaded models.\n * When a new model load would exceed the configured budget,\n * evicts least-recently-used models to make room.\n */\nexport class MemoryBudget {\n  private readonly maxMB: number;\n  private usedMB: number = 0;\n  private readonly lruOrder: string[] = [];\n  private readonly modelSizes: Map<string, number> = new Map();\n\n  constructor(maxMB: number) {\n    if (maxMB <= 0)\n      throw new RangeError('maxMB must be > 0');\n    this.maxMB = maxMB;\n  }\n\n  /** Total memory budget in MB. */\n  get totalMB(): number {\n    return this.maxMB;\n  }\n\n  /** Currently allocated memory in MB. */\n  get allocatedMB(): number {\n    return this.usedMB;\n  }\n\n  /** Remaining available memory in MB. */\n  get availableMB(): number {\n    return this.maxMB - this.usedMB;\n  }\n\n  /**\n   * Determine which model IDs must be evicted to fit `requiredMB`.\n   * Does NOT perform the eviction itself — caller is responsible for\n   * actually unloading the returned models before calling `allocate()`.\n   *\n   * @returns Array of model IDs to evict (LRU order), or null if\n   *          `requiredMB` exceeds the total budget (impossible to fit).\n   */\n  planEviction(requiredMB: number): string[] | null {\n    if (requiredMB > this.maxMB)\n      return null;\n    if (requiredMB <= this.availableMB)\n      return [];\n\n    const toEvict: string[] = [];\n    let freed = 0;\n\n    for (const id of this.lruOrder) {\n      if (freed >= requiredMB - this.availableMB)\n        break;\n      const size = this.modelSizes.get(id);\n      if (size !== undefined) {\n        toEvict.push(id);\n        freed += size;\n      }\n    }\n\n    return freed >= requiredMB - this.availableMB ? toEvict : null;\n  }\n\n  /**\n   * Allocate memory for a model. Call after the model is loaded.\n   * Updates LRU order.\n   */\n  allocate(modelId: string, memoryMB: number): void {\n    if (this.modelSizes.has(modelId)) {\n      this.release(modelId);\n    }\n    this.modelSizes.set(modelId, memoryMB);\n    this.usedMB += memoryMB;\n    this.touch(modelId);\n  }\n\n  /**\n   * Release memory for a model. Call when model is unloaded.\n   */\n  release(modelId: string): void {\n    const size = this.modelSizes.get(modelId);\n    if (size === undefined)\n      return;\n\n    this.modelSizes.delete(modelId);\n    this.usedMB = Math.max(0, this.usedMB - size);\n\n    const idx = this.lruOrder.indexOf(modelId);\n    if (idx !== -1)\n      this.lruOrder.splice(idx, 1);\n  }\n\n  /**\n   * Mark a model as recently used, moving it to the back of the LRU queue.\n   */\n  touch(modelId: string): void {\n    const idx = this.lruOrder.indexOf(modelId);\n    if (idx !== -1)\n      this.lruOrder.splice(idx, 1);\n    this.lruOrder.push(modelId);\n  }\n\n  /**\n   * Check whether allocating `requiredMB` would stay within budget\n   * (i.e., requires no evictions).\n   */\n  fits(requiredMB: number): boolean {\n    return requiredMB <= this.availableMB;\n  }\n\n  /** Return LRU-ordered list of tracked model IDs (oldest first). */\n  get lruList(): readonly string[] {\n    return this.lruOrder;\n  }\n}\n","import type { CapabilityReport, WasmCapability, WebGpuCapability } from './types.js';\n\nconst WASM_SIMD_PROBE = new Uint8Array([\n  0x00,\n  0x61,\n  0x73,\n  0x6D,\n  0x01,\n  0x00,\n  0x00,\n  0x00,\n  0x01,\n  0x05,\n  0x01,\n  0x60,\n  0x00,\n  0x01,\n  0x7B,\n  0x03,\n  0x02,\n  0x01,\n  0x00,\n  0x0A,\n  0x0A,\n  0x01,\n  0x08,\n  0x00,\n  0x41,\n  0x00,\n  0xFD,\n  0x0F,\n  0x00,\n  0x00,\n  0x0B,\n]);\n\nconst WASM_THREADS_PROBE = new Uint8Array([\n  0x00,\n  0x61,\n  0x73,\n  0x6D,\n  0x01,\n  0x00,\n  0x00,\n  0x00,\n  0x01,\n  0x04,\n  0x01,\n  0x60,\n  0x00,\n  0x00,\n  0x03,\n  0x02,\n  0x01,\n  0x00,\n  0x05,\n  0x04,\n  0x01,\n  0x03,\n  0x01,\n  0x01,\n  0x0A,\n  0x0B,\n  0x01,\n  0x09,\n  0x00,\n  0xFE,\n  0x01,\n  0x02,\n  0x00,\n  0x41,\n  0x00,\n  0x0B,\n]);\n\nfunction detectWasm(): WasmCapability {\n  if (typeof WebAssembly === 'undefined') {\n    return { simd: false, supported: false, threads: false };\n  }\n  return {\n    simd: WebAssembly.validate(WASM_SIMD_PROBE),\n    supported: true,\n    threads: WebAssembly.validate(WASM_THREADS_PROBE),\n  };\n}\n\nasync function detectWebGpu(): Promise<WebGpuCapability> {\n  if (typeof navigator === 'undefined' || !('gpu' in navigator)) {\n    return { adapter: null, isFallback: false, limits: null, supported: false };\n  }\n\n  // eslint-disable-next-line ts/no-explicit-any\n  const gpu = (navigator as any).gpu;\n  if (gpu == null) {\n    return { adapter: null, isFallback: false, limits: null, supported: false };\n  }\n\n  try {\n    const adapter = await gpu.requestAdapter();\n    if (!adapter) {\n      return { adapter: null, isFallback: false, limits: null, supported: false };\n    }\n\n    // eslint-disable-next-line ts/no-explicit-any\n    const info = await adapter.requestAdapterInfo?.() as any ?? {};\n    const isFallback: boolean = adapter.isFallbackAdapter ?? false;\n\n    return {\n      adapter: {\n        architecture: (info.architecture as string) ?? '',\n        description: (info.description as string) ?? '',\n        device: (info.device as string) ?? '',\n        vendor: (info.vendor as string) ?? '',\n      },\n      isFallback,\n      limits: {\n        maxBufferSize: adapter.limits?.maxBufferSize ?? 0,\n        maxStorageBufferBindingSize: adapter.limits?.maxStorageBufferBindingSize ?? 0,\n      },\n      supported: true,\n    };\n  }\n  catch {\n    return { adapter: null, isFallback: false, limits: null, supported: false };\n  }\n}\n\nfunction detectSharedWorker(): boolean {\n  return typeof SharedWorker !== 'undefined';\n}\n\nfunction detectBroadcastChannel(): boolean {\n  return typeof BroadcastChannel !== 'undefined';\n}\n\nfunction detectWebLocks(): boolean {\n  return typeof navigator !== 'undefined' && 'locks' in navigator;\n}\n\nlet cachedReport: CapabilityReport | null = null;\n\n/**\n * Detect browser capabilities for AI inference.\n * Result is cached after first call.\n *\n * @example\n * const caps = await detectCapabilities();\n * if (caps.webgpu.supported) {\n *   console.log('GPU vendor:', caps.webgpu.adapter?.vendor);\n * }\n */\nexport async function detectCapabilities(): Promise<CapabilityReport> {\n  if (cachedReport)\n    return cachedReport;\n\n  const [webgpu, wasm] = await Promise.all([detectWebGpu(), Promise.resolve(detectWasm())]);\n\n  cachedReport = Object.freeze({\n    broadcastChannel: detectBroadcastChannel(),\n    hardwareConcurrency: typeof navigator !== 'undefined' ? (navigator.hardwareConcurrency ?? 1) : 1,\n    sharedWorker: detectSharedWorker(),\n    wasm,\n    webgpu,\n    webLocks: detectWebLocks(),\n  });\n\n  return cachedReport;\n}\n\n/** Clear the cached capability report. Useful for testing. */\nexport function clearCapabilitiesCache(): void {\n  cachedReport = null;\n}\n","import type { SerializedError } from './types.js';\n\nexport class InferisError extends Error {\n  readonly code: string;\n\n  constructor(message: string, code: string) {\n    super(message);\n    this.name = 'InferisError';\n    this.code = code;\n  }\n\n  static fromSerialized(err: SerializedError): InferisError {\n    const instance = new InferisError(err.message, err.code ?? 'UNKNOWN');\n    instance.name = err.name;\n    if (err.stack)\n      instance.stack = err.stack;\n    return instance;\n  }\n\n  serialize(): SerializedError {\n    const result: SerializedError = {\n      code: this.code,\n      message: this.message,\n      name: this.name,\n    };\n    if (this.stack !== undefined) {\n      return { ...result, stack: this.stack };\n    }\n    return result;\n  }\n}\n\nexport class ModelLoadError extends InferisError {\n  readonly modelId: string;\n\n  constructor(modelId: string, message: string) {\n    super(message, 'MODEL_LOAD_ERROR');\n    this.name = 'ModelLoadError';\n    this.modelId = modelId;\n  }\n}\n\nexport class ModelNotReadyError extends InferisError {\n  readonly modelId: string;\n\n  constructor(modelId: string, state: string) {\n    super(`Model \"${modelId}\" is not ready (state: ${state})`, 'MODEL_NOT_READY');\n    this.name = 'ModelNotReadyError';\n    this.modelId = modelId;\n  }\n}\n\nexport class ModelDisposedError extends InferisError {\n  readonly modelId: string;\n\n  constructor(modelId: string) {\n    super(`Model \"${modelId}\" has been disposed`, 'MODEL_DISPOSED');\n    this.name = 'ModelDisposedError';\n    this.modelId = modelId;\n  }\n}\n\nexport class InferenceError extends InferisError {\n  readonly modelId: string;\n\n  constructor(modelId: string, message: string) {\n    super(message, 'INFERENCE_ERROR');\n    this.name = 'InferenceError';\n    this.modelId = modelId;\n  }\n}\n\nexport class BudgetExceededError extends InferisError {\n  readonly requestedMB: number;\n  readonly budgetMB: number;\n\n  constructor(requestedMB: number, budgetMB: number) {\n    super(\n      `Cannot load model: requested ${requestedMB}MB exceeds memory budget ${budgetMB}MB`,\n      'BUDGET_EXCEEDED',\n    );\n    this.name = 'BudgetExceededError';\n    this.budgetMB = budgetMB;\n    this.requestedMB = requestedMB;\n  }\n}\n\nexport class TaskTimeoutError extends InferisError {\n  readonly reqId: string;\n\n  constructor(reqId: string, timeoutMs: number) {\n    super(`Task \"${reqId}\" timed out after ${timeoutMs}ms`, 'TASK_TIMEOUT');\n    this.name = 'TaskTimeoutError';\n    this.reqId = reqId;\n  }\n}\n\nexport class WorkerError extends InferisError {\n  readonly workerId: number;\n\n  constructor(workerId: number, message: string) {\n    super(message, 'WORKER_ERROR');\n    this.name = 'WorkerError';\n    this.workerId = workerId;\n  }\n}\n\nexport class DeviceLostError extends InferisError {\n  readonly modelId: string;\n  readonly reason: string;\n\n  constructor(modelId: string, reason: string) {\n    super(`GPU device lost for model \"${modelId}\": ${reason}`, 'DEVICE_LOST');\n    this.name = 'DeviceLostError';\n    this.modelId = modelId;\n    this.reason = reason;\n  }\n}\n\nexport class EnvironmentError extends InferisError {\n  constructor(message: string) {\n    super(message, 'ENVIRONMENT_ERROR');\n    this.name = 'EnvironmentError';\n  }\n}\n\nexport class InvalidStateTransitionError extends InferisError {\n  constructor(from: string, to: string) {\n    super(`Invalid state transition: ${from} -> ${to}`, 'INVALID_STATE_TRANSITION');\n    this.name = 'InvalidStateTransitionError';\n  }\n}\n\n/** Serialize any error for postMessage transmission. */\nexport function serializeError(err: unknown): SerializedError {\n  if (err instanceof InferisError)\n    return err.serialize();\n  if (err instanceof Error) {\n    const base: SerializedError = { code: 'UNKNOWN', message: err.message, name: err.name };\n    return err.stack !== undefined ? { ...base, stack: err.stack } : base;\n  }\n  return { code: 'UNKNOWN', message: String(err), name: 'Error' };\n}\n","import type { ModelState } from './types.js';\nimport { InvalidStateTransitionError } from './errors.js';\n\n/** Valid transitions: from -> Set<to> */\nconst TRANSITIONS: Readonly<Record<ModelState, ReadonlySet<ModelState>>> = {\n  disposed: new Set<ModelState>(),\n  error: new Set<ModelState>(['loading', 'disposed']),\n  idle: new Set<ModelState>(['loading', 'disposed']),\n  inferring: new Set<ModelState>(['inferring', 'ready', 'error', 'unloading']),\n  loading: new Set<ModelState>(['ready', 'error', 'disposed']),\n  ready: new Set<ModelState>(['inferring', 'unloading', 'error']),\n  unloading: new Set<ModelState>(['disposed']),\n};\n\n/**\n * Validate and apply a lifecycle state transition.\n *\n * @throws {InvalidStateTransitionError} if the transition is not allowed.\n */\nexport function transition(from: ModelState, to: ModelState): ModelState {\n  if (!TRANSITIONS[from].has(to)) {\n    throw new InvalidStateTransitionError(from, to);\n  }\n  return to;\n}\n\n/**\n * Check if a state transition is valid without throwing.\n */\nexport function canTransition(from: ModelState, to: ModelState): boolean {\n  return TRANSITIONS[from].has(to);\n}\n\n/**\n * Check if a model in the given state can accept inference tasks.\n */\nexport function isAcceptingInference(state: ModelState): boolean {\n  return state === 'ready';\n}\n\n/**\n * Check if a model in the given state is considered terminal (no further transitions possible).\n */\nexport function isTerminal(state: ModelState): boolean {\n  return state === 'disposed';\n}\n","import type { Device, ModelEntry, ModelState } from './types.js';\n\n/**\n * ModelRegistry tracks all model entries across workers.\n *\n * A model ID is composed of `task:modelName` to allow the same underlying\n * model to be used for different tasks without collision.\n */\nexport class ModelRegistry {\n  private readonly models: Map<string, ModelEntry> = new Map();\n\n  /**\n   * Compose a canonical model ID from task and config.\n   */\n  static makeId(task: string, modelName: string): string {\n    return `${task}:${modelName}`;\n  }\n\n  /**\n   * Register a new model entry with IDLE state.\n   */\n  register(id: string, task: string, config: Record<string, unknown>): ModelEntry {\n    if (this.models.has(id)) {\n      return this.models.get(id)!;\n    }\n\n    const entry: ModelEntry = {\n      config,\n      device: 'wasm',\n      id,\n      memoryMB: 0,\n      state: 'idle',\n      stateListeners: new Set(),\n      task,\n      workerId: null,\n    };\n    this.models.set(id, entry);\n    return entry;\n  }\n\n  /**\n   * Get a model entry by ID.\n   */\n  get(id: string): ModelEntry | undefined {\n    return this.models.get(id);\n  }\n\n  /**\n   * Check if a model entry exists.\n   */\n  has(id: string): boolean {\n    return this.models.has(id);\n  }\n\n  /**\n   * Update the state of a model entry, notifying all subscribers.\n   */\n  setState(id: string, state: ModelState): void {\n    const entry = this.models.get(id);\n    if (!entry)\n      return;\n\n    entry.state = state;\n    for (const listener of entry.stateListeners) {\n      try {\n        listener(state);\n      }\n      catch {\n        // listeners must not throw\n      }\n    }\n  }\n\n  /**\n   * Update the device, memory, and worker assignment after a successful load.\n   */\n  setLoaded(id: string, device: Device, memoryMB: number, workerId: number): void {\n    const entry = this.models.get(id);\n    if (!entry)\n      return;\n\n    entry.device = device;\n    entry.memoryMB = memoryMB;\n    entry.workerId = workerId;\n  }\n\n  /**\n   * Clear the worker assignment on unload.\n   */\n  setUnloaded(id: string): void {\n    const entry = this.models.get(id);\n    if (!entry)\n      return;\n\n    entry.workerId = null;\n    entry.memoryMB = 0;\n  }\n\n  /**\n   * Add a state change listener to a model entry.\n   * @returns unsubscribe function\n   */\n  subscribe(id: string, listener: (state: ModelState) => void): () => void {\n    const entry = this.models.get(id);\n    if (!entry)\n      return () => {};\n\n    entry.stateListeners.add(listener);\n    return () => entry.stateListeners.delete(listener);\n  }\n\n  /**\n   * Remove a model entry completely.\n   */\n  delete(id: string): void {\n    const entry = this.models.get(id);\n    if (entry) {\n      entry.stateListeners.clear();\n      this.models.delete(id);\n    }\n  }\n\n  /**\n   * Return all model entries in a given state.\n   */\n  byState(state: ModelState): ModelEntry[] {\n    return [...this.models.values()].filter(e => e.state === state);\n  }\n\n  /**\n   * Return all model entries assigned to a specific worker.\n   */\n  byWorker(workerId: number): ModelEntry[] {\n    return [...this.models.values()].filter(e => e.workerId === workerId);\n  }\n\n  /** Number of registered model entries. */\n  get size(): number {\n    return this.models.size;\n  }\n\n  /** All model entries (read-only view for scheduling). */\n  get entries(): ReadonlyMap<string, ModelEntry> {\n    return this.models;\n  }\n}\n","import type { ModelEntry, ScheduledTask, TaskPriority } from './types.js';\n\nconst PRIORITY_WEIGHT: Record<TaskPriority, number> = {\n  high: 2,\n  low: 0,\n  normal: 1,\n};\n\n/**\n * Task scheduler with priority queue and model affinity.\n *\n * Model affinity: when dispatching a task, the scheduler prefers workers\n * that already have the required model loaded, avoiding redundant re-loads.\n */\nexport class Scheduler {\n  private readonly queues: Map<TaskPriority, ScheduledTask[]> = new Map([\n    ['high', []],\n    ['low', []],\n    ['normal', []],\n  ]);\n\n  private readonly workerLoad: Map<number, number> = new Map();\n  private readonly workerModels: Map<number, Set<string>> = new Map();\n\n  /**\n   * Register a worker with the scheduler.\n   */\n  addWorker(workerId: number): void {\n    this.workerLoad.set(workerId, 0);\n    this.workerModels.set(workerId, new Set());\n  }\n\n  /**\n   * Remove a worker from the scheduler.\n   * Rejects any queued tasks targeting only this worker (affinity-pinned).\n   */\n  removeWorker(workerId: number): void {\n    this.workerLoad.delete(workerId);\n    this.workerModels.delete(workerId);\n  }\n\n  /**\n   * Notify scheduler that a worker has loaded a model.\n   * Used for affinity tracking.\n   */\n  notifyModelLoaded(workerId: number, modelId: string): void {\n    this.workerModels.get(workerId)?.add(modelId);\n  }\n\n  /**\n   * Notify scheduler that a worker has unloaded a model.\n   */\n  notifyModelUnloaded(workerId: number, modelId: string): void {\n    this.workerModels.get(workerId)?.delete(modelId);\n  }\n\n  /**\n   * Enqueue a task. It will be dispatched to the best available worker.\n   * If all workers are busy, the task waits in the priority queue.\n   */\n  enqueue(task: ScheduledTask, _models?: ReadonlyMap<string, ModelEntry>): void {\n    const workerId = this.pickWorker(task.modelId);\n    if (workerId !== null) {\n      this.dispatch(task, workerId);\n    }\n    else {\n      this.queues.get(task.priority)!.push(task);\n    }\n  }\n\n  /**\n   * Notify scheduler that a worker has completed a task.\n   * Dispatches the next queued task to the now-free worker, if any.\n   */\n  notifyTaskComplete(workerId: number, _models?: ReadonlyMap<string, ModelEntry>): void {\n    const load = this.workerLoad.get(workerId);\n    if (load !== undefined) {\n      this.workerLoad.set(workerId, Math.max(0, load - 1));\n    }\n    this.drainNext(workerId);\n  }\n\n  /**\n   * Attempt to dispatch the highest-priority queued task to a specific worker.\n   */\n  private drainNext(workerId: number): void {\n    for (const priority of ['high', 'normal', 'low'] as TaskPriority[]) {\n      const queue = this.queues.get(priority)!;\n      if (queue.length === 0)\n        continue;\n\n      const idx = this.findAffinityTask(workerId, queue);\n      const taskIdx = idx !== -1 ? idx : 0;\n      const [task] = queue.splice(taskIdx, 1);\n      this.dispatch(task, workerId);\n      return;\n    }\n  }\n\n  /**\n   * Pick the best available worker for a given model.\n   * Prefers workers with the model already loaded (affinity).\n   * Falls back to the least-loaded worker.\n   * Returns null if all workers are saturated (load >= concurrencyLimit).\n   */\n  pickWorker(\n    modelId: string,\n    concurrencyPerWorker = 4,\n  ): number | null {\n    let affinityWorker: number | null = null;\n    let leastLoadedWorker: number | null = null;\n    let leastLoad = Infinity;\n\n    for (const [id, load] of this.workerLoad) {\n      if (load >= concurrencyPerWorker)\n        continue;\n\n      if (this.workerModels.get(id)?.has(modelId)) {\n        if (affinityWorker === null || load < (this.workerLoad.get(affinityWorker) ?? Infinity)) {\n          affinityWorker = id;\n        }\n      }\n\n      if (load < leastLoad) {\n        leastLoad = load;\n        leastLoadedWorker = id;\n      }\n    }\n\n    return affinityWorker ?? leastLoadedWorker;\n  }\n\n  private dispatch(task: ScheduledTask, workerId: number): void {\n    const load = this.workerLoad.get(workerId) ?? 0;\n    this.workerLoad.set(workerId, load + 1);\n    task.execute(workerId);\n  }\n\n  private findAffinityTask(workerId: number, queue: ScheduledTask[]): number {\n    const models = this.workerModels.get(workerId);\n    if (!models)\n      return -1;\n    return queue.findIndex(t => models.has(t.modelId));\n  }\n\n  /** Return current queue depth across all priorities. */\n  get queueDepth(): number {\n    let total = 0;\n    for (const q of this.queues.values()) total += q.length;\n    return total;\n  }\n\n  /** Return current load for a worker. */\n  workerLoadFor(workerId: number): number {\n    return this.workerLoad.get(workerId) ?? 0;\n  }\n\n  /** Return all registered worker IDs. */\n  get workerIds(): number[] {\n    return [...this.workerLoad.keys()];\n  }\n\n  /** Clear all worker state (called on pool termination). */\n  reset(): void {\n    this.workerLoad.clear();\n    this.workerModels.clear();\n  }\n\n  /** Return the effective priority weight for sorting. */\n  static priorityWeight(p: TaskPriority): number {\n    return PRIORITY_WEIGHT[p];\n  }\n}\n","import type {\n  CapabilityReport,\n  Device,\n  LoadProgressEvent,\n  ModelHandle,\n  ModelLoadConfig,\n  ModelState,\n  PendingRequest,\n  PoolConfig,\n  TaskPriority,\n  WorkerToMainMessage,\n} from './types.js';\nimport { MemoryBudget } from './budget.js';\nimport { detectCapabilities } from './capabilities.js';\nimport {\n  BudgetExceededError,\n  EnvironmentError,\n  InferisError,\n  ModelNotReadyError,\n  TaskTimeoutError,\n} from './errors.js';\nimport { canTransition, isAcceptingInference, transition } from './lifecycle.js';\nimport { ModelRegistry } from './registry.js';\nimport { Scheduler } from './scheduler.js';\n\nconst DEFAULT_MAX_WORKERS = typeof navigator !== 'undefined'\n  ? Math.max(1, (navigator.hardwareConcurrency ?? 2) - 1)\n  : 1;\nconst DEFAULT_MAX_MEMORY_MB = 2048;\nconst DEFAULT_TASK_TIMEOUT_MS = 120_000;\n\nconst PRIORITY_ORDER: Record<TaskPriority, number> = { high: 0, low: 2, normal: 1 };\n\ninterface InferenceDeferred {\n  enqueuedAt: number;\n  onAbort: (() => void) | undefined;\n  priority: TaskPriority;\n  reject: (e: Error) => void;\n  resolve: () => void;\n  signal: AbortSignal | undefined;\n  unsub: (() => void) | undefined;\n}\n\ninterface WorkerEntry {\n  worker: Worker;\n  id: number;\n}\n\n/**\n * WorkerPool — main orchestrator.\n *\n * Manages a pool of dedicated Web Workers, routes inference tasks,\n * tracks model lifecycle, and enforces memory budgets.\n *\n * @example\n * ```ts\n * const pool = await createPool({ adapter: transformersAdapter() });\n * const model = await pool.load('feature-extraction', { model: 'Xenova/...' });\n * const result = await model.run(['Hello world']);\n * await model.dispose();\n * await pool.terminate();\n * ```\n */\nexport class WorkerPool {\n  private readonly workers: Map<number, WorkerEntry> = new Map();\n  private readonly registry: ModelRegistry = new ModelRegistry();\n  private readonly scheduler: Scheduler = new Scheduler();\n  private readonly budget: MemoryBudget;\n  private readonly inferenceWaiters: Map<string, InferenceDeferred[]> = new Map();\n  private readonly pending: Map<string, PendingRequest> = new Map();\n  private readonly config: Required<PoolConfig>;\n  private readonly caps: CapabilityReport;\n  private readonly resolvedDevice: Device;\n  private nextWorkerId = 0;\n  private nextReqId = 0;\n  private terminated = false;\n\n  private constructor(config: Required<PoolConfig>, caps: CapabilityReport) {\n    this.config = config;\n    this.caps = caps;\n    this.budget = new MemoryBudget(config.maxMemoryMB);\n    this.resolvedDevice = this.resolveDevice(config.defaultDevice, caps);\n  }\n\n  /**\n   * Create and initialize a WorkerPool.\n   * Spawns `maxWorkers` dedicated workers and detects browser capabilities.\n   */\n  static async create(config: PoolConfig): Promise<WorkerPool> {\n    if (typeof Worker === 'undefined') {\n      throw new EnvironmentError(\n        'inferis requires a browser environment. '\n        + 'Wrap initialization in a client-only hook (useEffect, onMounted) or use dynamic import with SSR disabled.',\n      );\n    }\n\n    const caps = await detectCapabilities();\n    const full: Required<PoolConfig> = {\n      adapter: config.adapter,\n      crossTab: config.crossTab ?? false,\n      defaultDevice: config.defaultDevice ?? 'auto',\n      maxMemoryMB: config.maxMemoryMB ?? DEFAULT_MAX_MEMORY_MB,\n      maxWorkers: config.maxWorkers ?? DEFAULT_MAX_WORKERS,\n      taskTimeout: config.taskTimeout ?? DEFAULT_TASK_TIMEOUT_MS,\n      workerUrl: config.workerUrl ?? new URL('./worker/dedicated.worker.js', import.meta.url),\n    };\n\n    const pool = new WorkerPool(full, caps);\n    await pool.spawnWorkers();\n    return pool;\n  }\n\n  private async spawnWorkers(): Promise<void> {\n    for (let i = 0; i < this.config.maxWorkers; i++) {\n      await this.spawnWorker();\n    }\n  }\n\n  private async spawnWorker(): Promise<WorkerEntry> {\n    const id = this.nextWorkerId++;\n    const worker = new Worker(this.config.workerUrl, { type: 'module' });\n\n    worker.onmessage = (event: MessageEvent<WorkerToMainMessage>) => {\n      this.handleWorkerMessage(id, event.data);\n    };\n\n    worker.onerror = (event) => {\n      console.error(`[inferis] Worker ${id} error:`, event.message);\n      this.handleWorkerCrash(id);\n    };\n\n    const entry: WorkerEntry = { id, worker };\n    this.workers.set(id, entry);\n    this.scheduler.addWorker(id);\n\n    worker.postMessage({ device: this.resolvedDevice, type: '__init__' });\n\n    return entry;\n  }\n\n  private handleWorkerMessage(workerId: number, msg: WorkerToMainMessage): void {\n    switch (msg.type) {\n      case 'load-progress': {\n        const modelId = this.reqIdToModelId.get(msg.reqId);\n        if (modelId) {\n          const entry = this.registry.get(modelId);\n          if (entry?.config.onProgress) {\n            (entry.config.onProgress as (e: LoadProgressEvent) => void)(msg.progress);\n          }\n        }\n        break;\n      }\n      case 'load-complete': {\n        const modelId = this.reqIdToModelId.get(msg.reqId);\n        if (modelId) {\n          const entry = this.registry.get(modelId);\n          if (entry) {\n            this.registry.setLoaded(modelId, this.resolvedDevice, msg.memoryMB, workerId);\n            this.budget.allocate(modelId, msg.memoryMB);\n            this.scheduler.notifyModelLoaded(workerId, modelId);\n            this.registry.setState(modelId, transition(entry.state, 'ready'));\n          }\n          this.reqIdToModelId.delete(msg.reqId);\n        }\n        const req = this.pending.get(msg.reqId);\n        if (req) {\n          this.clearPendingTimeout(msg.reqId);\n          this.pending.delete(msg.reqId);\n          req.resolve(undefined);\n        }\n        this.scheduler.notifyTaskComplete(workerId);\n        break;\n      }\n      case 'load-error': {\n        if (msg.reqId === '__init__') {\n          console.error('[inferis] Worker init failed:', msg.error);\n          break;\n        }\n        const modelId = this.reqIdToModelId.get(msg.reqId);\n        if (modelId) {\n          const entry = this.registry.get(modelId);\n          if (entry)\n            this.registry.setState(modelId, transition(entry.state, 'error'));\n          this.reqIdToModelId.delete(msg.reqId);\n        }\n        const req = this.pending.get(msg.reqId);\n        if (req) {\n          this.clearPendingTimeout(msg.reqId);\n          this.pending.delete(msg.reqId);\n          req.reject(InferisError.fromSerialized(msg.error));\n        }\n        this.scheduler.notifyTaskComplete(workerId);\n        break;\n      }\n      case 'unload-complete': {\n        const modelId = this.reqIdToModelId.get(msg.reqId);\n        if (modelId) {\n          this.budget.release(modelId);\n          this.scheduler.notifyModelUnloaded(workerId, modelId);\n          this.registry.setUnloaded(modelId);\n          this.registry.setState(modelId, 'disposed');\n          this.registry.delete(modelId);\n          this.reqIdToModelId.delete(msg.reqId);\n        }\n        const req = this.pending.get(msg.reqId);\n        if (req) {\n          this.clearPendingTimeout(msg.reqId);\n          this.pending.delete(msg.reqId);\n          req.resolve(undefined);\n        }\n        break;\n      }\n      case 'unload-error': {\n        const modelId = this.reqIdToModelId.get(msg.reqId);\n        if (modelId) {\n          this.budget.release(modelId);\n          this.scheduler.notifyModelUnloaded(workerId, modelId);\n          this.registry.setUnloaded(modelId);\n          this.registry.setState(modelId, 'error');\n          this.registry.delete(modelId);\n          this.reqIdToModelId.delete(msg.reqId);\n        }\n        const req = this.pending.get(msg.reqId);\n        if (req) {\n          this.clearPendingTimeout(msg.reqId);\n          this.pending.delete(msg.reqId);\n          req.reject(InferisError.fromSerialized(msg.error));\n        }\n        break;\n      }\n      case 'run-result': {\n        const req = this.pending.get(msg.reqId);\n        if (req) {\n          this.clearPendingTimeout(msg.reqId);\n          this.pending.delete(msg.reqId);\n          req.resolve(msg.output);\n        }\n        const modelId = this.reqIdToModelId.get(msg.reqId);\n        if (modelId) {\n          const entry = this.registry.get(modelId);\n          if (entry && entry.state === 'inferring') {\n            this.registry.setState(modelId, transition(entry.state, 'ready'));\n          }\n          this.reqIdToModelId.delete(msg.reqId);\n        }\n        this.scheduler.notifyTaskComplete(workerId);\n        if (modelId)\n          this.drainInferenceWaiter(modelId);\n        break;\n      }\n      case 'run-error': {\n        const req = this.pending.get(msg.reqId);\n        if (req) {\n          this.clearPendingTimeout(msg.reqId);\n          this.pending.delete(msg.reqId);\n          req.reject(InferisError.fromSerialized(msg.error));\n        }\n        const modelId = this.reqIdToModelId.get(msg.reqId);\n        if (modelId) {\n          const entry = this.registry.get(modelId);\n          if (entry && entry.state === 'inferring') {\n            this.registry.setState(modelId, transition(entry.state, 'ready'));\n          }\n          this.reqIdToModelId.delete(msg.reqId);\n        }\n        this.scheduler.notifyTaskComplete(workerId);\n        if (modelId)\n          this.drainInferenceWaiter(modelId);\n        break;\n      }\n      case 'stream-chunk': {\n        const req = this.pending.get(msg.reqId);\n        req?.streamController?.enqueue(msg.chunk);\n        break;\n      }\n      case 'stream-end': {\n        const req = this.pending.get(msg.reqId);\n        if (req) {\n          this.clearPendingTimeout(msg.reqId);\n          this.pending.delete(msg.reqId);\n          req.streamController?.close();\n        }\n        const modelId = this.reqIdToModelId.get(msg.reqId);\n        if (modelId) {\n          const entry = this.registry.get(modelId);\n          if (entry && entry.state === 'inferring') {\n            this.registry.setState(modelId, transition(entry.state, 'ready'));\n          }\n          this.reqIdToModelId.delete(msg.reqId);\n        }\n        this.scheduler.notifyTaskComplete(workerId);\n        if (modelId)\n          this.drainInferenceWaiter(modelId);\n        break;\n      }\n      case 'stream-error': {\n        const req = this.pending.get(msg.reqId);\n        if (req) {\n          this.clearPendingTimeout(msg.reqId);\n          this.pending.delete(msg.reqId);\n          req.streamController?.error(InferisError.fromSerialized(msg.error));\n        }\n        const modelId = this.reqIdToModelId.get(msg.reqId);\n        if (modelId) {\n          const entry = this.registry.get(modelId);\n          if (entry && entry.state === 'inferring') {\n            this.registry.setState(modelId, transition(entry.state, 'ready'));\n          }\n          this.reqIdToModelId.delete(msg.reqId);\n        }\n        this.scheduler.notifyTaskComplete(workerId);\n        if (modelId)\n          this.drainInferenceWaiter(modelId);\n        break;\n      }\n      case 'device-lost': {\n        const entry = this.registry.get(msg.modelId);\n        if (entry && canTransition(entry.state, 'error')) {\n          this.registry.setState(msg.modelId, 'error');\n        }\n        break;\n      }\n    }\n  }\n\n  private readonly reqIdToModelId = new Map<string, string>();\n\n  /**\n   * Load a model. If already loaded with the same config, returns existing handle.\n   * Performs memory budget check and eviction before loading.\n   */\n  async load<TOutput = unknown>(\n    task: string,\n    config: ModelLoadConfig,\n  ): Promise<ModelHandle<TOutput>> {\n    if (this.terminated)\n      throw new InferisError('Pool has been terminated', 'POOL_TERMINATED');\n\n    const modelId = ModelRegistry.makeId(task, config.model);\n\n    // Return existing handle if model is already usable\n    const existing = this.registry.get(modelId);\n    if (existing) {\n      const s = existing.state;\n      if (s === 'ready' || s === 'loading' || s === 'inferring') {\n        return this.makeHandle<TOutput>(modelId);\n      }\n    }\n\n    // Estimate memory and check budget\n    const adapter = this.config.adapter;\n    let estimatedMB = config.estimatedMemoryMB ?? 100;\n    if (!config.estimatedMemoryMB) {\n      const tempAdapter = await adapter.create().catch(() => null);\n      try {\n        estimatedMB = tempAdapter?.estimateMemoryMB(task, config as Record<string, unknown>) ?? 100;\n      }\n      finally {\n        await tempAdapter?.unload({ instance: null, memoryMB: 0 }).catch(() => {});\n      }\n    }\n\n    const toEvict = this.budget.planEviction(estimatedMB);\n    if (toEvict === null) {\n      throw new BudgetExceededError(estimatedMB, this.config.maxMemoryMB);\n    }\n\n    // Evict LRU models to make room\n    for (const evictId of toEvict) {\n      await this.disposeModel(evictId);\n    }\n\n    // Register model entry\n    this.registry.register(modelId, task, config as Record<string, unknown>);\n    this.registry.setState(modelId, transition('idle', 'loading'));\n\n    // Enqueue load task\n    await new Promise<void>((resolve, reject) => {\n      const reqId = `${this.nextReqId++}`;\n      this.reqIdToModelId.set(reqId, modelId);\n\n      this.pending.set(reqId, { reject, resolve: resolve as (v: unknown) => void });\n      this.setRequestTimeout(reqId, this.config.taskTimeout);\n\n      this.scheduler.enqueue(\n        {\n          enqueuedAt: Date.now(),\n          execute: (workerId: number): void => {\n            const workerEntry = this.workers.get(workerId);\n            if (!workerEntry) {\n              reject(new InferisError('Worker not found', 'WORKER_NOT_FOUND'));\n              return;\n            }\n            try {\n              const { estimatedMemoryMB: _estMem, onProgress: _onProgress, ...workerConfig } = config;\n              workerEntry.worker.postMessage({\n                config: workerConfig as Record<string, unknown>,\n                device: this.resolvedDevice,\n                modelId,\n                reqId,\n                task,\n                type: 'load-model',\n              });\n            }\n            catch {\n              this.clearPendingTimeout(reqId);\n              this.pending.delete(reqId);\n              this.reqIdToModelId.delete(reqId);\n              reject(new InferisError('Input cannot be serialized for worker transfer', 'SERIALIZATION_ERROR'));\n            }\n          },\n          modelId,\n          priority: 'high',\n          reject,\n          reqId,\n        },\n        this.registry.entries,\n      );\n    });\n\n    return this.makeHandle<TOutput>(modelId);\n  }\n\n  private async disposeModel(modelId: string): Promise<void> {\n    const entry = this.registry.get(modelId);\n    if (!entry || entry.state === 'disposed')\n      return;\n\n    if (!canTransition(entry.state, 'unloading'))\n      return;\n\n    this.registry.setState(modelId, 'unloading');\n\n    if (entry.workerId === null) {\n      this.budget.release(modelId);\n      this.registry.delete(modelId);\n      return;\n    }\n\n    const workerEntry = this.workers.get(entry.workerId);\n    if (!workerEntry) {\n      this.budget.release(modelId);\n      this.registry.delete(modelId);\n      return;\n    }\n\n    const reqId = `${this.nextReqId++}`;\n    this.reqIdToModelId.set(reqId, modelId);\n\n    await new Promise<void>((resolve, reject) => {\n      this.pending.set(reqId, { reject, resolve: resolve as (v: unknown) => void });\n      this.setRequestTimeout(reqId, 10_000);\n      try {\n        workerEntry.worker.postMessage({ modelId, reqId, type: 'unload-model' });\n      }\n      catch {\n        this.clearPendingTimeout(reqId);\n        this.pending.delete(reqId);\n        this.reqIdToModelId.delete(reqId);\n        reject(new InferisError('Input cannot be serialized for worker transfer', 'SERIALIZATION_ERROR'));\n      }\n    });\n  }\n\n  private makeHandle<TOutput>(modelId: string): ModelHandle<TOutput> {\n    const registry = this.registry;\n    const dispose = this.disposeModel.bind(this);\n    const runInference = this.runInference.bind(this);\n    const streamInference = this.streamInference.bind(this);\n\n    return {\n      get device() {\n        return registry.get(modelId)?.device ?? 'wasm';\n      },\n      get id() {\n        return modelId;\n      },\n      get memoryMB() {\n        return registry.get(modelId)?.memoryMB ?? 0;\n      },\n      get state() {\n        return registry.get(modelId)?.state ?? 'disposed';\n      },\n\n      dispose: () => dispose(modelId),\n\n      onStateChange(callback: (state: ModelState) => void): () => void {\n        return registry.subscribe(modelId, callback);\n      },\n\n      run(input: unknown, options?) {\n        return runInference<TOutput>(modelId, input, options);\n      },\n\n      stream(input: unknown, options?) {\n        return streamInference<TOutput>(modelId, input, options);\n      },\n    };\n  }\n\n  /**\n   * Waits until the model transitions to `ready`, or rejects if it reaches a\n   * terminal/non-recoverable state (error, disposed, unloading).\n   * Respects the provided AbortSignal.\n   *\n   * When the model is `inferring`, uses a priority queue so that higher-priority\n   * callers are unblocked before lower-priority ones.\n   * When the model is `loading`, falls back to a plain state subscription.\n   */\n  private waitForReady(modelId: string, priority: TaskPriority, signal?: AbortSignal): Promise<void> {\n    return new Promise((resolve, reject) => {\n      if (signal?.aborted) {\n        reject(Object.assign(new Error('AbortError'), { name: 'AbortError' }));\n        return;\n      }\n\n      const currentState = this.registry.get(modelId)?.state;\n\n      if (currentState === 'loading') {\n        const onLoadAbort = (): void => {\n          // eslint-disable-next-line ts/no-use-before-define\n          unsub();\n          reject(Object.assign(new Error('AbortError'), { name: 'AbortError' }));\n        };\n        const unsub = this.registry.subscribe(modelId, (state) => {\n          if (state === 'ready') {\n            unsub();\n            signal?.removeEventListener('abort', onLoadAbort);\n            resolve();\n          }\n          else if (state !== 'inferring' && state !== 'loading') {\n            unsub();\n            signal?.removeEventListener('abort', onLoadAbort);\n            reject(new ModelNotReadyError(modelId, state));\n          }\n        });\n        signal?.addEventListener('abort', onLoadAbort, { once: true });\n        return;\n      }\n\n      const deferred: InferenceDeferred = {\n        enqueuedAt: Date.now(),\n        onAbort: undefined,\n        priority,\n        reject,\n        resolve,\n        signal,\n        unsub: undefined,\n      };\n\n      const queue = this.inferenceWaiters.get(modelId) ?? [];\n      queue.push(deferred);\n      queue.sort(\n        (a, b) => PRIORITY_ORDER[a.priority] - PRIORITY_ORDER[b.priority] || a.enqueuedAt - b.enqueuedAt,\n      );\n      this.inferenceWaiters.set(modelId, queue);\n\n      const unsub = this.registry.subscribe(modelId, (state) => {\n        if (state !== 'inferring' && state !== 'loading' && state !== 'ready') {\n          deferred.unsub = undefined;\n          const q = this.inferenceWaiters.get(modelId);\n          if (q) {\n            const idx = q.indexOf(deferred);\n            if (idx >= 0)\n              q.splice(idx, 1);\n          }\n          unsub();\n          if (deferred.signal && deferred.onAbort) {\n            deferred.signal.removeEventListener('abort', deferred.onAbort);\n          }\n          reject(new ModelNotReadyError(modelId, state));\n        }\n      });\n      deferred.unsub = unsub;\n\n      if (signal) {\n        const onAbort = (): void => {\n          const q = this.inferenceWaiters.get(modelId);\n          if (q) {\n            const idx = q.indexOf(deferred);\n            if (idx >= 0)\n              q.splice(idx, 1);\n          }\n          deferred.unsub?.();\n          deferred.unsub = undefined;\n          reject(Object.assign(new Error('AbortError'), { name: 'AbortError' }));\n        };\n        deferred.onAbort = onAbort;\n        signal.addEventListener('abort', onAbort, { once: true });\n      }\n    });\n  }\n\n  /**\n   * Unblocks the highest-priority waiter queued for the given model.\n   * Called after a model transitions back to `ready`.\n   */\n  private drainInferenceWaiter(modelId: string): void {\n    const queue = this.inferenceWaiters.get(modelId);\n    if (!queue || queue.length === 0)\n      return;\n\n    const [deferred] = queue.splice(0, 1);\n    deferred.unsub?.();\n    if (deferred.signal && deferred.onAbort) {\n      deferred.signal.removeEventListener('abort', deferred.onAbort);\n    }\n    deferred.resolve();\n  }\n\n  private async runInference<TOutput>(\n    modelId: string,\n    input: unknown,\n    options?: { signal?: AbortSignal; priority?: 'high' | 'normal' | 'low' },\n  ): Promise<TOutput> {\n    if (!this.registry.get(modelId))\n      throw new InferisError(`Model \"${modelId}\" not found`, 'MODEL_NOT_FOUND');\n\n    while (!isAcceptingInference(this.registry.get(modelId)!.state)) {\n      const state = this.registry.get(modelId)!.state;\n      if (state === 'inferring' || state === 'loading') {\n        await this.waitForReady(modelId, options?.priority ?? 'normal', options?.signal);\n      }\n      else {\n        throw new ModelNotReadyError(modelId, state);\n      }\n    }\n\n    if (options?.signal?.aborted) {\n      throw Object.assign(new Error('AbortError'), { name: 'AbortError' });\n    }\n\n    const entry = this.registry.get(modelId)!;\n    this.registry.setState(modelId, transition(entry.state, 'inferring'));\n    this.budget.touch(modelId);\n\n    return new Promise<TOutput>((resolve, reject) => {\n      const reqId = `${this.nextReqId++}`;\n      this.reqIdToModelId.set(reqId, modelId);\n\n      const onAbort = (): void => {\n        const workerEntry = entry.workerId !== null ? this.workers.get(entry.workerId) : undefined;\n        workerEntry?.worker.postMessage({ reqId, type: 'abort' });\n      };\n\n      options?.signal?.addEventListener('abort', onAbort, { once: true });\n\n      this.pending.set(reqId, {\n        onAbort,\n        reject: (err) => {\n          options?.signal?.removeEventListener('abort', onAbort);\n          reject(err);\n        },\n        resolve: (val) => {\n          options?.signal?.removeEventListener('abort', onAbort);\n          resolve(val as TOutput);\n        },\n        signal: options?.signal,\n      });\n\n      this.setRequestTimeout(reqId, this.config.taskTimeout);\n\n      this.scheduler.enqueue(\n        {\n          enqueuedAt: Date.now(),\n          execute: (workerId: number): void => {\n            const w = this.workers.get(workerId);\n            if (!w)\n              return;\n            try {\n              const { priority: _p, signal: _s, ...workerOptions } = options ?? {};\n              w.worker.postMessage({ input, modelId, options: workerOptions, reqId, type: 'run' });\n            }\n            catch {\n              this.clearPendingTimeout(reqId);\n              this.pending.delete(reqId);\n              this.reqIdToModelId.delete(reqId);\n              options?.signal?.removeEventListener('abort', onAbort);\n              reject(new InferisError('Input cannot be serialized for worker transfer', 'SERIALIZATION_ERROR'));\n            }\n          },\n          modelId,\n          priority: options?.priority ?? 'normal',\n          reject: (err: Error): void => {\n            options?.signal?.removeEventListener('abort', onAbort);\n            reject(err);\n          },\n          reqId,\n        },\n        this.registry.entries,\n      );\n    });\n  }\n\n  private streamInference<TOutput>(\n    modelId: string,\n    input: unknown,\n    options?: { signal?: AbortSignal; priority?: 'high' | 'normal' | 'low' },\n  ): ReadableStream<TOutput> {\n    if (!this.registry.get(modelId)) {\n      return new ReadableStream({\n        start(c) { c.error(new InferisError(`Model \"${modelId}\" not found`, 'MODEL_NOT_FOUND')); },\n      });\n    }\n\n    let reqId = '';\n\n    return new ReadableStream<TOutput>({\n      start: async (controller) => {\n        while (!isAcceptingInference(this.registry.get(modelId)!.state)) {\n          const state = this.registry.get(modelId)!.state;\n          if (state === 'inferring' || state === 'loading') {\n            try {\n              await this.waitForReady(modelId, options?.priority ?? 'normal', options?.signal);\n            }\n            catch (err) {\n              controller.error(err);\n              return;\n            }\n          }\n          else {\n            controller.error(new ModelNotReadyError(modelId, state));\n            return;\n          }\n        }\n\n        const entry = this.registry.get(modelId)!;\n        this.registry.setState(modelId, transition(entry.state, 'inferring'));\n        this.budget.touch(modelId);\n\n        reqId = `${this.nextReqId++}`;\n        this.reqIdToModelId.set(reqId, modelId);\n\n        const onAbort = (): void => {\n          const e = this.registry.get(modelId);\n          const workerEntry = e?.workerId != null ? this.workers.get(e.workerId) : undefined;\n          workerEntry?.worker.postMessage({ reqId, type: 'abort' });\n        };\n\n        options?.signal?.addEventListener('abort', onAbort, { once: true });\n\n        this.pending.set(reqId, {\n          onAbort,\n          reject: (err) => {\n            options?.signal?.removeEventListener('abort', onAbort);\n            controller.error(err);\n          },\n          resolve: () => {},\n          signal: options?.signal,\n          streamController: controller as ReadableStreamDefaultController<unknown>,\n        });\n\n        this.setRequestTimeout(reqId, this.config.taskTimeout);\n\n        this.scheduler.enqueue(\n          {\n            enqueuedAt: Date.now(),\n            execute: (workerId: number): void => {\n              const w = this.workers.get(workerId);\n              if (!w)\n                return;\n              try {\n                const { priority: _p, signal: _s, ...workerOptions } = options ?? {};\n                w.worker.postMessage({ input, modelId, options: workerOptions, reqId, type: 'run-stream' });\n              }\n              catch {\n                this.clearPendingTimeout(reqId);\n                this.pending.delete(reqId);\n                this.reqIdToModelId.delete(reqId);\n                options?.signal?.removeEventListener('abort', onAbort);\n                controller.error(new InferisError('Input cannot be serialized for worker transfer', 'SERIALIZATION_ERROR'));\n              }\n            },\n            modelId,\n            priority: options?.priority ?? 'normal',\n            reject: (err: Error): void => {\n              options?.signal?.removeEventListener('abort', onAbort);\n              controller.error(err);\n            },\n            reqId,\n          },\n          this.registry.entries,\n        );\n      },\n      cancel: () => {\n        if (!reqId)\n          return;\n        const e = this.registry.get(modelId);\n        const workerEntry = e?.workerId != null ? this.workers.get(e.workerId) : undefined;\n        workerEntry?.worker.postMessage({ reqId, type: 'abort' });\n\n        const req = this.pending.get(reqId);\n        if (req) {\n          if (req.signal && req.onAbort) {\n            req.signal.removeEventListener('abort', req.onAbort);\n          }\n          try {\n            req.streamController?.close();\n          }\n          catch { /* already closed */ }\n          this.clearPendingTimeout(reqId);\n          this.pending.delete(reqId);\n          this.reqIdToModelId.delete(reqId);\n        }\n      },\n    });\n  }\n\n  private setRequestTimeout(reqId: string, ms: number): void {\n    const id = setTimeout(() => {\n      const req = this.pending.get(reqId);\n      if (req) {\n        if (req.signal && req.onAbort) {\n          req.signal.removeEventListener('abort', req.onAbort);\n        }\n        this.pending.delete(reqId);\n        this.reqIdToModelId.delete(reqId);\n        req.reject(new TaskTimeoutError(reqId, ms));\n      }\n    }, ms);\n\n    const req = this.pending.get(reqId);\n    if (req)\n      req.timeoutId = id;\n  }\n\n  private clearPendingTimeout(reqId: string): void {\n    const req = this.pending.get(reqId);\n    if (req?.timeoutId !== undefined) {\n      clearTimeout(req.timeoutId);\n    }\n  }\n\n  private handleWorkerCrash(workerId: number): void {\n    this.scheduler.removeWorker(workerId);\n    this.workers.delete(workerId);\n\n    const crashedModelIds = new Set<string>();\n\n    for (const entry of this.registry.byWorker(workerId)) {\n      if (canTransition(entry.state, 'error')) {\n        this.registry.setState(entry.id, 'error');\n      }\n      crashedModelIds.add(entry.id);\n    }\n\n    for (const [reqId, req] of this.pending) {\n      const modelId = this.reqIdToModelId.get(reqId);\n      if (modelId && crashedModelIds.has(modelId)) {\n        this.clearPendingTimeout(reqId);\n        if (req.signal && req.onAbort) {\n          req.signal.removeEventListener('abort', req.onAbort);\n        }\n        this.pending.delete(reqId);\n        this.reqIdToModelId.delete(reqId);\n        req.reject(new InferisError('Worker crashed', 'WORKER_CRASHED'));\n      }\n    }\n  }\n\n  /**\n   * Gracefully terminate all workers and dispose all models.\n   */\n  async terminate(): Promise<void> {\n    this.terminated = true;\n\n    // Reject all pending requests\n    for (const [reqId, req] of this.pending) {\n      clearTimeout(req.timeoutId);\n      req.reject(new InferisError('Pool terminated', 'POOL_TERMINATED'));\n      this.pending.delete(reqId);\n      this.reqIdToModelId.delete(reqId);\n    }\n\n    for (const entry of this.workers.values()) {\n      entry.worker.terminate();\n    }\n\n    this.workers.clear();\n    this.scheduler.reset();\n  }\n\n  /**\n   * Return snapshot of detected browser capabilities.\n   */\n  capabilities(): CapabilityReport {\n    return this.caps;\n  }\n\n  private resolveDevice(defaultDevice: Device | 'auto', caps: CapabilityReport): Device {\n    if (defaultDevice === 'auto') {\n      return caps.webgpu.supported && !caps.webgpu.isFallback ? 'webgpu' : 'wasm';\n    }\n    return defaultDevice;\n  }\n\n  getMemoryBudget(): { totalMB: number; allocatedMB: number; availableMB: number } {\n    return {\n      totalMB: this.budget.totalMB,\n      allocatedMB: this.budget.allocatedMB,\n      availableMB: this.budget.availableMB,\n    };\n  }\n\n  /** @internal */\n  get _registry(): ModelRegistry { return this.registry; }\n  /** @internal */\n  get _budget(): MemoryBudget { return this.budget; }\n  /** @internal */\n  get _scheduler(): Scheduler { return this.scheduler; }\n}\n\n/**\n * Create and initialize a WorkerPool.\n *\n * @example\n * ```ts\n * import { createPool } from 'inferis-ml';\n * import { transformersAdapter } from 'inferis-ml/adapters/transformers';\n *\n * const pool = await createPool({ adapter: transformersAdapter() });\n * ```\n */\nexport async function createPool(config: PoolConfig): Promise<WorkerPool> {\n  return WorkerPool.create(config);\n}\n","import type { LoadProgressEvent } from '../core/types.js';\n\ntype ProgressListener = (event: LoadProgressEvent) => void;\n\n/**\n * Simple progress event emitter for model load operations.\n * Wraps the raw progress callback into a subscribable interface.\n */\nexport class ProgressEmitter {\n  private readonly listeners = new Set<ProgressListener>();\n\n  /**\n   * Subscribe to progress events.\n   * @returns unsubscribe function\n   */\n  on(listener: ProgressListener): () => void {\n    this.listeners.add(listener);\n    return () => this.listeners.delete(listener);\n  }\n\n  /**\n   * Emit a progress event to all subscribers.\n   */\n  emit(event: LoadProgressEvent): void {\n    for (const listener of this.listeners) {\n      try {\n        listener(event);\n      }\n      catch {\n        // listeners must not throw\n      }\n    }\n  }\n\n  /** Remove all listeners. */\n  clear(): void {\n    this.listeners.clear();\n  }\n\n  /** Number of active listeners. */\n  get listenerCount(): number {\n    return this.listeners.size;\n  }\n}\n","/**\n * Async iterator adapter for ReadableStream.\n *\n * Allows `for await (const token of stream)` syntax when the runtime\n * does not natively support ReadableStream async iteration.\n *\n * @example\n * ```ts\n * const stream = model.stream({ messages: [...] });\n * for await (const token of readableToAsyncIter(stream)) {\n *   process.stdout.write(token);\n * }\n * ```\n */\nexport function readableToAsyncIter<T>(stream: ReadableStream<T>): AsyncIterable<T> {\n  if (Symbol.asyncIterator in stream) {\n    return stream as unknown as AsyncIterable<T>;\n  }\n\n  return {\n    [Symbol.asyncIterator](): AsyncIterator<T> {\n      const reader = stream.getReader();\n      return {\n        async next() {\n          const { done, value } = await reader.read();\n          if (done)\n            return { done: true, value: undefined as unknown as T };\n          return { done: false, value };\n        },\n        async return() {\n          await reader.cancel();\n          return { done: true, value: undefined as unknown as T };\n        },\n        async throw(err) {\n          await reader.cancel(err);\n          throw err;\n        },\n      };\n    },\n  };\n}\n\n/**\n * Collect all chunks from a ReadableStream into an array.\n * Useful for non-streaming consumers.\n */\nexport async function collectStream<T>(stream: ReadableStream<T>): Promise<T[]> {\n  const results: T[] = [];\n  for await (const chunk of readableToAsyncIter(stream)) {\n    results.push(chunk);\n  }\n  return results;\n}\n\n/**\n * Collect all chunks from a ReadableStream and join them as a string.\n */\nexport async function collectStreamText(stream: ReadableStream<string>): Promise<string> {\n  const chunks = await collectStream(stream);\n  return chunks.join('');\n}\n"]}