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,504 @@
1
+ import { canUseAsyncFileRead, asyncReaderFromBytes, } from './async-file';
2
+ import { ensureWasmTmpDir, heapfsAlloc, heapfsModelPath, heapfsWrite, patchHeapFS, supportsHeapFS, } from './heapfs';
3
+ const safeJsonParse = (raw, fallback) => {
4
+ try {
5
+ return JSON.parse(raw);
6
+ }
7
+ catch (_a) {
8
+ return fallback;
9
+ }
10
+ };
11
+ /** Models above this use VFS streaming first (HeapFS/mmap can overflow JS stack). */
12
+ const LARGE_MODEL_BYTES = 500 * 1024 * 1024;
13
+ /** Legacy MEMFS streaming — use_mmap=false (full file copied into WASM VFS). */
14
+ const wasmLoadOptsJson = (opts, overrides) => JSON.stringify(Object.assign(Object.assign({ use_mmap: false }, (opts !== null && opts !== void 0 ? opts : {})), overrides));
15
+ /** JSPI async fread — model stays in JS; C++ reads on demand (use_mmap=false). */
16
+ const wasmAsyncLoadOptsJson = (opts, overrides) => JSON.stringify(Object.assign(Object.assign({ use_mmap: false }, (opts !== null && opts !== void 0 ? opts : {})), overrides));
17
+ const loadViaAsyncFile = (mod, modelId, sizeBytes, readChunk, opts) => {
18
+ const begin = mod.model_vfs_begin;
19
+ const bind = mod.async_model_bind;
20
+ const finish = mod.load_model_from_vfs;
21
+ const abort = mod.model_vfs_abort;
22
+ if (!begin || !bind || !finish) {
23
+ throw new Error('Wasm module missing JSPI async file exports — rebuild with: npm run build:wasm:jspi');
24
+ }
25
+ const optsJson = wasmAsyncLoadOptsJson(opts);
26
+ const vfsPath = begin(sizeBytes, optsJson);
27
+ if (!vfsPath)
28
+ throw new Error('model_vfs_begin returned empty path');
29
+ try {
30
+ bind(vfsPath, sizeBytes, (offset, length) => readChunk(offset, length));
31
+ finish(modelId, vfsPath, optsJson);
32
+ }
33
+ catch (err) {
34
+ abort === null || abort === void 0 ? void 0 : abort(vfsPath);
35
+ throw err;
36
+ }
37
+ };
38
+ const isStackOverflowError = (err) => {
39
+ const msg = err instanceof Error ? err.message : String(err);
40
+ return /maximum call stack size exceeded/i.test(msg);
41
+ };
42
+ const wasmMemoryDiagnostics = (em) => {
43
+ var _a, _b;
44
+ if (!em) {
45
+ return { wasmMemoryAccessible: false };
46
+ }
47
+ const wasmMem = em.wasmMemory;
48
+ const buffer = (_a = wasmMem === null || wasmMem === void 0 ? void 0 : wasmMem.buffer) !== null && _a !== void 0 ? _a : (_b = em.HEAPU8) === null || _b === void 0 ? void 0 : _b.buffer;
49
+ if (!buffer) {
50
+ return { wasmMemoryAccessible: false };
51
+ }
52
+ return {
53
+ wasmMemoryAccessible: true,
54
+ wasmLinearBytes: buffer.byteLength,
55
+ wasmLinearMb: +(buffer.byteLength / 1024 / 1024).toFixed(1),
56
+ wasmMemoryShared: (wasmMem === null || wasmMem === void 0 ? void 0 : wasmMem.buffer) instanceof SharedArrayBuffer,
57
+ };
58
+ };
59
+ // Resolve llama_engine.js candidates (worker-relative + app overrides).
60
+ const resolveModuleCandidates = () => {
61
+ var _a, _b;
62
+ const candidates = [];
63
+ const g = globalThis;
64
+ for (const key of ['__LLAMA_WASM_MODULE_URL__', '__LLAMA_ENGINE_URL__']) {
65
+ const customUrl = g === null || g === void 0 ? void 0 : g[key];
66
+ if (typeof customUrl === 'string' && customUrl.length > 0) {
67
+ candidates.push(customUrl);
68
+ }
69
+ }
70
+ try {
71
+ // Static import.meta.url reference — detected correctly by bundlers.
72
+ const base = new URL('../../wasm/llama_engine.js', import.meta.url).href;
73
+ candidates.push(base);
74
+ candidates.push(new URL('../../dist/wasm/llama_engine.js', import.meta.url).href);
75
+ }
76
+ catch (_c) {
77
+ // import.meta.url unavailable (CommonJS transform or test runner).
78
+ }
79
+ const origin = (_b = (_a = g === null || g === void 0 ? void 0 : g.location) === null || _a === void 0 ? void 0 : _a.origin) !== null && _b !== void 0 ? _b : '';
80
+ if (origin) {
81
+ candidates.push(`${origin}/llama-cpp/wasm/llama_engine.js`);
82
+ candidates.push(`${origin}/dist/wasm/llama_engine.js`);
83
+ candidates.push(`${origin}/wasm/llama_engine.js`);
84
+ }
85
+ return [...new Set(candidates)];
86
+ };
87
+ const loadWasmModule = async () => {
88
+ let lastError;
89
+ for (const url of resolveModuleCandidates()) {
90
+ try {
91
+ const mod = (await import(/* @vite-ignore */ url));
92
+ if (mod && typeof mod.default === 'function') {
93
+ await mod.default();
94
+ }
95
+ if (typeof mod.load_model === 'function' && typeof mod.generate === 'function' && typeof mod.embed === 'function') {
96
+ return mod;
97
+ }
98
+ lastError = new Error(`Module loaded but missing required exports at ${url}`);
99
+ }
100
+ catch (error) {
101
+ lastError = error;
102
+ }
103
+ }
104
+ throw new Error(`Unable to load wasm wrapper module (llama_engine.js). ` +
105
+ `Set window.__LLAMA_WASM_MODULE_URL__ to llama_engine.js. ` +
106
+ `Last error: ${lastError instanceof Error ? lastError.message : String(lastError)}`);
107
+ };
108
+ export const loadLlamaWasmEngine = async () => {
109
+ const mod = await loadWasmModule();
110
+ const emscripten = () => { var _a, _b; return (_b = (_a = mod.getEmscriptenModule) === null || _a === void 0 ? void 0 : _a.call(mod)) !== null && _b !== void 0 ? _b : null; };
111
+ const ensureHeapFS = () => {
112
+ const em = emscripten();
113
+ if (!em || !supportsHeapFS(em)) {
114
+ throw new Error('Wasm build missing HeapFS runtime (mmapAlloc/MEMFS/FS) — rebuild with npm run build:wasm');
115
+ }
116
+ patchHeapFS(em);
117
+ return em;
118
+ };
119
+ const ensureVfsReady = () => {
120
+ const em = emscripten();
121
+ if (em && supportsHeapFS(em)) {
122
+ ensureWasmTmpDir(em);
123
+ }
124
+ };
125
+ return {
126
+ init: async () => {
127
+ var _a, _b;
128
+ (_b = ((_a = mod.init_engine) !== null && _a !== void 0 ? _a : mod.init)) === null || _b === void 0 ? void 0 : _b();
129
+ const em = emscripten();
130
+ if (em && supportsHeapFS(em)) {
131
+ patchHeapFS(em);
132
+ ensureWasmTmpDir(em);
133
+ }
134
+ },
135
+ loadModel: async (modelId, modelBuffer, opts) => {
136
+ var _a;
137
+ const bytes = new Uint8Array(modelBuffer);
138
+ const em = emscripten();
139
+ const asyncReady = typeof mod.can_use_async_file === 'function'
140
+ ? mod.can_use_async_file()
141
+ : canUseAsyncFileRead((_a = em === null || em === void 0 ? void 0 : em.__llamaWasmJspi) !== null && _a !== void 0 ? _a : false);
142
+ // JSPI async fread: register JS reader — no full-model copy into WASM linear memory.
143
+ if (asyncReady) {
144
+ const reader = asyncReaderFromBytes(bytes);
145
+ loadViaAsyncFile(mod, modelId, reader.sizeBytes, reader.readChunk, opts);
146
+ return;
147
+ }
148
+ // HeapFS fallback: mmapAlloc places GGUF in WASM heap (wllama fallback when no JSPI).
149
+ const begin = mod.model_vfs_begin;
150
+ const write = mod.model_vfs_write;
151
+ const finish = mod.load_model_from_vfs;
152
+ const abort = mod.model_vfs_abort;
153
+ if (begin && write && finish) {
154
+ ensureVfsReady();
155
+ const optsJson = wasmLoadOptsJson(opts);
156
+ const vfsPath = begin(bytes.length, optsJson);
157
+ if (!vfsPath)
158
+ throw new Error('model_vfs_begin returned empty path');
159
+ try {
160
+ const CHUNK = 32 * 1024 * 1024;
161
+ for (let offset = 0; offset < bytes.length; offset += CHUNK) {
162
+ write(vfsPath, bytes.subarray(offset, offset + CHUNK));
163
+ }
164
+ finish(modelId, vfsPath, optsJson);
165
+ }
166
+ catch (err) {
167
+ abort === null || abort === void 0 ? void 0 : abort(vfsPath);
168
+ throw err;
169
+ }
170
+ return;
171
+ }
172
+ const loadModelFn = mod.load_model;
173
+ if (!loadModelFn)
174
+ throw new Error('Wasm module missing load_model export');
175
+ loadModelFn(modelId, bytes, JSON.stringify(opts !== null && opts !== void 0 ? opts : {}));
176
+ },
177
+ loadModelFromOpfsReader: async (modelId, reader, opts) => {
178
+ var _a;
179
+ const loadFromPath = mod.load_model_from_path;
180
+ const begin = mod.model_vfs_begin;
181
+ const write = mod.model_vfs_write;
182
+ const finish = mod.load_model_from_vfs;
183
+ const abort = mod.model_vfs_abort;
184
+ const chunkSize = 4 * 1024 * 1024;
185
+ const em = emscripten();
186
+ const asyncReady = typeof mod.can_use_async_file === 'function'
187
+ ? mod.can_use_async_file()
188
+ : canUseAsyncFileRead((_a = em === null || em === void 0 ? void 0 : em.__llamaWasmJspi) !== null && _a !== void 0 ? _a : false);
189
+ const loadViaAsyncOpfs = () => {
190
+ loadViaAsyncFile(mod, modelId, reader.sizeBytes, (offset, length) => reader.readChunk(offset, length), opts);
191
+ };
192
+ const streamOpfsToVfs = (useMmap) => {
193
+ if (!begin || !write || !finish) {
194
+ throw new Error('Wasm module missing OPFS streaming exports (model_vfs_* / load_model_from_path)');
195
+ }
196
+ ensureVfsReady();
197
+ const vfsPath = begin(reader.sizeBytes, wasmLoadOptsJson(opts, { use_mmap: useMmap }));
198
+ if (!vfsPath) {
199
+ throw new Error('model_vfs_begin returned empty path');
200
+ }
201
+ const optsJson = wasmLoadOptsJson(opts, { use_mmap: useMmap });
202
+ try {
203
+ for (let offset = 0; offset < reader.sizeBytes;) {
204
+ const chunk = reader.readChunk(offset, chunkSize);
205
+ if (chunk.byteLength === 0) {
206
+ break;
207
+ }
208
+ write(vfsPath, chunk);
209
+ offset += chunk.byteLength;
210
+ }
211
+ finish(modelId, vfsPath, optsJson);
212
+ }
213
+ catch (error) {
214
+ abort === null || abort === void 0 ? void 0 : abort(vfsPath);
215
+ throw error;
216
+ }
217
+ };
218
+ const tryHeapFSLoad = () => {
219
+ if (!loadFromPath) {
220
+ throw new Error('Wasm module missing load_model_from_path');
221
+ }
222
+ const emMod = ensureHeapFS();
223
+ const basename = `${modelId.replace(/[^\w.-]/g, '_')}.gguf`;
224
+ const vfsPath = heapfsModelPath(basename);
225
+ emMod.FS.createDataFile('/models', basename, new ArrayBuffer(0), true, true, true);
226
+ const fileId = heapfsAlloc(emMod, basename, reader.sizeBytes, true);
227
+ for (let offset = 0; offset < reader.sizeBytes;) {
228
+ const chunk = reader.readChunk(offset, chunkSize);
229
+ if (chunk.byteLength === 0)
230
+ break;
231
+ heapfsWrite(emMod, fileId, chunk, offset);
232
+ offset += chunk.byteLength;
233
+ }
234
+ loadFromPath(modelId, vfsPath, wasmLoadOptsJson(opts, { use_mmap: true }));
235
+ };
236
+ try {
237
+ if (asyncReady) {
238
+ loadViaAsyncOpfs();
239
+ return;
240
+ }
241
+ const preferVfs = reader.sizeBytes >= LARGE_MODEL_BYTES || (opts === null || opts === void 0 ? void 0 : opts.preferVfsStreaming) === true;
242
+ if (preferVfs) {
243
+ streamOpfsToVfs(false);
244
+ return;
245
+ }
246
+ if (loadFromPath) {
247
+ try {
248
+ tryHeapFSLoad();
249
+ return;
250
+ }
251
+ catch (heapErr) {
252
+ const reason = isStackOverflowError(heapErr)
253
+ ? 'HeapFS/mmap caused stack overflow'
254
+ : 'HeapFS load failed';
255
+ console.warn(`[llama-cpp] ${reason}; falling back to VFS streaming:`, heapErr);
256
+ }
257
+ }
258
+ streamOpfsToVfs(false);
259
+ }
260
+ finally {
261
+ reader.close();
262
+ }
263
+ },
264
+ unloadModel: async (modelId) => {
265
+ const unloadModel = mod.unload_model;
266
+ if (!unloadModel)
267
+ throw new Error('Wasm module missing unload_model export');
268
+ unloadModel(modelId);
269
+ },
270
+ generate: async (modelId, req, onToken) => {
271
+ if (onToken && typeof mod.generate_stream === 'function') {
272
+ const em = emscripten();
273
+ // JSPI build: tokens delivered incrementally via EM_ASYNC_JS in C++.
274
+ if (em === null || em === void 0 ? void 0 : em.__llamaWasmJspi) {
275
+ em.__llamaStreamOnToken = async (token, index) => {
276
+ onToken(token, index);
277
+ };
278
+ try {
279
+ const raw = mod.generate_stream(modelId, JSON.stringify(req !== null && req !== void 0 ? req : {}), () => { });
280
+ return safeJsonParse(raw, {
281
+ text: '',
282
+ tokens_predicted: 0,
283
+ tokens_evaluated: 0,
284
+ finish_reason: 'error',
285
+ });
286
+ }
287
+ finally {
288
+ em.__llamaStreamOnToken = undefined;
289
+ }
290
+ }
291
+ const raw = mod.generate_stream(modelId, JSON.stringify(req !== null && req !== void 0 ? req : {}), onToken);
292
+ return safeJsonParse(raw, {
293
+ text: '',
294
+ tokens_predicted: 0,
295
+ tokens_evaluated: 0,
296
+ finish_reason: 'error',
297
+ });
298
+ }
299
+ const generate = mod.generate;
300
+ if (!generate)
301
+ throw new Error('Wasm module missing generate export');
302
+ const raw = generate(modelId, JSON.stringify(req !== null && req !== void 0 ? req : {}));
303
+ return safeJsonParse(raw, {
304
+ text: '',
305
+ tokens_predicted: 0,
306
+ tokens_evaluated: 0,
307
+ finish_reason: 'error',
308
+ });
309
+ },
310
+ embed: async (modelId, input) => {
311
+ const embed = mod.embed;
312
+ if (!embed)
313
+ throw new Error('Wasm module missing embed export');
314
+ const raw = embed(modelId, JSON.stringify({ input }));
315
+ return safeJsonParse(raw, { vectors: [] });
316
+ },
317
+ tokenize: async (modelId, text) => {
318
+ if (!mod.tokenize) {
319
+ throw new Error('Wasm module missing tokenize export — rebuild with npm run build:wasm');
320
+ }
321
+ const raw = mod.tokenize(modelId, text);
322
+ const parsed = safeJsonParse(raw, {});
323
+ const tokens = Array.isArray(parsed['tokens'])
324
+ ? parsed['tokens']
325
+ : [];
326
+ return { tokens, has_media: Boolean(parsed['has_media']) };
327
+ },
328
+ detokenize: async (modelId, tokens) => {
329
+ var _a;
330
+ if (!mod.detokenize) {
331
+ throw new Error('Wasm module missing detokenize export — rebuild with npm run build:wasm');
332
+ }
333
+ const raw = mod.detokenize(modelId, JSON.stringify(tokens));
334
+ const parsed = safeJsonParse(raw, {});
335
+ return { text: (_a = parsed.text) !== null && _a !== void 0 ? _a : raw };
336
+ },
337
+ convertJsonSchemaToGrammar: async (schemaJson) => {
338
+ if (!mod.convert_json_schema_to_grammar) {
339
+ throw new Error('Wasm module missing convert_json_schema_to_grammar export — rebuild with npm run build:wasm');
340
+ }
341
+ return mod.convert_json_schema_to_grammar(schemaJson);
342
+ },
343
+ rerank: async (modelId, query, documents) => {
344
+ if (!mod.rerank) {
345
+ throw new Error('Wasm module missing rerank export — rebuild with npm run build:wasm');
346
+ }
347
+ const raw = mod.rerank(modelId, query, JSON.stringify(documents));
348
+ const parsed = safeJsonParse(raw, []);
349
+ if (!Array.isArray(parsed)) {
350
+ throw new Error(typeof parsed === 'object' && parsed && 'error' in parsed
351
+ ? String(parsed.error)
352
+ : 'Invalid rerank response');
353
+ }
354
+ return parsed;
355
+ },
356
+ bench: async (modelId, pp, tg, pl, nr) => {
357
+ if (!mod.bench) {
358
+ throw new Error('Wasm module missing bench export — rebuild with npm run build:wasm');
359
+ }
360
+ return mod.bench(modelId, pp, tg, pl, nr);
361
+ },
362
+ saveSession: async (modelId, filepath, tokenSize) => {
363
+ var _a;
364
+ if (!mod.save_session) {
365
+ throw new Error('Wasm module missing save_session export — rebuild with npm run build:wasm');
366
+ }
367
+ const raw = mod.save_session(modelId, filepath, tokenSize);
368
+ const parsed = safeJsonParse(raw, {});
369
+ if (parsed.error)
370
+ throw new Error(parsed.error);
371
+ return { tokens_saved: (_a = parsed.tokens_saved) !== null && _a !== void 0 ? _a : 0 };
372
+ },
373
+ loadSession: async (modelId, filepath) => {
374
+ var _a, _b;
375
+ if (!mod.load_session) {
376
+ throw new Error('Wasm module missing load_session export — rebuild with npm run build:wasm');
377
+ }
378
+ const raw = mod.load_session(modelId, filepath);
379
+ const parsed = safeJsonParse(raw, {});
380
+ if (parsed.error)
381
+ throw new Error(parsed.error);
382
+ return {
383
+ tokens_loaded: (_a = parsed.tokens_loaded) !== null && _a !== void 0 ? _a : 0,
384
+ prompt: (_b = parsed.prompt) !== null && _b !== void 0 ? _b : '',
385
+ };
386
+ },
387
+ applyLoraAdapters: async (modelId, loraAdapters) => {
388
+ if (!mod.apply_lora_adapters) {
389
+ throw new Error('Wasm module missing apply_lora_adapters export — rebuild with npm run build:wasm');
390
+ }
391
+ mod.apply_lora_adapters(modelId, JSON.stringify(loraAdapters));
392
+ },
393
+ removeLoraAdapters: async (modelId) => {
394
+ if (!mod.remove_lora_adapters) {
395
+ throw new Error('Wasm module missing remove_lora_adapters export — rebuild with npm run build:wasm');
396
+ }
397
+ mod.remove_lora_adapters(modelId);
398
+ },
399
+ getLoadedLoraAdapters: async (modelId) => {
400
+ if (!mod.get_loaded_lora_adapters) {
401
+ throw new Error('Wasm module missing get_loaded_lora_adapters export — rebuild with npm run build:wasm');
402
+ }
403
+ const raw = mod.get_loaded_lora_adapters(modelId);
404
+ return safeJsonParse(raw, []);
405
+ },
406
+ initMultimodal: async (modelId, path, useGpu = false) => {
407
+ if (!mod.init_multimodal) {
408
+ throw new Error('Wasm module missing init_multimodal export — rebuild with npm run build:wasm');
409
+ }
410
+ const raw = mod.init_multimodal(modelId, path, useGpu);
411
+ const parsed = safeJsonParse(raw, {});
412
+ if (parsed.error)
413
+ throw new Error(parsed.error);
414
+ return !!parsed.ok;
415
+ },
416
+ multimodalStatus: async (modelId) => {
417
+ if (!mod.multimodal_status) {
418
+ throw new Error('Wasm module missing multimodal_status export — rebuild with npm run build:wasm');
419
+ }
420
+ const raw = mod.multimodal_status(modelId);
421
+ return safeJsonParse(raw, {
422
+ enabled: false,
423
+ vision: false,
424
+ audio: false,
425
+ });
426
+ },
427
+ releaseMultimodal: async (modelId) => {
428
+ var _a;
429
+ (_a = mod.release_multimodal) === null || _a === void 0 ? void 0 : _a.call(mod, modelId);
430
+ },
431
+ initVocoder: async (modelId, path, nBatch = 512) => {
432
+ if (!mod.init_vocoder) {
433
+ throw new Error('Wasm module missing init_vocoder export — rebuild with npm run build:wasm');
434
+ }
435
+ const raw = mod.init_vocoder(modelId, path, nBatch);
436
+ const parsed = safeJsonParse(raw, {});
437
+ if (parsed.error)
438
+ throw new Error(parsed.error);
439
+ return !!parsed.ok;
440
+ },
441
+ vocoderEnabled: async (modelId) => {
442
+ if (!mod.vocoder_enabled) {
443
+ return false;
444
+ }
445
+ const raw = mod.vocoder_enabled(modelId);
446
+ const parsed = safeJsonParse(raw, {});
447
+ return !!parsed.enabled;
448
+ },
449
+ releaseVocoder: async (modelId) => {
450
+ var _a;
451
+ (_a = mod.release_vocoder) === null || _a === void 0 ? void 0 : _a.call(mod, modelId);
452
+ },
453
+ formattedAudioCompletion: async (modelId, speakerJson, textToSpeak) => {
454
+ var _a;
455
+ if (!mod.formatted_audio_completion) {
456
+ throw new Error('Wasm module missing formatted_audio_completion export — rebuild with npm run build:wasm');
457
+ }
458
+ const raw = mod.formatted_audio_completion(modelId, speakerJson, textToSpeak);
459
+ const parsed = safeJsonParse(raw, {});
460
+ if (parsed.error)
461
+ throw new Error(parsed.error);
462
+ return { prompt: (_a = parsed.prompt) !== null && _a !== void 0 ? _a : '', grammar: parsed.grammar };
463
+ },
464
+ audioGuideTokens: async (modelId, textToSpeak) => {
465
+ if (!mod.audio_guide_tokens) {
466
+ throw new Error('Wasm module missing audio_guide_tokens export — rebuild with npm run build:wasm');
467
+ }
468
+ const raw = mod.audio_guide_tokens(modelId, textToSpeak);
469
+ const parsed = safeJsonParse(raw, []);
470
+ if (!Array.isArray(parsed)) {
471
+ throw new Error(typeof parsed === 'object' && parsed && 'error' in parsed
472
+ ? String(parsed.error)
473
+ : 'Invalid audio guide tokens response');
474
+ }
475
+ return parsed;
476
+ },
477
+ decodeAudioTokens: async (modelId, tokens) => {
478
+ if (!mod.decode_audio_tokens) {
479
+ throw new Error('Wasm module missing decode_audio_tokens export — rebuild with npm run build:wasm');
480
+ }
481
+ const raw = mod.decode_audio_tokens(modelId, JSON.stringify(tokens));
482
+ const parsed = safeJsonParse(raw, []);
483
+ if (!Array.isArray(parsed)) {
484
+ throw new Error(typeof parsed === 'object' && parsed && 'error' in parsed
485
+ ? String(parsed.error)
486
+ : 'Invalid decode audio response');
487
+ }
488
+ return parsed;
489
+ },
490
+ health: async () => {
491
+ var _a, _b, _c, _d, _e;
492
+ const base = mod.health
493
+ ? safeJsonParse(mod.health(), {})
494
+ : {};
495
+ const em = emscripten();
496
+ return Object.assign(Object.assign(Object.assign({}, base), wasmMemoryDiagnostics(em)), { wasmJspi: (_a = em === null || em === void 0 ? void 0 : em.__llamaWasmJspi) !== null && _a !== void 0 ? _a : false, wasmAsyncFile: (_d = (_b = em === null || em === void 0 ? void 0 : em.__llamaWasmAsyncFile) !== null && _b !== void 0 ? _b : (_c = mod.can_use_async_file) === null || _c === void 0 ? void 0 : _c.call(mod)) !== null && _d !== void 0 ? _d : false, wasmPthread: (_e = em === null || em === void 0 ? void 0 : em.__llamaWasmPthread) !== null && _e !== void 0 ? _e : false });
497
+ },
498
+ memory: async () => {
499
+ const em = emscripten();
500
+ return Object.assign({ pressure: 'unknown' }, wasmMemoryDiagnostics(em));
501
+ },
502
+ };
503
+ };
504
+ //# sourceMappingURL=wasm.engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wasm.engine.js","sourceRoot":"","sources":["../../../src/workers/wasm.engine.ts"],"names":[],"mappings":"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","sourcesContent":["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 — 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 — 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 — 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 — 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 — 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) — 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 — 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 — 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 — 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 — 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 — 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 — 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 — 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 — 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 — 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 — 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 — 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 — 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 — 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 — 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 — 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 — 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 — 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"]}