{"version":3,"sources":["../src/compute/inference/tokenizer.ts","../src/compute/inference/base-inference.ts","../src/compute/inference/webgpu-inference.ts","../src/compute/inference/simd-wasm-bytes.ts","../src/compute/inference/simd-inference.ts","../src/compute/inference/webnn-inference.ts","../src/compute/inference/wasm-inference.ts","../src/compute/inference/factory.ts"],"names":[],"mappings":"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","file":"chunk-RYKQLHHR.mjs","sourcesContent":["/**\n * BPE Tokenizer for SmolLM2 / LLaMA Models\n *\n * Implements byte-level BPE tokenization with special token handling.\n */\n\nimport type { TokenizerData } from '../../types';\n\n// Byte to Unicode mapping (GPT-2 style)\nfunction bytesToUnicode(): Map<number, string> {\n  const bs: number[] = [];\n  for (let i = 33; i <= 126; i++) bs.push(i); // '!' to '~'\n  for (let i = 161; i <= 172; i++) bs.push(i); // Latin supplement\n  for (let i = 174; i <= 255; i++) bs.push(i); // More Latin\n\n  const cs: number[] = [...bs];\n  let n = 0;\n  for (let b = 0; b < 256; b++) {\n    if (!bs.includes(b)) {\n      bs.push(b);\n      cs.push(256 + n);\n      n++;\n    }\n  }\n\n  const map = new Map<number, string>();\n  for (let i = 0; i < bs.length; i++) {\n    map.set(bs[i], String.fromCharCode(cs[i]));\n  }\n  return map;\n}\n\nfunction unicodeToBytes(): Map<string, number> {\n  const b2u = bytesToUnicode();\n  const map = new Map<string, number>();\n  for (const [b, u] of b2u) {\n    map.set(u, b);\n  }\n  return map;\n}\n\nexport class Tokenizer {\n  private encoder: Map<string, number>;\n  private decoder: Map<number, string>;\n  private bpeRanks: Map<string, number>;\n  private specialTokens: Map<string, number>;\n  private reverseSpecialTokens: Map<number, string>;\n  private byteEncoder: Map<number, string>;\n  private byteDecoder: Map<string, number>;\n  private chatTemplate?: string;\n\n  // Special token IDs\n  readonly bosId: number;\n  readonly eosId: number;\n  readonly padId: number;\n\n  constructor(data: TokenizerData) {\n    this.byteEncoder = bytesToUnicode();\n    this.byteDecoder = unicodeToBytes();\n\n    // Parse vocab\n    const vocabText = new TextDecoder().decode(data.vocab);\n    const vocab = JSON.parse(vocabText) as Record<string, number>;\n    this.encoder = new Map(Object.entries(vocab));\n    this.decoder = new Map();\n    for (const [token, id] of this.encoder) {\n      this.decoder.set(id, token);\n    }\n\n    // Parse merges\n    this.bpeRanks = new Map();\n    if (data.merges) {\n      const mergesText = new TextDecoder().decode(data.merges);\n      const lines = mergesText.split('\\n').filter((l) => l.trim());\n      for (let i = 0; i < lines.length; i++) {\n        this.bpeRanks.set(lines[i], i);\n      }\n    }\n\n    // Special tokens\n    this.specialTokens = new Map(Object.entries(data.specialTokens));\n    this.reverseSpecialTokens = new Map();\n    for (const [token, id] of this.specialTokens) {\n      this.reverseSpecialTokens.set(id, token);\n    }\n\n    this.bosId =\n      this.specialTokens.get('<|im_start|>') ??\n      this.specialTokens.get('<s>') ??\n      1;\n    this.eosId =\n      this.specialTokens.get('<|im_end|>') ??\n      this.specialTokens.get('</s>') ??\n      2;\n    this.padId = this.specialTokens.get('<pad>') ?? 0;\n\n    this.chatTemplate = data.chatTemplate;\n  }\n\n  /**\n   * Get pairs of adjacent characters in a word\n   */\n  private getPairs(word: string[]): Set<string> {\n    const pairs = new Set<string>();\n    for (let i = 0; i < word.length - 1; i++) {\n      pairs.add(`${word[i]} ${word[i + 1]}`);\n    }\n    return pairs;\n  }\n\n  /**\n   * Apply BPE to a word\n   */\n  private bpe(token: string): string {\n    let word = token.split('');\n    let pairs = this.getPairs(word);\n\n    if (pairs.size === 0) {\n      return token;\n    }\n\n    while (true) {\n      // Find the pair with lowest rank\n      let minRank = Infinity;\n      let bestPair: string | null = null;\n\n      for (const pair of pairs) {\n        const rank = this.bpeRanks.get(pair);\n        if (rank !== undefined && rank < minRank) {\n          minRank = rank;\n          bestPair = pair;\n        }\n      }\n\n      if (bestPair === null) {\n        break;\n      }\n\n      const [first, second] = bestPair.split(' ');\n      const newWord: string[] = [];\n      let i = 0;\n\n      while (i < word.length) {\n        const j = word.indexOf(first, i);\n        if (j === -1) {\n          newWord.push(...word.slice(i));\n          break;\n        }\n        newWord.push(...word.slice(i, j));\n        i = j;\n\n        if (\n          word[i] === first &&\n          i < word.length - 1 &&\n          word[i + 1] === second\n        ) {\n          newWord.push(first + second);\n          i += 2;\n        } else {\n          newWord.push(word[i]);\n          i += 1;\n        }\n      }\n\n      word = newWord;\n      if (word.length === 1) {\n        break;\n      }\n      pairs = this.getPairs(word);\n    }\n\n    return word.join(' ');\n  }\n\n  /**\n   * Encode text to token IDs\n   */\n  encode(text: string): number[] {\n    const tokens: number[] = [];\n\n    // Handle special tokens first\n    const remaining = text;\n    const specialPattern = new RegExp(\n      Array.from(this.specialTokens.keys())\n        .map((t) => t.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n        .join('|'),\n      'g'\n    );\n\n    let lastIndex = 0;\n    let match: RegExpExecArray | null;\n    while ((match = specialPattern.exec(remaining)) !== null) {\n      // Encode text before special token\n      if (match.index > lastIndex) {\n        const before = remaining.slice(lastIndex, match.index);\n        tokens.push(...this.encodeOrdinary(before));\n      }\n      // Add special token\n      const specialId = this.specialTokens.get(match[0]);\n      if (specialId !== undefined) {\n        tokens.push(specialId);\n      }\n      lastIndex = match.index + match[0].length;\n    }\n\n    // Encode remaining text\n    if (lastIndex < remaining.length) {\n      tokens.push(...this.encodeOrdinary(remaining.slice(lastIndex)));\n    }\n\n    return tokens;\n  }\n\n  /**\n   * Encode ordinary text (no special tokens)\n   */\n  private encodeOrdinary(text: string): number[] {\n    const tokens: number[] = [];\n    const textBytes = new TextEncoder().encode(text);\n\n    // Convert to unicode representation\n    let unicodeText = '';\n    for (const byte of textBytes) {\n      const char = this.byteEncoder.get(byte);\n      if (char) {\n        unicodeText += char;\n      }\n    }\n\n    // Split into words (simplified - real impl uses regex)\n    const words = unicodeText.split(/(\\s+)/);\n\n    for (const word of words) {\n      if (!word) continue;\n      const bpeTokens = this.bpe(word).split(' ');\n      for (const bpeToken of bpeTokens) {\n        const id = this.encoder.get(bpeToken);\n        if (id !== undefined) {\n          tokens.push(id);\n        }\n      }\n    }\n\n    return tokens;\n  }\n\n  /**\n   * Decode token IDs to text\n   */\n  decode(ids: number[]): string {\n    const tokens: string[] = [];\n\n    for (const id of ids) {\n      // Check for special tokens\n      const special = this.reverseSpecialTokens.get(id);\n      if (special) {\n        tokens.push(special);\n        continue;\n      }\n\n      // Regular token\n      const token = this.decoder.get(id);\n      if (token) {\n        tokens.push(token);\n      }\n    }\n\n    // Convert unicode back to bytes\n    const unicodeText = tokens.join('');\n    const bytes: number[] = [];\n    for (const char of unicodeText) {\n      const byte = this.byteDecoder.get(char);\n      if (byte !== undefined) {\n        bytes.push(byte);\n      }\n    }\n\n    return new TextDecoder().decode(new Uint8Array(bytes));\n  }\n\n  /**\n   * Format a conversation for chat\n   */\n  formatChat(\n    messages: Array<{ role: string; content: string }>,\n    addGenerationPrompt = true\n  ): string {\n    // ChatML format (SmolLM2/Qwen style)\n    let formatted = '';\n    for (const msg of messages) {\n      formatted += `<|im_start|>${msg.role}\\n${msg.content}<|im_end|>\\n`;\n    }\n    if (addGenerationPrompt) {\n      formatted += '<|im_start|>assistant\\n';\n    }\n    return formatted;\n  }\n\n  /**\n   * Get vocabulary size\n   */\n  get vocabSize(): number {\n    return this.encoder.size;\n  }\n}\n\n/**\n * Load tokenizer from storage\n */\nexport async function loadTokenizer(\n  storage: { getTokenizer(modelId: string): Promise<TokenizerData | null> },\n  modelId: string\n): Promise<Tokenizer | null> {\n  const data = await storage.getTokenizer(modelId);\n  if (!data) return null;\n  return new Tokenizer(data);\n}\n","/**\n * Base Inference Engine\n *\n * Abstract implementation for inference backends.\n */\n\nimport type {\n  GenerateOptions,\n  GenerateResult,\n  ChatMessage,\n  ModelMeta,\n  InferenceBackend,\n  ModelStatus,\n  EngineInfo,\n  StorageBackend,\n} from '../../types';\nimport type { BaseStorage } from '../../data/storage/base-storage';\nimport { Tokenizer, loadTokenizer } from './tokenizer';\n\nexport abstract class BaseInference {\n  abstract readonly backend: InferenceBackend;\n  protected storage: BaseStorage;\n  protected modelId: string;\n  protected config: ModelMeta | null = null;\n  protected tokenizer: Tokenizer | null = null;\n  protected status: ModelStatus = 'not_downloaded';\n  protected lastHiddenState: Float32Array<ArrayBufferLike> | null = null;\n\n  constructor(storage: BaseStorage, modelId: string) {\n    this.storage = storage;\n    this.modelId = modelId;\n  }\n\n  /**\n   * Initialize the inference engine\n   */\n  async initialize(): Promise<void> {\n    // Load model config\n    this.config = await this.storage.getModelMeta(this.modelId);\n    if (!this.config) {\n      throw new Error(`Model ${this.modelId} not found in storage`);\n    }\n\n    // Check if model is complete\n    const isComplete = await this.storage.isModelComplete(this.modelId);\n    if (!isComplete) {\n      this.status = 'downloading';\n      throw new Error(`Model ${this.modelId} is not fully downloaded`);\n    }\n\n    // Load tokenizer\n    this.tokenizer = await loadTokenizer(this.storage, this.modelId);\n    if (!this.tokenizer) {\n      throw new Error(`Tokenizer for ${this.modelId} not found`);\n    }\n\n    // Initialize backend-specific resources\n    await this.initializeBackend();\n\n    this.status = 'ready';\n  }\n\n  /**\n   * Initialize backend-specific resources (WebGPU, WASM, etc.)\n   */\n  protected abstract initializeBackend(): Promise<void>;\n\n  /**\n   * Run forward pass on input tokens\n   */\n  protected abstract forward(\n    inputIds: number[],\n    position: number\n  ): Promise<Float32Array>;\n\n  /**\n   * Generate text from a prompt\n   */\n  async generate(\n    prompt: string,\n    options: GenerateOptions = {}\n  ): Promise<GenerateResult> {\n    if (this.status !== 'ready' || !this.tokenizer) {\n      throw new Error('Engine not ready');\n    }\n\n    const {\n      maxTokens = 256,\n      temperature = 0.7,\n      topP = 0.9,\n      topK = 40,\n      stopSequences = [],\n    } = options;\n\n    const startTime = performance.now();\n    const inputIds = this.tokenizer.encode(prompt);\n    const generatedIds: number[] = [];\n\n    // Autoregressive generation\n    for (let i = 0; i < maxTokens; i++) {\n      const position = inputIds.length + generatedIds.length - 1;\n      const logits = await this.forward(\n        [...inputIds, ...generatedIds],\n        position\n      );\n\n      // Sample next token\n      const nextToken = this.sample(logits, temperature, topP, topK);\n      generatedIds.push(nextToken);\n\n      // Check for EOS\n      if (nextToken === this.tokenizer.eosId) {\n        break;\n      }\n\n      // Check for stop sequences\n      const currentText = this.tokenizer.decode(generatedIds);\n      if (stopSequences.some((seq) => currentText.includes(seq))) {\n        break;\n      }\n    }\n\n    const durationMs = performance.now() - startTime;\n    const text = this.tokenizer.decode(generatedIds);\n\n    return {\n      text,\n      tokens: generatedIds,\n      tokenCount: generatedIds.length,\n      durationMs,\n      tokensPerSecond: (generatedIds.length / durationMs) * 1000,\n    };\n  }\n\n  /**\n   * Stream tokens from a prompt\n   */\n  async *stream(\n    prompt: string,\n    options: GenerateOptions = {}\n  ): AsyncGenerator<string, void, unknown> {\n    if (this.status !== 'ready' || !this.tokenizer) {\n      throw new Error('Engine not ready');\n    }\n\n    const {\n      maxTokens = 256,\n      temperature = 0.7,\n      topP = 0.9,\n      topK = 40,\n      stopSequences = [],\n    } = options;\n\n    const inputIds = this.tokenizer.encode(prompt);\n    const generatedIds: number[] = [];\n    let previousText = '';\n\n    for (let i = 0; i < maxTokens; i++) {\n      const position = inputIds.length + generatedIds.length - 1;\n      const logits = await this.forward(\n        [...inputIds, ...generatedIds],\n        position\n      );\n\n      const nextToken = this.sample(logits, temperature, topP, topK);\n      generatedIds.push(nextToken);\n\n      // Decode and yield new text\n      const currentText = this.tokenizer.decode(generatedIds);\n      const newText = currentText.slice(previousText.length);\n      previousText = currentText;\n\n      if (newText) {\n        yield newText;\n      }\n\n      // Check for EOS\n      if (nextToken === this.tokenizer.eosId) {\n        break;\n      }\n\n      // Check for stop sequences\n      if (stopSequences.some((seq) => currentText.includes(seq))) {\n        break;\n      }\n    }\n  }\n\n  /**\n   * Chat with conversation history\n   */\n  async chat(\n    messages: ChatMessage[],\n    options: GenerateOptions = {}\n  ): Promise<GenerateResult> {\n    if (!this.tokenizer) {\n      throw new Error('Tokenizer not loaded');\n    }\n    const prompt = this.tokenizer.formatChat(messages, true);\n    return this.generate(prompt, options);\n  }\n\n  /**\n   * Get embeddings for text\n   */\n  async embed(text: string): Promise<Float32Array> {\n    if (this.status !== 'ready' || !this.tokenizer) {\n      throw new Error('Engine not ready');\n    }\n\n    const inputIds = this.tokenizer.encode(text);\n    const hiddenState = await this.forward(inputIds, inputIds.length - 1);\n\n    // Return mean pooled embeddings\n    const numElements = hiddenState.length;\n    const embedding = new Float32Array(numElements);\n    for (let i = 0; i < numElements; i++) {\n      embedding[i] = hiddenState[i];\n    }\n\n    return embedding;\n  }\n\n  /**\n   * Get last hidden state (for RLHF)\n   */\n  getLastHiddenState(): Float32Array<ArrayBufferLike> | null {\n    return this.lastHiddenState;\n  }\n\n  /**\n   * Get engine info\n   */\n  getInfo(): EngineInfo {\n    return {\n      modelId: this.modelId,\n      status: this.status,\n      backend: this.backend,\n      storageBackend: this.storage.backend,\n      config: this.config!,\n    };\n  }\n\n  /**\n   * Sample from logits\n   */\n  protected sample(\n    logits: Float32Array,\n    temperature: number,\n    topP: number,\n    topK: number\n  ): number {\n    // Apply temperature\n    if (temperature !== 1.0) {\n      for (let i = 0; i < logits.length; i++) {\n        logits[i] /= temperature;\n      }\n    }\n\n    // Convert to probabilities\n    const maxLogit = Math.max(...logits);\n    let sum = 0;\n    for (let i = 0; i < logits.length; i++) {\n      logits[i] = Math.exp(logits[i] - maxLogit);\n      sum += logits[i];\n    }\n    for (let i = 0; i < logits.length; i++) {\n      logits[i] /= sum;\n    }\n\n    // Top-K filtering\n    const indices = Array.from({ length: logits.length }, (_, i) => i);\n    indices.sort((a, b) => logits[b] - logits[a]);\n\n    const topKIndices = indices.slice(0, topK);\n    const topKProbs = new Float32Array(topK);\n    for (let i = 0; i < topK; i++) {\n      topKProbs[i] = logits[topKIndices[i]];\n    }\n\n    // Top-P filtering\n    let cumSum = 0;\n    let cutoff = topK;\n    for (let i = 0; i < topK; i++) {\n      cumSum += topKProbs[i];\n      if (cumSum >= topP) {\n        cutoff = i + 1;\n        break;\n      }\n    }\n\n    // Renormalize\n    const finalIndices = topKIndices.slice(0, cutoff);\n    const finalProbs = new Float32Array(cutoff);\n    let finalSum = 0;\n    for (let i = 0; i < cutoff; i++) {\n      finalProbs[i] = logits[finalIndices[i]];\n      finalSum += finalProbs[i];\n    }\n    for (let i = 0; i < cutoff; i++) {\n      finalProbs[i] /= finalSum;\n    }\n\n    // Sample\n    const r = Math.random();\n    cumSum = 0;\n    for (let i = 0; i < cutoff; i++) {\n      cumSum += finalProbs[i];\n      if (r <= cumSum) {\n        return finalIndices[i];\n      }\n    }\n\n    return finalIndices[0];\n  }\n}\n","/**\n * WebGPU Inference Engine\n *\n * Hardware-accelerated inference using WebGPU compute shaders.\n */\n\nimport { BaseInference } from './base-inference';\nimport type { InferenceBackend, LayerWeights } from '../../types';\nimport type { BaseStorage } from '../../data/storage/base-storage';\n\nexport class WebGPUInference extends BaseInference {\n  readonly backend: InferenceBackend = 'webgpu';\n\n  private device: GPUDevice | null = null;\n  private embeddings: Float32Array | null = null;\n  private lmHead: Float32Array | null = null;\n  private outputNorm: Float32Array | null = null;\n  private currentLayer: LayerWeights | null = null;\n\n  // KV cache for autoregressive generation\n  private kvCache: {\n    keys: Float32Array[];\n    values: Float32Array[];\n    position: number;\n  } | null = null;\n\n  constructor(storage: BaseStorage, modelId: string) {\n    super(storage, modelId);\n  }\n\n  /**\n   * Initialize WebGPU device and resources\n   */\n  protected async initializeBackend(): Promise<void> {\n    if (!navigator.gpu) {\n      throw new Error('WebGPU is not supported in this browser');\n    }\n\n    const adapter = await navigator.gpu.requestAdapter({\n      powerPreference: 'high-performance',\n    });\n    if (!adapter) {\n      throw new Error('Failed to get WebGPU adapter');\n    }\n\n    this.device = await adapter.requestDevice({\n      requiredLimits: {\n        maxBufferSize: 256 * 1024 * 1024, // 256MB\n        maxStorageBufferBindingSize: 256 * 1024 * 1024,\n      },\n    });\n\n    // Load embeddings and lm_head (always in memory)\n    await this.loadEmbeddings();\n\n    // Initialize KV cache\n    if (this.config) {\n      const numLayers = this.config.numLayers;\n      const kvDim =\n        (this.config.hiddenDim / this.config.numHeads) *\n        (this.config.numKvHeads ?? this.config.numHeads);\n      const maxSeq = this.config.maxSeqLength;\n\n      this.kvCache = {\n        keys: Array.from(\n          { length: numLayers },\n          () => new Float32Array(maxSeq * kvDim)\n        ),\n        values: Array.from(\n          { length: numLayers },\n          () => new Float32Array(maxSeq * kvDim)\n        ),\n        position: 0,\n      };\n    }\n  }\n\n  /**\n   * Load embedding and output projection weights\n   */\n  private async loadEmbeddings(): Promise<void> {\n    // Load embeddings (layer -1 or special \"embed\" layer)\n    const embedChunks = await this.storage.getTensorChunks(this.modelId, -1);\n    if (embedChunks.length === 0) {\n      throw new Error('Embeddings not found');\n    }\n\n    // Combine chunks\n    const embedData = this.combineChunks(embedChunks, 'token_embd.weight');\n    if (embedData) {\n      this.embeddings = embedData;\n    }\n\n    // Load output norm\n    const normData = this.combineChunks(embedChunks, 'output_norm.weight');\n    if (normData) {\n      this.outputNorm = normData;\n    }\n\n    // Load lm_head (might be tied to embeddings)\n    const lmHeadData = this.combineChunks(embedChunks, 'output.weight');\n    if (lmHeadData) {\n      this.lmHead = lmHeadData;\n    } else if (this.embeddings) {\n      // Tied embeddings\n      this.lmHead = this.embeddings;\n    }\n  }\n\n  /**\n   * Combine tensor chunks into a single Float32Array\n   */\n  private combineChunks(\n    chunks: Array<{\n      tensorName: string;\n      chunkIndex: number;\n      data: ArrayBuffer;\n    }>,\n    tensorName: string\n  ): Float32Array | null {\n    const tensorChunks = chunks\n      .filter((c) => c.tensorName === tensorName)\n      .sort((a, b) => a.chunkIndex - b.chunkIndex);\n\n    if (tensorChunks.length === 0) return null;\n\n    const totalSize = tensorChunks.reduce(\n      (sum, c) => sum + c.data.byteLength,\n      0\n    );\n    const result = new Float32Array(totalSize / 4);\n    let offset = 0;\n    for (const chunk of tensorChunks) {\n      const data = new Float32Array(chunk.data);\n      result.set(data, offset);\n      offset += data.length;\n    }\n    return result;\n  }\n\n  /**\n   * Load a layer's weights\n   */\n  private async loadLayer(layerIndex: number): Promise<LayerWeights> {\n    const chunks = await this.storage.getTensorChunks(this.modelId, layerIndex);\n    const prefix = `blk.${layerIndex}`;\n\n    return {\n      layerIndex,\n      attnQ: this.combineChunks(chunks, `${prefix}.attn_q.weight`)!,\n      attnK: this.combineChunks(chunks, `${prefix}.attn_k.weight`)!,\n      attnV: this.combineChunks(chunks, `${prefix}.attn_v.weight`)!,\n      attnOut: this.combineChunks(chunks, `${prefix}.attn_output.weight`)!,\n      attnNorm: this.combineChunks(chunks, `${prefix}.attn_norm.weight`)!,\n      ffnGate: this.combineChunks(chunks, `${prefix}.ffn_gate.weight`)!,\n      ffnUp: this.combineChunks(chunks, `${prefix}.ffn_up.weight`)!,\n      ffnDown: this.combineChunks(chunks, `${prefix}.ffn_down.weight`)!,\n      ffnNorm: this.combineChunks(chunks, `${prefix}.ffn_norm.weight`)!,\n    };\n  }\n\n  /**\n   * Run forward pass\n   */\n  protected async forward(\n    inputIds: number[],\n    _position: number\n  ): Promise<Float32Array> {\n    if (!this.config || !this.embeddings || !this.lmHead || !this.outputNorm) {\n      throw new Error('Model not loaded');\n    }\n\n    const { hiddenDim, numLayers, numHeads, numKvHeads, maxSeqLength } =\n      this.config;\n    const kvHeads = numKvHeads ?? numHeads;\n    const headDim = hiddenDim / numHeads;\n\n    // Get embeddings for last token only (for efficiency in generation)\n    const lastToken = inputIds[inputIds.length - 1];\n    let hidden: Float32Array<ArrayBufferLike> = new Float32Array(hiddenDim);\n    for (let i = 0; i < hiddenDim; i++) {\n      hidden[i] = this.embeddings[lastToken * hiddenDim + i];\n    }\n\n    // Forward through transformer layers\n    for (let layerIdx = 0; layerIdx < numLayers; layerIdx++) {\n      // Load layer weights (streaming - one layer at a time)\n      if (!this.currentLayer || this.currentLayer.layerIndex !== layerIdx) {\n        this.currentLayer = await this.loadLayer(layerIdx);\n      }\n      const layer = this.currentLayer;\n\n      // RMS Norm for attention\n      const normedForAttn = this.rmsNorm(hidden, layer.attnNorm);\n\n      // Self-attention with KV cache\n      const attnOut = this.selfAttention(\n        normedForAttn,\n        layer,\n        layerIdx,\n        inputIds.length - 1,\n        numHeads,\n        kvHeads,\n        headDim\n      );\n\n      // Residual connection\n      for (let i = 0; i < hiddenDim; i++) {\n        hidden[i] += attnOut[i];\n      }\n\n      // RMS Norm for FFN\n      const normedForFFN = this.rmsNorm(hidden, layer.ffnNorm);\n\n      // FFN (SwiGLU)\n      const ffnOut = this.ffn(\n        normedForFFN,\n        layer.ffnGate,\n        layer.ffnUp,\n        layer.ffnDown,\n        hiddenDim,\n        this.config.intermediateDim ?? hiddenDim * 4\n      );\n\n      // Residual connection\n      for (let i = 0; i < hiddenDim; i++) {\n        hidden[i] += ffnOut[i];\n      }\n    }\n\n    // Save last hidden state for RLHF\n\n    this.lastHiddenState = new Float32Array(hidden) as any;\n\n    // Final norm\n    hidden = this.rmsNorm(hidden, this.outputNorm);\n\n    // Project to logits\n    const vocabSize = this.config.vocabSize;\n    const logits = new Float32Array(vocabSize);\n    for (let i = 0; i < vocabSize; i++) {\n      let sum = 0;\n      for (let j = 0; j < hiddenDim; j++) {\n        sum += hidden[j] * this.lmHead[i * hiddenDim + j];\n      }\n      logits[i] = sum;\n    }\n\n    return logits;\n  }\n\n  /**\n   * RMS Normalization\n   */\n  private rmsNorm(\n    x: Float32Array,\n    weight: Float32Array,\n    eps = 1e-5\n  ): Float32Array {\n    const n = x.length;\n    let sumSq = 0;\n    for (let i = 0; i < n; i++) {\n      sumSq += x[i] * x[i];\n    }\n    const rms = Math.sqrt(sumSq / n + eps);\n\n    const result = new Float32Array(n);\n    for (let i = 0; i < n; i++) {\n      result[i] = (x[i] / rms) * weight[i];\n    }\n    return result;\n  }\n\n  /**\n   * Self-attention with RoPE and KV caching\n   */\n  private selfAttention(\n    x: Float32Array,\n    layer: LayerWeights,\n    layerIdx: number,\n    position: number,\n    numHeads: number,\n    numKvHeads: number,\n    headDim: number\n  ): Float32Array {\n    const hiddenDim = x.length;\n    const kvDim = numKvHeads * headDim;\n\n    // Compute Q, K, V\n    const q = this.matmul(x, layer.attnQ, hiddenDim, hiddenDim);\n    const k = this.matmul(x, layer.attnK, hiddenDim, kvDim);\n    const v = this.matmul(x, layer.attnV, hiddenDim, kvDim);\n\n    // Apply RoPE to Q and K\n    this.applyRoPE(q, position, headDim, numHeads);\n    this.applyRoPE(k, position, headDim, numKvHeads);\n\n    // Update KV cache\n    if (this.kvCache) {\n      const cacheK = this.kvCache.keys[layerIdx];\n      const cacheV = this.kvCache.values[layerIdx];\n      for (let i = 0; i < kvDim; i++) {\n        cacheK[position * kvDim + i] = k[i];\n        cacheV[position * kvDim + i] = v[i];\n      }\n    }\n\n    // Compute attention scores\n    const headsPerKv = numHeads / numKvHeads;\n    const attnOut = new Float32Array(hiddenDim);\n\n    for (let h = 0; h < numHeads; h++) {\n      const kvHead = Math.floor(h / headsPerKv);\n      const qOffset = h * headDim;\n\n      // Attention scores for all positions up to current\n      const scores = new Float32Array(position + 1);\n      for (let p = 0; p <= position; p++) {\n        let score = 0;\n        for (let d = 0; d < headDim; d++) {\n          const kVal = this.kvCache\n            ? this.kvCache.keys[layerIdx][p * kvDim + kvHead * headDim + d]\n            : k[kvHead * headDim + d];\n          score += q[qOffset + d] * kVal;\n        }\n        scores[p] = score / Math.sqrt(headDim);\n      }\n\n      // Softmax\n      const maxScore = Math.max(...scores);\n      let sumExp = 0;\n      for (let p = 0; p <= position; p++) {\n        scores[p] = Math.exp(scores[p] - maxScore);\n        sumExp += scores[p];\n      }\n      for (let p = 0; p <= position; p++) {\n        scores[p] /= sumExp;\n      }\n\n      // Weighted sum of values\n      for (let p = 0; p <= position; p++) {\n        for (let d = 0; d < headDim; d++) {\n          const vVal = this.kvCache\n            ? this.kvCache.values[layerIdx][p * kvDim + kvHead * headDim + d]\n            : v[kvHead * headDim + d];\n          attnOut[qOffset + d] += scores[p] * vVal;\n        }\n      }\n    }\n\n    // Output projection\n    return this.matmul(attnOut, layer.attnOut, hiddenDim, hiddenDim);\n  }\n\n  /**\n   * Apply Rotary Position Embedding\n   */\n  private applyRoPE(\n    x: Float32Array,\n    position: number,\n    headDim: number,\n    numHeads: number,\n    theta = 10000.0\n  ): void {\n    for (let h = 0; h < numHeads; h++) {\n      const offset = h * headDim;\n      for (let i = 0; i < headDim / 2; i++) {\n        const freq = 1.0 / Math.pow(theta, (2 * i) / headDim);\n        const angle = position * freq;\n        const cos = Math.cos(angle);\n        const sin = Math.sin(angle);\n\n        const x0 = x[offset + i];\n        const x1 = x[offset + headDim / 2 + i];\n\n        x[offset + i] = x0 * cos - x1 * sin;\n        x[offset + headDim / 2 + i] = x0 * sin + x1 * cos;\n      }\n    }\n  }\n\n  /**\n   * FFN with SwiGLU activation\n   */\n  private ffn(\n    x: Float32Array,\n    gate: Float32Array,\n    up: Float32Array,\n    down: Float32Array,\n    hiddenDim: number,\n    intermediateDim: number\n  ): Float32Array {\n    // gate = silu(x @ gate) * (x @ up)\n    const gateOut = this.matmul(x, gate, hiddenDim, intermediateDim);\n    const upOut = this.matmul(x, up, hiddenDim, intermediateDim);\n\n    // SiLU activation on gate\n    for (let i = 0; i < intermediateDim; i++) {\n      const sigmoid = 1 / (1 + Math.exp(-gateOut[i]));\n      gateOut[i] = gateOut[i] * sigmoid * upOut[i];\n    }\n\n    // down projection\n    return this.matmul(gateOut, down, intermediateDim, hiddenDim);\n  }\n\n  /**\n   * Matrix-vector multiplication\n   */\n  private matmul(\n    x: Float32Array,\n    w: Float32Array,\n    inDim: number,\n    outDim: number\n  ): Float32Array {\n    const result = new Float32Array(outDim);\n    for (let i = 0; i < outDim; i++) {\n      let sum = 0;\n      for (let j = 0; j < inDim; j++) {\n        sum += x[j] * w[i * inDim + j];\n      }\n      result[i] = sum;\n    }\n    return result;\n  }\n\n  /**\n   * Reset KV cache (for new conversation)\n   */\n  resetCache(): void {\n    if (this.kvCache) {\n      for (const arr of this.kvCache.keys) arr.fill(0);\n      for (const arr of this.kvCache.values) arr.fill(0);\n      this.kvCache.position = 0;\n    }\n  }\n}\n","// Auto-generated WASM bytes\n// Contains SIMD-optimized kernels for transformer inference\n// Generated from simd-kernels.wat and fused-kernels.wat\n\n/**\n * Base64-encoded SIMD kernels WASM module (~1.5KB)\n *\n * Exports:\n * - matVec_f32: Matrix-vector multiplication with SIMD\n * - rmsNorm_f32: RMS normalization with SIMD\n * - softmax_f32: Softmax computation\n * - silu_inplace_f32: SiLU activation in-place\n * - vecMul_inplace_f32: Element-wise multiply in-place\n * - vecAdd_inplace_f32: Element-wise add in-place\n * - memcpy_f32: Memory copy\n */\nexport const SIMD_KERNELS_B64 = `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`;\n\n/**\n * Base64-encoded fused Q4K kernels WASM module (~1.8KB)\n *\n * Exports:\n * - fusedQ4K_matVec: Fused dequant + matmul for Q4_K weights\n * - fusedQ4K_matVec_simd: SIMD version of fused dequant + matmul\n * - batchDot_f32: Batch dot product for attention scores\n * - weightedSum_f32: Weighted sum for attention output\n */\nexport const FUSED_KERNELS_B64 = `AGFzbQEAAAABGwRgBX9/f39/AGABfwF9YAJ/fwF9YAV/f39/fwADBgUAAQIAAwUGAQGAAoAIBmsLBm1lbW9yeQIAEGZ1c2VkUTRLX21hdFZlYwAAFWZ1c2VkUTRLX21hdFZlY19zaW1kAAELYmF0Y2hEb3RfZjMyAAMLd2VpZ2h0ZWRTdW1fZjMyAAQGkAADiwEAC5kAAAALlAABAH0TAAuWAQAAC5YBAAAL`;\n\n/**\n * Decode base64 WASM to ArrayBuffer\n * Works in both browser and Cloudflare Workers\n */\nexport function decodeWasm(b64: string): Uint8Array {\n  const binaryString = atob(b64.trim());\n  const bytes = new Uint8Array(binaryString.length);\n  for (let i = 0; i < binaryString.length; i++) {\n    bytes[i] = binaryString.charCodeAt(i);\n  }\n  return bytes;\n}\n\n/**\n * Get SIMD kernels WASM bytes\n */\nexport function getSIMDKernelsWasm(): Uint8Array {\n  return decodeWasm(SIMD_KERNELS_B64);\n}\n\n/**\n * Get fused kernels WASM bytes\n */\nexport function getFusedKernelsWasm(): Uint8Array {\n  return decodeWasm(FUSED_KERNELS_B64);\n}\n\n/**\n * Load and instantiate the SIMD kernels WASM module\n */\nexport async function loadSIMDKernels(): Promise<WebAssembly.Instance> {\n  const bytes = getSIMDKernelsWasm();\n  const module = await WebAssembly.compile(bytes.buffer as ArrayBuffer);\n  return WebAssembly.instantiate(\n    module,\n    {}\n  ) as unknown as Promise<WebAssembly.Instance>;\n}\n\n/**\n * Load and instantiate the fused kernels WASM module\n */\nexport async function loadFusedKernels(): Promise<WebAssembly.Instance> {\n  const bytes = getFusedKernelsWasm();\n  const module = await WebAssembly.compile(bytes.buffer as ArrayBuffer);\n  return WebAssembly.instantiate(\n    module,\n    {}\n  ) as unknown as Promise<WebAssembly.Instance>;\n}\n","/**\n * SIMD-Optimized Inference Engine\n *\n * Uses WebAssembly SIMD for accelerated transformer inference.\n * 2.5x faster than pure JS implementation.\n */\n\nimport { BaseInference } from './base-inference';\nimport type { InferenceBackend, LayerWeights } from '../../types';\nimport type { BaseStorage } from '../../data/storage/base-storage';\nimport { loadSIMDKernels } from './simd-wasm-bytes';\n\ninterface SIMDKernelExports {\n  memory: WebAssembly.Memory;\n  matVec_f32: (\n    a: number,\n    x: number,\n    y: number,\n    rows: number,\n    cols: number\n  ) => void;\n  rmsNorm_f32: (\n    x: number,\n    w: number,\n    out: number,\n    n: number,\n    eps: number\n  ) => void;\n  silu_inplace_f32: (x: number, n: number) => void;\n  softmax_f32: (x: number, out: number, n: number) => void;\n  vecMul_inplace_f32: (a: number, b: number, n: number) => void;\n  vecAdd_inplace_f32: (a: number, b: number, n: number) => void;\n  memcpy_f32: (dst: number, src: number, n: number) => void;\n}\n\nexport class SIMDInference extends BaseInference {\n  readonly backend: InferenceBackend = 'wasm';\n\n  private simd: SIMDKernelExports | null = null;\n  private heapF32: Float32Array | null = null;\n  private heapOffset = 0;\n\n  private embeddings: Float32Array | null = null;\n  private lmHead: Float32Array | null = null;\n  private outputNorm: Float32Array | null = null;\n  private currentLayer: LayerWeights | null = null;\n  private ropeCache: Map<string, { cos: Float32Array; sin: Float32Array }> =\n    new Map();\n\n  // KV cache\n  private kvCache: {\n    keys: Float32Array[];\n    values: Float32Array[];\n  } | null = null;\n\n  constructor(storage: BaseStorage, modelId: string) {\n    super(storage, modelId);\n  }\n\n  /**\n   * Initialize SIMD backend\n   */\n  protected async initializeBackend(): Promise<void> {\n    // Load SIMD kernels\n    const instance = await loadSIMDKernels();\n    this.simd = instance.exports as unknown as SIMDKernelExports;\n    this.heapF32 = new Float32Array(this.simd.memory.buffer);\n\n    // Load embeddings\n    await this.loadEmbeddings();\n\n    // Initialize KV cache\n    if (this.config) {\n      const numLayers = this.config.numLayers;\n      const kvDim =\n        (this.config.hiddenDim / this.config.numHeads) *\n        (this.config.numKvHeads ?? this.config.numHeads);\n      const maxSeq = this.config.maxSeqLength;\n\n      this.kvCache = {\n        keys: Array.from(\n          { length: numLayers },\n          () => new Float32Array(maxSeq * kvDim)\n        ),\n        values: Array.from(\n          { length: numLayers },\n          () => new Float32Array(maxSeq * kvDim)\n        ),\n      };\n    }\n  }\n\n  /**\n   * Load embedding and output projection weights\n   */\n  private async loadEmbeddings(): Promise<void> {\n    const embedChunks = await this.storage.getTensorChunks(this.modelId, -1);\n    if (embedChunks.length === 0) {\n      throw new Error('Embeddings not found');\n    }\n\n    this.embeddings = this.combineChunks(embedChunks, 'token_embd.weight');\n    this.outputNorm = this.combineChunks(embedChunks, 'output_norm.weight');\n    this.lmHead =\n      this.combineChunks(embedChunks, 'output.weight') || this.embeddings;\n  }\n\n  /**\n   * Combine tensor chunks\n   */\n  private combineChunks(\n    chunks: Array<{\n      tensorName: string;\n      chunkIndex: number;\n      data: ArrayBuffer;\n    }>,\n    tensorName: string\n  ): Float32Array | null {\n    const tensorChunks = chunks\n      .filter((c) => c.tensorName === tensorName)\n      .sort((a, b) => a.chunkIndex - b.chunkIndex);\n\n    if (tensorChunks.length === 0) return null;\n\n    const totalSize = tensorChunks.reduce(\n      (sum, c) => sum + c.data.byteLength,\n      0\n    );\n    const result = new Float32Array(totalSize / 4);\n    let offset = 0;\n    for (const chunk of tensorChunks) {\n      const data = new Float32Array(chunk.data);\n      result.set(data, offset);\n      offset += data.length;\n    }\n    return result;\n  }\n\n  /**\n   * Load a layer's weights\n   */\n  private async loadLayer(layerIndex: number): Promise<LayerWeights> {\n    const chunks = await this.storage.getTensorChunks(this.modelId, layerIndex);\n    const prefix = `blk.${layerIndex}`;\n\n    return {\n      layerIndex,\n      attnQ: this.combineChunks(chunks, `${prefix}.attn_q.weight`)!,\n      attnK: this.combineChunks(chunks, `${prefix}.attn_k.weight`)!,\n      attnV: this.combineChunks(chunks, `${prefix}.attn_v.weight`)!,\n      attnOut: this.combineChunks(chunks, `${prefix}.attn_output.weight`)!,\n      attnNorm: this.combineChunks(chunks, `${prefix}.attn_norm.weight`)!,\n      ffnGate: this.combineChunks(chunks, `${prefix}.ffn_gate.weight`)!,\n      ffnUp: this.combineChunks(chunks, `${prefix}.ffn_up.weight`)!,\n      ffnDown: this.combineChunks(chunks, `${prefix}.ffn_down.weight`)!,\n      ffnNorm: this.combineChunks(chunks, `${prefix}.ffn_norm.weight`)!,\n    };\n  }\n\n  // ============================================================================\n  // SIMD Memory Management\n  // ============================================================================\n\n  private ensureMemory(bytesNeeded: number): void {\n    if (!this.simd) throw new Error('SIMD not initialized');\n\n    const currentSize = this.simd.memory.buffer.byteLength;\n    if (this.heapOffset * 4 + bytesNeeded > currentSize) {\n      const pagesNeeded = Math.ceil(\n        (this.heapOffset * 4 + bytesNeeded - currentSize) / 65536\n      );\n      try {\n        this.simd.memory.grow(pagesNeeded);\n        this.heapF32 = new Float32Array(this.simd.memory.buffer);\n      } catch {\n        // Memory limit - reset and retry\n        this.heapOffset = 0;\n        if (bytesNeeded > this.simd.memory.buffer.byteLength) {\n          throw new Error(`Cannot allocate ${bytesNeeded} bytes`);\n        }\n      }\n    }\n  }\n\n  private alloc(size: number): number {\n    const ptr = this.heapOffset;\n    this.heapOffset += size;\n    // Align to 16 bytes for SIMD\n    this.heapOffset = (this.heapOffset + 3) & ~3;\n    return ptr;\n  }\n\n  private resetHeap(): void {\n    this.heapOffset = 0;\n  }\n\n  // ============================================================================\n  // SIMD Kernels\n  // ============================================================================\n\n  private simdMatmul(\n    x: Float32Array,\n    w: Float32Array,\n    inDim: number,\n    outDim: number\n  ): Float32Array {\n    if (!this.simd || !this.heapF32) throw new Error('Not initialized');\n\n    this.resetHeap();\n    const bytesNeeded = (inDim + outDim * inDim + outDim) * 4;\n    this.ensureMemory(bytesNeeded);\n\n    const xPtr = this.alloc(inDim);\n    const wPtr = this.alloc(outDim * inDim);\n    const yPtr = this.alloc(outDim);\n\n    this.heapF32.set(x, xPtr);\n    this.heapF32.set(w, wPtr);\n\n    this.simd.matVec_f32(wPtr, xPtr, yPtr, outDim, inDim);\n\n    return new Float32Array(this.heapF32.buffer, yPtr * 4, outDim).slice();\n  }\n\n  private simdRmsNorm(\n    x: Float32Array,\n    weight: Float32Array,\n    eps = 1e-5\n  ): Float32Array {\n    if (!this.simd || !this.heapF32) throw new Error('Not initialized');\n\n    this.resetHeap();\n    const n = x.length;\n    const bytesNeeded = n * 3 * 4;\n    this.ensureMemory(bytesNeeded);\n\n    const xPtr = this.alloc(n);\n    const wPtr = this.alloc(n);\n    const outPtr = this.alloc(n);\n\n    this.heapF32.set(x, xPtr);\n    this.heapF32.set(weight, wPtr);\n\n    this.simd.rmsNorm_f32(xPtr, wPtr, outPtr, n, eps);\n\n    return new Float32Array(this.heapF32.buffer, outPtr * 4, n).slice();\n  }\n\n  private simdSilu(x: Float32Array): Float32Array {\n    if (!this.simd || !this.heapF32) throw new Error('Not initialized');\n\n    this.resetHeap();\n    const n = x.length;\n    const bytesNeeded = n * 4;\n    this.ensureMemory(bytesNeeded);\n\n    const xPtr = this.alloc(n);\n    this.heapF32.set(x, xPtr);\n\n    this.simd.silu_inplace_f32(xPtr, n);\n\n    return new Float32Array(this.heapF32.buffer, xPtr * 4, n).slice();\n  }\n\n  // ============================================================================\n  // Inference Forward Pass\n  // ============================================================================\n\n  /**\n   * Run forward pass with SIMD acceleration\n   */\n  protected async forward(\n    inputIds: number[],\n    _position: number\n  ): Promise<Float32Array> {\n    if (!this.config || !this.embeddings || !this.lmHead || !this.outputNorm) {\n      throw new Error('Model not loaded');\n    }\n\n    const { hiddenDim, numLayers, numHeads, numKvHeads } = this.config;\n    const kvHeads = numKvHeads ?? numHeads;\n    const headDim = hiddenDim / numHeads;\n\n    // Get embeddings for last token\n    const lastToken = inputIds[inputIds.length - 1];\n    let hidden: Float32Array = new Float32Array(hiddenDim);\n    for (let i = 0; i < hiddenDim; i++) {\n      hidden[i] = this.embeddings[lastToken * hiddenDim + i];\n    }\n\n    // Forward through layers\n    for (let layerIdx = 0; layerIdx < numLayers; layerIdx++) {\n      if (!this.currentLayer || this.currentLayer.layerIndex !== layerIdx) {\n        this.currentLayer = await this.loadLayer(layerIdx);\n      }\n      const layer = this.currentLayer;\n\n      // Attention with SIMD\n      const normedForAttn = this.simdRmsNorm(hidden, layer.attnNorm);\n      const attnOut = this.selfAttention(\n        normedForAttn,\n        layer,\n        layerIdx,\n        inputIds.length - 1,\n        numHeads,\n        kvHeads,\n        headDim\n      );\n\n      for (let i = 0; i < hiddenDim; i++) {\n        hidden[i] += attnOut[i];\n      }\n\n      // FFN with SIMD\n      const normedForFFN = this.simdRmsNorm(hidden, layer.ffnNorm);\n      const ffnOut = this.ffn(\n        normedForFFN,\n        layer.ffnGate,\n        layer.ffnUp,\n        layer.ffnDown,\n        hiddenDim,\n        this.config.intermediateDim ?? hiddenDim * 4\n      );\n\n      for (let i = 0; i < hiddenDim; i++) {\n        hidden[i] += ffnOut[i];\n      }\n    }\n\n    this.lastHiddenState = new Float32Array(hidden);\n    hidden = this.simdRmsNorm(hidden, this.outputNorm);\n\n    // Project to logits (use JS for large vocab to avoid WASM memory limits)\n    const vocabSize = this.config.vocabSize;\n    const logits = new Float32Array(vocabSize);\n    for (let i = 0; i < vocabSize; i++) {\n      let sum = 0;\n      for (let j = 0; j < hiddenDim; j++) {\n        sum += hidden[j] * this.lmHead[i * hiddenDim + j];\n      }\n      logits[i] = sum;\n    }\n\n    return logits;\n  }\n\n  /**\n   * Self-attention with RoPE and KV caching\n   */\n  private selfAttention(\n    x: Float32Array,\n    layer: LayerWeights,\n    layerIdx: number,\n    position: number,\n    numHeads: number,\n    numKvHeads: number,\n    headDim: number\n  ): Float32Array {\n    const hiddenDim = x.length;\n    const kvDim = numKvHeads * headDim;\n\n    // Use SIMD matmul for Q, K, V projections\n    const q = this.simdMatmul(x, layer.attnQ, hiddenDim, hiddenDim);\n    const k = this.simdMatmul(x, layer.attnK, hiddenDim, kvDim);\n    const v = this.simdMatmul(x, layer.attnV, hiddenDim, kvDim);\n\n    // Apply RoPE using cached trig tables for the current position.\n    this.applyRoPE(q, position, headDim, numHeads);\n    this.applyRoPE(k, position, headDim, numKvHeads);\n\n    // Update KV cache\n    if (this.kvCache) {\n      const cacheK = this.kvCache.keys[layerIdx];\n      const cacheV = this.kvCache.values[layerIdx];\n      for (let i = 0; i < kvDim; i++) {\n        cacheK[position * kvDim + i] = k[i];\n        cacheV[position * kvDim + i] = v[i];\n      }\n    }\n\n    // Compute attention\n    const headsPerKv = numHeads / numKvHeads;\n    const attnOut = new Float32Array(hiddenDim);\n\n    for (let h = 0; h < numHeads; h++) {\n      const kvHead = Math.floor(h / headsPerKv);\n      const qOffset = h * headDim;\n\n      const scores = new Float32Array(position + 1);\n      for (let p = 0; p <= position; p++) {\n        let score = 0;\n        for (let d = 0; d < headDim; d++) {\n          const kVal = this.kvCache\n            ? this.kvCache.keys[layerIdx][p * kvDim + kvHead * headDim + d]\n            : k[kvHead * headDim + d];\n          score += q[qOffset + d] * kVal;\n        }\n        scores[p] = score / Math.sqrt(headDim);\n      }\n\n      // Softmax\n      const maxScore = Math.max(...scores);\n      let sumExp = 0;\n      for (let p = 0; p <= position; p++) {\n        scores[p] = Math.exp(scores[p] - maxScore);\n        sumExp += scores[p];\n      }\n      for (let p = 0; p <= position; p++) {\n        scores[p] /= sumExp;\n      }\n\n      // Weighted sum of values\n      for (let p = 0; p <= position; p++) {\n        for (let d = 0; d < headDim; d++) {\n          const vVal = this.kvCache\n            ? this.kvCache.values[layerIdx][p * kvDim + kvHead * headDim + d]\n            : v[kvHead * headDim + d];\n          attnOut[qOffset + d] += scores[p] * vVal;\n        }\n      }\n    }\n\n    // Output projection with SIMD\n    return this.simdMatmul(attnOut, layer.attnOut, hiddenDim, hiddenDim);\n  }\n\n  /**\n   * Apply RoPE\n   */\n  private applyRoPE(\n    x: Float32Array,\n    position: number,\n    headDim: number,\n    numHeads: number,\n    theta = 10000.0\n  ): void {\n    const { cos, sin } = this.getRoPETrigonometry(position, headDim, theta);\n    for (let h = 0; h < numHeads; h++) {\n      const offset = h * headDim;\n      for (let i = 0; i < headDim / 2; i++) {\n        const x0 = x[offset + i];\n        const x1 = x[offset + headDim / 2 + i];\n\n        x[offset + i] = x0 * cos[i] - x1 * sin[i];\n        x[offset + headDim / 2 + i] = x0 * sin[i] + x1 * cos[i];\n      }\n    }\n  }\n\n  private getRoPETrigonometry(\n    position: number,\n    headDim: number,\n    theta: number\n  ): { cos: Float32Array; sin: Float32Array } {\n    const cacheKey = `${position}:${headDim}:${theta}`;\n    const cached = this.ropeCache.get(cacheKey);\n    if (cached) {\n      return cached;\n    }\n\n    const halfDim = Math.floor(headDim / 2);\n    const cos = new Float32Array(halfDim);\n    const sin = new Float32Array(halfDim);\n    for (let i = 0; i < halfDim; i++) {\n      const freq = 1.0 / Math.pow(theta, (2 * i) / headDim);\n      const angle = position * freq;\n      cos[i] = Math.cos(angle);\n      sin[i] = Math.sin(angle);\n    }\n\n    const entry = { cos, sin };\n    // Keep cache bounded to avoid unbounded growth on long-running sessions.\n    if (this.ropeCache.size > 128) {\n      this.ropeCache.clear();\n    }\n    this.ropeCache.set(cacheKey, entry);\n    return entry;\n  }\n\n  /**\n   * FFN with SwiGLU and SIMD\n   */\n  private ffn(\n    x: Float32Array,\n    gate: Float32Array,\n    up: Float32Array,\n    down: Float32Array,\n    hiddenDim: number,\n    intermediateDim: number\n  ): Float32Array {\n    // Use SIMD matmul for gate and up projections\n    const gateOut = this.simdMatmul(x, gate, hiddenDim, intermediateDim);\n    const upOut = this.simdMatmul(x, up, hiddenDim, intermediateDim);\n\n    // SiLU with SIMD\n    const gateAct = this.simdSilu(gateOut);\n\n    // Element-wise multiply\n    for (let i = 0; i < intermediateDim; i++) {\n      gateAct[i] *= upOut[i];\n    }\n\n    // Down projection with SIMD\n    return this.simdMatmul(gateAct, down, intermediateDim, hiddenDim);\n  }\n\n  /**\n   * Reset KV cache\n   */\n  resetCache(): void {\n    if (this.kvCache) {\n      for (const arr of this.kvCache.keys) arr.fill(0);\n      for (const arr of this.kvCache.values) arr.fill(0);\n    }\n    this.ropeCache.clear();\n  }\n}\n","/**\n * WebNN Inference Engine\n *\n * Uses WebNN capability detection and delegates tensor math to the SIMD\n * implementation until dedicated WebNN kernels are enabled.\n */\n\nimport type { InferenceBackend } from '../../types';\nimport type { BaseStorage } from '../../data/storage/base-storage';\nimport { SIMDInference } from './simd-inference';\n\nexport class WebNNInference extends SIMDInference {\n  readonly backend: InferenceBackend = 'webnn';\n\n  constructor(storage: BaseStorage, modelId: string) {\n    super(storage, modelId);\n  }\n\n  protected async initializeBackend(): Promise<void> {\n    if (typeof navigator === 'undefined' || !('ml' in navigator)) {\n      throw new Error('WebNN backend unavailable in this runtime');\n    }\n\n    await super.initializeBackend();\n  }\n}\n","/**\n * WASM Inference Engine\n *\n * Fallback inference using pure JavaScript/WASM.\n * Slower than WebGPU but works on all browsers.\n */\n\nimport { BaseInference } from './base-inference';\nimport type { InferenceBackend, LayerWeights } from '../../types';\nimport type { BaseStorage } from '../../data/storage/base-storage';\n\nexport class WASMInference extends BaseInference {\n  readonly backend: InferenceBackend = 'wasm';\n\n  private embeddings: Float32Array | null = null;\n  private lmHead: Float32Array | null = null;\n  private outputNorm: Float32Array | null = null;\n  private currentLayer: LayerWeights | null = null;\n\n  // KV cache\n  private kvCache: {\n    keys: Float32Array[];\n    values: Float32Array[];\n  } | null = null;\n\n  constructor(storage: BaseStorage, modelId: string) {\n    super(storage, modelId);\n  }\n\n  /**\n   * Initialize WASM backend\n   */\n  protected async initializeBackend(): Promise<void> {\n    // Load embeddings\n    await this.loadEmbeddings();\n\n    // Initialize KV cache\n    if (this.config) {\n      const numLayers = this.config.numLayers;\n      const kvDim =\n        (this.config.hiddenDim / this.config.numHeads) *\n        (this.config.numKvHeads ?? this.config.numHeads);\n      const maxSeq = this.config.maxSeqLength;\n\n      this.kvCache = {\n        keys: Array.from(\n          { length: numLayers },\n          () => new Float32Array(maxSeq * kvDim)\n        ),\n        values: Array.from(\n          { length: numLayers },\n          () => new Float32Array(maxSeq * kvDim)\n        ),\n      };\n    }\n  }\n\n  /**\n   * Load embedding and output projection weights\n   */\n  private async loadEmbeddings(): Promise<void> {\n    const embedChunks = await this.storage.getTensorChunks(this.modelId, -1);\n    if (embedChunks.length === 0) {\n      throw new Error('Embeddings not found');\n    }\n\n    this.embeddings = this.combineChunks(embedChunks, 'token_embd.weight');\n    this.outputNorm = this.combineChunks(embedChunks, 'output_norm.weight');\n    this.lmHead =\n      this.combineChunks(embedChunks, 'output.weight') || this.embeddings;\n  }\n\n  /**\n   * Combine tensor chunks\n   */\n  private combineChunks(\n    chunks: Array<{\n      tensorName: string;\n      chunkIndex: number;\n      data: ArrayBuffer;\n    }>,\n    tensorName: string\n  ): Float32Array | null {\n    const tensorChunks = chunks\n      .filter((c) => c.tensorName === tensorName)\n      .sort((a, b) => a.chunkIndex - b.chunkIndex);\n\n    if (tensorChunks.length === 0) return null;\n\n    const totalSize = tensorChunks.reduce(\n      (sum, c) => sum + c.data.byteLength,\n      0\n    );\n    const result = new Float32Array(totalSize / 4);\n    let offset = 0;\n    for (const chunk of tensorChunks) {\n      const data = new Float32Array(chunk.data);\n      result.set(data, offset);\n      offset += data.length;\n    }\n    return result;\n  }\n\n  /**\n   * Load a layer's weights\n   */\n  private async loadLayer(layerIndex: number): Promise<LayerWeights> {\n    const chunks = await this.storage.getTensorChunks(this.modelId, layerIndex);\n    const prefix = `blk.${layerIndex}`;\n\n    return {\n      layerIndex,\n      attnQ: this.combineChunks(chunks, `${prefix}.attn_q.weight`)!,\n      attnK: this.combineChunks(chunks, `${prefix}.attn_k.weight`)!,\n      attnV: this.combineChunks(chunks, `${prefix}.attn_v.weight`)!,\n      attnOut: this.combineChunks(chunks, `${prefix}.attn_output.weight`)!,\n      attnNorm: this.combineChunks(chunks, `${prefix}.attn_norm.weight`)!,\n      ffnGate: this.combineChunks(chunks, `${prefix}.ffn_gate.weight`)!,\n      ffnUp: this.combineChunks(chunks, `${prefix}.ffn_up.weight`)!,\n      ffnDown: this.combineChunks(chunks, `${prefix}.ffn_down.weight`)!,\n      ffnNorm: this.combineChunks(chunks, `${prefix}.ffn_norm.weight`)!,\n    };\n  }\n\n  /**\n   * Run forward pass (same as WebGPU but pure JS)\n   */\n  protected async forward(\n    inputIds: number[],\n    _position: number\n  ): Promise<Float32Array> {\n    if (!this.config || !this.embeddings || !this.lmHead || !this.outputNorm) {\n      throw new Error('Model not loaded');\n    }\n\n    const { hiddenDim, numLayers, numHeads, numKvHeads } = this.config;\n    const kvHeads = numKvHeads ?? numHeads;\n    const headDim = hiddenDim / numHeads;\n\n    // Get embeddings for last token\n    const lastToken = inputIds[inputIds.length - 1];\n    let hidden: Float32Array<ArrayBufferLike> = new Float32Array(hiddenDim);\n    for (let i = 0; i < hiddenDim; i++) {\n      hidden[i] = this.embeddings[lastToken * hiddenDim + i];\n    }\n\n    // Forward through layers\n    for (let layerIdx = 0; layerIdx < numLayers; layerIdx++) {\n      if (!this.currentLayer || this.currentLayer.layerIndex !== layerIdx) {\n        this.currentLayer = await this.loadLayer(layerIdx);\n      }\n      const layer = this.currentLayer;\n\n      // Attention\n      const normedForAttn = this.rmsNorm(hidden, layer.attnNorm);\n      const attnOut = this.selfAttention(\n        normedForAttn,\n        layer,\n        layerIdx,\n        inputIds.length - 1,\n        numHeads,\n        kvHeads,\n        headDim\n      );\n\n      for (let i = 0; i < hiddenDim; i++) {\n        hidden[i] += attnOut[i];\n      }\n\n      // FFN\n      const normedForFFN = this.rmsNorm(hidden, layer.ffnNorm);\n      const ffnOut = this.ffn(\n        normedForFFN,\n        layer.ffnGate,\n        layer.ffnUp,\n        layer.ffnDown,\n        hiddenDim,\n        this.config.intermediateDim ?? hiddenDim * 4\n      );\n\n      for (let i = 0; i < hiddenDim; i++) {\n        hidden[i] += ffnOut[i];\n      }\n    }\n\n    this.lastHiddenState = new Float32Array(hidden) as any;\n    hidden = this.rmsNorm(hidden, this.outputNorm);\n\n    // Project to logits\n    const vocabSize = this.config.vocabSize;\n    const logits = new Float32Array(vocabSize);\n    for (let i = 0; i < vocabSize; i++) {\n      let sum = 0;\n      for (let j = 0; j < hiddenDim; j++) {\n        sum += hidden[j] * this.lmHead[i * hiddenDim + j];\n      }\n      logits[i] = sum;\n    }\n\n    return logits;\n  }\n\n  /**\n   * RMS Normalization\n   */\n  private rmsNorm(\n    x: Float32Array,\n    weight: Float32Array,\n    eps = 1e-5\n  ): Float32Array {\n    const n = x.length;\n    let sumSq = 0;\n    for (let i = 0; i < n; i++) {\n      sumSq += x[i] * x[i];\n    }\n    const rms = Math.sqrt(sumSq / n + eps);\n\n    const result = new Float32Array(n);\n    for (let i = 0; i < n; i++) {\n      result[i] = (x[i] / rms) * weight[i];\n    }\n    return result;\n  }\n\n  /**\n   * Self-attention with RoPE and KV caching\n   */\n  private selfAttention(\n    x: Float32Array,\n    layer: LayerWeights,\n    layerIdx: number,\n    position: number,\n    numHeads: number,\n    numKvHeads: number,\n    headDim: number\n  ): Float32Array {\n    const hiddenDim = x.length;\n    const kvDim = numKvHeads * headDim;\n\n    const q = this.matmul(x, layer.attnQ, hiddenDim, hiddenDim);\n    const k = this.matmul(x, layer.attnK, hiddenDim, kvDim);\n    const v = this.matmul(x, layer.attnV, hiddenDim, kvDim);\n\n    this.applyRoPE(q, position, headDim, numHeads);\n    this.applyRoPE(k, position, headDim, numKvHeads);\n\n    if (this.kvCache) {\n      const cacheK = this.kvCache.keys[layerIdx];\n      const cacheV = this.kvCache.values[layerIdx];\n      for (let i = 0; i < kvDim; i++) {\n        cacheK[position * kvDim + i] = k[i];\n        cacheV[position * kvDim + i] = v[i];\n      }\n    }\n\n    const headsPerKv = numHeads / numKvHeads;\n    const attnOut = new Float32Array(hiddenDim);\n\n    for (let h = 0; h < numHeads; h++) {\n      const kvHead = Math.floor(h / headsPerKv);\n      const qOffset = h * headDim;\n\n      const scores = new Float32Array(position + 1);\n      for (let p = 0; p <= position; p++) {\n        let score = 0;\n        for (let d = 0; d < headDim; d++) {\n          const kVal = this.kvCache\n            ? this.kvCache.keys[layerIdx][p * kvDim + kvHead * headDim + d]\n            : k[kvHead * headDim + d];\n          score += q[qOffset + d] * kVal;\n        }\n        scores[p] = score / Math.sqrt(headDim);\n      }\n\n      const maxScore = Math.max(...scores);\n      let sumExp = 0;\n      for (let p = 0; p <= position; p++) {\n        scores[p] = Math.exp(scores[p] - maxScore);\n        sumExp += scores[p];\n      }\n      for (let p = 0; p <= position; p++) {\n        scores[p] /= sumExp;\n      }\n\n      for (let p = 0; p <= position; p++) {\n        for (let d = 0; d < headDim; d++) {\n          const vVal = this.kvCache\n            ? this.kvCache.values[layerIdx][p * kvDim + kvHead * headDim + d]\n            : v[kvHead * headDim + d];\n          attnOut[qOffset + d] += scores[p] * vVal;\n        }\n      }\n    }\n\n    return this.matmul(attnOut, layer.attnOut, hiddenDim, hiddenDim);\n  }\n\n  /**\n   * Apply RoPE\n   */\n  private applyRoPE(\n    x: Float32Array,\n    position: number,\n    headDim: number,\n    numHeads: number,\n    theta = 10000.0\n  ): void {\n    for (let h = 0; h < numHeads; h++) {\n      const offset = h * headDim;\n      for (let i = 0; i < headDim / 2; i++) {\n        const freq = 1.0 / Math.pow(theta, (2 * i) / headDim);\n        const angle = position * freq;\n        const cos = Math.cos(angle);\n        const sin = Math.sin(angle);\n\n        const x0 = x[offset + i];\n        const x1 = x[offset + headDim / 2 + i];\n\n        x[offset + i] = x0 * cos - x1 * sin;\n        x[offset + headDim / 2 + i] = x0 * sin + x1 * cos;\n      }\n    }\n  }\n\n  /**\n   * FFN with SwiGLU\n   */\n  private ffn(\n    x: Float32Array,\n    gate: Float32Array,\n    up: Float32Array,\n    down: Float32Array,\n    hiddenDim: number,\n    intermediateDim: number\n  ): Float32Array {\n    const gateOut = this.matmul(x, gate, hiddenDim, intermediateDim);\n    const upOut = this.matmul(x, up, hiddenDim, intermediateDim);\n\n    for (let i = 0; i < intermediateDim; i++) {\n      const sigmoid = 1 / (1 + Math.exp(-gateOut[i]));\n      gateOut[i] = gateOut[i] * sigmoid * upOut[i];\n    }\n\n    return this.matmul(gateOut, down, intermediateDim, hiddenDim);\n  }\n\n  /**\n   * Matrix-vector multiplication\n   */\n  private matmul(\n    x: Float32Array,\n    w: Float32Array,\n    inDim: number,\n    outDim: number\n  ): Float32Array {\n    const result = new Float32Array(outDim);\n    for (let i = 0; i < outDim; i++) {\n      let sum = 0;\n      for (let j = 0; j < inDim; j++) {\n        sum += x[j] * w[i * inDim + j];\n      }\n      result[i] = sum;\n    }\n    return result;\n  }\n\n  /**\n   * Reset KV cache\n   */\n  resetCache(): void {\n    if (this.kvCache) {\n      for (const arr of this.kvCache.keys) arr.fill(0);\n      for (const arr of this.kvCache.values) arr.fill(0);\n    }\n  }\n}\n","/**\n * Inference Engine Factory\n *\n * Creates appropriate inference backend based on environment capabilities.\n */\n\nimport { WebGPUInference } from './webgpu-inference';\nimport { WebNNInference } from './webnn-inference';\nimport { getModelConfig } from '../../models';\nimport { WASMInference } from './wasm-inference';\nimport { SIMDInference } from './simd-inference';\nimport { BaseInference } from './base-inference';\nimport type { BaseStorage } from '../../data/storage/base-storage';\nimport type { InferenceBackend } from '../../types';\n\nexport interface InferenceOptions {\n  /** Preferred inference backend */\n  backend?: InferenceBackend;\n  /** Force the specified backend even if not optimal */\n  force?: boolean;\n  /** Use SIMD-optimized WASM (default: true) */\n  useSIMD?: boolean;\n}\n\n/**\n * Detect the best available inference backend\n */\nexport function detectBestBackend(): InferenceBackend {\n  // Check for WebGPU support\n  if (typeof navigator !== 'undefined' && 'gpu' in navigator) {\n    return 'webgpu';\n  }\n\n  // Check for WebNN support\n  if (typeof navigator !== 'undefined' && 'ml' in navigator) {\n    return 'webnn';\n  }\n\n  // Fall back to WASM/CPU\n  return 'wasm';\n}\n\n/**\n * Check if an inference backend is available\n */\nexport function isBackendAvailable(backend: InferenceBackend): boolean {\n  switch (backend) {\n    case 'webgpu':\n      return typeof navigator !== 'undefined' && 'gpu' in navigator;\n    case 'webnn':\n      return typeof navigator !== 'undefined' && 'ml' in navigator;\n    case 'wasm':\n    case 'cpu':\n      return true;\n    default:\n      return false;\n  }\n}\n\n/**\n * Create an inference engine\n */\nexport async function createInferenceEngine(\n  storage: BaseStorage,\n  modelId: string,\n  options: InferenceOptions = {}\n): Promise<BaseInference> {\n  const { backend, force = false, useSIMD = true } = options;\n\n  // Determine which backend to use\n  let selectedBackend: InferenceBackend;\n  if (backend && (force || isBackendAvailable(backend))) {\n    selectedBackend = backend;\n  } else {\n    selectedBackend = detectBestBackend();\n  }\n\n  // Create the engine\n  let engine: BaseInference;\n  switch (selectedBackend) {\n    case 'webgpu':\n      engine = new WebGPUInference(storage, modelId);\n      break;\n    case 'webnn':\n      try {\n        engine = new WebNNInference(storage, modelId);\n      } catch (error) {\n        console.warn('WebNN backend unavailable, using SIMD/WASM fallback');\n        engine = useSIMD\n          ? new SIMDInference(storage, modelId)\n          : new WASMInference(storage, modelId);\n      }\n      break;\n    case 'wasm':\n    case 'cpu':\n    default:\n      // Use SIMD-optimized WASM by default (2.5x faster)\n      engine = useSIMD\n        ? new SIMDInference(storage, modelId)\n        : new WASMInference(storage, modelId);\n      break;\n  }\n\n  try {\n    await engine.initialize();\n  } catch (error) {\n    if (selectedBackend === 'webnn' && !force) {\n      console.warn('WebNN initialization failed, retrying with SIMD/WASM');\n      engine = useSIMD\n        ? new SIMDInference(storage, modelId)\n        : new WASMInference(storage, modelId);\n      await engine.initialize();\n    } else {\n      throw error;\n    }\n  }\n  return engine;\n}\n\n/**\n * Get inference capabilities info\n */\nexport function getInferenceCapabilities(): {\n  webgpu: boolean;\n  webnn: boolean;\n  wasm: boolean;\n  simd: boolean;\n  recommended: InferenceBackend;\n} {\n  // Check for WASM SIMD support\n  const simdSupported = (() => {\n    try {\n      // Test for SIMD support by checking if v128 type is available\n      return (\n        typeof WebAssembly !== 'undefined' &&\n        WebAssembly.validate(\n          new Uint8Array([\n            0x00,\n            0x61,\n            0x73,\n            0x6d, // WASM magic\n            0x01,\n            0x00,\n            0x00,\n            0x00, // Version 1\n            0x01,\n            0x05,\n            0x01,\n            0x60,\n            0x00,\n            0x01,\n            0x7b, // Type section with v128\n          ])\n        )\n      );\n    } catch {\n      return false;\n    }\n  })();\n\n  return {\n    webgpu: isBackendAvailable('webgpu'),\n    webnn: isBackendAvailable('webnn'),\n    wasm: true,\n    simd: simdSupported,\n    recommended: detectBestBackend(),\n  };\n}\n"]}