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,411 @@
1
+ import { getDesktopBridge, getDesktopSidecarPort } from './desktop.runtime';
2
+ import { readSidecarSseTokens } from './sidecar-sse';
3
+ import { WebProvider } from './provider.web';
4
+ import { LlmError } from './errors';
5
+ import { DefaultModelScheduler } from './model.scheduler';
6
+ import { WASM_MAX_CONCURRENT_MODELS } from './wasmMemoryPolicy';
7
+ const MAX_MODELS = WASM_MAX_CONCURRENT_MODELS;
8
+ /**
9
+ * Desktop LLM provider: native sidecar (HTTP) for GPU/CPU inference;
10
+ * WASM worker for multimodal, LoRA, TTS, bench (inherited via composition).
11
+ * Sidecar path supports up to 5 concurrent models with admission control.
12
+ */
13
+ export class DesktopProvider extends WebProvider {
14
+ constructor() {
15
+ super(...arguments);
16
+ this.platform = 'desktop';
17
+ this.sidecarPort = null;
18
+ this.sidecarScheduler = new DefaultModelScheduler(MAX_MODELS);
19
+ this.sidecarLoadedModels = new Set();
20
+ this.modelPaths = new Map();
21
+ }
22
+ getPort() {
23
+ if (this.sidecarPort != null)
24
+ return this.sidecarPort;
25
+ const p = getDesktopSidecarPort();
26
+ if (p == null) {
27
+ throw new LlmError('NATIVE_PLUGIN_UNAVAILABLE', 'Desktop sidecar port not set. Register desktop IPC handlers and preload bridge.');
28
+ }
29
+ this.sidecarPort = p;
30
+ return p;
31
+ }
32
+ sidecarAvailable() {
33
+ try {
34
+ this.getPort();
35
+ return true;
36
+ }
37
+ catch (_a) {
38
+ return false;
39
+ }
40
+ }
41
+ async getDesktopMemorySnapshot() {
42
+ const bridge = getDesktopBridge();
43
+ if (bridge === null || bridge === void 0 ? void 0 : bridge.getMemorySnapshot) {
44
+ return bridge.getMemorySnapshot();
45
+ }
46
+ return super.getMemorySnapshot();
47
+ }
48
+ mapSidecarHttpError(status, text) {
49
+ if (status === 429 || text.includes('model_limit_reached') || text.includes('Model limit')) {
50
+ return new LlmError('MODEL_LIMIT_REACHED', text.slice(0, 200));
51
+ }
52
+ if (text.includes('INSUFFICIENT') || text.includes('memory')) {
53
+ return new LlmError('INSUFFICIENT_MEMORY', text.slice(0, 200));
54
+ }
55
+ if (status === 404 && text.includes('model_not_found')) {
56
+ return new LlmError('MODEL_NOT_LOADED', text.slice(0, 200));
57
+ }
58
+ return new LlmError('INFERENCE_FAILED', `Sidecar HTTP ${status}: ${text.slice(0, 200)}`);
59
+ }
60
+ async sidecarFetch(path, method, body, timeoutMs = 120000) {
61
+ var _a;
62
+ const port = this.getPort();
63
+ const controller = new AbortController();
64
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
65
+ try {
66
+ const res = await fetch(`http://127.0.0.1:${port}${path}`, {
67
+ method,
68
+ headers: { 'Content-Type': 'application/json' },
69
+ body: body != null ? JSON.stringify(body) : undefined,
70
+ signal: controller.signal,
71
+ });
72
+ if (!res.ok) {
73
+ const text = await res.text();
74
+ throw this.mapSidecarHttpError(res.status, text);
75
+ }
76
+ const ct = (_a = res.headers.get('content-type')) !== null && _a !== void 0 ? _a : '';
77
+ if (ct.includes('application/json')) {
78
+ return (await res.json());
79
+ }
80
+ return {};
81
+ }
82
+ finally {
83
+ clearTimeout(timer);
84
+ }
85
+ }
86
+ async ensureSidecarProcess(opts) {
87
+ var _a;
88
+ if (this.sidecarAvailable()) {
89
+ return;
90
+ }
91
+ const bridge = getDesktopBridge();
92
+ if (!(bridge === null || bridge === void 0 ? void 0 : bridge.ensureSidecar)) {
93
+ throw new LlmError('NATIVE_PLUGIN_UNAVAILABLE', 'Desktop IPC bridge not available — register ipc-handlers in Electron main.');
94
+ }
95
+ const payload = {
96
+ modelId: opts === null || opts === void 0 ? void 0 : opts.modelId,
97
+ n_ctx: opts === null || opts === void 0 ? void 0 : opts.n_ctx,
98
+ n_gpu_layers: opts === null || opts === void 0 ? void 0 : opts.n_gpu_layers,
99
+ n_threads: opts === null || opts === void 0 ? void 0 : opts.n_threads,
100
+ embedding: opts === null || opts === void 0 ? void 0 : opts.embedding,
101
+ };
102
+ if (opts === null || opts === void 0 ? void 0 : opts.modelPath) {
103
+ payload.modelPath = opts.modelPath;
104
+ }
105
+ const result = await bridge.ensureSidecar(payload);
106
+ if (!(result === null || result === void 0 ? void 0 : result.ok) || !result.port) {
107
+ throw new LlmError('NATIVE_PLUGIN_UNAVAILABLE', `Sidecar failed to start: ${(_a = result === null || result === void 0 ? void 0 : result.reason) !== null && _a !== void 0 ? _a : 'unknown'}`);
108
+ }
109
+ this.setSidecarPort(result.port);
110
+ }
111
+ requireSidecarModel(modelId) {
112
+ if (!this.sidecarLoadedModels.has(modelId)) {
113
+ throw new LlmError('MODEL_NOT_LOADED', `Model '${modelId}' is not loaded on desktop sidecar`);
114
+ }
115
+ }
116
+ async setContextLimit(limit) {
117
+ const clamped = Math.min(MAX_MODELS, Math.max(1, Math.floor(limit)));
118
+ this.sidecarScheduler = new DefaultModelScheduler(clamped);
119
+ for (const modelId of this.sidecarLoadedModels) {
120
+ this.sidecarScheduler.markLoaded(modelId);
121
+ }
122
+ if (this.sidecarAvailable()) {
123
+ await this.sidecarFetch('/v1/internal/context-limit', 'POST', { limit: clamped }, 5000);
124
+ }
125
+ }
126
+ listLoadedModels() {
127
+ return this.sidecarScheduler.listLoaded();
128
+ }
129
+ async sidecarStreamChat(req, onToken) {
130
+ var _a, _b;
131
+ const port = this.getPort();
132
+ const controller = new AbortController();
133
+ const timer = setTimeout(() => controller.abort(), 300000);
134
+ let text = '';
135
+ let index = 0;
136
+ try {
137
+ const res = await fetch(`http://127.0.0.1:${port}/v1/chat/completions`, {
138
+ method: 'POST',
139
+ headers: { 'Content-Type': 'application/json' },
140
+ body: JSON.stringify({
141
+ model: req.modelId,
142
+ messages: req.messages,
143
+ prompt: req.prompt,
144
+ max_tokens: (_a = req.max_tokens) !== null && _a !== void 0 ? _a : 256,
145
+ temperature: (_b = req.temperature) !== null && _b !== void 0 ? _b : 0.7,
146
+ stream: true,
147
+ }),
148
+ signal: controller.signal,
149
+ });
150
+ if (!res.ok || !res.body) {
151
+ throw new LlmError('INFERENCE_FAILED', `Sidecar stream failed: ${res.status}`);
152
+ }
153
+ await readSidecarSseTokens(res.body, 'chat', (token) => {
154
+ text += token;
155
+ onToken({ modelId: req.modelId, token, index: index++ });
156
+ });
157
+ }
158
+ finally {
159
+ clearTimeout(timer);
160
+ }
161
+ return {
162
+ text,
163
+ tokens_predicted: index,
164
+ tokens_evaluated: 0,
165
+ finish_reason: 'stop',
166
+ };
167
+ }
168
+ async sidecarStreamCompletion(req, onToken) {
169
+ var _a, _b, _c;
170
+ const port = this.getPort();
171
+ const controller = new AbortController();
172
+ const timer = setTimeout(() => controller.abort(), 300000);
173
+ let text = '';
174
+ let index = 0;
175
+ try {
176
+ const res = await fetch(`http://127.0.0.1:${port}/v1/completions`, {
177
+ method: 'POST',
178
+ headers: { 'Content-Type': 'application/json' },
179
+ body: JSON.stringify({
180
+ model: req.modelId,
181
+ prompt: (_a = req.prompt) !== null && _a !== void 0 ? _a : '',
182
+ max_tokens: (_b = req.max_tokens) !== null && _b !== void 0 ? _b : 256,
183
+ temperature: (_c = req.temperature) !== null && _c !== void 0 ? _c : 0.7,
184
+ stream: true,
185
+ }),
186
+ signal: controller.signal,
187
+ });
188
+ if (!res.ok || !res.body) {
189
+ throw new LlmError('INFERENCE_FAILED', `Sidecar stream failed: ${res.status}`);
190
+ }
191
+ await readSidecarSseTokens(res.body, 'completion', (token) => {
192
+ text += token;
193
+ onToken({ modelId: req.modelId, token, index: index++ });
194
+ });
195
+ }
196
+ finally {
197
+ clearTimeout(timer);
198
+ }
199
+ return {
200
+ text,
201
+ tokens_predicted: index,
202
+ tokens_evaluated: 0,
203
+ finish_reason: 'stop',
204
+ };
205
+ }
206
+ async initialize(opts) {
207
+ if (!this.sidecarAvailable()) {
208
+ await this.ensureSidecarProcess(opts);
209
+ }
210
+ if (!this.sidecarAvailable()) {
211
+ await super.initialize(opts);
212
+ return;
213
+ }
214
+ await this.loadModel(opts);
215
+ }
216
+ async loadModel(opts) {
217
+ var _a;
218
+ if (!opts.modelId) {
219
+ throw new LlmError('INVALID_REQUEST', 'modelId is required');
220
+ }
221
+ await this.ensureSidecarProcess(opts);
222
+ if (!this.sidecarAvailable()) {
223
+ await super.loadModel(opts);
224
+ return;
225
+ }
226
+ const modelPath = (_a = opts.modelPath) !== null && _a !== void 0 ? _a : opts.modelId;
227
+ // Never register absolute filesystem paths as sidecar ids (DELETE route is single-segment).
228
+ const modelId = (() => {
229
+ const raw = opts.modelId;
230
+ if (!raw.includes('/') && !raw.includes('\\'))
231
+ return raw;
232
+ const base = raw.split(/[/\\]/).pop() || raw;
233
+ return base.replace(/\.gguf$/i, '') || base;
234
+ })();
235
+ if (this.sidecarLoadedModels.has(modelId)) {
236
+ return;
237
+ }
238
+ const modelBytes = typeof opts.modelBytes === 'number' ? opts.modelBytes : 0;
239
+ // Sidecar (Metal/Accelerate) reclaims macOS inactive pages; keep a modest reserve.
240
+ const reserveBytes = typeof opts.reserveBytes === 'number' ? opts.reserveBytes : 128 * 1024 * 1024;
241
+ const memory = await this.getDesktopMemorySnapshot();
242
+ if (typeof opts.availableMemoryBytes === 'number') {
243
+ memory.freeBytes = opts.availableMemoryBytes;
244
+ }
245
+ if (typeof opts.totalMemoryBytes === 'number') {
246
+ memory.totalBytes = opts.totalMemoryBytes;
247
+ }
248
+ // If host free RAM still looks absurdly low vs total (Node freemem quirk / no IPC),
249
+ // treat a fraction of total as available rather than blocking every load.
250
+ if (typeof memory.totalBytes === 'number' &&
251
+ typeof memory.freeBytes === 'number' &&
252
+ memory.totalBytes > 0 &&
253
+ memory.freeBytes / memory.totalBytes < 0.05) {
254
+ memory.freeBytes = Math.floor(memory.totalBytes * 0.45);
255
+ }
256
+ this.sidecarScheduler.ensureCapacity(modelId, modelBytes, memory, reserveBytes, {
257
+ skipWasm: true,
258
+ loadOpts: { n_ctx: opts.n_ctx, embedding: opts.embedding },
259
+ });
260
+ await this.sidecarFetch('/v1/internal/models/load', 'POST', {
261
+ model_id: modelId,
262
+ path: modelPath,
263
+ n_ctx: opts.n_ctx,
264
+ n_gpu_layers: opts.n_gpu_layers,
265
+ n_threads: opts.n_threads,
266
+ embedding: opts.embedding,
267
+ }, 300000);
268
+ this.sidecarLoadedModels.add(modelId);
269
+ this.modelPaths.set(modelId, modelPath);
270
+ this.sidecarScheduler.markLoaded(modelId, modelBytes, {
271
+ n_ctx: opts.n_ctx,
272
+ embedding: opts.embedding,
273
+ });
274
+ }
275
+ async unloadModel(modelId) {
276
+ if (!this.sidecarAvailable()) {
277
+ await super.unloadModel(modelId);
278
+ return;
279
+ }
280
+ const normalized = (() => {
281
+ if (!modelId.includes('/') && !modelId.includes('\\'))
282
+ return modelId;
283
+ const base = modelId.split(/[/\\]/).pop() || modelId;
284
+ return base.replace(/\.gguf$/i, '') || base;
285
+ })();
286
+ if (!this.sidecarLoadedModels.has(normalized) && !this.sidecarLoadedModels.has(modelId)) {
287
+ return;
288
+ }
289
+ const id = this.sidecarLoadedModels.has(normalized) ? normalized : modelId;
290
+ try {
291
+ await this.sidecarFetch(`/v1/internal/models/${encodeURIComponent(id)}`, 'DELETE', undefined, 60000);
292
+ }
293
+ catch (_a) {
294
+ /* model may already be gone on sidecar */
295
+ }
296
+ this.sidecarLoadedModels.delete(id);
297
+ this.sidecarLoadedModels.delete(modelId);
298
+ this.modelPaths.delete(id);
299
+ this.modelPaths.delete(modelId);
300
+ this.sidecarScheduler.markUnloaded(id);
301
+ }
302
+ async generate(req) {
303
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;
304
+ if (!this.sidecarAvailable()) {
305
+ return super.generate(req);
306
+ }
307
+ this.requireSidecarModel(req.modelId);
308
+ if (req.messages && req.messages.length > 0) {
309
+ const data = await this.sidecarFetch('/v1/chat/completions', 'POST', {
310
+ model: req.modelId,
311
+ messages: req.messages,
312
+ max_tokens: (_a = req.max_tokens) !== null && _a !== void 0 ? _a : 256,
313
+ temperature: (_b = req.temperature) !== null && _b !== void 0 ? _b : 0.7,
314
+ stream: false,
315
+ });
316
+ const text = (_f = (_e = (_d = (_c = data.choices) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.message) === null || _e === void 0 ? void 0 : _e.content) !== null && _f !== void 0 ? _f : '';
317
+ return {
318
+ text,
319
+ tokens_predicted: (_h = (_g = data.usage) === null || _g === void 0 ? void 0 : _g.completion_tokens) !== null && _h !== void 0 ? _h : 0,
320
+ tokens_evaluated: (_k = (_j = data.usage) === null || _j === void 0 ? void 0 : _j.prompt_tokens) !== null && _k !== void 0 ? _k : 0,
321
+ finish_reason: 'stop',
322
+ };
323
+ }
324
+ const data = await this.sidecarFetch('/v1/completions', 'POST', {
325
+ model: req.modelId,
326
+ prompt: (_l = req.prompt) !== null && _l !== void 0 ? _l : '',
327
+ max_tokens: (_m = req.max_tokens) !== null && _m !== void 0 ? _m : 256,
328
+ temperature: (_o = req.temperature) !== null && _o !== void 0 ? _o : 0.7,
329
+ stream: false,
330
+ });
331
+ return {
332
+ text: (_r = (_q = (_p = data.choices) === null || _p === void 0 ? void 0 : _p[0]) === null || _q === void 0 ? void 0 : _q.text) !== null && _r !== void 0 ? _r : '',
333
+ tokens_predicted: (_t = (_s = data.usage) === null || _s === void 0 ? void 0 : _s.completion_tokens) !== null && _t !== void 0 ? _t : 0,
334
+ tokens_evaluated: (_v = (_u = data.usage) === null || _u === void 0 ? void 0 : _u.prompt_tokens) !== null && _v !== void 0 ? _v : 0,
335
+ finish_reason: 'stop',
336
+ };
337
+ }
338
+ async generateStream(req, onToken) {
339
+ if (!this.sidecarAvailable()) {
340
+ return super.generateStream(req, onToken);
341
+ }
342
+ this.requireSidecarModel(req.modelId);
343
+ if (req.messages && req.messages.length > 0) {
344
+ return this.sidecarStreamChat(req, onToken);
345
+ }
346
+ return this.sidecarStreamCompletion(req, onToken);
347
+ }
348
+ async embed(req) {
349
+ var _a;
350
+ if (!this.sidecarAvailable()) {
351
+ return super.embed(req);
352
+ }
353
+ this.requireSidecarModel(req.modelId);
354
+ const input = Array.isArray(req.input) ? req.input : [req.input];
355
+ const data = await this.sidecarFetch('/v1/embeddings', 'POST', { model: req.modelId, input });
356
+ return { vectors: ((_a = data.data) !== null && _a !== void 0 ? _a : []).map((d) => { var _a; return (_a = d.embedding) !== null && _a !== void 0 ? _a : []; }) };
357
+ }
358
+ async tokenize(modelId, text) {
359
+ if (!this.sidecarAvailable()) {
360
+ return super.tokenize(modelId, text);
361
+ }
362
+ return super.tokenize(modelId, text);
363
+ }
364
+ async detokenize(modelId, tokens) {
365
+ if (!this.sidecarAvailable()) {
366
+ return super.detokenize(modelId, tokens);
367
+ }
368
+ return super.detokenize(modelId, tokens);
369
+ }
370
+ async getMemorySnapshot() {
371
+ if (!this.sidecarAvailable()) {
372
+ return super.getMemorySnapshot();
373
+ }
374
+ const memory = await this.getDesktopMemorySnapshot();
375
+ try {
376
+ const reg = await this.sidecarFetch('/v1/internal/memory', 'GET', undefined, 5000);
377
+ return Object.assign(Object.assign({}, memory), { loadedModelCount: reg.loaded_count, maxModels: reg.max_models });
378
+ }
379
+ catch (_a) {
380
+ return memory;
381
+ }
382
+ }
383
+ async health() {
384
+ if (!this.sidecarAvailable()) {
385
+ return super.health();
386
+ }
387
+ try {
388
+ const h = await this.sidecarFetch('/health', 'GET', undefined, 5000);
389
+ return {
390
+ ok: h.status === 'ok',
391
+ details: {
392
+ backend: 'sidecar',
393
+ port: this.getPort(),
394
+ platform: 'desktop',
395
+ loadedModels: this.listLoadedModels(),
396
+ registry: h.registry,
397
+ },
398
+ };
399
+ }
400
+ catch (err) {
401
+ return { ok: false, details: { error: String(err) } };
402
+ }
403
+ }
404
+ setSidecarPort(port) {
405
+ this.sidecarPort = port;
406
+ if (typeof globalThis !== 'undefined') {
407
+ globalThis.__annadataSidecarPort = port;
408
+ }
409
+ }
410
+ }
411
+ //# sourceMappingURL=provider.desktop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.desktop.js","sourceRoot":"","sources":["../../../src/isomorphic/provider.desktop.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n EmbedRequest,\n EmbedResult,\n GenerateRequest,\n GenerateResult,\n InitializeOptions,\n MemorySnapshot,\n PlatformKind,\n TokenEvent,\n} from './provider.interface';\nimport { getDesktopBridge, getDesktopSidecarPort } from './desktop.runtime';\nimport { readSidecarSseTokens } from './sidecar-sse';\nimport { WebProvider } from './provider.web';\nimport { LlmError } from './errors';\nimport { DefaultModelScheduler } from './model.scheduler';\nimport { WASM_MAX_CONCURRENT_MODELS } from './wasmMemoryPolicy';\nimport type { DetokenizeResult, TokenizeResult } from '../workers/wasm.engine';\n\nconst MAX_MODELS = WASM_MAX_CONCURRENT_MODELS;\n\n/**\n * Desktop LLM provider: native sidecar (HTTP) for GPU/CPU inference;\n * WASM worker for multimodal, LoRA, TTS, bench (inherited via composition).\n * Sidecar path supports up to 5 concurrent models with admission control.\n */\nexport class DesktopProvider extends WebProvider {\n override readonly platform: PlatformKind = 'desktop';\n\n private sidecarPort: number | null = null;\n private sidecarScheduler = new DefaultModelScheduler(MAX_MODELS);\n private sidecarLoadedModels = new Set<string>();\n private modelPaths = new Map<string, string>();\n\n private getPort(): number {\n if (this.sidecarPort != null) return this.sidecarPort;\n const p = getDesktopSidecarPort();\n if (p == null) {\n throw new LlmError(\n 'NATIVE_PLUGIN_UNAVAILABLE',\n 'Desktop sidecar port not set. Register desktop IPC handlers and preload bridge.',\n );\n }\n this.sidecarPort = p;\n return p;\n }\n\n private sidecarAvailable(): boolean {\n try {\n this.getPort();\n return true;\n } catch {\n return false;\n }\n }\n\n private async getDesktopMemorySnapshot(): Promise<MemorySnapshot> {\n const bridge = getDesktopBridge();\n if (bridge?.getMemorySnapshot) {\n return bridge.getMemorySnapshot();\n }\n return super.getMemorySnapshot();\n }\n\n private mapSidecarHttpError(status: number, text: string): LlmError {\n if (status === 429 || text.includes('model_limit_reached') || text.includes('Model limit')) {\n return new LlmError('MODEL_LIMIT_REACHED', text.slice(0, 200));\n }\n if (text.includes('INSUFFICIENT') || text.includes('memory')) {\n return new LlmError('INSUFFICIENT_MEMORY', text.slice(0, 200));\n }\n if (status === 404 && text.includes('model_not_found')) {\n return new LlmError('MODEL_NOT_LOADED', text.slice(0, 200));\n }\n return new LlmError('INFERENCE_FAILED', `Sidecar HTTP ${status}: ${text.slice(0, 200)}`);\n }\n\n private async sidecarFetch<T>(\n path: string,\n method: 'GET' | 'POST' | 'DELETE',\n body?: unknown,\n timeoutMs = 120000,\n ): Promise<T> {\n const port = this.getPort();\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetch(`http://127.0.0.1:${port}${path}`, {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: body != null ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text();\n throw this.mapSidecarHttpError(res.status, text);\n }\n const ct = res.headers.get('content-type') ?? '';\n if (ct.includes('application/json')) {\n return (await res.json()) as T;\n }\n return {} as T;\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async ensureSidecarProcess(opts?: InitializeOptions): Promise<void> {\n if (this.sidecarAvailable()) {\n return;\n }\n const bridge = getDesktopBridge();\n if (!bridge?.ensureSidecar) {\n throw new LlmError(\n 'NATIVE_PLUGIN_UNAVAILABLE',\n 'Desktop IPC bridge not available — register ipc-handlers in Electron main.',\n );\n }\n const payload: Parameters<NonNullable<ReturnType<typeof getDesktopBridge>>['ensureSidecar']>[0] = {\n modelId: opts?.modelId,\n n_ctx: opts?.n_ctx,\n n_gpu_layers: opts?.n_gpu_layers,\n n_threads: opts?.n_threads,\n embedding: opts?.embedding,\n };\n if (opts?.modelPath) {\n payload.modelPath = opts.modelPath;\n }\n const result = await bridge.ensureSidecar(payload);\n if (!result?.ok || !result.port) {\n throw new LlmError(\n 'NATIVE_PLUGIN_UNAVAILABLE',\n `Sidecar failed to start: ${result?.reason ?? 'unknown'}`,\n );\n }\n this.setSidecarPort(result.port);\n }\n\n private requireSidecarModel(modelId: string): void {\n if (!this.sidecarLoadedModels.has(modelId)) {\n throw new LlmError('MODEL_NOT_LOADED', `Model '${modelId}' is not loaded on desktop sidecar`);\n }\n }\n\n async setContextLimit(limit: number): Promise<void> {\n const clamped = Math.min(MAX_MODELS, Math.max(1, Math.floor(limit)));\n this.sidecarScheduler = new DefaultModelScheduler(clamped);\n for (const modelId of this.sidecarLoadedModels) {\n this.sidecarScheduler.markLoaded(modelId);\n }\n if (this.sidecarAvailable()) {\n await this.sidecarFetch('/v1/internal/context-limit', 'POST', { limit: clamped }, 5000);\n }\n }\n\n listLoadedModels(): string[] {\n return this.sidecarScheduler.listLoaded();\n }\n\n private async sidecarStreamChat(\n req: GenerateRequest,\n onToken: (event: TokenEvent) => void,\n ): Promise<GenerateResult> {\n const port = this.getPort();\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 300000);\n let text = '';\n let index = 0;\n try {\n const res = await fetch(`http://127.0.0.1:${port}/v1/chat/completions`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: req.modelId,\n messages: req.messages,\n prompt: req.prompt,\n max_tokens: req.max_tokens ?? 256,\n temperature: req.temperature ?? 0.7,\n stream: true,\n }),\n signal: controller.signal,\n });\n if (!res.ok || !res.body) {\n throw new LlmError('INFERENCE_FAILED', `Sidecar stream failed: ${res.status}`);\n }\n await readSidecarSseTokens(res.body, 'chat', (token) => {\n text += token;\n onToken({ modelId: req.modelId, token, index: index++ });\n });\n } finally {\n clearTimeout(timer);\n }\n return {\n text,\n tokens_predicted: index,\n tokens_evaluated: 0,\n finish_reason: 'stop',\n };\n }\n\n private async sidecarStreamCompletion(\n req: GenerateRequest,\n onToken: (event: TokenEvent) => void,\n ): Promise<GenerateResult> {\n const port = this.getPort();\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 300000);\n let text = '';\n let index = 0;\n try {\n const res = await fetch(`http://127.0.0.1:${port}/v1/completions`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: req.modelId,\n prompt: req.prompt ?? '',\n max_tokens: req.max_tokens ?? 256,\n temperature: req.temperature ?? 0.7,\n stream: true,\n }),\n signal: controller.signal,\n });\n if (!res.ok || !res.body) {\n throw new LlmError('INFERENCE_FAILED', `Sidecar stream failed: ${res.status}`);\n }\n await readSidecarSseTokens(res.body, 'completion', (token) => {\n text += token;\n onToken({ modelId: req.modelId, token, index: index++ });\n });\n } finally {\n clearTimeout(timer);\n }\n return {\n text,\n tokens_predicted: index,\n tokens_evaluated: 0,\n finish_reason: 'stop',\n };\n }\n\n override async initialize(opts: InitializeOptions): Promise<void> {\n if (!this.sidecarAvailable()) {\n await this.ensureSidecarProcess(opts);\n }\n if (!this.sidecarAvailable()) {\n await super.initialize(opts);\n return;\n }\n await this.loadModel(opts);\n }\n\n override async loadModel(opts: InitializeOptions): Promise<void> {\n if (!opts.modelId) {\n throw new LlmError('INVALID_REQUEST', 'modelId is required');\n }\n\n await this.ensureSidecarProcess(opts);\n if (!this.sidecarAvailable()) {\n await super.loadModel(opts);\n return;\n }\n\n const modelPath = opts.modelPath ?? opts.modelId;\n // Never register absolute filesystem paths as sidecar ids (DELETE route is single-segment).\n const modelId = (() => {\n const raw = opts.modelId;\n if (!raw.includes('/') && !raw.includes('\\\\')) return raw;\n const base = raw.split(/[/\\\\]/).pop() || raw;\n return base.replace(/\\.gguf$/i, '') || base;\n })();\n if (this.sidecarLoadedModels.has(modelId)) {\n return;\n }\n const modelBytes = typeof opts.modelBytes === 'number' ? opts.modelBytes : 0;\n // Sidecar (Metal/Accelerate) reclaims macOS inactive pages; keep a modest reserve.\n const reserveBytes =\n typeof opts.reserveBytes === 'number' ? opts.reserveBytes : 128 * 1024 * 1024;\n const memory = await this.getDesktopMemorySnapshot();\n if (typeof opts.availableMemoryBytes === 'number') {\n memory.freeBytes = opts.availableMemoryBytes;\n }\n if (typeof opts.totalMemoryBytes === 'number') {\n memory.totalBytes = opts.totalMemoryBytes;\n }\n // If host free RAM still looks absurdly low vs total (Node freemem quirk / no IPC),\n // treat a fraction of total as available rather than blocking every load.\n if (\n typeof memory.totalBytes === 'number' &&\n typeof memory.freeBytes === 'number' &&\n memory.totalBytes > 0 &&\n memory.freeBytes / memory.totalBytes < 0.05\n ) {\n memory.freeBytes = Math.floor(memory.totalBytes * 0.45);\n }\n this.sidecarScheduler.ensureCapacity(modelId, modelBytes, memory, reserveBytes, {\n skipWasm: true,\n loadOpts: { n_ctx: opts.n_ctx, embedding: opts.embedding },\n });\n\n await this.sidecarFetch(\n '/v1/internal/models/load',\n 'POST',\n {\n model_id: modelId,\n path: modelPath,\n n_ctx: opts.n_ctx,\n n_gpu_layers: opts.n_gpu_layers,\n n_threads: opts.n_threads,\n embedding: opts.embedding,\n },\n 300000,\n );\n\n this.sidecarLoadedModels.add(modelId);\n this.modelPaths.set(modelId, modelPath);\n this.sidecarScheduler.markLoaded(modelId, modelBytes, {\n n_ctx: opts.n_ctx,\n embedding: opts.embedding,\n });\n }\n\n override async unloadModel(modelId: string): Promise<void> {\n if (!this.sidecarAvailable()) {\n await super.unloadModel(modelId);\n return;\n }\n const normalized = (() => {\n if (!modelId.includes('/') && !modelId.includes('\\\\')) return modelId;\n const base = modelId.split(/[/\\\\]/).pop() || modelId;\n return base.replace(/\\.gguf$/i, '') || base;\n })();\n if (!this.sidecarLoadedModels.has(normalized) && !this.sidecarLoadedModels.has(modelId)) {\n return;\n }\n const id = this.sidecarLoadedModels.has(normalized) ? normalized : modelId;\n try {\n await this.sidecarFetch(\n `/v1/internal/models/${encodeURIComponent(id)}`,\n 'DELETE',\n undefined,\n 60000,\n );\n } catch {\n /* model may already be gone on sidecar */\n }\n this.sidecarLoadedModels.delete(id);\n this.sidecarLoadedModels.delete(modelId);\n this.modelPaths.delete(id);\n this.modelPaths.delete(modelId);\n this.sidecarScheduler.markUnloaded(id);\n }\n\n override async generate(req: GenerateRequest): Promise<GenerateResult> {\n if (!this.sidecarAvailable()) {\n return super.generate(req);\n }\n this.requireSidecarModel(req.modelId);\n if (req.messages && req.messages.length > 0) {\n const data = await this.sidecarFetch<{\n choices?: Array<{ message?: { content?: string } }>;\n usage?: { completion_tokens?: number; prompt_tokens?: number };\n }>('/v1/chat/completions', 'POST', {\n model: req.modelId,\n messages: req.messages,\n max_tokens: req.max_tokens ?? 256,\n temperature: req.temperature ?? 0.7,\n stream: false,\n });\n const text = data.choices?.[0]?.message?.content ?? '';\n return {\n text,\n tokens_predicted: data.usage?.completion_tokens ?? 0,\n tokens_evaluated: data.usage?.prompt_tokens ?? 0,\n finish_reason: 'stop',\n };\n }\n const data = await this.sidecarFetch<{\n choices?: Array<{ text?: string }>;\n usage?: { completion_tokens?: number; prompt_tokens?: number };\n }>('/v1/completions', 'POST', {\n model: req.modelId,\n prompt: req.prompt ?? '',\n max_tokens: req.max_tokens ?? 256,\n temperature: req.temperature ?? 0.7,\n stream: false,\n });\n return {\n text: data.choices?.[0]?.text ?? '',\n tokens_predicted: data.usage?.completion_tokens ?? 0,\n tokens_evaluated: data.usage?.prompt_tokens ?? 0,\n finish_reason: 'stop',\n };\n }\n\n override async generateStream(\n req: GenerateRequest,\n onToken: (event: TokenEvent) => void,\n ): Promise<GenerateResult> {\n if (!this.sidecarAvailable()) {\n return super.generateStream(req, onToken);\n }\n this.requireSidecarModel(req.modelId);\n if (req.messages && req.messages.length > 0) {\n return this.sidecarStreamChat(req, onToken);\n }\n return this.sidecarStreamCompletion(req, onToken);\n }\n\n override async embed(req: EmbedRequest): Promise<EmbedResult> {\n if (!this.sidecarAvailable()) {\n return super.embed(req);\n }\n this.requireSidecarModel(req.modelId);\n const input = Array.isArray(req.input) ? req.input : [req.input];\n const data = await this.sidecarFetch<{\n data?: Array<{ embedding?: number[] }>;\n }>('/v1/embeddings', 'POST', { model: req.modelId, input });\n return { vectors: (data.data ?? []).map((d) => d.embedding ?? []) };\n }\n\n override async tokenize(modelId: string, text: string): Promise<TokenizeResult> {\n if (!this.sidecarAvailable()) {\n return super.tokenize(modelId, text);\n }\n return super.tokenize(modelId, text);\n }\n\n override async detokenize(modelId: string, tokens: number[]): Promise<DetokenizeResult> {\n if (!this.sidecarAvailable()) {\n return super.detokenize(modelId, tokens);\n }\n return super.detokenize(modelId, tokens);\n }\n\n override async getMemorySnapshot(): Promise<MemorySnapshot> {\n if (!this.sidecarAvailable()) {\n return super.getMemorySnapshot();\n }\n const memory = await this.getDesktopMemorySnapshot();\n try {\n const reg = await this.sidecarFetch<{\n loaded_count?: number;\n max_models?: number;\n }>('/v1/internal/memory', 'GET', undefined, 5000);\n return {\n ...memory,\n loadedModelCount: reg.loaded_count,\n maxModels: reg.max_models,\n };\n } catch {\n return memory;\n }\n }\n\n override async health(): Promise<{ ok: boolean; details?: Record<string, unknown> }> {\n if (!this.sidecarAvailable()) {\n return super.health();\n }\n try {\n const h = await this.sidecarFetch<{ status?: string; registry?: Record<string, unknown> }>(\n '/health',\n 'GET',\n undefined,\n 5000,\n );\n return {\n ok: h.status === 'ok',\n details: {\n backend: 'sidecar',\n port: this.getPort(),\n platform: 'desktop',\n loadedModels: this.listLoadedModels(),\n registry: h.registry,\n },\n };\n } catch (err) {\n return { ok: false, details: { error: String(err) } };\n }\n }\n\n setSidecarPort(port: number): void {\n this.sidecarPort = port;\n if (typeof globalThis !== 'undefined') {\n (globalThis as { __annadataSidecarPort?: number }).__annadataSidecarPort = port;\n }\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import type { LlmProvider } from './provider.interface';
2
+ export declare function createLlmProvider(): LlmProvider;
@@ -0,0 +1,16 @@
1
+ import { Capacitor } from '@capacitor/core';
2
+ import { NativeProvider } from './provider.native';
3
+ import { WebProvider } from './provider.web';
4
+ import { DesktopProvider } from './provider.desktop';
5
+ import { isDesktopRuntime } from './desktop.runtime';
6
+ export function createLlmProvider() {
7
+ if (isDesktopRuntime()) {
8
+ return new DesktopProvider();
9
+ }
10
+ const platform = Capacitor.getPlatform();
11
+ if (platform === 'ios' || platform === 'android') {
12
+ return new NativeProvider();
13
+ }
14
+ return new WebProvider();
15
+ }
16
+ //# sourceMappingURL=provider.factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.factory.js","sourceRoot":"","sources":["../../../src/isomorphic/provider.factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,UAAU,iBAAiB;IAC/B,IAAI,gBAAgB,EAAE,EAAE,CAAC;QACvB,OAAO,IAAI,eAAe,EAAE,CAAC;IAC/B,CAAC;IACD,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IACzC,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACjD,OAAO,IAAI,cAAc,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,IAAI,WAAW,EAAE,CAAC;AAC3B,CAAC","sourcesContent":["import { Capacitor } from '@capacitor/core';\nimport type { LlmProvider } from './provider.interface';\nimport { NativeProvider } from './provider.native';\nimport { WebProvider } from './provider.web';\nimport { DesktopProvider } from './provider.desktop';\nimport { isDesktopRuntime } from './desktop.runtime';\n\nexport function createLlmProvider(): LlmProvider {\n if (isDesktopRuntime()) {\n return new DesktopProvider();\n }\n const platform = Capacitor.getPlatform();\n if (platform === 'ios' || platform === 'android') {\n return new NativeProvider();\n }\n return new WebProvider();\n}\n\n"]}
@@ -0,0 +1,76 @@
1
+ export type PlatformKind = 'native' | 'web' | 'desktop';
2
+ export interface InitializeOptions {
3
+ modelId: string;
4
+ modelPath?: string;
5
+ modelUrl?: string;
6
+ n_ctx?: number;
7
+ n_batch?: number;
8
+ n_threads?: number;
9
+ n_gpu_layers?: number;
10
+ embedding?: boolean;
11
+ /** WASM: force VFS streaming instead of HeapFS (default: auto for models >500 MB). */
12
+ preferVfsStreaming?: boolean;
13
+ /** WASM: use mmap when loading from VFS (default false — safer for large GGUF). */
14
+ use_mmap?: boolean;
15
+ /** Called during OPFS model download with running byte counts (#6). */
16
+ onProgress?: (downloaded: number, total: number) => void;
17
+ [key: string]: unknown;
18
+ }
19
+ export interface GenerateRequest {
20
+ modelId: string;
21
+ prompt?: string;
22
+ messages?: Array<{
23
+ role: string;
24
+ content: string;
25
+ }>;
26
+ max_tokens?: number;
27
+ temperature?: number;
28
+ top_p?: number;
29
+ top_k?: number;
30
+ min_p?: number;
31
+ repeat_penalty?: number;
32
+ seed?: number;
33
+ stop?: string | string[];
34
+ grammar?: string;
35
+ stream?: boolean;
36
+ }
37
+ export interface TokenEvent {
38
+ modelId: string;
39
+ token: string;
40
+ index: number;
41
+ }
42
+ export interface GenerateResult {
43
+ text: string;
44
+ tokens_predicted: number;
45
+ tokens_evaluated: number;
46
+ finish_reason: 'stop' | 'length' | 'error';
47
+ }
48
+ export interface EmbedRequest {
49
+ modelId: string;
50
+ input: string | string[];
51
+ }
52
+ export interface EmbedResult {
53
+ vectors: number[][];
54
+ }
55
+ export interface MemorySnapshot {
56
+ totalBytes?: number;
57
+ freeBytes?: number;
58
+ usedBytes?: number;
59
+ pressure: 'low' | 'medium' | 'high' | 'unknown';
60
+ loadedModelCount?: number;
61
+ maxModels?: number;
62
+ }
63
+ export interface LlmProvider {
64
+ readonly platform: PlatformKind;
65
+ initialize(opts: InitializeOptions): Promise<void>;
66
+ loadModel(opts: InitializeOptions): Promise<void>;
67
+ unloadModel(modelId: string): Promise<void>;
68
+ generate(req: GenerateRequest): Promise<GenerateResult>;
69
+ generateStream(req: GenerateRequest, onToken: (event: TokenEvent) => void): Promise<GenerateResult>;
70
+ embed(req: EmbedRequest): Promise<EmbedResult>;
71
+ getMemorySnapshot(): Promise<MemorySnapshot>;
72
+ health(): Promise<{
73
+ ok: boolean;
74
+ details?: Record<string, unknown>;
75
+ }>;
76
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=provider.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.interface.js","sourceRoot":"","sources":["../../../src/isomorphic/provider.interface.ts"],"names":[],"mappings":"","sourcesContent":["export type PlatformKind = 'native' | 'web' | 'desktop';\n\nexport interface InitializeOptions {\n modelId: string;\n modelPath?: string;\n modelUrl?: string;\n n_ctx?: number;\n n_batch?: number;\n n_threads?: number;\n n_gpu_layers?: number;\n embedding?: boolean;\n /** WASM: force VFS streaming instead of HeapFS (default: auto for models >500 MB). */\n preferVfsStreaming?: boolean;\n /** WASM: use mmap when loading from VFS (default false — safer for large GGUF). */\n use_mmap?: boolean;\n /** Called during OPFS model download with running byte counts (#6). */\n onProgress?: (downloaded: number, total: number) => void;\n [key: string]: unknown;\n}\n\nexport interface GenerateRequest {\n modelId: string;\n prompt?: string;\n messages?: Array<{ role: string; content: string }>;\n max_tokens?: number;\n temperature?: number;\n top_p?: number;\n top_k?: number;\n min_p?: number;\n repeat_penalty?: number;\n seed?: number;\n stop?: string | string[];\n grammar?: string;\n stream?: boolean;\n}\n\nexport interface TokenEvent {\n modelId: string;\n token: string;\n index: number;\n}\n\nexport interface GenerateResult {\n text: string;\n tokens_predicted: number;\n tokens_evaluated: number;\n finish_reason: 'stop' | 'length' | 'error';\n}\n\nexport interface EmbedRequest {\n modelId: string;\n input: string | string[];\n}\n\nexport interface EmbedResult {\n vectors: number[][];\n}\n\nexport interface MemorySnapshot {\n totalBytes?: number;\n freeBytes?: number;\n usedBytes?: number;\n pressure: 'low' | 'medium' | 'high' | 'unknown';\n loadedModelCount?: number;\n maxModels?: number;\n}\n\nexport interface LlmProvider {\n readonly platform: PlatformKind;\n initialize(opts: InitializeOptions): Promise<void>;\n loadModel(opts: InitializeOptions): Promise<void>;\n unloadModel(modelId: string): Promise<void>;\n generate(req: GenerateRequest): Promise<GenerateResult>;\n generateStream(req: GenerateRequest, onToken: (event: TokenEvent) => void): Promise<GenerateResult>;\n embed(req: EmbedRequest): Promise<EmbedResult>;\n getMemorySnapshot(): Promise<MemorySnapshot>;\n health(): Promise<{ ok: boolean; details?: Record<string, unknown> }>;\n}\n\n"]}
@@ -0,0 +1,18 @@
1
+ import type { EmbedRequest, EmbedResult, GenerateRequest, GenerateResult, InitializeOptions, LlmProvider, MemorySnapshot, TokenEvent } from './provider.interface';
2
+ export declare class NativeProvider implements LlmProvider {
3
+ readonly platform: "native";
4
+ private contextByModel;
5
+ private nextContextId;
6
+ private scheduler;
7
+ initialize(opts: InitializeOptions): Promise<void>;
8
+ loadModel(opts: InitializeOptions): Promise<void>;
9
+ unloadModel(modelId: string): Promise<void>;
10
+ generate(req: GenerateRequest): Promise<GenerateResult>;
11
+ generateStream(req: GenerateRequest, onToken: (event: TokenEvent) => void): Promise<GenerateResult>;
12
+ embed(req: EmbedRequest): Promise<EmbedResult>;
13
+ getMemorySnapshot(): Promise<MemorySnapshot>;
14
+ health(): Promise<{
15
+ ok: boolean;
16
+ details?: Record<string, unknown>;
17
+ }>;
18
+ }