llama-cpp-pro 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (310) hide show
  1. package/CHANGELOG.md +295 -0
  2. package/LICENSE +21 -0
  3. package/LlamaCpp.podspec +33 -0
  4. package/LlamaCppCapacitor.podspec +33 -0
  5. package/Package.swift +29 -0
  6. package/README.md +93 -0
  7. package/android/build.gradle +88 -0
  8. package/android/src/main/AndroidManifest.xml +4 -0
  9. package/android/src/main/CMakeLists-arm64.txt +138 -0
  10. package/android/src/main/CMakeLists-x86_64.txt +141 -0
  11. package/android/src/main/CMakeLists.txt +138 -0
  12. package/android/src/main/java/ai/annadata/plugin/capacitor/LlamaCpp.java +1340 -0
  13. package/android/src/main/java/ai/annadata/plugin/capacitor/LlamaCppPlugin.java +814 -0
  14. package/android/src/main/java/ai/annadata/plugin/capacitor/ModelAdmissionController.java +214 -0
  15. package/android/src/main/jni-chat-session.cpp +261 -0
  16. package/android/src/main/jni-lora.cpp +197 -0
  17. package/android/src/main/jni-multimodal.cpp +167 -0
  18. package/android/src/main/jni-tts.cpp +290 -0
  19. package/android/src/main/jni-utils.h +148 -0
  20. package/android/src/main/jni.cpp +1808 -0
  21. package/android/src/main/jniLibs/arm64-v8a/libllama-cpp-arm64.so +0 -0
  22. package/android/src/main/res/.gitkeep +0 -0
  23. package/build-native.sh +280 -0
  24. package/cmake/desktop-metal-embed.cmake +30 -0
  25. package/cmake/desktop-sources.cmake +100 -0
  26. package/cmake/ggml-backends.cmake +44 -0
  27. package/cpp/LICENSE +21 -0
  28. package/cpp/README.md +15 -0
  29. package/cpp/anyascii.c +22223 -0
  30. package/cpp/anyascii.h +42 -0
  31. package/cpp/cap-completion.cpp +942 -0
  32. package/cpp/cap-completion.h +127 -0
  33. package/cpp/cap-embedding.cpp +193 -0
  34. package/cpp/cap-embedding.h +35 -0
  35. package/cpp/cap-ios-bridge.cpp +1810 -0
  36. package/cpp/cap-ios-bridge.h +61 -0
  37. package/cpp/cap-llama.cpp +412 -0
  38. package/cpp/cap-llama.h +161 -0
  39. package/cpp/cap-mtmd.hpp +602 -0
  40. package/cpp/cap-native-server.cpp +1095 -0
  41. package/cpp/cap-native-server.h +40 -0
  42. package/cpp/cap-tts.cpp +591 -0
  43. package/cpp/cap-tts.h +59 -0
  44. package/cpp/cap-wasm-fs.cpp +156 -0
  45. package/cpp/cap-wasm-jspi.cpp +19 -0
  46. package/cpp/cap-wasm-jspi.h +30 -0
  47. package/cpp/cap-wasm-vfs.cpp +22 -0
  48. package/cpp/chat-parser.cpp +393 -0
  49. package/cpp/chat-parser.h +120 -0
  50. package/cpp/chat.cpp +2315 -0
  51. package/cpp/chat.h +221 -0
  52. package/cpp/common.cpp +1664 -0
  53. package/cpp/common.h +744 -0
  54. package/cpp/ggml-alloc.c +1028 -0
  55. package/cpp/ggml-alloc.h +76 -0
  56. package/cpp/ggml-backend-impl.h +255 -0
  57. package/cpp/ggml-backend-reg.cpp +600 -0
  58. package/cpp/ggml-backend.cpp +2121 -0
  59. package/cpp/ggml-backend.h +354 -0
  60. package/cpp/ggml-common.h +1878 -0
  61. package/cpp/ggml-cpp.h +39 -0
  62. package/cpp/ggml-cpu/amx/amx.cpp +221 -0
  63. package/cpp/ggml-cpu/amx/amx.h +8 -0
  64. package/cpp/ggml-cpu/amx/common.h +91 -0
  65. package/cpp/ggml-cpu/amx/mmq.cpp +2512 -0
  66. package/cpp/ggml-cpu/amx/mmq.h +10 -0
  67. package/cpp/ggml-cpu/arch/arm/cpu-feats.cpp +94 -0
  68. package/cpp/ggml-cpu/arch/arm/quants.c +3650 -0
  69. package/cpp/ggml-cpu/arch/arm/repack.cpp +1891 -0
  70. package/cpp/ggml-cpu/arch/x86/cpu-feats.cpp +327 -0
  71. package/cpp/ggml-cpu/arch/x86/quants.c +3820 -0
  72. package/cpp/ggml-cpu/arch/x86/repack.cpp +6307 -0
  73. package/cpp/ggml-cpu/arch-fallback.h +215 -0
  74. package/cpp/ggml-cpu/binary-ops.cpp +158 -0
  75. package/cpp/ggml-cpu/binary-ops.h +16 -0
  76. package/cpp/ggml-cpu/common.h +73 -0
  77. package/cpp/ggml-cpu/ggml-cpu-impl.h +559 -0
  78. package/cpp/ggml-cpu/ggml-cpu.c +3578 -0
  79. package/cpp/ggml-cpu/ggml-cpu.cpp +672 -0
  80. package/cpp/ggml-cpu/ops.cpp +10587 -0
  81. package/cpp/ggml-cpu/ops.h +114 -0
  82. package/cpp/ggml-cpu/quants.c +1193 -0
  83. package/cpp/ggml-cpu/quants.h +97 -0
  84. package/cpp/ggml-cpu/repack.cpp +1982 -0
  85. package/cpp/ggml-cpu/repack.h +120 -0
  86. package/cpp/ggml-cpu/simd-mappings.h +1184 -0
  87. package/cpp/ggml-cpu/traits.cpp +36 -0
  88. package/cpp/ggml-cpu/traits.h +38 -0
  89. package/cpp/ggml-cpu/unary-ops.cpp +186 -0
  90. package/cpp/ggml-cpu/unary-ops.h +28 -0
  91. package/cpp/ggml-cpu/vec.cpp +348 -0
  92. package/cpp/ggml-cpu/vec.h +1121 -0
  93. package/cpp/ggml-cpu.h +145 -0
  94. package/cpp/ggml-impl.h +622 -0
  95. package/cpp/ggml-metal-impl.h +688 -0
  96. package/cpp/ggml-metal.h +66 -0
  97. package/cpp/ggml-metal.m +6833 -0
  98. package/cpp/ggml-metal.metal +10754 -0
  99. package/cpp/ggml-opt.cpp +1093 -0
  100. package/cpp/ggml-opt.h +256 -0
  101. package/cpp/ggml-quants.c +5324 -0
  102. package/cpp/ggml-quants.h +106 -0
  103. package/cpp/ggml-threading.cpp +12 -0
  104. package/cpp/ggml-threading.h +14 -0
  105. package/cpp/ggml.c +7108 -0
  106. package/cpp/ggml.h +2492 -0
  107. package/cpp/gguf.cpp +1358 -0
  108. package/cpp/gguf.h +202 -0
  109. package/cpp/json-partial.cpp +256 -0
  110. package/cpp/json-partial.h +38 -0
  111. package/cpp/json-schema-to-grammar.cpp +985 -0
  112. package/cpp/json-schema-to-grammar.h +21 -0
  113. package/cpp/llama-adapter.cpp +388 -0
  114. package/cpp/llama-adapter.h +76 -0
  115. package/cpp/llama-arch.cpp +2355 -0
  116. package/cpp/llama-arch.h +499 -0
  117. package/cpp/llama-batch.cpp +875 -0
  118. package/cpp/llama-batch.h +160 -0
  119. package/cpp/llama-chat.cpp +783 -0
  120. package/cpp/llama-chat.h +65 -0
  121. package/cpp/llama-context.cpp +2788 -0
  122. package/cpp/llama-context.h +306 -0
  123. package/cpp/llama-cparams.cpp +5 -0
  124. package/cpp/llama-cparams.h +41 -0
  125. package/cpp/llama-cpp.h +30 -0
  126. package/cpp/llama-grammar.cpp +1229 -0
  127. package/cpp/llama-grammar.h +173 -0
  128. package/cpp/llama-graph.cpp +1891 -0
  129. package/cpp/llama-graph.h +810 -0
  130. package/cpp/llama-hparams.cpp +180 -0
  131. package/cpp/llama-hparams.h +233 -0
  132. package/cpp/llama-impl.cpp +167 -0
  133. package/cpp/llama-impl.h +61 -0
  134. package/cpp/llama-io.cpp +15 -0
  135. package/cpp/llama-io.h +35 -0
  136. package/cpp/llama-kv-cache-iswa.cpp +318 -0
  137. package/cpp/llama-kv-cache-iswa.h +135 -0
  138. package/cpp/llama-kv-cache.cpp +2059 -0
  139. package/cpp/llama-kv-cache.h +374 -0
  140. package/cpp/llama-kv-cells.h +491 -0
  141. package/cpp/llama-memory-hybrid.cpp +258 -0
  142. package/cpp/llama-memory-hybrid.h +137 -0
  143. package/cpp/llama-memory-recurrent.cpp +1146 -0
  144. package/cpp/llama-memory-recurrent.h +179 -0
  145. package/cpp/llama-memory.cpp +59 -0
  146. package/cpp/llama-memory.h +119 -0
  147. package/cpp/llama-mmap.cpp +609 -0
  148. package/cpp/llama-mmap.h +68 -0
  149. package/cpp/llama-model-loader.cpp +1166 -0
  150. package/cpp/llama-model-loader.h +170 -0
  151. package/cpp/llama-model-saver.cpp +282 -0
  152. package/cpp/llama-model-saver.h +37 -0
  153. package/cpp/llama-model.cpp +19061 -0
  154. package/cpp/llama-model.h +491 -0
  155. package/cpp/llama-sampling.cpp +2575 -0
  156. package/cpp/llama-sampling.h +32 -0
  157. package/cpp/llama-vocab.cpp +3792 -0
  158. package/cpp/llama-vocab.h +176 -0
  159. package/cpp/llama.cpp +358 -0
  160. package/cpp/llama.h +1373 -0
  161. package/cpp/log.cpp +428 -0
  162. package/cpp/log.h +103 -0
  163. package/cpp/minja/chat-template.hpp +550 -0
  164. package/cpp/minja/minja.hpp +3009 -0
  165. package/cpp/nlohmann/json.hpp +25526 -0
  166. package/cpp/nlohmann/json_fwd.hpp +187 -0
  167. package/cpp/regex-partial.cpp +204 -0
  168. package/cpp/regex-partial.h +56 -0
  169. package/cpp/sampling.cpp +579 -0
  170. package/cpp/sampling.h +107 -0
  171. package/cpp/tools/mtmd/clip-impl.h +473 -0
  172. package/cpp/tools/mtmd/clip.cpp +4322 -0
  173. package/cpp/tools/mtmd/clip.h +106 -0
  174. package/cpp/tools/mtmd/miniaudio/miniaudio.h +93468 -0
  175. package/cpp/tools/mtmd/mtmd-audio.cpp +769 -0
  176. package/cpp/tools/mtmd/mtmd-audio.h +47 -0
  177. package/cpp/tools/mtmd/mtmd-helper.cpp +460 -0
  178. package/cpp/tools/mtmd/mtmd-helper.h +95 -0
  179. package/cpp/tools/mtmd/mtmd.cpp +1066 -0
  180. package/cpp/tools/mtmd/mtmd.h +302 -0
  181. package/cpp/tools/mtmd/stb/stb_image.h +7988 -0
  182. package/cpp/unicode-data.cpp +7034 -0
  183. package/cpp/unicode-data.h +20 -0
  184. package/cpp/unicode.cpp +1061 -0
  185. package/cpp/unicode.h +68 -0
  186. package/cpp/vendor/cpp-httplib/httplib.cpp +16509 -0
  187. package/cpp/vendor/cpp-httplib/httplib.h +3883 -0
  188. package/desktop/electron-builder.config.cjs +157 -0
  189. package/desktop/entitlements.mac.plist +12 -0
  190. package/desktop/package.json +11 -0
  191. package/desktop/resolve-package-root.cjs +88 -0
  192. package/desktop/src/main/backend-selector.cjs +148 -0
  193. package/desktop/src/main/gpu-probe.cjs +142 -0
  194. package/desktop/src/main/index.cjs +58 -0
  195. package/desktop/src/main/ipc-handlers.cjs +212 -0
  196. package/desktop/src/main/model-store.cjs +50 -0
  197. package/desktop/src/main/preload.cjs +39 -0
  198. package/desktop/src/main/sidecar-client.cjs +76 -0
  199. package/desktop/src/main/sidecar-manager.cjs +364 -0
  200. package/dist/docs.json +14357 -0
  201. package/dist/esm/definitions.d.ts +731 -0
  202. package/dist/esm/definitions.js +2 -0
  203. package/dist/esm/definitions.js.map +1 -0
  204. package/dist/esm/desktop.d.ts +37 -0
  205. package/dist/esm/desktop.js +133 -0
  206. package/dist/esm/desktop.js.map +1 -0
  207. package/dist/esm/index.d.ts +200 -0
  208. package/dist/esm/index.js +612 -0
  209. package/dist/esm/index.js.map +1 -0
  210. package/dist/esm/isomorphic/desktop.runtime.d.ts +37 -0
  211. package/dist/esm/isomorphic/desktop.runtime.js +36 -0
  212. package/dist/esm/isomorphic/desktop.runtime.js.map +1 -0
  213. package/dist/esm/isomorphic/errors.d.ts +6 -0
  214. package/dist/esm/isomorphic/errors.js +9 -0
  215. package/dist/esm/isomorphic/errors.js.map +1 -0
  216. package/dist/esm/isomorphic/model.admission.d.ts +17 -0
  217. package/dist/esm/isomorphic/model.admission.js +27 -0
  218. package/dist/esm/isomorphic/model.admission.js.map +1 -0
  219. package/dist/esm/isomorphic/model.scheduler.d.ts +31 -0
  220. package/dist/esm/isomorphic/model.scheduler.js +95 -0
  221. package/dist/esm/isomorphic/model.scheduler.js.map +1 -0
  222. package/dist/esm/isomorphic/provider.desktop.d.ts +40 -0
  223. package/dist/esm/isomorphic/provider.desktop.js +411 -0
  224. package/dist/esm/isomorphic/provider.desktop.js.map +1 -0
  225. package/dist/esm/isomorphic/provider.factory.d.ts +2 -0
  226. package/dist/esm/isomorphic/provider.factory.js +16 -0
  227. package/dist/esm/isomorphic/provider.factory.js.map +1 -0
  228. package/dist/esm/isomorphic/provider.interface.d.ts +76 -0
  229. package/dist/esm/isomorphic/provider.interface.js +2 -0
  230. package/dist/esm/isomorphic/provider.interface.js.map +1 -0
  231. package/dist/esm/isomorphic/provider.native.d.ts +18 -0
  232. package/dist/esm/isomorphic/provider.native.js +173 -0
  233. package/dist/esm/isomorphic/provider.native.js.map +1 -0
  234. package/dist/esm/isomorphic/provider.web.d.ts +88 -0
  235. package/dist/esm/isomorphic/provider.web.js +573 -0
  236. package/dist/esm/isomorphic/provider.web.js.map +1 -0
  237. package/dist/esm/isomorphic/sidecar-sse.d.ts +14 -0
  238. package/dist/esm/isomorphic/sidecar-sse.js +76 -0
  239. package/dist/esm/isomorphic/sidecar-sse.js.map +1 -0
  240. package/dist/esm/isomorphic/wasmMemoryCalibration.d.ts +26 -0
  241. package/dist/esm/isomorphic/wasmMemoryCalibration.js +60 -0
  242. package/dist/esm/isomorphic/wasmMemoryCalibration.js.map +1 -0
  243. package/dist/esm/isomorphic/wasmMemoryPolicy.d.ts +55 -0
  244. package/dist/esm/isomorphic/wasmMemoryPolicy.js +93 -0
  245. package/dist/esm/isomorphic/wasmMemoryPolicy.js.map +1 -0
  246. package/dist/esm/storage/manifest.d.ts +13 -0
  247. package/dist/esm/storage/manifest.js +87 -0
  248. package/dist/esm/storage/manifest.js.map +1 -0
  249. package/dist/esm/storage/opfs.store.d.ts +31 -0
  250. package/dist/esm/storage/opfs.store.js +241 -0
  251. package/dist/esm/storage/opfs.store.js.map +1 -0
  252. package/dist/esm/web.d.ts +206 -0
  253. package/dist/esm/web.js +521 -0
  254. package/dist/esm/web.js.map +1 -0
  255. package/dist/esm/workers/async-file.d.ts +13 -0
  256. package/dist/esm/workers/async-file.js +12 -0
  257. package/dist/esm/workers/async-file.js.map +1 -0
  258. package/dist/esm/workers/heapfs.d.ts +55 -0
  259. package/dist/esm/workers/heapfs.js +115 -0
  260. package/dist/esm/workers/heapfs.js.map +1 -0
  261. package/dist/esm/workers/wasm.engine.d.ts +86 -0
  262. package/dist/esm/workers/wasm.engine.js +504 -0
  263. package/dist/esm/workers/wasm.engine.js.map +1 -0
  264. package/dist/esm/workers/worker.protocol.d.ts +160 -0
  265. package/dist/esm/workers/worker.protocol.js +2 -0
  266. package/dist/esm/workers/worker.protocol.js.map +1 -0
  267. package/dist/plugin.cjs +3179 -0
  268. package/dist/plugin.cjs.map +1 -0
  269. package/dist/plugin.js +3181 -0
  270. package/dist/plugin.js.map +1 -0
  271. package/dist/wasm/llama_engine.d.ts +74 -0
  272. package/dist/wasm/llama_engine.js +1829 -0
  273. package/dist/wasm/llama_engine.wasm +0 -0
  274. package/dist/wasm/llama_engine_emscripten.mjs +2 -0
  275. package/dist/wasm/package.json +16 -0
  276. package/dist/workers/llm.worker.js +1226 -0
  277. package/dist/workers/llm.worker.js.map +7 -0
  278. package/extraResources/llama-wasm/llama_engine.d.ts +74 -0
  279. package/extraResources/llama-wasm/llama_engine.js +1829 -0
  280. package/extraResources/llama-wasm/llama_engine.wasm +0 -0
  281. package/extraResources/llama-wasm/llama_engine_emscripten.mjs +2 -0
  282. package/extraResources/llama-wasm/package.json +16 -0
  283. package/extraResources/sidecar/README.md +11 -0
  284. package/extraResources/sidecar/darwin-arm64 +0 -0
  285. package/extraResources/sidecar/darwin-x64 +0 -0
  286. package/ios/CMakeLists-arm64.txt +161 -0
  287. package/ios/CMakeLists-x86_64.txt +188 -0
  288. package/ios/CMakeLists.txt +161 -0
  289. package/ios/Frameworks/llama-cpp.framework/Info.plist +28 -0
  290. package/ios/Frameworks/llama-cpp.framework/llama-cpp +0 -0
  291. package/ios/Sources/LlamaCppCapacitor/LlamaCpp.swift +1365 -0
  292. package/ios/Sources/LlamaCppCapacitor/LlamaCppPlugin.swift +694 -0
  293. package/ios/Sources/LlamaCppCapacitor/LlamaNativeBridge.swift +349 -0
  294. package/ios/Sources/LlamaCppCapacitor/ModelAdmissionController.swift +177 -0
  295. package/ios/embed-metal-shaders.sh +24 -0
  296. package/ios/metal-embed.cmake +29 -0
  297. package/package.json +281 -0
  298. package/scripts/build-js-preserve-wasm.cjs +53 -0
  299. package/scripts/build-sidecar-linux.sh +6 -0
  300. package/scripts/build-sidecar-win.bat +19 -0
  301. package/scripts/build-sidecar.sh +184 -0
  302. package/scripts/embed-llama-ios-app-framework.sh +63 -0
  303. package/scripts/ensure-desktop-sidecar-bundle.cjs +103 -0
  304. package/scripts/ensure-llama-ios-xcframework.sh +108 -0
  305. package/scripts/fix-esm-extensions.cjs +45 -0
  306. package/scripts/prepare-js-dist.cjs +28 -0
  307. package/scripts/stage-desktop-resources.cjs +116 -0
  308. package/sidecar/CMakeLists.txt +192 -0
  309. package/sidecar/cap-sidecar-main.cpp +68 -0
  310. package/types/llama-cpp-pro.d.ts +441 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/workers/async-file.ts", "../../src/workers/heapfs.ts", "../../src/workers/wasm.engine.ts", "../../src/isomorphic/errors.ts", "../../src/storage/manifest.ts", "../../src/storage/opfs.store.ts", "../../src/isomorphic/wasmMemoryCalibration.ts", "../../src/isomorphic/wasmMemoryPolicy.ts", "../../src/workers/llm.worker.ts"],
