{"version":3,"sources":["../src/data/storage/base-storage.ts","../src/data/storage/opfs-storage.ts","../src/data/storage/indexeddb-storage.ts","../src/data/storage/memory-storage.ts","../src/data/storage/factory.ts"],"names":["chunks"],"mappings":"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","file":"chunk-Y5R4V252.mjs","sourcesContent":["/**\n * Base Storage Class\n *\n * Abstract implementation of ModelStorage interface.\n */\n\nimport type {\n  ModelMeta,\n  TensorChunk,\n  TokenizerData,\n  SyncProgress,\n  UserAdapter,\n  TrainingLogEntry,\n  StorageBackend,\n} from '../../types';\n\nexport abstract class BaseStorage {\n  abstract readonly backend: StorageBackend;\n\n  // Initialization\n  abstract initialize(): Promise<void>;\n\n  // Model metadata\n  abstract getModelMeta(modelId: string): Promise<ModelMeta | null>;\n  abstract setModelMeta(meta: ModelMeta): Promise<void>;\n  abstract deleteModelMeta(modelId: string): Promise<void>;\n  abstract listModels(): Promise<ModelMeta[]>;\n\n  // Tensor chunks\n  abstract getTensorChunks(\n    modelId: string,\n    layerIndex: number\n  ): Promise<TensorChunk[]>;\n  abstract getTensorChunk(\n    modelId: string,\n    tensorName: string,\n    chunkIndex: number\n  ): Promise<TensorChunk | null>;\n  abstract storeTensorChunk(chunk: TensorChunk): Promise<void>;\n  abstract deleteTensorChunks(modelId: string): Promise<void>;\n\n  // Tokenizer\n  abstract getTokenizer(modelId: string): Promise<TokenizerData | null>;\n  abstract setTokenizer(data: TokenizerData): Promise<void>;\n\n  // Sync progress\n  abstract getSyncProgress(modelId: string): Promise<SyncProgress[]>;\n  abstract updateSyncProgress(progress: SyncProgress): Promise<void>;\n  abstract clearSyncProgress(modelId: string): Promise<void>;\n\n  // User adapters (for RLHF)\n  abstract getUserAdapter(\n    modelId: string,\n    userId: string,\n    adapterId?: string\n  ): Promise<UserAdapter | null>;\n  abstract setUserAdapter(adapter: UserAdapter): Promise<void>;\n  abstract deleteUserAdapter(adapterId: string): Promise<void>;\n\n  // Training log\n  abstract addTrainingLogEntry(\n    entry: Omit<TrainingLogEntry, 'id'>\n  ): Promise<number>;\n  abstract getTrainingLog(\n    adapterId: string,\n    limit?: number\n  ): Promise<TrainingLogEntry[]>;\n\n  // Utility methods\n  abstract isModelComplete(modelId: string): Promise<boolean>;\n  abstract getStorageUsed(): Promise<number>;\n  abstract clear(): Promise<void>;\n\n  /**\n   * Load all tensor chunks for a layer and combine into Float32Arrays\n   */\n  async loadLayerWeights(\n    modelId: string,\n    layerIndex: number\n  ): Promise<Map<string, Float32Array>> {\n    const chunks = await this.getTensorChunks(modelId, layerIndex);\n    const tensors = new Map<string, ArrayBuffer[]>();\n\n    // Group chunks by tensor name\n    for (const chunk of chunks) {\n      if (!tensors.has(chunk.tensorName)) {\n        tensors.set(chunk.tensorName, []);\n      }\n      tensors.get(chunk.tensorName)![chunk.chunkIndex] = chunk.data;\n    }\n\n    // Combine chunks into Float32Arrays\n    const result = new Map<string, Float32Array>();\n    for (const [name, chunks] of tensors) {\n      const totalSize = chunks.reduce((sum, c) => sum + c.byteLength, 0);\n      const combined = new Float32Array(totalSize / 4);\n      let offset = 0;\n      for (const chunk of chunks) {\n        const f32 = new Float32Array(chunk);\n        combined.set(f32, offset);\n        offset += f32.length;\n      }\n      result.set(name, combined);\n    }\n\n    return result;\n  }\n\n  /**\n   * Get download progress percentage\n   */\n  async getDownloadProgress(modelId: string): Promise<number> {\n    const progress = await this.getSyncProgress(modelId);\n    if (progress.length === 0) return 0;\n\n    const downloaded = progress.reduce((sum, p) => sum + p.chunksDownloaded, 0);\n    const total = progress.reduce((sum, p) => sum + p.totalChunks, 0);\n\n    return total > 0 ? (downloaded / total) * 100 : 0;\n  }\n}\n","/**\n * OPFS Storage Implementation\n *\n * Uses Origin Private File System for model weight storage.\n * Provides best performance for large binary data in browsers.\n */\n\nimport { BaseStorage } from './base-storage';\nimport type { DownloadProgress } from '../../types';\nimport type {\n  ModelMeta,\n  TensorChunk,\n  TokenizerData,\n  SyncProgress,\n  UserAdapter,\n  TrainingLogEntry,\n  StorageBackend,\n} from '../../types';\n\nconst DB_NAME = 'edgework-models';\nconst DB_VERSION = 1;\n\ninterface OPFSDatabase {\n  models: ModelMeta[];\n  tokenizers: Map<string, TokenizerData>;\n  syncProgress: Map<string, SyncProgress[]>;\n  adapters: Map<string, UserAdapter>;\n  trainingLog: TrainingLogEntry[];\n}\n\nexport class OPFSStorage extends BaseStorage {\n  readonly backend: StorageBackend = 'opfs';\n  private root: FileSystemDirectoryHandle | null = null;\n  private metaDb: OPFSDatabase | null = null;\n  private metaFile: FileSystemFileHandle | null = null;\n\n  /**\n   * Initialize OPFS storage\n   */\n  async initialize(): Promise<void> {\n    if (!('storage' in navigator) || !('getDirectory' in navigator.storage)) {\n      throw new Error('OPFS is not supported in this browser');\n    }\n\n    this.root = await navigator.storage.getDirectory();\n    const modelsDir = await this.root.getDirectoryHandle('models', {\n      create: true,\n    });\n\n    // Load or create metadata file\n    this.metaFile = await modelsDir.getFileHandle('meta.json', {\n      create: true,\n    });\n    await this.loadMetadata();\n  }\n\n  private async loadMetadata(): Promise<void> {\n    if (!this.metaFile) return;\n\n    try {\n      const file = await this.metaFile.getFile();\n      const text = await file.text();\n      if (text) {\n        const data = JSON.parse(text);\n        this.metaDb = {\n          models: data.models || [],\n          tokenizers: new Map(Object.entries(data.tokenizers || {})),\n          syncProgress: new Map(Object.entries(data.syncProgress || {})),\n          adapters: new Map(Object.entries(data.adapters || {})),\n          trainingLog: data.trainingLog || [],\n        };\n      } else {\n        this.metaDb = {\n          models: [],\n          tokenizers: new Map(),\n          syncProgress: new Map(),\n          adapters: new Map(),\n          trainingLog: [],\n        };\n      }\n    } catch {\n      this.metaDb = {\n        models: [],\n        tokenizers: new Map(),\n        syncProgress: new Map(),\n        adapters: new Map(),\n        trainingLog: [],\n      };\n    }\n  }\n\n  private async saveMetadata(): Promise<void> {\n    if (!this.metaFile || !this.metaDb) return;\n\n    const data = {\n      models: this.metaDb.models,\n      tokenizers: Object.fromEntries(this.metaDb.tokenizers),\n      syncProgress: Object.fromEntries(this.metaDb.syncProgress),\n      adapters: Object.fromEntries(this.metaDb.adapters),\n      trainingLog: this.metaDb.trainingLog,\n    };\n\n    const writable = await this.metaFile.createWritable();\n    await writable.write(JSON.stringify(data));\n    await writable.close();\n  }\n\n  private async getModelDir(\n    modelId: string\n  ): Promise<FileSystemDirectoryHandle> {\n    if (!this.root) throw new Error('Storage not initialized');\n    const modelsDir = await this.root.getDirectoryHandle('models', {\n      create: true,\n    });\n    return modelsDir.getDirectoryHandle(modelId, { create: true });\n  }\n\n  // Model metadata\n  async getModelMeta(modelId: string): Promise<ModelMeta | null> {\n    if (!this.metaDb) return null;\n    return this.metaDb.models.find((m) => m.id === modelId) || null;\n  }\n\n  async setModelMeta(meta: ModelMeta): Promise<void> {\n    if (!this.metaDb) return;\n    const idx = this.metaDb.models.findIndex((m) => m.id === meta.id);\n    if (idx >= 0) {\n      this.metaDb.models[idx] = meta;\n    } else {\n      this.metaDb.models.push(meta);\n    }\n    await this.saveMetadata();\n  }\n\n  async deleteModelMeta(modelId: string): Promise<void> {\n    if (!this.metaDb) return;\n    this.metaDb.models = this.metaDb.models.filter((m) => m.id !== modelId);\n    await this.saveMetadata();\n  }\n\n  async listModels(): Promise<ModelMeta[]> {\n    return this.metaDb?.models || [];\n  }\n\n  // Tensor chunks - stored as binary files in OPFS\n  async getTensorChunks(\n    modelId: string,\n    layerIndex: number\n  ): Promise<TensorChunk[]> {\n    const chunks: TensorChunk[] = [];\n    try {\n      const modelDir = await this.getModelDir(modelId);\n      const layerDir = await modelDir.getDirectoryHandle(\n        `layer_${layerIndex}`,\n        {\n          create: false,\n        }\n      );\n\n      // Use values() iterator for better compatibility\n      const entries = (layerDir as any).entries() as AsyncIterable<\n        [string, FileSystemHandle]\n      >;\n      for await (const [name, handle] of entries) {\n        if (handle.kind === 'file' && name.endsWith('.bin')) {\n          const file = await (handle as FileSystemFileHandle).getFile();\n          const metaName = name.replace('.bin', '.json');\n          const metaHandle = await layerDir.getFileHandle(metaName);\n          const metaFile = await metaHandle.getFile();\n          const meta = JSON.parse(await metaFile.text());\n\n          chunks.push({\n            ...meta,\n            data: await file.arrayBuffer(),\n          });\n        }\n      }\n    } catch {\n      // Directory doesn't exist, return empty\n    }\n    return chunks.sort((a, b) => a.chunkIndex - b.chunkIndex);\n  }\n\n  async getTensorChunk(\n    modelId: string,\n    tensorName: string,\n    chunkIndex: number\n  ): Promise<TensorChunk | null> {\n    // Parse layer index from tensor name\n    const match = tensorName.match(/blk\\.(\\d+)/);\n    if (!match) return null;\n    const layerIndex = parseInt(match[1], 10);\n\n    const chunks = await this.getTensorChunks(modelId, layerIndex);\n    return (\n      chunks.find(\n        (c) => c.tensorName === tensorName && c.chunkIndex === chunkIndex\n      ) || null\n    );\n  }\n\n  async storeTensorChunk(chunk: TensorChunk): Promise<void> {\n    const modelDir = await this.getModelDir(chunk.modelId);\n    const layerDir = await modelDir.getDirectoryHandle(\n      `layer_${chunk.layerIndex ?? 'embed'}`,\n      { create: true }\n    );\n\n    // Store binary data\n    const binName = `${chunk.tensorName}_${chunk.chunkIndex}.bin`;\n    const binHandle = await layerDir.getFileHandle(binName, { create: true });\n    const binWritable = await binHandle.createWritable();\n    await binWritable.write(chunk.data);\n    await binWritable.close();\n\n    // Store metadata\n    const metaName = `${chunk.tensorName}_${chunk.chunkIndex}.json`;\n    const metaHandle = await layerDir.getFileHandle(metaName, { create: true });\n    const metaWritable = await metaHandle.createWritable();\n    const { data: _, ...meta } = chunk;\n    await metaWritable.write(JSON.stringify(meta));\n    await metaWritable.close();\n  }\n\n  async deleteTensorChunks(modelId: string): Promise<void> {\n    if (!this.root) return;\n    try {\n      const modelsDir = await this.root.getDirectoryHandle('models');\n      await modelsDir.removeEntry(modelId, { recursive: true });\n    } catch {\n      // Directory doesn't exist\n    }\n  }\n\n  // Tokenizer\n  async getTokenizer(modelId: string): Promise<TokenizerData | null> {\n    return this.metaDb?.tokenizers.get(modelId) || null;\n  }\n\n  async setTokenizer(data: TokenizerData): Promise<void> {\n    if (!this.metaDb) return;\n    this.metaDb.tokenizers.set(data.modelId, data);\n    await this.saveMetadata();\n  }\n\n  // Sync progress\n  async getSyncProgress(modelId: string): Promise<SyncProgress[]> {\n    return this.metaDb?.syncProgress.get(modelId) || [];\n  }\n\n  async updateSyncProgress(progress: SyncProgress): Promise<void> {\n    if (!this.metaDb) return;\n    const existing = this.metaDb.syncProgress.get(progress.modelId) || [];\n    const idx = existing.findIndex((p) => p.tensorName === progress.tensorName);\n    if (idx >= 0) {\n      existing[idx] = progress;\n    } else {\n      existing.push(progress);\n    }\n    this.metaDb.syncProgress.set(progress.modelId, existing);\n    await this.saveMetadata();\n  }\n\n  async clearSyncProgress(modelId: string): Promise<void> {\n    if (!this.metaDb) return;\n    this.metaDb.syncProgress.delete(modelId);\n    await this.saveMetadata();\n  }\n\n  // User adapters\n  async getUserAdapter(\n    modelId: string,\n    userId: string,\n    adapterId?: string\n  ): Promise<UserAdapter | null> {\n    if (!this.metaDb) return null;\n    for (const adapter of this.metaDb.adapters.values()) {\n      if (\n        adapter.modelId === modelId &&\n        adapter.userId === userId &&\n        (!adapterId || adapter.id === adapterId)\n      ) {\n        return adapter;\n      }\n    }\n    return null;\n  }\n\n  async setUserAdapter(adapter: UserAdapter): Promise<void> {\n    if (!this.metaDb) return;\n    this.metaDb.adapters.set(adapter.id, adapter);\n    await this.saveMetadata();\n  }\n\n  async deleteUserAdapter(adapterId: string): Promise<void> {\n    if (!this.metaDb) return;\n    this.metaDb.adapters.delete(adapterId);\n    await this.saveMetadata();\n  }\n\n  // Training log\n  async addTrainingLogEntry(\n    entry: Omit<TrainingLogEntry, 'id'>\n  ): Promise<number> {\n    if (!this.metaDb) return -1;\n    const id = this.metaDb.trainingLog.length;\n    this.metaDb.trainingLog.push({ ...entry, id });\n    await this.saveMetadata();\n    return id;\n  }\n\n  async getTrainingLog(\n    adapterId: string,\n    limit = 100\n  ): Promise<TrainingLogEntry[]> {\n    if (!this.metaDb) return [];\n    return this.metaDb.trainingLog\n      .filter((e) => e.adapterId === adapterId)\n      .slice(-limit);\n  }\n\n  // Utility\n  async isModelComplete(modelId: string): Promise<boolean> {\n    const progress = await this.getSyncProgress(modelId);\n    if (progress.length === 0) return false;\n    return progress.every((p) => p.chunksDownloaded >= p.totalChunks);\n  }\n\n  async getStorageUsed(): Promise<number> {\n    if (!navigator.storage.estimate) return 0;\n    const estimate = await navigator.storage.estimate();\n    return estimate.usage || 0;\n  }\n\n  async clear(): Promise<void> {\n    if (!this.root) return;\n    try {\n      await this.root.removeEntry('models', { recursive: true });\n    } catch {\n      // Directory doesn't exist\n    }\n    this.metaDb = {\n      models: [],\n      tokenizers: new Map(),\n      syncProgress: new Map(),\n      adapters: new Map(),\n      trainingLog: [],\n    };\n  }\n}\n","/**\n * IndexedDB Storage Implementation\n *\n * Fallback storage for browsers without OPFS support.\n * Uses IndexedDB with structured stores for model data.\n */\n\nimport { BaseStorage } from './base-storage';\nimport type {\n  ModelMeta,\n  TensorChunk,\n  TokenizerData,\n  SyncProgress,\n  UserAdapter,\n  TrainingLogEntry,\n  StorageBackend,\n} from '../../types';\n\nconst DB_NAME = 'edgework-models';\nconst DB_VERSION = 1;\n\nexport class IndexedDBStorage extends BaseStorage {\n  readonly backend: StorageBackend = 'indexeddb';\n  private db: IDBDatabase | null = null;\n\n  /**\n   * Initialize IndexedDB storage\n   */\n  async initialize(): Promise<void> {\n    return new Promise((resolve, reject) => {\n      const request = indexedDB.open(DB_NAME, DB_VERSION);\n\n      request.onerror = () => reject(request.error);\n      request.onsuccess = () => {\n        this.db = request.result;\n        resolve();\n      };\n\n      request.onupgradeneeded = (event) => {\n        const db = (event.target as IDBOpenDBRequest).result;\n\n        // Models store\n        if (!db.objectStoreNames.contains('models')) {\n          db.createObjectStore('models', { keyPath: 'id' });\n        }\n\n        // Tensor chunks store\n        if (!db.objectStoreNames.contains('tensorChunks')) {\n          const store = db.createObjectStore('tensorChunks', { keyPath: 'id' });\n          store.createIndex('modelId', 'modelId', { unique: false });\n          store.createIndex('layerIndex', ['modelId', 'layerIndex'], {\n            unique: false,\n          });\n          store.createIndex('tensorName', ['modelId', 'tensorName'], {\n            unique: false,\n          });\n        }\n\n        // Tokenizers store\n        if (!db.objectStoreNames.contains('tokenizers')) {\n          db.createObjectStore('tokenizers', { keyPath: 'modelId' });\n        }\n\n        // Sync progress store\n        if (!db.objectStoreNames.contains('syncProgress')) {\n          const store = db.createObjectStore('syncProgress', {\n            keyPath: ['modelId', 'tensorName'],\n          });\n          store.createIndex('modelId', 'modelId', { unique: false });\n        }\n\n        // User adapters store\n        if (!db.objectStoreNames.contains('userAdapters')) {\n          const store = db.createObjectStore('userAdapters', { keyPath: 'id' });\n          store.createIndex('modelUser', ['modelId', 'userId'], {\n            unique: false,\n          });\n        }\n\n        // Training log store\n        if (!db.objectStoreNames.contains('trainingLog')) {\n          const store = db.createObjectStore('trainingLog', {\n            keyPath: 'id',\n            autoIncrement: true,\n          });\n          store.createIndex('adapterId', 'adapterId', { unique: false });\n        }\n      };\n    });\n  }\n\n  private getStore(\n    name: string,\n    mode: IDBTransactionMode = 'readonly'\n  ): IDBObjectStore {\n    if (!this.db) throw new Error('Database not initialized');\n    return this.db.transaction(name, mode).objectStore(name);\n  }\n\n  private promisify<T>(request: IDBRequest<T>): Promise<T> {\n    return new Promise((resolve, reject) => {\n      request.onsuccess = () => resolve(request.result);\n      request.onerror = () => reject(request.error);\n    });\n  }\n\n  // Model metadata\n  async getModelMeta(modelId: string): Promise<ModelMeta | null> {\n    const store = this.getStore('models');\n    return (await this.promisify(store.get(modelId))) || null;\n  }\n\n  async setModelMeta(meta: ModelMeta): Promise<void> {\n    const store = this.getStore('models', 'readwrite');\n    await this.promisify(store.put(meta));\n  }\n\n  async deleteModelMeta(modelId: string): Promise<void> {\n    const store = this.getStore('models', 'readwrite');\n    await this.promisify(store.delete(modelId));\n  }\n\n  async listModels(): Promise<ModelMeta[]> {\n    const store = this.getStore('models');\n    return this.promisify(store.getAll());\n  }\n\n  // Tensor chunks\n  async getTensorChunks(\n    modelId: string,\n    layerIndex: number\n  ): Promise<TensorChunk[]> {\n    const store = this.getStore('tensorChunks');\n    const index = store.index('layerIndex');\n    return this.promisify(index.getAll([modelId, layerIndex]));\n  }\n\n  async getTensorChunk(\n    modelId: string,\n    tensorName: string,\n    chunkIndex: number\n  ): Promise<TensorChunk | null> {\n    const id = `${modelId}:${tensorName}:${chunkIndex}`;\n    const store = this.getStore('tensorChunks');\n    return (await this.promisify(store.get(id))) || null;\n  }\n\n  async storeTensorChunk(chunk: TensorChunk): Promise<void> {\n    const store = this.getStore('tensorChunks', 'readwrite');\n    await this.promisify(store.put(chunk));\n  }\n\n  async deleteTensorChunks(modelId: string): Promise<void> {\n    const store = this.getStore('tensorChunks', 'readwrite');\n    const index = store.index('modelId');\n    const keys = await this.promisify(index.getAllKeys(modelId));\n    for (const key of keys) {\n      await this.promisify(store.delete(key));\n    }\n  }\n\n  // Tokenizer\n  async getTokenizer(modelId: string): Promise<TokenizerData | null> {\n    const store = this.getStore('tokenizers');\n    return (await this.promisify(store.get(modelId))) || null;\n  }\n\n  async setTokenizer(data: TokenizerData): Promise<void> {\n    const store = this.getStore('tokenizers', 'readwrite');\n    await this.promisify(store.put(data));\n  }\n\n  // Sync progress\n  async getSyncProgress(modelId: string): Promise<SyncProgress[]> {\n    const store = this.getStore('syncProgress');\n    const index = store.index('modelId');\n    return this.promisify(index.getAll(modelId));\n  }\n\n  async updateSyncProgress(progress: SyncProgress): Promise<void> {\n    const store = this.getStore('syncProgress', 'readwrite');\n    await this.promisify(store.put(progress));\n  }\n\n  async clearSyncProgress(modelId: string): Promise<void> {\n    const store = this.getStore('syncProgress', 'readwrite');\n    const index = store.index('modelId');\n    const keys = await this.promisify(index.getAllKeys(modelId));\n    for (const key of keys) {\n      await this.promisify(store.delete(key));\n    }\n  }\n\n  // User adapters\n  async getUserAdapter(\n    modelId: string,\n    userId: string,\n    adapterId?: string\n  ): Promise<UserAdapter | null> {\n    const store = this.getStore('userAdapters');\n    const index = store.index('modelUser');\n    const results = await this.promisify(index.getAll([modelId, userId]));\n    if (!adapterId) {\n      return results[0] || null;\n    }\n    return (\n      (results.find((result) => result.id === adapterId) as UserAdapter) || null\n    );\n  }\n\n  async setUserAdapter(adapter: UserAdapter): Promise<void> {\n    const store = this.getStore('userAdapters', 'readwrite');\n    await this.promisify(store.put(adapter));\n  }\n\n  async deleteUserAdapter(adapterId: string): Promise<void> {\n    const store = this.getStore('userAdapters', 'readwrite');\n    await this.promisify(store.delete(adapterId));\n  }\n\n  // Training log\n  async addTrainingLogEntry(\n    entry: Omit<TrainingLogEntry, 'id'>\n  ): Promise<number> {\n    const store = this.getStore('trainingLog', 'readwrite');\n    return this.promisify(store.add(entry)) as Promise<number>;\n  }\n\n  async getTrainingLog(\n    adapterId: string,\n    limit = 100\n  ): Promise<TrainingLogEntry[]> {\n    const store = this.getStore('trainingLog');\n    const index = store.index('adapterId');\n    const results = await this.promisify(index.getAll(adapterId));\n    return results.slice(-limit);\n  }\n\n  // Utility\n  async isModelComplete(modelId: string): Promise<boolean> {\n    const progress = await this.getSyncProgress(modelId);\n    if (progress.length === 0) return false;\n    return progress.every((p) => p.chunksDownloaded >= p.totalChunks);\n  }\n\n  async getStorageUsed(): Promise<number> {\n    if (!navigator.storage?.estimate) return 0;\n    const estimate = await navigator.storage.estimate();\n    return estimate.usage || 0;\n  }\n\n  async clear(): Promise<void> {\n    const stores = [\n      'models',\n      'tensorChunks',\n      'tokenizers',\n      'syncProgress',\n      'userAdapters',\n      'trainingLog',\n    ];\n    for (const name of stores) {\n      const store = this.getStore(name, 'readwrite');\n      await this.promisify(store.clear());\n    }\n  }\n}\n","/**\n * Memory Storage Implementation\n *\n * In-memory storage for testing and Node.js environments.\n * Does not persist data between sessions.\n */\n\nimport { BaseStorage } from './base-storage';\nimport type {\n  ModelMeta,\n  TensorChunk,\n  TokenizerData,\n  SyncProgress,\n  UserAdapter,\n  TrainingLogEntry,\n  StorageBackend,\n} from '../../types';\n\nexport class MemoryStorage extends BaseStorage {\n  readonly backend: StorageBackend = 'memory';\n\n  private models = new Map<string, ModelMeta>();\n  private tensorChunks = new Map<string, TensorChunk>();\n  private tokenizers = new Map<string, TokenizerData>();\n  private syncProgress = new Map<string, SyncProgress[]>();\n  private userAdapters = new Map<string, UserAdapter>();\n  private trainingLog: TrainingLogEntry[] = [];\n  private nextLogId = 0;\n\n  async initialize(): Promise<void> {\n    /* noop - nothing to initialize for memory storage */\n  }\n\n  // Model metadata\n  async getModelMeta(modelId: string): Promise<ModelMeta | null> {\n    return this.models.get(modelId) || null;\n  }\n\n  async setModelMeta(meta: ModelMeta): Promise<void> {\n    this.models.set(meta.id, meta);\n  }\n\n  async deleteModelMeta(modelId: string): Promise<void> {\n    this.models.delete(modelId);\n  }\n\n  async listModels(): Promise<ModelMeta[]> {\n    return Array.from(this.models.values());\n  }\n\n  // Tensor chunks\n  async getTensorChunks(\n    modelId: string,\n    layerIndex: number\n  ): Promise<TensorChunk[]> {\n    const chunks: TensorChunk[] = [];\n    for (const chunk of this.tensorChunks.values()) {\n      if (chunk.modelId === modelId && chunk.layerIndex === layerIndex) {\n        chunks.push(chunk);\n      }\n    }\n    return chunks.sort((a, b) => a.chunkIndex - b.chunkIndex);\n  }\n\n  async getTensorChunk(\n    modelId: string,\n    tensorName: string,\n    chunkIndex: number\n  ): Promise<TensorChunk | null> {\n    const id = `${modelId}:${tensorName}:${chunkIndex}`;\n    return this.tensorChunks.get(id) || null;\n  }\n\n  async storeTensorChunk(chunk: TensorChunk): Promise<void> {\n    this.tensorChunks.set(chunk.id, chunk);\n  }\n\n  async deleteTensorChunks(modelId: string): Promise<void> {\n    for (const [key, chunk] of this.tensorChunks) {\n      if (chunk.modelId === modelId) {\n        this.tensorChunks.delete(key);\n      }\n    }\n  }\n\n  // Tokenizer\n  async getTokenizer(modelId: string): Promise<TokenizerData | null> {\n    return this.tokenizers.get(modelId) || null;\n  }\n\n  async setTokenizer(data: TokenizerData): Promise<void> {\n    this.tokenizers.set(data.modelId, data);\n  }\n\n  // Sync progress\n  async getSyncProgress(modelId: string): Promise<SyncProgress[]> {\n    return this.syncProgress.get(modelId) || [];\n  }\n\n  async updateSyncProgress(progress: SyncProgress): Promise<void> {\n    const existing = this.syncProgress.get(progress.modelId) || [];\n    const idx = existing.findIndex((p) => p.tensorName === progress.tensorName);\n    if (idx >= 0) {\n      existing[idx] = progress;\n    } else {\n      existing.push(progress);\n    }\n    this.syncProgress.set(progress.modelId, existing);\n  }\n\n  async clearSyncProgress(modelId: string): Promise<void> {\n    this.syncProgress.delete(modelId);\n  }\n\n  // User adapters\n  async getUserAdapter(\n    modelId: string,\n    userId: string,\n    adapterId?: string\n  ): Promise<UserAdapter | null> {\n    for (const adapter of this.userAdapters.values()) {\n      if (\n        adapter.modelId === modelId &&\n        adapter.userId === userId &&\n        (!adapterId || adapter.id === adapterId)\n      ) {\n        return adapter;\n      }\n    }\n    return null;\n  }\n\n  async setUserAdapter(adapter: UserAdapter): Promise<void> {\n    this.userAdapters.set(adapter.id, adapter);\n  }\n\n  async deleteUserAdapter(adapterId: string): Promise<void> {\n    this.userAdapters.delete(adapterId);\n  }\n\n  // Training log\n  async addTrainingLogEntry(\n    entry: Omit<TrainingLogEntry, 'id'>\n  ): Promise<number> {\n    const id = this.nextLogId++;\n    this.trainingLog.push({ ...entry, id });\n    return id;\n  }\n\n  async getTrainingLog(\n    adapterId: string,\n    limit = 100\n  ): Promise<TrainingLogEntry[]> {\n    return this.trainingLog\n      .filter((e) => e.adapterId === adapterId)\n      .slice(-limit);\n  }\n\n  // Utility\n  async isModelComplete(modelId: string): Promise<boolean> {\n    const progress = await this.getSyncProgress(modelId);\n    if (progress.length === 0) return false;\n    return progress.every((p) => p.chunksDownloaded >= p.totalChunks);\n  }\n\n  async getStorageUsed(): Promise<number> {\n    let size = 0;\n    for (const chunk of this.tensorChunks.values()) {\n      size += chunk.data.byteLength;\n    }\n    return size;\n  }\n\n  async clear(): Promise<void> {\n    this.models.clear();\n    this.tensorChunks.clear();\n    this.tokenizers.clear();\n    this.syncProgress.clear();\n    this.userAdapters.clear();\n    this.trainingLog = [];\n    this.nextLogId = 0;\n  }\n}\n","/**\n * Storage Factory\n *\n * Creates appropriate storage backend based on environment capabilities.\n */\n\nimport { OPFSStorage } from './opfs-storage';\nimport { IndexedDBStorage } from './indexeddb-storage';\nimport { MemoryStorage } from './memory-storage';\nimport { BaseStorage } from './base-storage';\nimport type { StorageBackend } from '../../types';\n\nexport interface StorageOptions {\n  /** Preferred storage backend */\n  backend?: StorageBackend;\n  /** Force the specified backend even if not optimal */\n  force?: boolean;\n}\n\n/**\n * Detect the best available storage backend\n */\nexport function detectBestBackend(): StorageBackend {\n  // Check if we're in a browser\n  if (typeof window === 'undefined') {\n    return 'memory';\n  }\n\n  // Check for OPFS support (best for large binary data)\n  if ('storage' in navigator && 'getDirectory' in navigator.storage) {\n    return 'opfs';\n  }\n\n  // Check for IndexedDB support\n  if ('indexedDB' in window) {\n    return 'indexeddb';\n  }\n\n  // Fall back to memory\n  return 'memory';\n}\n\n/**\n * Check if a storage backend is available\n */\nexport function isBackendAvailable(backend: StorageBackend): boolean {\n  if (typeof window === 'undefined') {\n    return backend === 'memory';\n  }\n\n  switch (backend) {\n    case 'opfs':\n      return 'storage' in navigator && 'getDirectory' in navigator.storage;\n    case 'indexeddb':\n      return 'indexedDB' in window;\n    case 'memory':\n      return true;\n    default:\n      return false;\n  }\n}\n\n/**\n * Create a storage instance\n */\nexport async function createStorage(\n  options: StorageOptions = {}\n): Promise<BaseStorage> {\n  const { backend, force = false } = options;\n\n  // Determine which backend to use\n  let selectedBackend: StorageBackend;\n  if (backend && (force || isBackendAvailable(backend))) {\n    selectedBackend = backend;\n  } else {\n    selectedBackend = detectBestBackend();\n  }\n\n  // Create and initialize the storage\n  let storage: BaseStorage;\n  switch (selectedBackend) {\n    case 'opfs':\n      storage = new OPFSStorage() as unknown as BaseStorage;\n      break;\n    case 'indexeddb':\n      storage = new IndexedDBStorage();\n      break;\n    case 'memory':\n    default:\n      storage = new MemoryStorage();\n      break;\n  }\n\n  await storage.initialize();\n  return storage;\n}\n\n/**\n * Get storage capabilities info\n */\nexport function getStorageCapabilities(): {\n  opfs: boolean;\n  indexeddb: boolean;\n  memory: boolean;\n  recommended: StorageBackend;\n} {\n  return {\n    opfs: isBackendAvailable('opfs'),\n    indexeddb: isBackendAvailable('indexeddb'),\n    memory: true,\n    recommended: detectBestBackend(),\n  };\n}\n"]}