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,521 @@
1
+ import { WebProvider } from './isomorphic/provider.web';
2
+ import { ensureModelInOpfs } from './storage/opfs.store';
3
+ import { listManifestEntries } from './storage/manifest';
4
+ // ---------------------------------------------------------------------------
5
+ // Fix #4: LlamaCppWeb now delegates real inference work to WebProvider so
6
+ // that calling the standard Capacitor LlamaCpp API on the web platform routes
7
+ // through the WASM engine rather than throwing "not supported" errors.
8
+ // ---------------------------------------------------------------------------
9
+ const MODEL_DESC_STUB = {
10
+ desc: 'WASM model',
11
+ size: 0,
12
+ nEmbd: 0,
13
+ nParams: 0,
14
+ chatTemplates: {
15
+ llamaChat: true,
16
+ minja: {
17
+ default: true,
18
+ defaultCaps: {
19
+ tools: false, toolCalls: false, toolResponses: false,
20
+ systemRole: true, parallelToolCalls: false, toolCallId: false,
21
+ },
22
+ toolUse: false,
23
+ toolUseCaps: {
24
+ tools: false, toolCalls: false, toolResponses: false,
25
+ systemRole: true, parallelToolCalls: false, toolCallId: false,
26
+ },
27
+ },
28
+ },
29
+ metadata: {},
30
+ isChatTemplateSupported: true,
31
+ };
32
+ /**
33
+ * Format a message array into a prompt string using the specified template.
34
+ * Supports the four most common open-weight model formats. Defaults to ChatML.
35
+ */
36
+ function formatMessagesWithTemplate(messages, template) {
37
+ const tpl = (template !== null && template !== void 0 ? template : 'chatml').toLowerCase();
38
+ if (tpl === 'llama3' || tpl === 'llama-3') {
39
+ const parts = messages.map((m) => `<|start_header_id|>${m.role}<|end_header_id|>\n\n${m.content}<|eot_id|>`);
40
+ return `<|begin_of_text|>${parts.join('')}<|start_header_id|>assistant<|end_header_id|>\n\n`;
41
+ }
42
+ if (tpl === 'mistral') {
43
+ // Mistral: [INST] user [/INST] assistant </s> [INST] ...
44
+ let out = '';
45
+ for (let i = 0; i < messages.length; i++) {
46
+ const m = messages[i];
47
+ if (m.role === 'system') {
48
+ out += `[INST] ${m.content}\n`;
49
+ }
50
+ else if (m.role === 'user') {
51
+ out += `[INST] ${m.content} [/INST]`;
52
+ }
53
+ else if (m.role === 'assistant') {
54
+ out += ` ${m.content}</s>`;
55
+ }
56
+ }
57
+ return out;
58
+ }
59
+ if (tpl === 'gemma' || tpl === 'gemma2') {
60
+ const parts = messages.map((m) => `<start_of_turn>${m.role}\n${m.content}<end_of_turn>`);
61
+ return `${parts.join('\n')}\n<start_of_turn>model\n`;
62
+ }
63
+ // Default: ChatML — widely used by Qwen, Phi, Hermes, OpenChat, etc.
64
+ const parts = messages.map((m) => `<|im_start|>${m.role}\n${m.content}<|im_end|>`);
65
+ return `${parts.join('\n')}\n<|im_start|>assistant\n`;
66
+ }
67
+ const activeDownloads = new Map();
68
+ /** Map a user-facing path to a WASM VFS path (MEMFS /tmp). */
69
+ function vfsPathForWeb(filepath) {
70
+ var _a;
71
+ if (filepath.startsWith('/'))
72
+ return filepath;
73
+ const base = (_a = filepath.split(/[/\\]/).pop()) !== null && _a !== void 0 ? _a : 'file.bin';
74
+ return `/tmp/${base}`;
75
+ }
76
+ export class LlamaCppWeb {
77
+ constructor() {
78
+ this.provider = new WebProvider();
79
+ // contextId → modelId
80
+ this.contextToModel = new Map();
81
+ // eventName → Set of listener callbacks
82
+ this.listeners = new Map();
83
+ }
84
+ emitListener(eventName, data) {
85
+ var _a;
86
+ (_a = this.listeners.get(eventName)) === null || _a === void 0 ? void 0 : _a.forEach((cb) => cb(data));
87
+ }
88
+ hasListeners(eventName) {
89
+ const set = this.listeners.get(eventName);
90
+ return !!set && set.size > 0;
91
+ }
92
+ // -------------------------------------------------------------------------
93
+ // Core initialization
94
+ // -------------------------------------------------------------------------
95
+ async toggleNativeLog() {
96
+ // No-op on web; no native log callback to toggle.
97
+ }
98
+ async setContextLimit(_opts) {
99
+ // No-op on web; WebProvider manages its own slot limit via DefaultModelScheduler.
100
+ }
101
+ async modelInfo({ path }) {
102
+ var _a;
103
+ const entry = await listManifestEntries().then((es) => es.find((e) => e.modelId === path || e.path === path));
104
+ return Object.assign(Object.assign({}, MODEL_DESC_STUB), { path, desc: 'WASM model (web)', size: (_a = entry === null || entry === void 0 ? void 0 : entry.sizeBytes) !== null && _a !== void 0 ? _a : 0 });
105
+ }
106
+ async initContext({ contextId, params, }) {
107
+ var _a;
108
+ // Use the model path/URL as the modelId for the isomorphic layer.
109
+ const modelId = params.model;
110
+ await this.provider.initialize({
111
+ modelId,
112
+ modelPath: params.model,
113
+ // If model is a URL, ensureModelInOpfs will download it; if it's an
114
+ // OPFS-relative path, WebProvider will look it up in the manifest.
115
+ modelUrl: ((_a = params.model) === null || _a === void 0 ? void 0 : _a.startsWith('http')) ? params.model : undefined,
116
+ n_ctx: params.n_ctx,
117
+ n_threads: params.n_threads,
118
+ embedding: params.embedding,
119
+ });
120
+ this.contextToModel.set(contextId, modelId);
121
+ return {
122
+ contextId,
123
+ gpu: false,
124
+ reasonNoGPU: 'WebAssembly does not expose GPU acceleration in browsers',
125
+ model: MODEL_DESC_STUB,
126
+ };
127
+ }
128
+ async releaseContext({ contextId }) {
129
+ const modelId = this.contextToModel.get(contextId);
130
+ if (modelId) {
131
+ await this.provider.unloadModel(modelId);
132
+ this.contextToModel.delete(contextId);
133
+ }
134
+ }
135
+ async releaseAllContexts() {
136
+ for (const [contextId, modelId] of this.contextToModel.entries()) {
137
+ await this.provider.unloadModel(modelId).catch(() => { });
138
+ this.contextToModel.delete(contextId);
139
+ }
140
+ }
141
+ // -------------------------------------------------------------------------
142
+ // Chat and completion
143
+ // -------------------------------------------------------------------------
144
+ async getFormattedChat({ contextId, messages, chatTemplate, params, }) {
145
+ const parsed = JSON.parse(messages);
146
+ // If the provider exposes a native getFormattedChat (desktop sidecar or WASM with Jinja),
147
+ // delegate to it so model-embedded templates are used instead of client-side formatters.
148
+ const modelId = this.contextToModel.get(contextId);
149
+ if (modelId && typeof this.provider.getFormattedChat === 'function') {
150
+ try {
151
+ return await this.provider.getFormattedChat(modelId, messages, chatTemplate, params);
152
+ }
153
+ catch (_a) {
154
+ // Fall through to client-side formatting
155
+ }
156
+ }
157
+ const prompt = formatMessagesWithTemplate(parsed, chatTemplate);
158
+ return { type: 'llama-chat', prompt, has_media: false, media_paths: [] };
159
+ }
160
+ async completion({ contextId, params, }) {
161
+ const modelId = this.contextToModel.get(contextId);
162
+ if (!modelId)
163
+ throw new Error('LlamaCppWeb: context not found');
164
+ const wantStream = this.hasListeners('@LlamaCpp_onToken');
165
+ const generateFn = wantStream
166
+ ? this.provider.generateStream.bind(this.provider, {
167
+ modelId,
168
+ prompt: params.prompt,
169
+ max_tokens: params.n_predict,
170
+ temperature: params.temperature,
171
+ top_p: params.top_p,
172
+ top_k: params.top_k,
173
+ min_p: params.min_p,
174
+ repeat_penalty: params.penalty_repeat,
175
+ seed: params.seed,
176
+ stop: params.stop,
177
+ grammar: params.grammar,
178
+ stream: true,
179
+ }, (evt) => {
180
+ this.emitListener('@LlamaCpp_onToken', {
181
+ contextId,
182
+ token: evt.token,
183
+ index: evt.index,
184
+ });
185
+ })
186
+ : () => this.provider.generate({
187
+ modelId,
188
+ prompt: params.prompt,
189
+ max_tokens: params.n_predict,
190
+ temperature: params.temperature,
191
+ top_p: params.top_p,
192
+ top_k: params.top_k,
193
+ min_p: params.min_p,
194
+ repeat_penalty: params.penalty_repeat,
195
+ seed: params.seed,
196
+ stop: params.stop,
197
+ grammar: params.grammar,
198
+ stream: false,
199
+ });
200
+ const result = await generateFn();
201
+ return {
202
+ text: result.text,
203
+ content: result.text,
204
+ reasoning_content: '',
205
+ tool_calls: [],
206
+ tokens_predicted: result.tokens_predicted,
207
+ tokens_evaluated: result.tokens_evaluated,
208
+ truncated: false,
209
+ stopped_eos: result.finish_reason === 'stop',
210
+ stopped_word: '',
211
+ stopped_limit: result.finish_reason === 'length' ? 1 : 0,
212
+ stopping_word: '',
213
+ context_full: false,
214
+ interrupted: result.finish_reason === 'error',
215
+ tokens_cached: 0,
216
+ chat_format: 0,
217
+ timings: {
218
+ prompt_n: result.tokens_evaluated,
219
+ prompt_ms: 0,
220
+ prompt_per_token_ms: 0,
221
+ prompt_per_second: 0,
222
+ predicted_n: result.tokens_predicted,
223
+ predicted_ms: 0,
224
+ predicted_per_token_ms: 0,
225
+ predicted_per_second: 0,
226
+ },
227
+ };
228
+ }
229
+ // Fix #7: implement chat convenience helpers using proper template formatting
230
+ async chat({ contextId, messages, system, chatTemplate, params }) {
231
+ var _a;
232
+ const allMessages = system
233
+ ? [{ role: 'system', content: system }, ...messages]
234
+ : messages;
235
+ const formatted = await this.getFormattedChat({
236
+ contextId,
237
+ messages: JSON.stringify(allMessages),
238
+ chatTemplate,
239
+ params,
240
+ });
241
+ const prompt = (_a = formatted.prompt) !== null && _a !== void 0 ? _a : JSON.stringify(allMessages);
242
+ return this.completion({ contextId, params: Object.assign(Object.assign({}, params), { prompt }) });
243
+ }
244
+ async chatWithSystem({ contextId, system, message, params }) {
245
+ return this.chat({
246
+ contextId,
247
+ messages: [
248
+ { role: 'system', content: system },
249
+ { role: 'user', content: message },
250
+ ],
251
+ params,
252
+ });
253
+ }
254
+ async generateText({ contextId, prompt, params }) {
255
+ return this.completion({ contextId, params: Object.assign(Object.assign({}, params), { prompt }) });
256
+ }
257
+ async stopCompletion() {
258
+ // Terminates the worker process; the model must be reloaded on the next call.
259
+ this.provider.stopGeneration();
260
+ }
261
+ // -------------------------------------------------------------------------
262
+ // Session management (WASM VFS — persist via /tmp paths in worker)
263
+ // -------------------------------------------------------------------------
264
+ async loadSession({ contextId, filepath, }) {
265
+ const modelId = this.contextToModel.get(contextId);
266
+ if (!modelId)
267
+ throw new Error('LlamaCppWeb: context not found');
268
+ return this.provider.loadSession(modelId, vfsPathForWeb(filepath));
269
+ }
270
+ async saveSession({ contextId, filepath, size, }) {
271
+ const modelId = this.contextToModel.get(contextId);
272
+ if (!modelId)
273
+ throw new Error('LlamaCppWeb: context not found');
274
+ return this.provider.saveSession(modelId, vfsPathForWeb(filepath), size);
275
+ }
276
+ // -------------------------------------------------------------------------
277
+ // Tokenization
278
+ // -------------------------------------------------------------------------
279
+ async tokenize({ contextId, text, }) {
280
+ const modelId = this.contextToModel.get(contextId);
281
+ if (!modelId)
282
+ throw new Error('LlamaCppWeb: context not found');
283
+ const result = await this.provider.tokenize(modelId, text);
284
+ return {
285
+ tokens: result.tokens,
286
+ has_images: false,
287
+ bitmap_hashes: [],
288
+ chunk_pos: [],
289
+ chunk_pos_images: [],
290
+ };
291
+ }
292
+ async detokenize({ contextId, tokens, }) {
293
+ const modelId = this.contextToModel.get(contextId);
294
+ if (!modelId)
295
+ throw new Error('LlamaCppWeb: context not found');
296
+ const result = await this.provider.detokenize(modelId, tokens);
297
+ return result.text;
298
+ }
299
+ // -------------------------------------------------------------------------
300
+ // Embeddings
301
+ // -------------------------------------------------------------------------
302
+ async embedding({ contextId, text }) {
303
+ var _a;
304
+ const modelId = this.contextToModel.get(contextId);
305
+ if (!modelId)
306
+ throw new Error('LlamaCppWeb: context not found');
307
+ const result = await this.provider.embed({ modelId, input: text });
308
+ return { embedding: (_a = result.vectors[0]) !== null && _a !== void 0 ? _a : [] };
309
+ }
310
+ async rerank({ contextId, query, documents, }) {
311
+ const modelId = this.contextToModel.get(contextId);
312
+ if (!modelId)
313
+ throw new Error('LlamaCppWeb: context not found');
314
+ return this.provider.rerank(modelId, query, documents);
315
+ }
316
+ // -------------------------------------------------------------------------
317
+ // Benchmarking
318
+ // -------------------------------------------------------------------------
319
+ async bench({ contextId, pp, tg, pl, nr, }) {
320
+ const modelId = this.contextToModel.get(contextId);
321
+ if (!modelId)
322
+ throw new Error('LlamaCppWeb: context not found');
323
+ return this.provider.bench(modelId, pp, tg, pl, nr);
324
+ }
325
+ // -------------------------------------------------------------------------
326
+ // LoRA adapters
327
+ // -------------------------------------------------------------------------
328
+ async applyLoraAdapters({ contextId, loraAdapters, }) {
329
+ const modelId = this.contextToModel.get(contextId);
330
+ if (!modelId)
331
+ throw new Error('LlamaCppWeb: context not found');
332
+ const mapped = loraAdapters.map((la) => (Object.assign(Object.assign({}, la), { path: vfsPathForWeb(la.path) })));
333
+ await this.provider.applyLoraAdapters(modelId, mapped);
334
+ }
335
+ async removeLoraAdapters({ contextId }) {
336
+ const modelId = this.contextToModel.get(contextId);
337
+ if (!modelId)
338
+ throw new Error('LlamaCppWeb: context not found');
339
+ await this.provider.removeLoraAdapters(modelId);
340
+ }
341
+ async getLoadedLoraAdapters({ contextId, }) {
342
+ const modelId = this.contextToModel.get(contextId);
343
+ if (!modelId)
344
+ throw new Error('LlamaCppWeb: context not found');
345
+ return this.provider.getLoadedLoraAdapters(modelId);
346
+ }
347
+ // -------------------------------------------------------------------------
348
+ // Multimodal
349
+ // -------------------------------------------------------------------------
350
+ async initMultimodal({ contextId, params, }) {
351
+ var _a;
352
+ const modelId = this.contextToModel.get(contextId);
353
+ if (!modelId)
354
+ throw new Error('LlamaCppWeb: context not found');
355
+ return this.provider.initMultimodal(modelId, vfsPathForWeb(params.path), (_a = params.use_gpu) !== null && _a !== void 0 ? _a : false);
356
+ }
357
+ async isMultimodalEnabled({ contextId }) {
358
+ const modelId = this.contextToModel.get(contextId);
359
+ if (!modelId)
360
+ return false;
361
+ return this.provider.isMultimodalEnabled(modelId);
362
+ }
363
+ async getMultimodalSupport({ contextId }) {
364
+ const modelId = this.contextToModel.get(contextId);
365
+ if (!modelId)
366
+ return { vision: false, audio: false };
367
+ return this.provider.getMultimodalSupport(modelId);
368
+ }
369
+ async releaseMultimodal({ contextId }) {
370
+ const modelId = this.contextToModel.get(contextId);
371
+ if (!modelId)
372
+ return;
373
+ await this.provider.releaseMultimodal(modelId);
374
+ }
375
+ // -------------------------------------------------------------------------
376
+ // TTS
377
+ // -------------------------------------------------------------------------
378
+ async initVocoder({ contextId, params, }) {
379
+ var _a;
380
+ const modelId = this.contextToModel.get(contextId);
381
+ if (!modelId)
382
+ throw new Error('LlamaCppWeb: context not found');
383
+ return this.provider.initVocoder(modelId, vfsPathForWeb(params.path), (_a = params.n_batch) !== null && _a !== void 0 ? _a : 512);
384
+ }
385
+ async isVocoderEnabled({ contextId }) {
386
+ const modelId = this.contextToModel.get(contextId);
387
+ if (!modelId)
388
+ return false;
389
+ return this.provider.isVocoderEnabled(modelId);
390
+ }
391
+ async getFormattedAudioCompletion({ contextId, speakerJsonStr, textToSpeak, }) {
392
+ const modelId = this.contextToModel.get(contextId);
393
+ if (!modelId)
394
+ throw new Error('LlamaCppWeb: context not found');
395
+ const speaker = speakerJsonStr ? JSON.parse(speakerJsonStr) : null;
396
+ return this.provider.getFormattedAudioCompletion(modelId, speaker, textToSpeak);
397
+ }
398
+ async getAudioCompletionGuideTokens({ contextId, textToSpeak, }) {
399
+ const modelId = this.contextToModel.get(contextId);
400
+ if (!modelId)
401
+ throw new Error('LlamaCppWeb: context not found');
402
+ return this.provider.getAudioCompletionGuideTokens(modelId, textToSpeak);
403
+ }
404
+ async decodeAudioTokens({ contextId, tokens, }) {
405
+ const modelId = this.contextToModel.get(contextId);
406
+ if (!modelId)
407
+ throw new Error('LlamaCppWeb: context not found');
408
+ return this.provider.decodeAudioTokens(modelId, tokens);
409
+ }
410
+ async releaseVocoder({ contextId }) {
411
+ const modelId = this.contextToModel.get(contextId);
412
+ if (!modelId)
413
+ return;
414
+ await this.provider.releaseVocoder(modelId);
415
+ }
416
+ // -------------------------------------------------------------------------
417
+ // Fix #8: Model download / management — implemented via OPFS (#8)
418
+ // -------------------------------------------------------------------------
419
+ async downloadModel({ url, filename }) {
420
+ const modelId = filename;
421
+ const abortController = new AbortController();
422
+ const entry = {
423
+ abortController,
424
+ promise: Promise.resolve(undefined),
425
+ downloaded: 0,
426
+ total: 0,
427
+ completed: false,
428
+ failed: false,
429
+ errorMessage: undefined,
430
+ localPath: undefined,
431
+ };
432
+ entry.promise = ensureModelInOpfs(modelId, url, (downloaded, total) => {
433
+ entry.downloaded = downloaded;
434
+ entry.total = total;
435
+ this.emitListener('@LlamaCpp_onDownloadProgress', {
436
+ url,
437
+ modelId,
438
+ downloaded,
439
+ total,
440
+ progress: total > 0 ? downloaded / total : 0,
441
+ });
442
+ }, abortController.signal)
443
+ .then((manifest) => {
444
+ entry.completed = true;
445
+ entry.localPath = manifest.path;
446
+ this.emitListener('@LlamaCpp_onDownloadComplete', { url, modelId, localPath: manifest.path });
447
+ })
448
+ .catch((err) => {
449
+ const cancelled = abortController.signal.aborted;
450
+ entry.failed = !cancelled;
451
+ entry.errorMessage = err.message;
452
+ if (!cancelled) {
453
+ this.emitListener('@LlamaCpp_onDownloadError', { url, modelId, error: err.message });
454
+ }
455
+ });
456
+ activeDownloads.set(url, entry);
457
+ return modelId;
458
+ }
459
+ async getDownloadProgress({ url }) {
460
+ const dl = activeDownloads.get(url);
461
+ if (!dl) {
462
+ return { progress: 0, completed: false, failed: false, downloadedBytes: 0, totalBytes: 0 };
463
+ }
464
+ const progress = dl.total > 0 ? dl.downloaded / dl.total : 0;
465
+ return {
466
+ progress,
467
+ completed: dl.completed,
468
+ failed: dl.failed,
469
+ errorMessage: dl.errorMessage,
470
+ localPath: dl.localPath,
471
+ downloadedBytes: dl.downloaded,
472
+ totalBytes: dl.total,
473
+ };
474
+ }
475
+ async cancelDownload({ url }) {
476
+ const entry = activeDownloads.get(url);
477
+ if (!entry)
478
+ return false;
479
+ entry.abortController.abort();
480
+ activeDownloads.delete(url);
481
+ return true;
482
+ }
483
+ async getAvailableModels() {
484
+ const entries = await listManifestEntries();
485
+ return entries.map((e) => ({
486
+ name: e.modelId,
487
+ path: e.path,
488
+ size: e.sizeBytes,
489
+ }));
490
+ }
491
+ // -------------------------------------------------------------------------
492
+ // Grammar utilities
493
+ // -------------------------------------------------------------------------
494
+ async convertJsonSchemaToGrammar({ schema, }) {
495
+ return this.provider.convertJsonSchemaToGrammar(schema);
496
+ }
497
+ // -------------------------------------------------------------------------
498
+ // Native server (not available on web)
499
+ // -------------------------------------------------------------------------
500
+ async startNativeLlamaServer(_options) {
501
+ throw new Error('LlamaCppWeb: native server is only available on iOS/Android/Desktop');
502
+ }
503
+ async stopNativeLlamaServer() { }
504
+ async isNativeLlamaServerRunning() {
505
+ return { running: false };
506
+ }
507
+ // -------------------------------------------------------------------------
508
+ // Events
509
+ // -------------------------------------------------------------------------
510
+ async addListener(eventName, listenerFunc) {
511
+ if (!this.listeners.has(eventName)) {
512
+ this.listeners.set(eventName, new Set());
513
+ }
514
+ this.listeners.get(eventName).add(listenerFunc);
515
+ }
516
+ async removeAllListeners() {
517
+ this.listeners.clear();
518
+ }
519
+ }
520
+ export * from './definitions';
521
+ //# sourceMappingURL=web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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","sourcesContent":["import type { LlamaCppPlugin, NativeLlamaContext, NativeCompletionResult, NativeTokenizeResult } from './definitions';\nimport { WebProvider } from './isomorphic/provider.web';\nimport { ensureModelInOpfs } from './storage/opfs.store';\nimport { listManifestEntries } from './storage/manifest';\n\n// ---------------------------------------------------------------------------\n// Fix #4: LlamaCppWeb now delegates real inference work to WebProvider so\n// that calling the standard Capacitor LlamaCpp API on the web platform routes\n// through the WASM engine rather than throwing \"not supported\" errors.\n// ---------------------------------------------------------------------------\n\nconst MODEL_DESC_STUB = {\n desc: 'WASM model',\n size: 0,\n nEmbd: 0,\n nParams: 0,\n chatTemplates: {\n llamaChat: true,\n minja: {\n default: true,\n defaultCaps: {\n tools: false, toolCalls: false, toolResponses: false,\n systemRole: true, parallelToolCalls: false, toolCallId: false,\n },\n toolUse: false,\n toolUseCaps: {\n tools: false, toolCalls: false, toolResponses: false,\n systemRole: true, parallelToolCalls: false, toolCallId: false,\n },\n },\n },\n metadata: {},\n isChatTemplateSupported: true,\n};\n\n// ---------------------------------------------------------------------------\n// Chat template formatting\n// ---------------------------------------------------------------------------\n\ntype ChatMessage = { role: string; content: string };\n\n/**\n * Format a message array into a prompt string using the specified template.\n * Supports the four most common open-weight model formats. Defaults to ChatML.\n */\nfunction formatMessagesWithTemplate(messages: ChatMessage[], template?: string): string {\n const tpl = (template ?? 'chatml').toLowerCase();\n\n if (tpl === 'llama3' || tpl === 'llama-3') {\n const parts = messages.map(\n (m) =>\n `<|start_header_id|>${m.role}<|end_header_id|>\\n\\n${m.content}<|eot_id|>`,\n );\n return `<|begin_of_text|>${parts.join('')}<|start_header_id|>assistant<|end_header_id|>\\n\\n`;\n }\n\n if (tpl === 'mistral') {\n // Mistral: [INST] user [/INST] assistant </s> [INST] ...\n let out = '';\n for (let i = 0; i < messages.length; i++) {\n const m = messages[i];\n if (m.role === 'system') {\n out += `[INST] ${m.content}\\n`;\n } else if (m.role === 'user') {\n out += `[INST] ${m.content} [/INST]`;\n } else if (m.role === 'assistant') {\n out += ` ${m.content}</s>`;\n }\n }\n return out;\n }\n\n if (tpl === 'gemma' || tpl === 'gemma2') {\n const parts = messages.map(\n (m) => `<start_of_turn>${m.role}\\n${m.content}<end_of_turn>`,\n );\n return `${parts.join('\\n')}\\n<start_of_turn>model\\n`;\n }\n\n // Default: ChatML — widely used by Qwen, Phi, Hermes, OpenChat, etc.\n const parts = messages.map(\n (m) => `<|im_start|>${m.role}\\n${m.content}<|im_end|>`,\n );\n return `${parts.join('\\n')}\\n<|im_start|>assistant\\n`;\n}\n\n// ---------------------------------------------------------------------------\n// In-progress downloads\n// ---------------------------------------------------------------------------\ntype ActiveDownload = {\n abortController: AbortController;\n promise: Promise<void>;\n downloaded: number;\n total: number;\n completed: boolean;\n failed: boolean;\n errorMessage?: string;\n localPath?: string;\n};\n\nconst activeDownloads = new Map<string, ActiveDownload>();\n\n/** Map a user-facing path to a WASM VFS path (MEMFS /tmp). */\nfunction vfsPathForWeb(filepath: string): string {\n if (filepath.startsWith('/')) return filepath;\n const base = filepath.split(/[/\\\\]/).pop() ?? 'file.bin';\n return `/tmp/${base}`;\n}\n\nexport class LlamaCppWeb implements LlamaCppPlugin {\n protected provider: WebProvider = new WebProvider();\n // contextId → modelId\n protected contextToModel = new Map<number, string>();\n // eventName → Set of listener callbacks\n protected listeners = new Map<string, Set<(data: unknown) => void>>();\n\n protected emitListener(eventName: string, data: unknown): void {\n this.listeners.get(eventName)?.forEach((cb) => cb(data));\n }\n\n protected hasListeners(eventName: string): boolean {\n const set = this.listeners.get(eventName);\n return !!set && set.size > 0;\n }\n\n // -------------------------------------------------------------------------\n // Core initialization\n // -------------------------------------------------------------------------\n async toggleNativeLog(): Promise<void> {\n // No-op on web; no native log callback to toggle.\n }\n\n async setContextLimit(_opts?: { limit: number }): Promise<void> {\n // No-op on web; WebProvider manages its own slot limit via DefaultModelScheduler.\n }\n\n async modelInfo({ path }: { path: string; skip?: string[] }): Promise<Object> {\n const entry = await listManifestEntries().then((es) => es.find((e) => e.modelId === path || e.path === path));\n return {\n ...MODEL_DESC_STUB,\n path,\n desc: 'WASM model (web)',\n size: entry?.sizeBytes ?? 0,\n };\n }\n\n async initContext({\n contextId,\n params,\n }: {\n contextId: number;\n params: any;\n }): Promise<NativeLlamaContext> {\n // Use the model path/URL as the modelId for the isomorphic layer.\n const modelId: string = params.model;\n\n await this.provider.initialize({\n modelId,\n modelPath: params.model,\n // If model is a URL, ensureModelInOpfs will download it; if it's an\n // OPFS-relative path, WebProvider will look it up in the manifest.\n modelUrl: params.model?.startsWith('http') ? params.model : undefined,\n n_ctx: params.n_ctx,\n n_threads: params.n_threads,\n embedding: params.embedding,\n });\n\n this.contextToModel.set(contextId, modelId);\n\n return {\n contextId,\n gpu: false,\n reasonNoGPU: 'WebAssembly does not expose GPU acceleration in browsers',\n model: MODEL_DESC_STUB,\n };\n }\n\n async releaseContext({ contextId }: { contextId: number }): Promise<void> {\n const modelId = this.contextToModel.get(contextId);\n if (modelId) {\n await this.provider.unloadModel(modelId);\n this.contextToModel.delete(contextId);\n }\n }\n\n async releaseAllContexts(): Promise<void> {\n for (const [contextId, modelId] of this.contextToModel.entries()) {\n await this.provider.unloadModel(modelId).catch(() => {});\n this.contextToModel.delete(contextId);\n }\n }\n\n // -------------------------------------------------------------------------\n // Chat and completion\n // -------------------------------------------------------------------------\n\n async getFormattedChat({\n contextId,\n messages,\n chatTemplate,\n params,\n }: {\n contextId: number;\n messages: string;\n chatTemplate?: string;\n params?: any;\n }): Promise<any> {\n const parsed: Array<{ role: string; content: string }> = JSON.parse(messages);\n\n // If the provider exposes a native getFormattedChat (desktop sidecar or WASM with Jinja),\n // delegate to it so model-embedded templates are used instead of client-side formatters.\n const modelId = this.contextToModel.get(contextId);\n if (modelId && typeof (this.provider as any).getFormattedChat === 'function') {\n try {\n return await (this.provider as any).getFormattedChat(modelId, messages, chatTemplate, params);\n } catch {\n // Fall through to client-side formatting\n }\n }\n\n const prompt = formatMessagesWithTemplate(parsed, chatTemplate);\n return { type: 'llama-chat', prompt, has_media: false, media_paths: [] };\n }\n\n async completion({\n contextId,\n params,\n }: {\n contextId: number;\n params: any;\n }): Promise<NativeCompletionResult> {\n const modelId = this.contextToModel.get(contextId);\n if (!modelId) throw new Error('LlamaCppWeb: context not found');\n\n const wantStream = this.hasListeners('@LlamaCpp_onToken');\n const generateFn = wantStream\n ? this.provider.generateStream.bind(\n this.provider,\n {\n modelId,\n prompt: params.prompt,\n max_tokens: params.n_predict,\n temperature: params.temperature,\n top_p: params.top_p,\n top_k: params.top_k,\n min_p: params.min_p,\n repeat_penalty: params.penalty_repeat,\n seed: params.seed,\n stop: params.stop,\n grammar: params.grammar,\n stream: true,\n },\n (evt: any) => {\n this.emitListener('@LlamaCpp_onToken', {\n contextId,\n token: evt.token,\n index: evt.index,\n });\n },\n )\n : () =>\n this.provider.generate({\n modelId,\n prompt: params.prompt,\n max_tokens: params.n_predict,\n temperature: params.temperature,\n top_p: params.top_p,\n top_k: params.top_k,\n min_p: params.min_p,\n repeat_penalty: params.penalty_repeat,\n seed: params.seed,\n stop: params.stop,\n grammar: params.grammar,\n stream: false,\n });\n\n const result = await generateFn();\n\n return {\n text: result.text,\n content: result.text,\n reasoning_content: '',\n tool_calls: [],\n tokens_predicted: result.tokens_predicted,\n tokens_evaluated: result.tokens_evaluated,\n truncated: false,\n stopped_eos: result.finish_reason === 'stop',\n stopped_word: '',\n stopped_limit: result.finish_reason === 'length' ? 1 : 0,\n stopping_word: '',\n context_full: false,\n interrupted: result.finish_reason === 'error',\n tokens_cached: 0,\n chat_format: 0,\n timings: {\n prompt_n: result.tokens_evaluated,\n prompt_ms: 0,\n prompt_per_token_ms: 0,\n prompt_per_second: 0,\n predicted_n: result.tokens_predicted,\n predicted_ms: 0,\n predicted_per_token_ms: 0,\n predicted_per_second: 0,\n },\n };\n }\n\n // Fix #7: implement chat convenience helpers using proper template formatting\n async chat({ contextId, messages, system, chatTemplate, params }: {\n contextId: number;\n messages: Array<{ role: string; content: string }>;\n system?: string;\n chatTemplate?: string;\n params?: any;\n }): Promise<NativeCompletionResult> {\n const allMessages = system\n ? [{ role: 'system', content: system }, ...messages]\n : messages;\n const formatted = await this.getFormattedChat({\n contextId,\n messages: JSON.stringify(allMessages),\n chatTemplate,\n params,\n });\n const prompt = (formatted as any).prompt ?? JSON.stringify(allMessages);\n return this.completion({ contextId, params: { ...params, prompt } });\n }\n\n async chatWithSystem({ contextId, system, message, params }: {\n contextId: number;\n system: string;\n message: string;\n params?: any;\n }): Promise<NativeCompletionResult> {\n return this.chat({\n contextId,\n messages: [\n { role: 'system', content: system },\n { role: 'user', content: message },\n ],\n params,\n });\n }\n\n async generateText({ contextId, prompt, params }: {\n contextId: number;\n prompt: string;\n params?: any;\n }): Promise<NativeCompletionResult> {\n return this.completion({ contextId, params: { ...params, prompt } });\n }\n\n async stopCompletion(): Promise<void> {\n // Terminates the worker process; the model must be reloaded on the next call.\n this.provider.stopGeneration();\n }\n\n // -------------------------------------------------------------------------\n // Session management (WASM VFS — persist via /tmp paths in worker)\n // -------------------------------------------------------------------------\n async loadSession({\n contextId,\n filepath,\n }: {\n contextId: number;\n filepath: string;\n }): Promise<{ tokens_loaded: number; prompt: string }> {\n const modelId = this.contextToModel.get(contextId);\n if (!modelId) throw new Error('LlamaCppWeb: context not found');\n return this.provider.loadSession(modelId, vfsPathForWeb(filepath));\n }\n\n async saveSession({\n contextId,\n filepath,\n size,\n }: {\n contextId: number;\n filepath: string;\n size: number;\n }): Promise<number> {\n const modelId = this.contextToModel.get(contextId);\n if (!modelId) throw new Error('LlamaCppWeb: context not found');\n return this.provider.saveSession(modelId, vfsPathForWeb(filepath), size);\n }\n\n // -------------------------------------------------------------------------\n // Tokenization\n // -------------------------------------------------------------------------\n async tokenize({\n contextId,\n text,\n }: {\n contextId: number;\n text: string;\n imagePaths?: string[];\n }): Promise<NativeTokenizeResult> {\n const modelId = this.contextToModel.get(contextId);\n if (!modelId) throw new Error('LlamaCppWeb: context not found');\n const result = await this.provider.tokenize(modelId, text);\n return {\n tokens: result.tokens,\n has_images: false,\n bitmap_hashes: [],\n chunk_pos: [],\n chunk_pos_images: [],\n };\n }\n\n async detokenize({\n contextId,\n tokens,\n }: {\n contextId: number;\n tokens: number[];\n [key: string]: unknown;\n }): Promise<string> {\n const modelId = this.contextToModel.get(contextId);\n if (!modelId) throw new Error('LlamaCppWeb: context not found');\n const result = await this.provider.detokenize(modelId, tokens);\n return result.text;\n }\n\n // -------------------------------------------------------------------------\n // Embeddings\n // -------------------------------------------------------------------------\n async embedding({ contextId, text }: { contextId: number; text: string; params: any }): Promise<any> {\n const modelId = this.contextToModel.get(contextId);\n if (!modelId) throw new Error('LlamaCppWeb: context not found');\n const result = await this.provider.embed({ modelId, input: text });\n return { embedding: result.vectors[0] ?? [] };\n }\n\n async rerank({\n contextId,\n query,\n documents,\n }: {\n contextId: number;\n query: string;\n documents: string[];\n params?: Record<string, unknown>;\n }): Promise<Array<{ score: number; index: number }>> {\n const modelId = this.contextToModel.get(contextId);\n if (!modelId) throw new Error('LlamaCppWeb: context not found');\n return this.provider.rerank(modelId, query, documents);\n }\n\n // -------------------------------------------------------------------------\n // Benchmarking\n // -------------------------------------------------------------------------\n async bench({\n contextId,\n pp,\n tg,\n pl,\n nr,\n }: {\n contextId: number;\n pp: number;\n tg: number;\n pl: number;\n nr: number;\n }): Promise<string> {\n const modelId = this.contextToModel.get(contextId);\n if (!modelId) throw new Error('LlamaCppWeb: context not found');\n return this.provider.bench(modelId, pp, tg, pl, nr);\n }\n\n // -------------------------------------------------------------------------\n // LoRA adapters\n // -------------------------------------------------------------------------\n async applyLoraAdapters({\n contextId,\n loraAdapters,\n }: {\n contextId: number;\n loraAdapters: Array<{ path: string; scaled?: number }>;\n }): Promise<void> {\n const modelId = this.contextToModel.get(contextId);\n if (!modelId) throw new Error('LlamaCppWeb: context not found');\n const mapped = loraAdapters.map((la) => ({\n ...la,\n path: vfsPathForWeb(la.path),\n }));\n await this.provider.applyLoraAdapters(modelId, mapped);\n }\n\n async removeLoraAdapters({ contextId }: { contextId: number }): Promise<void> {\n const modelId = this.contextToModel.get(contextId);\n if (!modelId) throw new Error('LlamaCppWeb: context not found');\n await this.provider.removeLoraAdapters(modelId);\n }\n\n async getLoadedLoraAdapters({\n contextId,\n }: {\n contextId: number;\n }): Promise<Array<{ path: string; scaled?: number }>> {\n const modelId = this.contextToModel.get(contextId);\n if (!modelId) throw new Error('LlamaCppWeb: context not found');\n return this.provider.getLoadedLoraAdapters(modelId);\n }\n\n // -------------------------------------------------------------------------\n // Multimodal\n // -------------------------------------------------------------------------\n async initMultimodal({\n contextId,\n params,\n }: {\n contextId: number;\n params: { path: string; use_gpu?: boolean };\n }): Promise<boolean> {\n const modelId = this.contextToModel.get(contextId);\n if (!modelId) throw new Error('LlamaCppWeb: context not found');\n return this.provider.initMultimodal(modelId, vfsPathForWeb(params.path), params.use_gpu ?? false);\n }\n\n async isMultimodalEnabled({ contextId }: { contextId: number }): Promise<boolean> {\n const modelId = this.contextToModel.get(contextId);\n if (!modelId) return false;\n return this.provider.isMultimodalEnabled(modelId);\n }\n\n async getMultimodalSupport({ contextId }: { contextId: number }): Promise<{ vision: boolean; audio: boolean }> {\n const modelId = this.contextToModel.get(contextId);\n if (!modelId) return { vision: false, audio: false };\n return this.provider.getMultimodalSupport(modelId);\n }\n\n async releaseMultimodal({ contextId }: { contextId: number }): Promise<void> {\n const modelId = this.contextToModel.get(contextId);\n if (!modelId) return;\n await this.provider.releaseMultimodal(modelId);\n }\n\n // -------------------------------------------------------------------------\n // TTS\n // -------------------------------------------------------------------------\n async initVocoder({\n contextId,\n params,\n }: {\n contextId: number;\n params: { path: string; n_batch?: number };\n }): Promise<boolean> {\n const modelId = this.contextToModel.get(contextId);\n if (!modelId) throw new Error('LlamaCppWeb: context not found');\n return this.provider.initVocoder(\n modelId,\n vfsPathForWeb(params.path),\n params.n_batch ?? 512,\n );\n }\n\n async isVocoderEnabled({ contextId }: { contextId: number }): Promise<boolean> {\n const modelId = this.contextToModel.get(contextId);\n if (!modelId) return false;\n return this.provider.isVocoderEnabled(modelId);\n }\n\n async getFormattedAudioCompletion({\n contextId,\n speakerJsonStr,\n textToSpeak,\n }: {\n contextId: number;\n speakerJsonStr: string;\n textToSpeak: string;\n }): Promise<{ prompt: string; grammar?: string }> {\n const modelId = this.contextToModel.get(contextId);\n if (!modelId) throw new Error('LlamaCppWeb: context not found');\n const speaker = speakerJsonStr ? (JSON.parse(speakerJsonStr) as object) : null;\n return this.provider.getFormattedAudioCompletion(modelId, speaker, textToSpeak);\n }\n\n async getAudioCompletionGuideTokens({\n contextId,\n textToSpeak,\n }: {\n contextId: number;\n textToSpeak: string;\n }): Promise<number[]> {\n const modelId = this.contextToModel.get(contextId);\n if (!modelId) throw new Error('LlamaCppWeb: context not found');\n return this.provider.getAudioCompletionGuideTokens(modelId, textToSpeak);\n }\n\n async decodeAudioTokens({\n contextId,\n tokens,\n }: {\n contextId: number;\n tokens: number[];\n }): Promise<number[]> {\n const modelId = this.contextToModel.get(contextId);\n if (!modelId) throw new Error('LlamaCppWeb: context not found');\n return this.provider.decodeAudioTokens(modelId, tokens);\n }\n\n async releaseVocoder({ contextId }: { contextId: number }): Promise<void> {\n const modelId = this.contextToModel.get(contextId);\n if (!modelId) return;\n await this.provider.releaseVocoder(modelId);\n }\n\n // -------------------------------------------------------------------------\n // Fix #8: Model download / management — implemented via OPFS (#8)\n // -------------------------------------------------------------------------\n async downloadModel({ url, filename }: { url: string; filename: string }): Promise<string> {\n const modelId = filename;\n const abortController = new AbortController();\n const entry: ActiveDownload = {\n abortController,\n promise: Promise.resolve<void>(undefined),\n downloaded: 0,\n total: 0,\n completed: false,\n failed: false,\n errorMessage: undefined,\n localPath: undefined,\n };\n\n entry.promise = ensureModelInOpfs(\n modelId,\n url,\n (downloaded, total) => {\n entry.downloaded = downloaded;\n entry.total = total;\n this.emitListener('@LlamaCpp_onDownloadProgress', {\n url,\n modelId,\n downloaded,\n total,\n progress: total > 0 ? downloaded / total : 0,\n });\n },\n abortController.signal,\n )\n .then((manifest) => {\n entry.completed = true;\n entry.localPath = manifest.path;\n this.emitListener('@LlamaCpp_onDownloadComplete', { url, modelId, localPath: manifest.path });\n })\n .catch((err: Error) => {\n const cancelled = abortController.signal.aborted;\n entry.failed = !cancelled;\n entry.errorMessage = err.message;\n if (!cancelled) {\n this.emitListener('@LlamaCpp_onDownloadError', { url, modelId, error: err.message });\n }\n });\n\n activeDownloads.set(url, entry);\n return modelId;\n }\n\n async getDownloadProgress({ url }: { url: string }): Promise<{\n progress: number;\n completed: boolean;\n failed: boolean;\n errorMessage?: string;\n localPath?: string;\n downloadedBytes: number;\n totalBytes: number;\n }> {\n const dl = activeDownloads.get(url);\n if (!dl) {\n return { progress: 0, completed: false, failed: false, downloadedBytes: 0, totalBytes: 0 };\n }\n const progress = dl.total > 0 ? dl.downloaded / dl.total : 0;\n return {\n progress,\n completed: dl.completed,\n failed: dl.failed,\n errorMessage: dl.errorMessage,\n localPath: dl.localPath,\n downloadedBytes: dl.downloaded,\n totalBytes: dl.total,\n };\n }\n\n async cancelDownload({ url }: { url: string }): Promise<boolean> {\n const entry = activeDownloads.get(url);\n if (!entry) return false;\n entry.abortController.abort();\n activeDownloads.delete(url);\n return true;\n }\n\n async getAvailableModels(): Promise<Array<{ name: string; path: string; size: number }>> {\n const entries = await listManifestEntries();\n return entries.map((e) => ({\n name: e.modelId,\n path: e.path,\n size: e.sizeBytes,\n }));\n }\n\n // -------------------------------------------------------------------------\n // Grammar utilities\n // -------------------------------------------------------------------------\n async convertJsonSchemaToGrammar({\n schema,\n }: {\n schema: string;\n [key: string]: unknown;\n }): Promise<string> {\n return this.provider.convertJsonSchemaToGrammar(schema);\n }\n\n // -------------------------------------------------------------------------\n // Native server (not available on web)\n // -------------------------------------------------------------------------\n async startNativeLlamaServer(_options?: {\n modelPath: string;\n host?: string;\n port?: number;\n params?: import('./definitions').NativeContextParams;\n }): Promise<{ running: boolean }> {\n throw new Error('LlamaCppWeb: native server is only available on iOS/Android/Desktop');\n }\n\n async stopNativeLlamaServer(): Promise<void> {}\n\n async isNativeLlamaServerRunning(): Promise<{ running: boolean }> {\n return { running: false };\n }\n\n // -------------------------------------------------------------------------\n // Events\n // -------------------------------------------------------------------------\n async addListener(eventName: string, listenerFunc: (data: unknown) => void): Promise<void> {\n if (!this.listeners.has(eventName)) {\n this.listeners.set(eventName, new Set());\n }\n this.listeners.get(eventName)!.add(listenerFunc);\n }\n\n async removeAllListeners(): Promise<void> {\n this.listeners.clear();\n }\n}\n\nexport * from './definitions';\n"]}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * External GGUF read — model bytes stay in JS/OPFS; WASM sync-fread pulls on demand.
3
+ * Does not require native WebAssembly JSPI (uses sync EM_JS, not EM_ASYNC_JS).
4
+ */
5
+ /** True when this build includes the cap-wasm-fs fread hook. */
6
+ export declare const canUseAsyncFileRead: (wasmJspiBuild?: boolean) => boolean;
7
+ export type AsyncFileReader = {
8
+ sizeBytes: number;
9
+ /** Must be synchronous — called from WASM EM_JS without suspend. */
10
+ readChunk: (offset: number, length: number) => Uint8Array;
11
+ };
12
+ /** Zero-copy subarray reader over a Uint8Array (ArrayBuffer load path). */
13
+ export declare const asyncReaderFromBytes: (bytes: Uint8Array) => AsyncFileReader;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * External GGUF read — model bytes stay in JS/OPFS; WASM sync-fread pulls on demand.
3
+ * Does not require native WebAssembly JSPI (uses sync EM_JS, not EM_ASYNC_JS).
4
+ */
5
+ /** True when this build includes the cap-wasm-fs fread hook. */
6
+ export const canUseAsyncFileRead = (wasmJspiBuild = false) => wasmJspiBuild;
7
+ /** Zero-copy subarray reader over a Uint8Array (ArrayBuffer load path). */
8
+ export const asyncReaderFromBytes = (bytes) => ({
9
+ sizeBytes: bytes.byteLength,
10
+ readChunk: (offset, length) => bytes.subarray(offset, Math.min(offset + length, bytes.byteLength)),
11
+ });
12
+ //# sourceMappingURL=async-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-file.js","sourceRoot":"","sources":["../../../src/workers/async-file.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,gEAAgE;AAChE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,aAAa,GAAG,KAAK,EAAW,EAAE,CAAC,aAAa,CAAC;AAQrF,2EAA2E;AAC3E,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAiB,EAAmB,EAAE,CAAC,CAAC;IAC3E,SAAS,EAAE,KAAK,CAAC,UAAU;IAC3B,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;CACnG,CAAC,CAAC","sourcesContent":["/**\n * External GGUF read — 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 — 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"]}