4
+ "sourcesContent": ["/**\n * External GGUF read \u2014 model bytes stay in JS/OPFS; WASM sync-fread pulls on demand.\n * Does not require native WebAssembly JSPI (uses sync EM_JS, not EM_ASYNC_JS).\n */\n\n/** True when this build includes the cap-wasm-fs fread hook. */\nexport const canUseAsyncFileRead = (wasmJspiBuild = false): boolean => wasmJspiBuild;\n\nexport type AsyncFileReader = {\n sizeBytes: number;\n /** Must be synchronous \u2014 called from WASM EM_JS without suspend. */\n readChunk: (offset: number, length: number) => Uint8Array;\n};\n\n/** Zero-copy subarray reader over a Uint8Array (ArrayBuffer load path). */\nexport const asyncReaderFromBytes = (bytes: Uint8Array): AsyncFileReader => ({\n sizeBytes: bytes.byteLength,\n readChunk: (offset, length) => bytes.subarray(offset, Math.min(offset + length, bytes.byteLength)),\n});\n", "/**\n * HeapFS \u2014 allocate model bytes directly in WASM linear memory (wllama-style).\n *\n * Standard Emscripten MEMFS stores file contents in the JS heap; reads/mmap\n * copy into WASM. HeapFS patches MEMFS so file contents are a subarray of\n * HEAPU8 at an mmapAlloc'd address, enabling zero-copy mmap for llama.cpp.\n *\n * Ref: ref-code/wllama/src/workers-code/llama-cpp.js\n */\n\nexport type EmscriptenModule = {\n MEMFS: {\n stream_ops: Record<string, unknown> & {\n read: (...args: unknown[]) => unknown;\n write: (...args: unknown[]) => unknown;\n llseek: (...args: unknown[]) => unknown;\n allocate: (...args: unknown[]) => unknown;\n mmap: (...args: unknown[]) => unknown;\n msync: (...args: unknown[]) => unknown;\n _read?: (...args: unknown[]) => unknown;\n _write?: (...args: unknown[]) => unknown;\n _llseek?: (...args: unknown[]) => unknown;\n _allocate?: (...args: unknown[]) => unknown;\n _mmap?: (...args: unknown[]) => unknown;\n _msync?: (...args: unknown[]) => unknown;\n };\n ops_table: { file: { stream: Record<string, unknown> } };\n };\n FS: {\n mkdir: (path: string) => void;\n analyzePath: (path: string) => { exists: boolean };\n createPath?: (parent: string, path: string, canRead: boolean, canWrite: boolean) => void;\n mount: (type: unknown, opts: unknown, mountpoint: string) => void;\n createDataFile: (\n parent: string,\n name: string,\n data: ArrayBuffer,\n canRead: boolean,\n canWrite: boolean,\n canOwn: boolean,\n ) => void;\n };\n mmapAlloc: (size: number) => number;\n HEAPU8: Uint8Array;\n};\n\ntype HeapFile = {\n ptr: number;\n size: number;\n id: number;\n};\n\nconst fsNameToFile: Record<string, HeapFile> = {};\nconst fsIdToFile: Record<number, HeapFile> = {};\nlet currFileId = 0;\nlet patched = false;\n\nconst getHeapU8 = (mod: EmscriptenModule): Uint8Array => {\n const buf = (mod as { wasmMemory?: WebAssembly.Memory }).wasmMemory?.buffer ?? mod.HEAPU8?.buffer;\n if (!buf) throw new Error('HeapFS requires WASM linear memory');\n return new Uint8Array(buf);\n};\n\nconst patchStream = (mod: EmscriptenModule, stream: { node: { name: string; contents?: Uint8Array; usedBytes?: number } }) => {\n const name = stream.node.name;\n const f = fsNameToFile[name];\n if (!f) return;\n const heap = getHeapU8(mod);\n const ptr = Number(f.ptr);\n stream.node.contents = heap.subarray(ptr, ptr + f.size);\n stream.node.usedBytes = f.size;\n};\n\n/** Patch MEMFS stream ops so mmap/read use WASM-heap-backed file storage. */\nexport const patchHeapFS = (mod: EmscriptenModule): void => {\n if (patched) return;\n patched = true;\n\n const ops = mod.MEMFS.stream_ops;\n ops._read = ops._read ?? ops.read;\n ops._write = ops._write ?? ops.write;\n ops._llseek = ops._llseek ?? ops.llseek;\n ops._allocate = ops._allocate ?? ops.allocate;\n ops._mmap = ops._mmap ?? ops.mmap;\n ops._msync = ops._msync ?? ops.msync;\n\n ops.read = function (this: unknown, stream: Parameters<typeof ops._read>[0], ...rest: unknown[]) {\n patchStream(mod, stream as Parameters<typeof patchStream>[1]);\n return (ops._read as (...a: unknown[]) => unknown).call(this, stream, ...rest);\n };\n mod.MEMFS.ops_table.file.stream.read = ops.read;\n\n ops.llseek = function (this: unknown, stream: Parameters<typeof ops._llseek>[0], ...rest: unknown[]) {\n patchStream(mod, stream as Parameters<typeof patchStream>[1]);\n return (ops._llseek as (...a: unknown[]) => unknown).call(this, stream, ...rest);\n };\n mod.MEMFS.ops_table.file.stream.llseek = ops.llseek;\n\n ops.mmap = function (this: unknown, stream: unknown, length: unknown, position: unknown, prot: unknown, flags: unknown) {\n patchStream(mod, stream as Parameters<typeof patchStream>[1]);\n const name = (stream as { node: { name: string } }).node.name;\n const f = fsNameToFile[name];\n if (f) {\n return { ptr: Number(f.ptr) + Number(position), allocated: false };\n }\n return (ops._mmap as (...a: unknown[]) => unknown).call(this, stream, length, position, prot, flags);\n };\n mod.MEMFS.ops_table.file.stream.mmap = ops.mmap;\n\n mod.FS.mkdir('/models');\n mod.FS.mount(mod.MEMFS, { root: '.' }, '/models');\n};\n\n/** Ensure MEMFS /tmp exists for VFS model streaming (fopen fails without it). */\nexport const ensureWasmTmpDir = (mod: EmscriptenModule): void => {\n const fs = mod.FS;\n if (fs.analyzePath('/tmp').exists) return;\n try {\n if (typeof fs.createPath === 'function') {\n fs.createPath('/', 'tmp', true, true);\n } else {\n fs.mkdir('/tmp');\n }\n } catch {\n if (!fs.analyzePath('/tmp').exists) {\n throw new Error('Failed to create MEMFS /tmp for model VFS streaming');\n }\n }\n};\n\n/** Allocate `size` bytes in WASM heap for a model file; returns file id. */\nexport const heapfsAlloc = (mod: EmscriptenModule, name: string, size: number, allocBuffer = true): number => {\n if (size < 1) throw new Error('HeapFS file size must be > 0');\n const ptr = allocBuffer ? Number(mod.mmapAlloc(size)) : 0;\n const file: HeapFile = { ptr, size, id: currFileId++ };\n fsIdToFile[file.id] = file;\n fsNameToFile[name] = file;\n return file.id;\n};\n\n/** Write bytes at `offset` into a HeapFS file. Returns bytes written. */\nexport const heapfsWrite = (mod: EmscriptenModule, id: number, buffer: Uint8Array, offset: number): number => {\n const f = fsIdToFile[id];\n if (!f) throw new Error(`HeapFS file id ${id} not found`);\n const after = offset + buffer.byteLength;\n if (after > f.size) {\n throw new Error(`HeapFS write out of bounds: ${after} > ${f.size}`);\n }\n getHeapU8(mod).set(buffer, Number(f.ptr) + offset);\n return buffer.byteLength;\n};\n\n/** VFS path for a model basename under /models/. */\nexport const heapfsModelPath = (basename: string): string => `/models/${basename}`;\n\n/** Whether HeapFS runtime methods are present on the module. */\nexport const supportsHeapFS = (mod: unknown): mod is EmscriptenModule =>\n !!mod &&\n typeof (mod as EmscriptenModule).mmapAlloc === 'function' &&\n typeof (mod as EmscriptenModule).MEMFS === 'object' &&\n typeof (mod as EmscriptenModule).FS === 'object';\n", "type GenerateRequest = {\n prompt?: string;\n messages?: Array<{ role: string; content: string }>;\n max_tokens?: number;\n temperature?: number;\n stream?: boolean;\n};\n\ntype GenerateResult = {\n text: string;\n tokens_predicted: number;\n tokens_evaluated: number;\n finish_reason: 'stop' | 'length' | 'error';\n};\n\ntype EmbedResult = {\n vectors: number[][];\n};\n\nexport type TokenizeResult = { tokens: number[]; has_media?: boolean };\nexport type DetokenizeResult = { text: string };\n\nimport {\n canUseAsyncFileRead,\n asyncReaderFromBytes,\n} from './async-file';\nimport {\n ensureWasmTmpDir,\n heapfsAlloc,\n heapfsModelPath,\n heapfsWrite,\n patchHeapFS,\n supportsHeapFS,\n type EmscriptenModule,\n} from './heapfs';\n\nexport type WasmEngine = {\n init?: () => Promise<void> | void;\n loadModel: (modelId: string, modelBuffer: ArrayBuffer, opts?: Record<string, unknown>) => Promise<void> | void;\n /** Stream from OPFS sync handle without holding full model in JS heap (#9). */\n loadModelFromOpfsReader?: (\n modelId: string,\n reader: { sizeBytes: number; readChunk: (offset: number, length?: number) => Uint8Array; close: () => void },\n opts?: Record<string, unknown>,\n ) => Promise<void> | void;\n unloadModel: (modelId: string) => Promise<void> | void;\n generate: (\n modelId: string,\n req: GenerateRequest,\n onToken?: (token: string, index: number) => void,\n ) => Promise<GenerateResult> | GenerateResult;\n embed: (modelId: string, input: string | string[]) => Promise<EmbedResult> | EmbedResult;\n /** Tokenize text using the loaded model vocabulary. */\n tokenize?: (modelId: string, text: string) => Promise<TokenizeResult> | TokenizeResult;\n /** Detokenize a token ID array back to text. */\n detokenize?: (modelId: string, tokens: number[]) => Promise<DetokenizeResult> | DetokenizeResult;\n /** Convert a JSON Schema to a GBNF grammar string for constrained sampling. */\n convertJsonSchemaToGrammar?: (schemaJson: string) => Promise<string> | string;\n rerank?: (modelId: string, query: string, documents: string[]) => Promise<Array<{ index: number; score: number }>>;\n bench?: (modelId: string, pp: number, tg: number, pl: number, nr: number) => Promise<string>;\n saveSession?: (modelId: string, filepath: string, tokenSize: number) => Promise<{ tokens_saved: number }>;\n loadSession?: (modelId: string, filepath: string) => Promise<{ tokens_loaded: number; prompt: string }>;\n applyLoraAdapters?: (modelId: string, loraAdapters: Array<{ path: string; scaled?: number }>) => Promise<void>;\n removeLoraAdapters?: (modelId: string) => Promise<void>;\n getLoadedLoraAdapters?: (modelId: string) => Promise<Array<{ path: string; scaled?: number }>>;\n initMultimodal?: (modelId: string, path: string, useGpu?: boolean) => Promise<boolean>;\n multimodalStatus?: (modelId: string) => Promise<{ enabled: boolean; vision: boolean; audio: boolean }>;\n releaseMultimodal?: (modelId: string) => Promise<void>;\n initVocoder?: (modelId: string, path: string, nBatch?: number) => Promise<boolean>;\n vocoderEnabled?: (modelId: string) => Promise<boolean>;\n releaseVocoder?: (modelId: string) => Promise<void>;\n formattedAudioCompletion?: (\n modelId: string,\n speakerJson: string,\n textToSpeak: string,\n ) => Promise<{ prompt: string; grammar?: string }>;\n audioGuideTokens?: (modelId: string, textToSpeak: string) => Promise<number[]>;\n decodeAudioTokens?: (modelId: string, tokens: number[]) => Promise<number[]>;\n health?: () => Promise<Record<string, unknown>> | Record<string, unknown>;\n memory?: () => Promise<Record<string, unknown>> | Record<string, unknown>;\n};\n\ntype WasmModule = {\n /** Default export: loads and initialises the .wasm binary. */\n default?: (moduleOrPath?: string | URL | Request | Response | BufferSource | WebAssembly.Module) => Promise<unknown>;\n getEmscriptenModule?: () => EmscriptenModule | null;\n /**\n * Engine-level init (wasm_bindgen export named `init` in Rust).\n * Exported as `init_engine` / `wasm_init` in the ES module wrapper to avoid\n * colliding with the wasm-module-load default export.\n */\n init_engine?: () => void;\n /** @deprecated use init_engine \u2014 kept for backwards compat with older builds */\n init?: () => void;\n load_model?: (modelId: string, bytes: Uint8Array, optsJson: string) => void;\n model_vfs_begin?: (totalBytes?: number, optsJson?: string) => string;\n model_vfs_write?: (vfsPath: string, chunk: Uint8Array) => void;\n model_vfs_abort?: (vfsPath: string) => void;\n load_model_from_vfs?: (modelId: string, vfsPath: string, optsJson: string) => void;\n load_model_from_path?: (modelId: string, vfsPath: string, optsJson: string) => void;\n async_model_bind?: (\n vfsPath: string,\n sizeBytes: number,\n readFn: (offset: number, length: number) => Uint8Array | Promise<Uint8Array>,\n ) => void;\n can_use_async_file?: () => boolean;\n unload_model?: (modelId: string) => void;\n generate?: (modelId: string, reqJson: string) => string;\n // generate_stream is the real streaming export from Rust/wasm-bindgen (#3).\n generate_stream?: (modelId: string, reqJson: string, onToken: (token: string, index: number) => void) => string;\n embed?: (modelId: string, reqJson: string) => string;\n tokenize?: (modelId: string, text: string) => string;\n detokenize?: (modelId: string, tokensJson: string) => string;\n convert_json_schema_to_grammar?: (schemaJson: string) => string;\n rerank?: (modelId: string, query: string, documentsJson: string) => string;\n bench?: (modelId: string, pp: number, tg: number, pl: number, nr: number) => string;\n save_session?: (modelId: string, filepath: string, tokenSize: number) => string;\n load_session?: (modelId: string, filepath: string) => string;\n apply_lora_adapters?: (modelId: string, loraListJson: string) => void;\n remove_lora_adapters?: (modelId: string) => void;\n get_loaded_lora_adapters?: (modelId: string) => string;\n init_multimodal?: (modelId: string, path: string, useGpu: boolean) => string;\n multimodal_status?: (modelId: string) => string;\n release_multimodal?: (modelId: string) => void;\n init_vocoder?: (modelId: string, path: string, nBatch: number) => string;\n vocoder_enabled?: (modelId: string) => string;\n release_vocoder?: (modelId: string) => void;\n formatted_audio_completion?: (modelId: string, speakerJson: string, textToSpeak: string) => string;\n audio_guide_tokens?: (modelId: string, textToSpeak: string) => string;\n decode_audio_tokens?: (modelId: string, tokensJson: string) => string;\n health?: () => string;\n memory_snapshot?: () => string;\n};\n\nconst safeJsonParse = <T>(raw: string, fallback: T): T => {\n try {\n return JSON.parse(raw) as T;\n } catch {\n return fallback;\n }\n};\n\n/** Models above this use VFS streaming first (HeapFS/mmap can overflow JS stack). */\nconst LARGE_MODEL_BYTES = 500 * 1024 * 1024;\n\n/** Legacy MEMFS streaming \u2014 use_mmap=false (full file copied into WASM VFS). */\nconst wasmLoadOptsJson = (\n opts: Record<string, unknown> | undefined,\n overrides?: Record<string, unknown>,\n): string => JSON.stringify({ use_mmap: false, ...(opts ?? {}), ...overrides });\n\n/** JSPI async fread \u2014 model stays in JS; C++ reads on demand (use_mmap=false). */\nconst wasmAsyncLoadOptsJson = (\n opts: Record<string, unknown> | undefined,\n overrides?: Record<string, unknown>,\n): string => JSON.stringify({ use_mmap: false, ...(opts ?? {}), ...overrides });\n\nconst loadViaAsyncFile = (\n mod: WasmModule,\n modelId: string,\n sizeBytes: number,\n readChunk: (offset: number, length: number) => Uint8Array,\n opts?: Record<string, unknown>,\n): void => {\n const begin = mod.model_vfs_begin;\n const bind = mod.async_model_bind;\n const finish = mod.load_model_from_vfs;\n const abort = mod.model_vfs_abort;\n if (!begin || !bind || !finish) {\n throw new Error('Wasm module missing JSPI async file exports \u2014 rebuild with: npm run build:wasm:jspi');\n }\n const optsJson = wasmAsyncLoadOptsJson(opts);\n const vfsPath = begin(sizeBytes, optsJson);\n if (!vfsPath) throw new Error('model_vfs_begin returned empty path');\n try {\n bind(vfsPath, sizeBytes, (offset, length) => readChunk(offset, length));\n finish(modelId, vfsPath, optsJson);\n } catch (err) {\n abort?.(vfsPath);\n throw err;\n }\n};\n\nconst isStackOverflowError = (err: unknown): boolean => {\n const msg = err instanceof Error ? err.message : String(err);\n return /maximum call stack size exceeded/i.test(msg);\n};\n\nconst wasmMemoryDiagnostics = (em: EmscriptenModule | null): Record<string, unknown> => {\n if (!em) {\n return { wasmMemoryAccessible: false };\n }\n const wasmMem = (em as { wasmMemory?: WebAssembly.Memory }).wasmMemory;\n const buffer = wasmMem?.buffer ?? em.HEAPU8?.buffer;\n if (!buffer) {\n return { wasmMemoryAccessible: false };\n }\n return {\n wasmMemoryAccessible: true,\n wasmLinearBytes: buffer.byteLength,\n wasmLinearMb: +(buffer.byteLength / 1024 / 1024).toFixed(1),\n wasmMemoryShared: wasmMem?.buffer instanceof SharedArrayBuffer,\n };\n};\n\n// Resolve llama_engine.js candidates (worker-relative + app overrides).\nconst resolveModuleCandidates = (): string[] => {\n const candidates: string[] = [];\n const g = globalThis as any;\n\n for (const key of ['__LLAMA_WASM_MODULE_URL__', '__LLAMA_ENGINE_URL__']) {\n const customUrl = g?.[key];\n if (typeof customUrl === 'string' && customUrl.length > 0) {\n candidates.push(customUrl);\n }\n }\n\n try {\n // Static import.meta.url reference \u2014 detected correctly by bundlers.\n const base = new URL('../../wasm/llama_engine.js', import.meta.url).href;\n candidates.push(base);\n candidates.push(new URL('../../dist/wasm/llama_engine.js', import.meta.url).href);\n } catch {\n // import.meta.url unavailable (CommonJS transform or test runner).\n }\n\n const origin = g?.location?.origin ?? '';\n if (origin) {\n candidates.push(`${origin}/llama-cpp/wasm/llama_engine.js`);\n candidates.push(`${origin}/dist/wasm/llama_engine.js`);\n candidates.push(`${origin}/wasm/llama_engine.js`);\n }\n\n return [...new Set(candidates)];\n};\n\nconst loadWasmModule = async (): Promise<WasmModule> => {\n let lastError: unknown;\n for (const url of resolveModuleCandidates()) {\n try {\n const mod = (await import(/* @vite-ignore */ url)) as WasmModule;\n if (mod && typeof mod.default === 'function') {\n await mod.default();\n }\n if (typeof mod.load_model === 'function' && typeof mod.generate === 'function' && typeof mod.embed === 'function') {\n return mod;\n }\n lastError = new Error(`Module loaded but missing required exports at ${url}`);\n } catch (error) {\n lastError = error;\n }\n }\n throw new Error(\n `Unable to load wasm wrapper module (llama_engine.js). ` +\n `Set window.__LLAMA_WASM_MODULE_URL__ to llama_engine.js. ` +\n `Last error: ${lastError instanceof Error ? lastError.message : String(lastError)}`,\n );\n};\n\nexport const loadLlamaWasmEngine = async (): Promise<WasmEngine> => {\n const mod = await loadWasmModule();\n const emscripten = (): EmscriptenModule | null => mod.getEmscriptenModule?.() ?? null;\n\n const ensureHeapFS = (): EmscriptenModule => {\n const em = emscripten();\n if (!em || !supportsHeapFS(em)) {\n throw new Error('Wasm build missing HeapFS runtime (mmapAlloc/MEMFS/FS) \u2014 rebuild with npm run build:wasm');\n }\n patchHeapFS(em);\n return em;\n };\n\n const ensureVfsReady = (): void => {\n const em = emscripten();\n if (em && supportsHeapFS(em)) {\n ensureWasmTmpDir(em);\n }\n };\n\n return {\n init: async () => {\n (mod.init_engine ?? mod.init)?.();\n const em = emscripten();\n if (em && supportsHeapFS(em)) {\n patchHeapFS(em);\n ensureWasmTmpDir(em);\n }\n },\n\n loadModel: async (modelId, modelBuffer, opts) => {\n const bytes = new Uint8Array(modelBuffer);\n const em = emscripten() as { __llamaWasmJspi?: boolean; __llamaWasmAsyncFile?: boolean } | null;\n const asyncReady =\n typeof mod.can_use_async_file === 'function'\n ? mod.can_use_async_file()\n : canUseAsyncFileRead(em?.__llamaWasmJspi ?? false);\n\n // JSPI async fread: register JS reader \u2014 no full-model copy into WASM linear memory.\n if (asyncReady) {\n const reader = asyncReaderFromBytes(bytes);\n loadViaAsyncFile(mod, modelId, reader.sizeBytes, reader.readChunk, opts);\n return;\n }\n\n // HeapFS fallback: mmapAlloc places GGUF in WASM heap (wllama fallback when no JSPI).\n const begin = mod.model_vfs_begin;\n const write = mod.model_vfs_write;\n const finish = mod.load_model_from_vfs;\n const abort = mod.model_vfs_abort;\n\n if (begin && write && finish) {\n ensureVfsReady();\n const optsJson = wasmLoadOptsJson(opts);\n const vfsPath = begin(bytes.length, optsJson);\n if (!vfsPath) throw new Error('model_vfs_begin returned empty path');\n try {\n const CHUNK = 32 * 1024 * 1024;\n for (let offset = 0; offset < bytes.length; offset += CHUNK) {\n write(vfsPath, bytes.subarray(offset, offset + CHUNK));\n }\n finish(modelId, vfsPath, optsJson);\n } catch (err) {\n abort?.(vfsPath);\n throw err;\n }\n return;\n }\n\n const loadModelFn = mod.load_model;\n if (!loadModelFn) throw new Error('Wasm module missing load_model export');\n loadModelFn(modelId, bytes, JSON.stringify(opts ?? {}));\n },\n\n loadModelFromOpfsReader: async (modelId, reader, opts) => {\n const loadFromPath = mod.load_model_from_path;\n const begin = mod.model_vfs_begin;\n const write = mod.model_vfs_write;\n const finish = mod.load_model_from_vfs;\n const abort = mod.model_vfs_abort;\n const chunkSize = 4 * 1024 * 1024;\n const em = emscripten() as { __llamaWasmJspi?: boolean } | null;\n const asyncReady =\n typeof mod.can_use_async_file === 'function'\n ? mod.can_use_async_file()\n : canUseAsyncFileRead(em?.__llamaWasmJspi ?? false);\n\n const loadViaAsyncOpfs = (): void => {\n loadViaAsyncFile(\n mod,\n modelId,\n reader.sizeBytes,\n (offset, length) => reader.readChunk(offset, length),\n opts,\n );\n };\n\n const streamOpfsToVfs = (useMmap: boolean): void => {\n if (!begin || !write || !finish) {\n throw new Error('Wasm module missing OPFS streaming exports (model_vfs_* / load_model_from_path)');\n }\n ensureVfsReady();\n const vfsPath = begin(reader.sizeBytes, wasmLoadOptsJson(opts, { use_mmap: useMmap }));\n if (!vfsPath) {\n throw new Error('model_vfs_begin returned empty path');\n }\n const optsJson = wasmLoadOptsJson(opts, { use_mmap: useMmap });\n try {\n for (let offset = 0; offset < reader.sizeBytes; ) {\n const chunk = reader.readChunk(offset, chunkSize);\n if (chunk.byteLength === 0) {\n break;\n }\n write(vfsPath, chunk);\n offset += chunk.byteLength;\n }\n finish(modelId, vfsPath, optsJson);\n } catch (error) {\n abort?.(vfsPath);\n throw error;\n }\n };\n\n const tryHeapFSLoad = (): void => {\n if (!loadFromPath) {\n throw new Error('Wasm module missing load_model_from_path');\n }\n const emMod = ensureHeapFS();\n const basename = `${modelId.replace(/[^\\w.-]/g, '_')}.gguf`;\n const vfsPath = heapfsModelPath(basename);\n emMod.FS.createDataFile('/models', basename, new ArrayBuffer(0), true, true, true);\n const fileId = heapfsAlloc(emMod, basename, reader.sizeBytes, true);\n for (let offset = 0; offset < reader.sizeBytes; ) {\n const chunk = reader.readChunk(offset, chunkSize);\n if (chunk.byteLength === 0) break;\n heapfsWrite(emMod, fileId, chunk, offset);\n offset += chunk.byteLength;\n }\n loadFromPath(modelId, vfsPath, wasmLoadOptsJson(opts, { use_mmap: true }));\n };\n\n try {\n if (asyncReady) {\n loadViaAsyncOpfs();\n return;\n }\n\n const preferVfs =\n reader.sizeBytes >= LARGE_MODEL_BYTES || opts?.preferVfsStreaming === true;\n\n if (preferVfs) {\n streamOpfsToVfs(false);\n return;\n }\n\n if (loadFromPath) {\n try {\n tryHeapFSLoad();\n return;\n } catch (heapErr) {\n const reason = isStackOverflowError(heapErr)\n ? 'HeapFS/mmap caused stack overflow'\n : 'HeapFS load failed';\n console.warn(`[llama-cpp] ${reason}; falling back to VFS streaming:`, heapErr);\n }\n }\n\n streamOpfsToVfs(false);\n } finally {\n reader.close();\n }\n },\n\n unloadModel: async (modelId) => {\n const unloadModel = mod.unload_model;\n if (!unloadModel) throw new Error('Wasm module missing unload_model export');\n unloadModel(modelId);\n },\n\n generate: async (modelId, req, onToken) => {\n if (onToken && typeof mod.generate_stream === 'function') {\n const em = emscripten() as (EmscriptenModule & {\n __llamaWasmJspi?: boolean;\n __llamaStreamOnToken?: (token: string, index: number) => void | Promise<void>;\n }) | null;\n\n // JSPI build: tokens delivered incrementally via EM_ASYNC_JS in C++.\n if (em?.__llamaWasmJspi) {\n em.__llamaStreamOnToken = async (token: string, index: number) => {\n onToken(token, index);\n };\n try {\n const raw = mod.generate_stream(modelId, JSON.stringify(req ?? {}), () => {});\n return safeJsonParse<GenerateResult>(raw, {\n text: '',\n tokens_predicted: 0,\n tokens_evaluated: 0,\n finish_reason: 'error',\n });\n } finally {\n em.__llamaStreamOnToken = undefined;\n }\n }\n\n const raw = mod.generate_stream(modelId, JSON.stringify(req ?? {}), onToken);\n return safeJsonParse<GenerateResult>(raw, {\n text: '',\n tokens_predicted: 0,\n tokens_evaluated: 0,\n finish_reason: 'error',\n });\n }\n\n const generate = mod.generate;\n if (!generate) throw new Error('Wasm module missing generate export');\n const raw = generate(modelId, JSON.stringify(req ?? {}));\n return safeJsonParse<GenerateResult>(raw, {\n text: '',\n tokens_predicted: 0,\n tokens_evaluated: 0,\n finish_reason: 'error',\n });\n },\n\n embed: async (modelId, input) => {\n const embed = mod.embed;\n if (!embed) throw new Error('Wasm module missing embed export');\n const raw = embed(modelId, JSON.stringify({ input }));\n return safeJsonParse<EmbedResult>(raw, { vectors: [] });\n },\n\n tokenize: async (modelId, text) => {\n if (!mod.tokenize) {\n throw new Error('Wasm module missing tokenize export \u2014 rebuild with npm run build:wasm');\n }\n const raw = mod.tokenize(modelId, text);\n const parsed = safeJsonParse<Record<string, unknown>>(raw, {});\n const tokens = Array.isArray(parsed['tokens'])\n ? (parsed['tokens'] as number[])\n : [];\n return { tokens, has_media: Boolean(parsed['has_media']) };\n },\n\n detokenize: async (modelId, tokens) => {\n if (!mod.detokenize) {\n throw new Error('Wasm module missing detokenize export \u2014 rebuild with npm run build:wasm');\n }\n const raw = mod.detokenize(modelId, JSON.stringify(tokens));\n const parsed = safeJsonParse<{ text?: string }>(raw, {});\n return { text: parsed.text ?? raw };\n },\n\n convertJsonSchemaToGrammar: async (schemaJson) => {\n if (!mod.convert_json_schema_to_grammar) {\n throw new Error('Wasm module missing convert_json_schema_to_grammar export \u2014 rebuild with npm run build:wasm');\n }\n return mod.convert_json_schema_to_grammar(schemaJson);\n },\n\n rerank: async (modelId, query, documents) => {\n if (!mod.rerank) {\n throw new Error('Wasm module missing rerank export \u2014 rebuild with npm run build:wasm');\n }\n const raw = mod.rerank(modelId, query, JSON.stringify(documents));\n const parsed = safeJsonParse<Array<{ index: number; score: number }>>(raw, []);\n if (!Array.isArray(parsed)) {\n throw new Error(typeof parsed === 'object' && parsed && 'error' in (parsed as object)\n ? String((parsed as { error?: string }).error)\n : 'Invalid rerank response');\n }\n return parsed;\n },\n\n bench: async (modelId, pp, tg, pl, nr) => {\n if (!mod.bench) {\n throw new Error('Wasm module missing bench export \u2014 rebuild with npm run build:wasm');\n }\n return mod.bench(modelId, pp, tg, pl, nr);\n },\n\n saveSession: async (modelId, filepath, tokenSize) => {\n if (!mod.save_session) {\n throw new Error('Wasm module missing save_session export \u2014 rebuild with npm run build:wasm');\n }\n const raw = mod.save_session(modelId, filepath, tokenSize);\n const parsed = safeJsonParse<{ tokens_saved?: number; error?: string }>(raw, {});\n if (parsed.error) throw new Error(parsed.error);\n return { tokens_saved: parsed.tokens_saved ?? 0 };\n },\n\n loadSession: async (modelId, filepath) => {\n if (!mod.load_session) {\n throw new Error('Wasm module missing load_session export \u2014 rebuild with npm run build:wasm');\n }\n const raw = mod.load_session(modelId, filepath);\n const parsed = safeJsonParse<{ tokens_loaded?: number; prompt?: string; error?: string }>(raw, {});\n if (parsed.error) throw new Error(parsed.error);\n return {\n tokens_loaded: parsed.tokens_loaded ?? 0,\n prompt: parsed.prompt ?? '',\n };\n },\n\n applyLoraAdapters: async (modelId, loraAdapters) => {\n if (!mod.apply_lora_adapters) {\n throw new Error('Wasm module missing apply_lora_adapters export \u2014 rebuild with npm run build:wasm');\n }\n mod.apply_lora_adapters(modelId, JSON.stringify(loraAdapters));\n },\n\n removeLoraAdapters: async (modelId) => {\n if (!mod.remove_lora_adapters) {\n throw new Error('Wasm module missing remove_lora_adapters export \u2014 rebuild with npm run build:wasm');\n }\n mod.remove_lora_adapters(modelId);\n },\n\n getLoadedLoraAdapters: async (modelId) => {\n if (!mod.get_loaded_lora_adapters) {\n throw new Error('Wasm module missing get_loaded_lora_adapters export \u2014 rebuild with npm run build:wasm');\n }\n const raw = mod.get_loaded_lora_adapters(modelId);\n return safeJsonParse<Array<{ path: string; scaled?: number }>>(raw, []);\n },\n\n initMultimodal: async (modelId, path, useGpu = false) => {\n if (!mod.init_multimodal) {\n throw new Error('Wasm module missing init_multimodal export \u2014 rebuild with npm run build:wasm');\n }\n const raw = mod.init_multimodal(modelId, path, useGpu);\n const parsed = safeJsonParse<{ ok?: boolean; error?: string }>(raw, {});\n if (parsed.error) throw new Error(parsed.error);\n return !!parsed.ok;\n },\n\n multimodalStatus: async (modelId) => {\n if (!mod.multimodal_status) {\n throw new Error('Wasm module missing multimodal_status export \u2014 rebuild with npm run build:wasm');\n }\n const raw = mod.multimodal_status(modelId);\n return safeJsonParse<{ enabled: boolean; vision: boolean; audio: boolean }>(raw, {\n enabled: false,\n vision: false,\n audio: false,\n });\n },\n\n releaseMultimodal: async (modelId) => {\n mod.release_multimodal?.(modelId);\n },\n\n initVocoder: async (modelId, path, nBatch = 512) => {\n if (!mod.init_vocoder) {\n throw new Error('Wasm module missing init_vocoder export \u2014 rebuild with npm run build:wasm');\n }\n const raw = mod.init_vocoder(modelId, path, nBatch);\n const parsed = safeJsonParse<{ ok?: boolean; error?: string }>(raw, {});\n if (parsed.error) throw new Error(parsed.error);\n return !!parsed.ok;\n },\n\n vocoderEnabled: async (modelId) => {\n if (!mod.vocoder_enabled) {\n return false;\n }\n const raw = mod.vocoder_enabled(modelId);\n const parsed = safeJsonParse<{ enabled?: boolean }>(raw, {});\n return !!parsed.enabled;\n },\n\n releaseVocoder: async (modelId) => {\n mod.release_vocoder?.(modelId);\n },\n\n formattedAudioCompletion: async (modelId, speakerJson, textToSpeak) => {\n if (!mod.formatted_audio_completion) {\n throw new Error('Wasm module missing formatted_audio_completion export \u2014 rebuild with npm run build:wasm');\n }\n const raw = mod.formatted_audio_completion(modelId, speakerJson, textToSpeak);\n const parsed = safeJsonParse<{ prompt?: string; grammar?: string; error?: string }>(raw, {});\n if (parsed.error) throw new Error(parsed.error);\n return { prompt: parsed.prompt ?? '', grammar: parsed.grammar };\n },\n\n audioGuideTokens: async (modelId, textToSpeak) => {\n if (!mod.audio_guide_tokens) {\n throw new Error('Wasm module missing audio_guide_tokens export \u2014 rebuild with npm run build:wasm');\n }\n const raw = mod.audio_guide_tokens(modelId, textToSpeak);\n const parsed = safeJsonParse<number[] | { error?: string }>(raw, []);\n if (!Array.isArray(parsed)) {\n throw new Error(typeof parsed === 'object' && parsed && 'error' in parsed\n ? String(parsed.error)\n : 'Invalid audio guide tokens response');\n }\n return parsed;\n },\n\n decodeAudioTokens: async (modelId, tokens) => {\n if (!mod.decode_audio_tokens) {\n throw new Error('Wasm module missing decode_audio_tokens export \u2014 rebuild with npm run build:wasm');\n }\n const raw = mod.decode_audio_tokens(modelId, JSON.stringify(tokens));\n const parsed = safeJsonParse<number[] | { error?: string }>(raw, []);\n if (!Array.isArray(parsed)) {\n throw new Error(typeof parsed === 'object' && parsed && 'error' in parsed\n ? String(parsed.error)\n : 'Invalid decode audio response');\n }\n return parsed;\n },\n\n health: async () => {\n const base = mod.health\n ? safeJsonParse<Record<string, unknown>>(mod.health(), {})\n : {};\n const em = emscripten() as (EmscriptenModule & {\n __llamaWasmJspi?: boolean;\n __llamaWasmAsyncFile?: boolean;\n __llamaWasmPthread?: boolean;\n }) | null;\n return {\n ...base,\n ...wasmMemoryDiagnostics(em),\n wasmJspi: em?.__llamaWasmJspi ?? false,\n wasmAsyncFile: em?.__llamaWasmAsyncFile ?? mod.can_use_async_file?.() ?? false,\n wasmPthread: em?.__llamaWasmPthread ?? false,\n };\n },\n\n memory: async () => {\n const em = emscripten();\n return { pressure: 'unknown', ...wasmMemoryDiagnostics(em) };\n },\n };\n};\n", "export type LlmErrorCode =\n | 'MODEL_NOT_LOADED'\n | 'MODEL_LIMIT_REACHED'\n | 'INSUFFICIENT_MEMORY'\n | 'MODEL_DOWNLOAD_FAILED'\n | 'STORAGE_UNAVAILABLE'\n | 'STORAGE_IO_FAILED'\n | 'UNSUPPORTED_PLATFORM'\n | 'WASM_INIT_FAILED'\n | 'NATIVE_PLUGIN_UNAVAILABLE'\n | 'INFERENCE_FAILED'\n | 'INVALID_REQUEST';\n\nexport class LlmError extends Error {\n code: LlmErrorCode;\n meta?: Record<string, unknown>;\n\n constructor(code: LlmErrorCode, message: string, meta?: Record<string, unknown>) {\n super(message);\n this.name = 'LlmError';\n this.code = code;\n this.meta = meta;\n }\n}\n\n", "import { LlmError } from '../isomorphic/errors';\n\nexport interface ModelManifestEntry {\n modelId: string;\n path: string;\n sizeBytes: number;\n sha256?: string;\n sourceUrl?: string;\n createdAt: number;\n lastUsedAt: number;\n}\n\ntype ManifestMap = Record<string, ModelManifestEntry>;\n\nconst MANIFEST_FILE = '.llm-manifest.json';\n\nconst getStorageApi = (): any => {\n const storageApi = (globalThis as any)?.navigator?.storage;\n if (!storageApi || typeof storageApi.getDirectory !== 'function') {\n throw new LlmError(\n 'STORAGE_UNAVAILABLE',\n 'OPFS is not available in this runtime. navigator.storage.getDirectory is missing.',\n );\n }\n return storageApi;\n};\n\nconst getRootDirectory = async (): Promise<any> => {\n const storageApi = getStorageApi();\n try {\n return await storageApi.getDirectory();\n } catch (error) {\n throw new LlmError('STORAGE_IO_FAILED', 'Failed to access OPFS root directory.', {\n cause: String(error),\n });\n }\n};\n\nconst readTextFile = async (fileHandle: any): Promise<string> => {\n const file = await fileHandle.getFile();\n return file.text();\n};\n\nconst writeTextFile = async (fileHandle: any, content: string): Promise<void> => {\n const writable = await fileHandle.createWritable();\n try {\n await writable.write(content);\n } finally {\n await writable.close();\n }\n};\n\nasync function loadManifestInternal(): Promise<ManifestMap> {\n const root = await getRootDirectory();\n try {\n const handle = await root.getFileHandle(MANIFEST_FILE, { create: true });\n const content = await readTextFile(handle);\n if (!content.trim()) {\n return {};\n }\n const parsed = JSON.parse(content) as unknown;\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return {};\n }\n return parsed as ManifestMap;\n } catch (error) {\n throw new LlmError('STORAGE_IO_FAILED', 'Failed to read OPFS manifest.', {\n cause: String(error),\n });\n }\n}\n\nasync function saveManifestInternal(manifest: ManifestMap): Promise<void> {\n const root = await getRootDirectory();\n try {\n const handle = await root.getFileHandle(MANIFEST_FILE, { create: true });\n await writeTextFile(handle, JSON.stringify(manifest, null, 2));\n } catch (error) {\n throw new LlmError('STORAGE_IO_FAILED', 'Failed to write OPFS manifest.', {\n cause: String(error),\n });\n }\n}\n\nexport async function listManifestEntries(): Promise<ModelManifestEntry[]> {\n const manifest = await loadManifestInternal();\n return Object.values(manifest);\n}\n\nexport async function getManifestEntry(modelId: string): Promise<ModelManifestEntry | undefined> {\n const manifest = await loadManifestInternal();\n return manifest[modelId];\n}\n\nexport async function upsertManifestEntry(entry: ModelManifestEntry): Promise<void> {\n const manifest = await loadManifestInternal();\n manifest[entry.modelId] = entry;\n await saveManifestInternal(manifest);\n}\n\nexport async function removeManifestEntry(modelId: string): Promise<void> {\n const manifest = await loadManifestInternal();\n if (manifest[modelId]) {\n delete manifest[modelId];\n await saveManifestInternal(manifest);\n }\n}\n\n", "import { LlmError } from '../isomorphic/errors';\nimport {\n getManifestEntry,\n listManifestEntries,\n type ModelManifestEntry,\n removeManifestEntry,\n upsertManifestEntry,\n} from './manifest';\n\nconst MODELS_DIR = 'models';\n\nconst getStorageApi = (): any => {\n const storageApi = (globalThis as any)?.navigator?.storage;\n if (!storageApi || typeof storageApi.getDirectory !== 'function') {\n throw new LlmError(\n 'STORAGE_UNAVAILABLE',\n 'OPFS is not available in this runtime. navigator.storage.getDirectory is missing.',\n );\n }\n return storageApi;\n};\n\nconst getRootDirectory = async (): Promise<any> => {\n const storageApi = getStorageApi();\n try {\n return await storageApi.getDirectory();\n } catch (error) {\n throw new LlmError('STORAGE_IO_FAILED', 'Failed to access OPFS root directory.', {\n cause: String(error),\n });\n }\n};\n\nconst sanitizeModelId = (modelId: string): string =>\n modelId.replace(/[^a-zA-Z0-9._-]/g, '_');\n\nconst pathForModelId = (modelId: string): string =>\n `${MODELS_DIR}/${sanitizeModelId(modelId)}.gguf`;\n\nconst ensureParentDirAndFileHandle = async (path: string, create = true): Promise<any> => {\n const root = await getRootDirectory();\n const parts = path.split('/').filter(Boolean);\n const fileName = parts.pop();\n if (!fileName) {\n throw new LlmError('STORAGE_IO_FAILED', `Invalid OPFS path '${path}'.`);\n }\n let current = root;\n for (const dir of parts) {\n current = await current.getDirectoryHandle(dir, { create: true });\n }\n return current.getFileHandle(fileName, { create });\n};\n\nconst writeStreamToFile = async (\n res: Response,\n fileHandle: any,\n onProgress?: (downloaded: number, total: number) => void,\n signal?: AbortSignal,\n): Promise<number> => {\n const writable = await fileHandle.createWritable();\n const total = Number(res.headers.get('content-length') ?? 0);\n let written = 0;\n try {\n if (!res.body) {\n const buf = await res.arrayBuffer();\n await writable.write(buf);\n written += buf.byteLength;\n onProgress?.(written, total || written);\n return written;\n }\n\n const reader = res.body.getReader();\n while (true) {\n if (signal?.aborted) {\n reader.cancel();\n throw new LlmError('MODEL_DOWNLOAD_FAILED', 'Download aborted by caller.');\n }\n const { value, done } = await reader.read();\n if (done) break;\n if (value) {\n await writable.write(value);\n written += value.byteLength;\n onProgress?.(written, total || written);\n }\n }\n return written;\n } finally {\n await writable.close();\n }\n};\n\nexport async function ensureModelInOpfs(\n modelId: string,\n modelUrl: string,\n onProgress?: (downloaded: number, total: number) => void,\n signal?: AbortSignal,\n): Promise<ModelManifestEntry> {\n if (!modelId) {\n throw new LlmError('INVALID_REQUEST', 'modelId is required for OPFS storage.');\n }\n if (!modelUrl) {\n throw new LlmError('INVALID_REQUEST', 'modelUrl is required for OPFS storage.');\n }\n\n const existing = await getManifestEntry(modelId);\n if (existing) {\n await upsertManifestEntry({ ...existing, lastUsedAt: Date.now() });\n return { ...existing, lastUsedAt: Date.now() };\n }\n\n let res: Response;\n try {\n res = await fetch(modelUrl, signal ? { signal } : undefined);\n } catch (error) {\n const isAbort = error instanceof Error && error.name === 'AbortError';\n throw new LlmError(\n 'MODEL_DOWNLOAD_FAILED',\n isAbort\n ? `Download of model '${modelId}' was cancelled.`\n : `Failed to download model '${modelId}'.`,\n { modelId, modelUrl, cause: String(error) },\n );\n }\n if (!res.ok) {\n throw new LlmError('MODEL_DOWNLOAD_FAILED', `Failed to download model '${modelId}': HTTP ${res.status}`, {\n modelId,\n modelUrl,\n status: res.status,\n });\n }\n\n const path = pathForModelId(modelId);\n let sizeBytes = 0;\n try {\n const fileHandle = await ensureParentDirAndFileHandle(path, true);\n sizeBytes = await writeStreamToFile(res, fileHandle, onProgress, signal);\n } catch (error) {\n throw new LlmError('STORAGE_IO_FAILED', `Failed to persist model '${modelId}' in OPFS.`, {\n modelId,\n path,\n cause: String(error),\n });\n }\n\n const now = Date.now();\n const entry: ModelManifestEntry = {\n modelId,\n path,\n sizeBytes,\n sourceUrl: modelUrl,\n createdAt: now,\n lastUsedAt: now,\n };\n await upsertManifestEntry(entry);\n return entry;\n}\n\n/**\n * Choice 3 \u2014 primary web model load path.\n * Opens an OPFS FileSystemSyncAccessHandle in the worker and reads the\n * model in fixed-size chunks (default 4MB). Chunks are streamed into WASM\n * MEMFS; the full GGUF is never materialised as a single JS ArrayBuffer.\n *\n * Worker-only: createSyncAccessHandle is not available on the main thread.\n */\nexport const OPFS_MODEL_CHUNK_BYTES = 4 * 1024 * 1024;\n\nexport interface OpfsModelSyncReader {\n readonly sizeBytes: number;\n readChunk(offset: number, length?: number): Uint8Array;\n close(): void;\n}\n\nexport async function openOpfsModelSyncReader(modelId: string): Promise<OpfsModelSyncReader> {\n const entry = await getManifestEntry(modelId);\n if (!entry) {\n throw new LlmError('MODEL_NOT_LOADED', `Model '${modelId}' is not present in OPFS manifest.`);\n }\n\n const fileHandle = await ensureParentDirAndFileHandle(entry.path, false);\n if (typeof fileHandle.createSyncAccessHandle !== 'function') {\n throw new LlmError(\n 'STORAGE_UNAVAILABLE',\n 'OPFS sync access handles are not available in this browser/worker context.',\n { modelId },\n );\n }\n\n let accessHandle: {\n getSize(): number;\n read(buffer: Uint8Array, options: { at: number }): number;\n close(): void;\n };\n try {\n accessHandle = await fileHandle.createSyncAccessHandle();\n } catch (error) {\n throw new LlmError('STORAGE_IO_FAILED', `Failed to open OPFS sync handle for '${modelId}'.`, {\n modelId,\n path: entry.path,\n cause: String(error),\n });\n }\n\n const sizeBytes = accessHandle.getSize();\n await upsertManifestEntry({ ...entry, lastUsedAt: Date.now() });\n\n return {\n sizeBytes,\n readChunk(offset: number, length = OPFS_MODEL_CHUNK_BYTES) {\n const toRead = Math.min(length, sizeBytes - offset);\n if (toRead <= 0) {\n return new Uint8Array(0);\n }\n const buf = new Uint8Array(toRead);\n const bytesRead = accessHandle.read(buf, { at: offset });\n return buf.subarray(0, bytesRead);\n },\n close() {\n accessHandle.close();\n },\n };\n}\n\n/**\n * Read the model from OPFS as an ArrayBuffer (fallback when sync handles\n * are unavailable). Prefer openOpfsModelSyncReader in workers.\n */\nexport async function readModelBufferFromOpfs(modelId: string): Promise<{ buffer: ArrayBuffer; sizeBytes: number }> {\n const file = await readModelFromOpfs(modelId);\n const buffer = await file.arrayBuffer();\n return { buffer, sizeBytes: file.size };\n}\n\nexport async function readModelFromOpfs(modelId: string): Promise<File> {\n const entry = await getManifestEntry(modelId);\n if (!entry) {\n throw new LlmError('MODEL_NOT_LOADED', `Model '${modelId}' is not present in OPFS manifest.`);\n }\n try {\n const fileHandle = await ensureParentDirAndFileHandle(entry.path, false);\n const file = await fileHandle.getFile();\n await upsertManifestEntry({ ...entry, lastUsedAt: Date.now() });\n return file;\n } catch (error) {\n throw new LlmError('STORAGE_IO_FAILED', `Failed to read model '${modelId}' from OPFS.`, {\n modelId,\n path: entry.path,\n cause: String(error),\n });\n }\n}\n\nexport async function removeModelFromOpfs(modelId: string): Promise<void> {\n const entry = await getManifestEntry(modelId);\n if (!entry) return;\n\n const root = await getRootDirectory();\n const parts = entry.path.split('/').filter(Boolean);\n const fileName = parts.pop();\n if (!fileName) {\n await removeManifestEntry(modelId);\n return;\n }\n\n try {\n let current = root;\n for (const dir of parts) {\n current = await current.getDirectoryHandle(dir, { create: false });\n }\n await current.removeEntry(fileName);\n } catch (error) {\n // Keep manifest cleanup deterministic even if file was already gone.\n if (!(error instanceof Error) || !/not found/i.test(error.message)) {\n throw new LlmError('STORAGE_IO_FAILED', `Failed to remove model '${modelId}' from OPFS.`, {\n modelId,\n path: entry.path,\n cause: String(error),\n });\n }\n } finally {\n await removeManifestEntry(modelId);\n }\n}\n\nexport async function getOpfsUsage(): Promise<{ usedBytes: number; quotaBytes?: number }> {\n const entries = await listManifestEntries();\n const usedBytes = entries.reduce((sum, e) => sum + (e.sizeBytes || 0), 0);\n const estimate = await (globalThis as any)?.navigator?.storage?.estimate?.();\n const quotaBytes = typeof estimate?.quota === 'number' ? estimate.quota : undefined;\n return { usedBytes, quotaBytes };\n}\n\n", "export type ModelFootprintEntry = {\n fileBytes: number;\n estimatedBytes: number;\n measuredBytes?: number;\n linearBefore?: number;\n linearAfter?: number;\n calibratedAt?: number;\n};\n\nexport type WasmProjectionInput = {\n wasmLinearBytes: number;\n residentModelCount: number;\n residentFootprintBytes: number;\n candidateEstimateBytes: number;\n candidateMeasuredBytes?: number;\n};\n\nconst WARM_HEAP_BYTES = 64 * 1024 * 1024;\n\n/** Bytes used for scheduling \u2014 measured when calibrated, else estimate. */\nexport function resolveFootprintBytes(\n entry: ModelFootprintEntry | number | undefined,\n fallbackEstimate: number,\n): number {\n if (typeof entry === 'number' && entry > 0) return entry;\n if (entry && typeof entry === 'object') {\n if (typeof entry.measuredBytes === 'number' && entry.measuredBytes > 0) {\n return entry.measuredBytes;\n }\n if (entry.estimatedBytes > 0) return entry.estimatedBytes;\n }\n return fallbackEstimate;\n}\n\n/** Attribute heap growth to one model load (delta from linear before \u2192 after). */\nexport function calibrateFootprintFromLinearDelta(\n linearBefore: number,\n linearAfter: number,\n estimatedBytes: number,\n options?: { firstModelInHeap?: boolean },\n): number {\n const delta = Math.max(0, linearAfter - linearBefore);\n if (options?.firstModelInHeap && linearAfter > WARM_HEAP_BYTES) {\n return linearAfter;\n }\n if (delta > 0) {\n return delta;\n }\n return estimatedBytes;\n}\n\nexport function createFootprintEntry(\n fileBytes: number,\n estimatedBytes: number,\n): ModelFootprintEntry {\n return { fileBytes, estimatedBytes };\n}\n\nexport function applyCalibration(\n entry: ModelFootprintEntry,\n linearBefore: number,\n linearAfter: number,\n firstModelInHeap: boolean,\n): ModelFootprintEntry {\n const measuredBytes = calibrateFootprintFromLinearDelta(\n linearBefore,\n linearAfter,\n entry.estimatedBytes,\n { firstModelInHeap },\n );\n return {\n ...entry,\n measuredBytes,\n linearBefore,\n linearAfter,\n calibratedAt: Date.now(),\n };\n}\n\nexport function sumResidentFootprintBytes(\n footprints: Map<string, ModelFootprintEntry | number>,\n excludeModelId?: string,\n): number {\n let sum = 0;\n for (const [id, entry] of footprints) {\n if (excludeModelId && id === excludeModelId) continue;\n const fallback = typeof entry === 'object' ? entry.estimatedBytes : 0;\n sum += resolveFootprintBytes(entry, fallback);\n }\n return sum;\n}\n\n/** Project WASM pool usage after admitting one more model (footprint-based). */\nexport function projectWasmAfterLoad(input: WasmProjectionInput): number {\n const linear = input.wasmLinearBytes;\n const nextBytes = input.candidateMeasuredBytes ?? input.candidateEstimateBytes;\n\n // Prefer calibrated footprints over linear heap size. Linear may include unused\n // pre-grown headroom (or a prior failed grow to MAXIMUM_MEMORY).\n if (input.residentModelCount > 0) {\n return input.residentFootprintBytes + nextBytes;\n }\n if (linear > WARM_HEAP_BYTES) {\n return nextBytes;\n }\n return Math.max(linear, nextBytes);\n}\n", "import type { MemorySnapshot } from './provider.interface';\nimport { projectWasmAfterLoad } from './wasmMemoryCalibration';\n\n/** Max concurrent GGUF contexts in one WASM worker (matches n_threads slot policy). */\nexport const WASM_MAX_CONCURRENT_MODELS = 5;\n\n/** Emscripten MAXIMUM_MEMORY \u2014 absolute hard limit from build (2 GiB). */\nexport const WASM_EMSCRIPTEN_MAX_BYTES = 2147483648;\n\n/** WASM pool planning cap \u2014 aligned with Emscripten max (was 1536 MB). */\nexport const WASM_POOL_CEILING_BYTES = WASM_EMSCRIPTEN_MAX_BYTES;\n\n/** Keep this much headroom free inside the WASM pool after a load. */\nexport const WASM_POOL_RESERVE_BYTES = 64 * 1024 * 1024;\n\nexport type ModelLoadMemoryOpts = {\n n_ctx?: number;\n n_batch?: number;\n embedding?: boolean;\n};\n\nexport type WasmMemoryStatus = MemorySnapshot & {\n wasmLinearBytes?: number;\n wasmPoolCeilingBytes?: number;\n wasmHeadroomBytes?: number;\n loadedModelCount?: number;\n maxModels?: number;\n loadedModels?: Array<{ modelId: string; fileBytes?: number; estimatedFootprintBytes?: number }>;\n};\n\nexport type WasmLoadAdmissionInput = {\n modelId: string;\n fileBytes: number;\n loadOpts?: ModelLoadMemoryOpts;\n currentlyLoaded: number;\n maxModels?: number;\n wasmLinearBytes?: number;\n wasmPoolCeilingBytes?: number;\n loadedFootprintBytes?: number;\n /** Prior measured footprint for this model id (if re-loading after unload). */\n candidateMeasuredBytes?: number;\n reserveBytes?: number;\n browserMemory?: MemorySnapshot;\n};\n\nexport type WasmLoadAdmissionResult = {\n allow: boolean;\n deniedBy?: 'limit' | 'wasm_pool' | 'browser_memory';\n reason?: string;\n estimatedFootprintBytes: number;\n projectedWasmBytes?: number;\n};\n\n/**\n * Estimate WASM linear memory for one model (weights + context/KV headroom).\n * PWA loads via async OPFS \u2014 weights are not fully duplicated in heap (not 2\u00D7 file).\n * Observed: LFM2 ~697 MB GGUF \u2192 ~940 MB WASM; BGE ~17 MB \u2192 ~150\u2013200 MB.\n */\nexport function estimateModelWasmFootprint(\n fileBytes: number,\n opts: ModelLoadMemoryOpts = {},\n): number {\n if (!(fileBytes > 0)) return 20 * 1024 * 1024;\n\n const embedding = opts.embedding === true;\n const n_ctx = typeof opts.n_ctx === 'number' && opts.n_ctx > 0 ? opts.n_ctx : embedding ? 256 : 512;\n const n_batch = typeof opts.n_batch === 'number' && opts.n_batch > 0 ? opts.n_batch : embedding ? 32 : 16;\n\n // Async OPFS: ~1.3\u00D7 file for large chat; embed models are lighter.\n const weightMultiplier = embedding ? 1.25 : fileBytes > 200 * 1024 * 1024 ? 1.32 : 1.2;\n const ctxBytes = n_ctx * n_batch * 4096;\n const proportional = Math.ceil(fileBytes * 0.12);\n const minHeadroom = embedding ? 48 * 1024 * 1024 : 96 * 1024 * 1024;\n const headroom = Math.max(minHeadroom, proportional, ctxBytes);\n\n return Math.ceil(fileBytes * weightMultiplier + headroom);\n}\n\nexport function canAdmitWasmModelLoad(input: WasmLoadAdmissionInput): WasmLoadAdmissionResult {\n const maxModels = input.maxModels ?? WASM_MAX_CONCURRENT_MODELS;\n const ceiling = input.wasmPoolCeilingBytes ?? WASM_POOL_CEILING_BYTES;\n const reserve = input.reserveBytes ?? WASM_POOL_RESERVE_BYTES;\n const estimated = estimateModelWasmFootprint(input.fileBytes, input.loadOpts ?? {});\n\n if (input.currentlyLoaded >= maxModels) {\n return {\n allow: false,\n deniedBy: 'limit',\n reason: `Model slot limit reached (${maxModels} concurrent WASM contexts)`,\n estimatedFootprintBytes: estimated,\n };\n }\n\n const linear = input.wasmLinearBytes ?? 0;\n const loadedFootprint = input.loadedFootprintBytes ?? 0;\n const projectedWasm = projectWasmAfterLoad({\n wasmLinearBytes: linear,\n residentModelCount: input.currentlyLoaded,\n residentFootprintBytes: loadedFootprint,\n candidateEstimateBytes: estimated,\n candidateMeasuredBytes: input.candidateMeasuredBytes,\n });\n const admitLimit = Math.min(ceiling, WASM_EMSCRIPTEN_MAX_BYTES) - reserve;\n\n if (projectedWasm > admitLimit) {\n return {\n allow: false,\n deniedBy: 'wasm_pool',\n reason:\n `WASM pool would exceed ${(ceiling / 1024 / 1024).toFixed(0)} MB ` +\n `(projected ${(projectedWasm / 1024 / 1024).toFixed(0)} MB, ` +\n `GGUF ${(input.fileBytes / 1024 / 1024).toFixed(0)} MB \u2192 est. WASM ~${(estimated / 1024 / 1024).toFixed(0)} MB)`,\n estimatedFootprintBytes: estimated,\n projectedWasmBytes: projectedWasm,\n };\n }\n\n if (typeof input.browserMemory?.freeBytes === 'number') {\n const browserReserve = 256 * 1024 * 1024;\n const postFree = input.browserMemory.freeBytes - estimated;\n if (postFree < browserReserve) {\n return {\n allow: false,\n deniedBy: 'browser_memory',\n reason: 'Insufficient browser JS heap after model load reserve',\n estimatedFootprintBytes: estimated,\n projectedWasmBytes: projectedWasm,\n };\n }\n }\n\n return {\n allow: true,\n estimatedFootprintBytes: estimated,\n projectedWasmBytes: projectedWasm,\n };\n}\n\nexport function wasmMemoryPressure(\n wasmLinearBytes: number,\n ceilingBytes: number = WASM_POOL_CEILING_BYTES,\n): MemorySnapshot['pressure'] {\n if (!(wasmLinearBytes > 0) || !(ceilingBytes > 0)) return 'unknown';\n const ratio = wasmLinearBytes / ceilingBytes;\n if (ratio >= 0.85) return 'high';\n if (ratio >= 0.7) return 'medium';\n return 'low';\n}\n", "import type { WorkerEvent, WorkerRequest } from './worker.protocol';\nimport { loadLlamaWasmEngine, type WasmEngine, type TokenizeResult, type DetokenizeResult } from './wasm.engine';\nimport {\n openOpfsModelSyncReader,\n readModelBufferFromOpfs,\n} from '../storage/opfs.store';\nimport { WASM_MAX_CONCURRENT_MODELS } from '../isomorphic/wasmMemoryPolicy';\n\ntype GenerateResult = {\n text: string;\n tokens_predicted: number;\n tokens_evaluated: number;\n finish_reason: 'stop' | 'length' | 'error';\n};\n\ntype EmbedResult = {\n vectors: number[][];\n};\n\nconst state = {\n initialized: false,\n wasmEngineContextInitialized: false,\n loadedModels: new Set<string>(),\n modelLoadOutcomes: new Map<string, 'loaded' | 'failed'>(),\n modelLoadFailureReasons: new Map<string, string>(),\n modelLoadInflight: new Map<string, Promise<void>>(),\n engine: null as WasmEngine | null,\n};\n\nconst isModelReadyInWorker = (modelId: string): boolean =>\n state.wasmEngineContextInitialized &&\n state.engine != null &&\n state.loadedModels.has(modelId);\n\nconst clearModelLoadMemo = (modelId: string): void => {\n state.loadedModels.delete(modelId);\n state.modelLoadOutcomes.delete(modelId);\n state.modelLoadFailureReasons.delete(modelId);\n state.modelLoadInflight.delete(modelId);\n};\n\nconst postEvent = (evt: WorkerEvent): void => {\n (self as DedicatedWorkerGlobalScope).postMessage(evt);\n};\n\nconst postError = (id: string, code: string, message: string, meta?: Record<string, unknown>): void => {\n postEvent({ id, type: 'ERROR', code, message, meta });\n};\n\nconst ensureEngine = (): WasmEngine => {\n if (!state.engine) {\n throw new Error('WASM engine is not initialized. Send INIT first.');\n }\n return state.engine;\n};\n\nconst tryLoadEngine = async (): Promise<WasmEngine> => {\n const engine = await loadLlamaWasmEngine();\n if (\n !engine ||\n typeof engine.loadModel !== 'function' ||\n typeof engine.generate !== 'function' ||\n typeof engine.embed !== 'function'\n ) {\n throw new Error('Loaded wasm engine does not expose required methods.');\n }\n return engine;\n};\n\nconst loadModelFromOpfs = async (\n engine: WasmEngine,\n modelId: string,\n opts: Record<string, unknown> | undefined,\n): Promise<void> => {\n // Choice 3 (primary): OPFS sync access handle \u2192 chunked stream \u2192 WASM MEMFS.\n // Never materialises the full model in the JS heap (required for 2GB+ models).\n if (typeof engine.loadModelFromOpfsReader !== 'function') {\n throw new Error(\n 'WASM module is missing OPFS streaming exports (model_vfs_*). ' +\n 'Rebuild with: npm run build:wasm',\n );\n }\n\n try {\n const reader = await openOpfsModelSyncReader(modelId);\n await engine.loadModelFromOpfsReader(modelId, reader, opts);\n return;\n } catch (error) {\n const code = (error as { code?: string })?.code;\n const message = error instanceof Error ? error.message : String(error);\n const syncUnavailable =\n code === 'STORAGE_UNAVAILABLE' || /sync access handle/i.test(message);\n if (!syncUnavailable) {\n throw error;\n }\n }\n\n // Legacy fallback (choice 1): only when sync handles are unavailable (older browsers).\n console.warn(\n `[llama-cpp] OPFS sync access handle unavailable for '${modelId}'; ` +\n 'falling back to full-buffer load (not suitable for models >2GB).',\n );\n const { buffer, sizeBytes } = await readModelBufferFromOpfs(modelId);\n await engine.loadModel(modelId, buffer, { ...(opts ?? {}), modelBytes: sizeBytes });\n};\n\nself.onmessage = async (evt: MessageEvent<WorkerRequest>) => {\n const req = evt.data;\n\n try {\n switch (req.type) {\n case 'INIT': {\n if (!state.initialized) {\n state.engine = await tryLoadEngine();\n await state.engine.init?.();\n state.initialized = true;\n state.wasmEngineContextInitialized = true;\n }\n postEvent({\n id: req.id,\n type: 'RESULT',\n payload: { ok: true, initialized: state.initialized },\n });\n return;\n }\n\n case 'LOAD_MODEL': {\n if (!state.initialized) {\n postError(req.id, 'WASM_INIT_FAILED', 'Worker is not initialized. Send INIT first.');\n return;\n }\n\n const requestModelId = req.modelId;\n\n if (isModelReadyInWorker(requestModelId)) {\n postEvent({\n id: req.id,\n type: 'RESULT',\n payload: { ok: true, modelId: requestModelId, alreadyLoaded: true, ready: true },\n });\n return;\n }\n\n const cachedFailure = state.modelLoadFailureReasons.get(requestModelId);\n if (state.modelLoadOutcomes.get(requestModelId) === 'failed' && cachedFailure) {\n postError(req.id, 'INSUFFICIENT_MEMORY', cachedFailure, {\n modelId: requestModelId,\n cachedFailure: true,\n });\n return;\n }\n\n let inflight = state.modelLoadInflight.get(requestModelId);\n if (!inflight) {\n const engine = ensureEngine();\n inflight = (async () => {\n try {\n await loadModelFromOpfs(engine, requestModelId, req.opts);\n state.loadedModels.add(requestModelId);\n state.modelLoadOutcomes.set(requestModelId, 'loaded');\n state.modelLoadFailureReasons.delete(requestModelId);\n } catch (readErr) {\n const reason =\n readErr instanceof Error ? readErr.message : String(readErr);\n state.modelLoadOutcomes.set(requestModelId, 'failed');\n state.modelLoadFailureReasons.set(requestModelId, reason);\n throw readErr;\n }\n })().finally(() => {\n state.modelLoadInflight.delete(requestModelId);\n });\n state.modelLoadInflight.set(requestModelId, inflight);\n }\n\n try {\n await inflight;\n let measuredFootprintBytes: number | undefined;\n let wasmLinearBytes: number | undefined;\n try {\n const engine = ensureEngine();\n const mem = engine ? await engine.memory?.() : undefined;\n if (mem && typeof mem.wasmLinearBytes === 'number') {\n wasmLinearBytes = mem.wasmLinearBytes;\n }\n if (Array.isArray(mem?.loadedModels)) {\n const row = mem.loadedModels.find(\n (m: { modelId?: string }) => m?.modelId === requestModelId,\n );\n if (row && typeof row.measuredFootprintBytes === 'number' && row.measuredFootprintBytes > 0) {\n measuredFootprintBytes = row.measuredFootprintBytes;\n }\n }\n } catch {\n /* optional calibration read */\n }\n postEvent({\n id: req.id,\n type: 'RESULT',\n payload: {\n ok: true,\n modelId: requestModelId,\n ready: true,\n wasmLinearBytes,\n measuredFootprintBytes,\n },\n });\n } catch (readErr) {\n const reason =\n state.modelLoadFailureReasons.get(requestModelId) ??\n (readErr instanceof Error ? readErr.message : String(readErr));\n postError(\n req.id,\n 'STORAGE_IO_FAILED',\n `Failed to read model '${requestModelId}' from OPFS in worker: ${reason}`,\n { modelId: requestModelId, cachedFailure: true },\n );\n }\n return;\n }\n\n case 'UNLOAD_MODEL': {\n if (!state.loadedModels.has(req.modelId)) {\n clearModelLoadMemo(req.modelId);\n postEvent({\n id: req.id,\n type: 'RESULT',\n payload: { ok: true, modelId: req.modelId, alreadyUnloaded: true },\n });\n return;\n }\n const engine = ensureEngine();\n await engine.unloadModel(req.modelId);\n clearModelLoadMemo(req.modelId);\n postEvent({\n id: req.id,\n type: 'RESULT',\n payload: { ok: true, modelId: req.modelId },\n });\n return;\n }\n\n case 'GENERATE': {\n if (!state.loadedModels.has(req.modelId)) {\n postError(req.id, 'MODEL_NOT_LOADED', `Model '${req.modelId}' is not loaded in worker.`);\n return;\n }\n const engine = ensureEngine();\n\n // Fix #3: use the real streaming callback when stream=true so tokens\n // arrive from the WASM generation loop, not as a post-hoc string split.\n const onToken = req.req.stream\n ? (token: string, index: number) => {\n postEvent({\n id: req.id,\n type: 'TOKEN',\n modelId: req.modelId,\n token,\n index,\n });\n }\n : undefined;\n\n const result = await engine.generate(req.modelId, req.req, onToken);\n postEvent({\n id: req.id,\n type: 'RESULT',\n payload: result,\n });\n return;\n }\n\n case 'EMBED': {\n if (!state.loadedModels.has(req.modelId)) {\n postError(req.id, 'MODEL_NOT_LOADED', `Model '${req.modelId}' is not loaded in worker.`);\n return;\n }\n const engine = ensureEngine();\n const result = await engine.embed(req.modelId, req.input);\n postEvent({\n id: req.id,\n type: 'RESULT',\n payload: result,\n });\n return;\n }\n\n case 'TOKENIZE': {\n if (!state.loadedModels.has(req.modelId)) {\n postError(req.id, 'MODEL_NOT_LOADED', `Model '${req.modelId}' is not loaded in worker.`);\n return;\n }\n const engine = ensureEngine();\n if (typeof engine.tokenize !== 'function') {\n postError(req.id, 'INFERENCE_FAILED', 'tokenize is not supported by this WASM build \u2014 rebuild with npm run build:wasm');\n return;\n }\n const result: TokenizeResult = await engine.tokenize(req.modelId, req.text);\n postEvent({ id: req.id, type: 'RESULT', payload: result });\n return;\n }\n\n case 'DETOKENIZE': {\n if (!state.loadedModels.has(req.modelId)) {\n postError(req.id, 'MODEL_NOT_LOADED', `Model '${req.modelId}' is not loaded in worker.`);\n return;\n }\n const engine = ensureEngine();\n if (typeof engine.detokenize !== 'function') {\n postError(req.id, 'INFERENCE_FAILED', 'detokenize is not supported by this WASM build \u2014 rebuild with npm run build:wasm');\n return;\n }\n const result: DetokenizeResult = await engine.detokenize(req.modelId, req.tokens);\n postEvent({ id: req.id, type: 'RESULT', payload: result });\n return;\n }\n\n case 'CONVERT_GRAMMAR': {\n const engine = ensureEngine();\n if (typeof engine.convertJsonSchemaToGrammar !== 'function') {\n postError(req.id, 'INFERENCE_FAILED', 'convertJsonSchemaToGrammar is not supported by this WASM build \u2014 rebuild with npm run build:wasm');\n return;\n }\n const grammar: string = await engine.convertJsonSchemaToGrammar(req.schemaJson);\n postEvent({ id: req.id, type: 'RESULT', payload: { grammar } });\n return;\n }\n\n case 'HEALTH': {\n const details = state.engine ? await state.engine.health?.() : undefined;\n postEvent({\n id: req.id,\n type: 'RESULT',\n payload: {\n ok: state.initialized,\n initialized: state.initialized,\n loadedModels: state.loadedModels.size,\n details: details ?? {},\n },\n });\n return;\n }\n\n case 'MEMORY': {\n const details = state.engine ? await state.engine.memory?.() : undefined;\n const loadedModelIds = [...state.loadedModels];\n postEvent({\n id: req.id,\n type: 'RESULT',\n payload: {\n pressure: 'unknown',\n loadedModelIds,\n loadedModelCount: loadedModelIds.length,\n maxModels: WASM_MAX_CONCURRENT_MODELS,\n ...(details ?? {}),\n },\n });\n return;\n }\n\n case 'RERANK': {\n if (!state.loadedModels.has(req.modelId)) {\n postError(req.id, 'MODEL_NOT_LOADED', `Model '${req.modelId}' is not loaded in worker.`);\n return;\n }\n const engine = ensureEngine();\n if (typeof engine.rerank !== 'function') {\n postError(req.id, 'INFERENCE_FAILED', 'rerank is not supported by this WASM build');\n return;\n }\n const results = await engine.rerank(req.modelId, req.query, req.documents);\n postEvent({ id: req.id, type: 'RESULT', payload: { results } });\n return;\n }\n\n case 'BENCH': {\n if (!state.loadedModels.has(req.modelId)) {\n postError(req.id, 'MODEL_NOT_LOADED', `Model '${req.modelId}' is not loaded in worker.`);\n return;\n }\n const engine = ensureEngine();\n if (typeof engine.bench !== 'function') {\n postError(req.id, 'INFERENCE_FAILED', 'bench is not supported by this WASM build');\n return;\n }\n const result = await engine.bench(req.modelId, req.pp, req.tg, req.pl, req.nr);\n postEvent({ id: req.id, type: 'RESULT', payload: { result } });\n return;\n }\n\n case 'SAVE_SESSION': {\n if (!state.loadedModels.has(req.modelId)) {\n postError(req.id, 'MODEL_NOT_LOADED', `Model '${req.modelId}' is not loaded in worker.`);\n return;\n }\n const engine = ensureEngine();\n if (typeof engine.saveSession !== 'function') {\n postError(req.id, 'INFERENCE_FAILED', 'saveSession is not supported by this WASM build');\n return;\n }\n const result = await engine.saveSession(req.modelId, req.filepath, req.tokenSize);\n postEvent({ id: req.id, type: 'RESULT', payload: result });\n return;\n }\n\n case 'LOAD_SESSION': {\n if (!state.loadedModels.has(req.modelId)) {\n postError(req.id, 'MODEL_NOT_LOADED', `Model '${req.modelId}' is not loaded in worker.`);\n return;\n }\n const engine = ensureEngine();\n if (typeof engine.loadSession !== 'function') {\n postError(req.id, 'INFERENCE_FAILED', 'loadSession is not supported by this WASM build');\n return;\n }\n const result = await engine.loadSession(req.modelId, req.filepath);\n postEvent({ id: req.id, type: 'RESULT', payload: result });\n return;\n }\n\n case 'APPLY_LORA': {\n if (!state.loadedModels.has(req.modelId)) {\n postError(req.id, 'MODEL_NOT_LOADED', `Model '${req.modelId}' is not loaded in worker.`);\n return;\n }\n const engine = ensureEngine();\n if (typeof engine.applyLoraAdapters !== 'function') {\n postError(req.id, 'INFERENCE_FAILED', 'applyLoraAdapters is not supported by this WASM build');\n return;\n }\n await engine.applyLoraAdapters(req.modelId, req.loraAdapters);\n postEvent({ id: req.id, type: 'RESULT', payload: { ok: true } });\n return;\n }\n\n case 'REMOVE_LORA': {\n if (!state.loadedModels.has(req.modelId)) {\n postError(req.id, 'MODEL_NOT_LOADED', `Model '${req.modelId}' is not loaded in worker.`);\n return;\n }\n const engine = ensureEngine();\n await engine.removeLoraAdapters?.(req.modelId);\n postEvent({ id: req.id, type: 'RESULT', payload: { ok: true } });\n return;\n }\n\n case 'GET_LORA': {\n if (!state.loadedModels.has(req.modelId)) {\n postError(req.id, 'MODEL_NOT_LOADED', `Model '${req.modelId}' is not loaded in worker.`);\n return;\n }\n const engine = ensureEngine();\n const adapters = (await engine.getLoadedLoraAdapters?.(req.modelId)) ?? [];\n postEvent({ id: req.id, type: 'RESULT', payload: { adapters } });\n return;\n }\n\n case 'INIT_MULTIMODAL': {\n if (!state.loadedModels.has(req.modelId)) {\n postError(req.id, 'MODEL_NOT_LOADED', `Model '${req.modelId}' is not loaded in worker.`);\n return;\n }\n const engine = ensureEngine();\n const ok = await engine.initMultimodal?.(req.modelId, req.path, req.useGpu ?? false);\n postEvent({ id: req.id, type: 'RESULT', payload: { ok: !!ok } });\n return;\n }\n\n case 'MULTIMODAL_STATUS': {\n if (!state.loadedModels.has(req.modelId)) {\n postError(req.id, 'MODEL_NOT_LOADED', `Model '${req.modelId}' is not loaded in worker.`);\n return;\n }\n const engine = ensureEngine();\n const status = await engine.multimodalStatus?.(req.modelId);\n postEvent({ id: req.id, type: 'RESULT', payload: status ?? { enabled: false, vision: false, audio: false } });\n return;\n }\n\n case 'RELEASE_MULTIMODAL': {\n const engine = ensureEngine();\n await engine.releaseMultimodal?.(req.modelId);\n postEvent({ id: req.id, type: 'RESULT', payload: { ok: true } });\n return;\n }\n\n case 'INIT_VOCODER': {\n if (!state.loadedModels.has(req.modelId)) {\n postError(req.id, 'MODEL_NOT_LOADED', `Model '${req.modelId}' is not loaded in worker.`);\n return;\n }\n const engine = ensureEngine();\n const ok = await engine.initVocoder?.(req.modelId, req.path, req.nBatch ?? 512);\n postEvent({ id: req.id, type: 'RESULT', payload: { ok: !!ok } });\n return;\n }\n\n case 'VOCODER_ENABLED': {\n if (!state.loadedModels.has(req.modelId)) {\n postError(req.id, 'MODEL_NOT_LOADED', `Model '${req.modelId}' is not loaded in worker.`);\n return;\n }\n const engine = ensureEngine();\n const enabled = await engine.vocoderEnabled?.(req.modelId);\n postEvent({ id: req.id, type: 'RESULT', payload: { enabled: !!enabled } });\n return;\n }\n\n case 'RELEASE_VOCODER': {\n const engine = ensureEngine();\n await engine.releaseVocoder?.(req.modelId);\n postEvent({ id: req.id, type: 'RESULT', payload: { ok: true } });\n return;\n }\n\n case 'FORMATTED_AUDIO': {\n if (!state.loadedModels.has(req.modelId)) {\n postError(req.id, 'MODEL_NOT_LOADED', `Model '${req.modelId}' is not loaded in worker.`);\n return;\n }\n const engine = ensureEngine();\n const result = await engine.formattedAudioCompletion?.(\n req.modelId,\n req.speakerJson,\n req.textToSpeak,\n );\n postEvent({ id: req.id, type: 'RESULT', payload: result ?? { prompt: '' } });\n return;\n }\n\n case 'AUDIO_GUIDE_TOKENS': {\n if (!state.loadedModels.has(req.modelId)) {\n postError(req.id, 'MODEL_NOT_LOADED', `Model '${req.modelId}' is not loaded in worker.`);\n return;\n }\n const engine = ensureEngine();\n const tokens = await engine.audioGuideTokens?.(req.modelId, req.textToSpeak);\n postEvent({ id: req.id, type: 'RESULT', payload: { tokens: tokens ?? [] } });\n return;\n }\n\n case 'DECODE_AUDIO_TOKENS': {\n if (!state.loadedModels.has(req.modelId)) {\n postError(req.id, 'MODEL_NOT_LOADED', `Model '${req.modelId}' is not loaded in worker.`);\n return;\n }\n const engine = ensureEngine();\n const audio = await engine.decodeAudioTokens?.(req.modelId, req.tokens);\n postEvent({ id: req.id, type: 'RESULT', payload: { audio: audio ?? [] } });\n return;\n }\n\n default: {\n const unknownReq = req as any;\n postError(\n typeof unknownReq?.id === 'string' ? unknownReq.id : 'unknown',\n 'INVALID_REQUEST',\n `Unknown worker request type '${unknownReq?.type}'.`,\n );\n }\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const code = req.type === 'INIT' ? 'WASM_INIT_FAILED' : 'INFERENCE_FAILED';\n postError(req.id, code, message, { requestType: req.type });\n }\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["raw", "getStorageApi", "getRootDirectory", "getRootDirectory"]
7
+ }
@@ -0,0 +1,74 @@
1
+ /* @ts-self-types="./llama_engine.d.ts" */
2
+ /* eslint-disable */
3
+ /* tslint:disable */
4
+
5
+ /**
6
+ * Public API of the llama_engine Wasm module.
7
+ * Consumed by src/workers/wasm.engine.ts.
8
+ */
9
+
10
+ /** Rust-level engine initialiser — call once after the default export resolves. */
11
+ export function init(): void;
12
+
13
+ /** Load a GGUF model from raw bytes. */
14
+ export function load_model(model_id: string, bytes: Uint8Array, opts_json: string): void;
15
+
16
+ /** Unload a loaded model and free resources. */
17
+ export function unload_model(model_id: string): void;
18
+
19
+ /** Point the active inference handler at a loaded model. */
20
+ export function set_active_model(model_id: string): void;
21
+
22
+ /** Return the active model id. */
23
+ export function get_active_model(): string;
24
+
25
+ /** List resident models as JSON. */
26
+ export function list_loaded_models(): string;
27
+
28
+ /** Run text generation. Returns JSON-serialised GenerateResponse. */
29
+ export function generate(model_id: string, req_json: string): string;
30
+
31
+ /** Streaming generation with per-token callback (JSPI build). */
32
+ export function generate_stream(
33
+ model_id: string,
34
+ req_json: string,
35
+ on_token: (token: string, index: number) => void,
36
+ ): string;
37
+
38
+ /** Generate text embeddings. Returns JSON-serialised EmbedResponse. */
39
+ export function embed(model_id: string, req_json: string): string;
40
+
41
+ /** Engine health status as a JSON string. */
42
+ export function health(): string;
43
+
44
+ /** Current memory usage as a JSON string. */
45
+ export function memory_snapshot(): string;
46
+
47
+ /** Begin streaming a model into MEMFS. Returns the temp VFS path. */
48
+ export function model_vfs_begin(total_bytes?: number, opts_json?: string): string;
49
+ /** Append a chunk to an in-progress VFS model write. */
50
+ export function model_vfs_write(vfs_path: string, chunk: Uint8Array): void;
51
+ /** Abort a partial VFS write and remove the temp file. */
52
+ export function model_vfs_abort(vfs_path: string): void;
53
+ /** Finish a streamed VFS write and load the model (deletes the VFS file). */
54
+ export function load_model_from_vfs(model_id: string, vfs_path: string, opts_json: string): void;
55
+ /** Load from an existing VFS path (HeapFS zero-copy mmap). */
56
+ export function load_model_from_path(model_id: string, vfs_path: string, opts_json: string): void;
57
+ /** Bind JS-side reader for JSPI async load (no full-model WASM heap copy). */
58
+ export function async_model_bind(
59
+ vfs_path: string,
60
+ size_bytes: number,
61
+ readFn: (offset: number, length: number) => Uint8Array,
62
+ ): void;
63
+ /** True when this build includes sync external fread (cap-wasm-fs). Does not require native JSPI. */
64
+ export function can_use_async_file(): boolean;
65
+ /** Raw Emscripten module (for HeapFS helpers). */
66
+ export function getEmscriptenModule(): unknown;
67
+
68
+ /**
69
+ * Default export — loads and instantiates the WebAssembly module.
70
+ * Resolves the .wasm binary relative to import.meta.url when called without arguments.
71
+ */
72
+ export default function initWasm(
73
+ pathHint?: string | URL,
74
+ ): Promise<unknown>;