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,103 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Preflight check before electron-builder packaging.
4
+ *
5
+ * Usage:
6
+ * node scripts/ensure-desktop-sidecar-bundle.cjs
7
+ * node scripts/ensure-desktop-sidecar-bundle.cjs --platform=darwin|linux|win32
8
+ * node scripts/ensure-desktop-sidecar-bundle.cjs --arch=arm64|x64|universal
9
+ *
10
+ * By default, only the current host platform/arch binary is required
11
+ * (correct for local Electron dev on Apple Silicon). Pass --arch=universal
12
+ * on macOS to require both darwin-arm64 and darwin-x64.
13
+ */
14
+
15
+ 'use strict';
16
+
17
+ const fs = require('fs');
18
+ const path = require('path');
19
+ const os = require('os');
20
+
21
+ const root = path.resolve(__dirname, '..');
22
+ const extra = path.join(root, 'extraResources', 'sidecar');
23
+
24
+ function argValue(name) {
25
+ const prefix = `--${name}=`;
26
+ const hit = process.argv.find((a) => a.startsWith(prefix));
27
+ if (hit) return hit.slice(prefix.length);
28
+ const idx = process.argv.indexOf(`--${name}`);
29
+ if (idx >= 0 && process.argv[idx + 1] && !process.argv[idx + 1].startsWith('-')) {
30
+ return process.argv[idx + 1];
31
+ }
32
+ return null;
33
+ }
34
+
35
+ const platform = argValue('platform') || process.platform;
36
+ const archOpt = argValue('arch');
37
+
38
+ function hostArchLabel() {
39
+ const a = os.arch();
40
+ if (a === 'arm64') return 'arm64';
41
+ if (a === 'x64' || a === 'x86_64') return 'x64';
42
+ return a;
43
+ }
44
+
45
+ function requiredBinaries(plat, archMode) {
46
+ if (plat === 'darwin') {
47
+ if (archMode === 'universal' || archMode === 'all') {
48
+ return ['darwin-arm64', 'darwin-x64'];
49
+ }
50
+ const arch = archMode === 'x64' || archMode === 'arm64' ? archMode : hostArchLabel();
51
+ return [`darwin-${arch}`];
52
+ }
53
+ if (plat === 'linux') {
54
+ return ['linux-x64'];
55
+ }
56
+ if (plat === 'win32') {
57
+ return ['win32-x64.exe'];
58
+ }
59
+ return [];
60
+ }
61
+
62
+ const optional = {
63
+ darwin: [],
64
+ linux: ['linux-x64-rocm', 'linux-x64-cuda', 'linux-x64-vulkan', 'linux-x64-openblas'],
65
+ win32: ['win32-x64-rocm.exe', 'win32-x64-cuda.exe', 'win32-x64-vulkan.exe', 'win32-x64-openblas.exe'],
66
+ };
67
+
68
+ const required = requiredBinaries(platform, archOpt);
69
+ const errors = [];
70
+
71
+ if (!required.length) {
72
+ process.stderr.write(`Unsupported platform: ${platform}\n`);
73
+ process.exit(1);
74
+ }
75
+
76
+ for (const name of required) {
77
+ const p = path.join(extra, name);
78
+ if (!fs.existsSync(p)) {
79
+ errors.push(`Missing required: extraResources/sidecar/${name}`);
80
+ }
81
+ }
82
+
83
+ if (errors.length) {
84
+ process.stderr.write('Desktop sidecar bundle incomplete:\n\n');
85
+ for (const e of errors) process.stderr.write(` • ${e}\n`);
86
+ process.stderr.write('\nRun: npm run build:sidecar && npm run stage:desktop\n');
87
+ if (platform === 'darwin') {
88
+ process.stderr.write(
89
+ 'Tip: on Apple Silicon only darwin-arm64 is required for local Electron.\n' +
90
+ ' For universal Mac packages: npm run verify:desktop:bundle -- --arch=universal\n',
91
+ );
92
+ }
93
+ process.exit(1);
94
+ }
95
+
96
+ const foundOptional = (optional[platform] || []).filter((n) =>
97
+ fs.existsSync(path.join(extra, n)),
98
+ );
99
+ process.stdout.write(
100
+ `Desktop bundle OK (${platform}): ${required.join(', ')}` +
101
+ (foundOptional.length ? `; GPU variants: ${foundOptional.join(', ')}` : '') +
102
+ '\n',
103
+ );
@@ -0,0 +1,108 @@
1
+ #!/usr/bin/env bash
2
+ # Build llama-cpp.xcframework (device + simulator) inside this npm package.
3
+ #
4
+ # Consumer Capacitor apps — run from app root after npm install (do not copy this file):
5
+ # bash node_modules/llama-cpp-capacitor/scripts/ensure-llama-ios-xcframework.sh
6
+ #
7
+ # Plugin developers — from this repo:
8
+ # npm run build:ios:xcframework
9
+ set -euo pipefail
10
+
11
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
12
+
13
+ # Plugin root: this script lives in scripts/ inside the npm package.
14
+ if [ -f "$SCRIPT_DIR/../ios/CMakeLists.txt" ] && [ -f "$SCRIPT_DIR/../package.json" ]; then
15
+ PLUGIN_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
16
+ else
17
+ echo "Error: could not locate llama-cpp-capacitor plugin root (expected ios/CMakeLists.txt next to package.json)."
18
+ exit 1
19
+ fi
20
+
21
+ IOS_DIR="$PLUGIN_DIR/ios"
22
+ FRAMEWORK_DIR="$IOS_DIR/Frameworks"
23
+ XCFRAMEWORK_DIR="$FRAMEWORK_DIR/llama-cpp.xcframework"
24
+ BUILD_PROFILE_FILE="$FRAMEWORK_DIR/.llama-cpp-build-profile"
25
+ # Bump when native sources change (e.g. Metal embed) so cached xcframework is rebuilt.
26
+ EXPECTED_BUILD_PROFILE="metal-embed-cpu-fallback-v1"
27
+ DEVICE_BUILD_DIR="$IOS_DIR/build-device"
28
+ SIM_BUILD_DIR="$IOS_DIR/build-simulator"
29
+
30
+ if [[ "$OSTYPE" != darwin* ]]; then
31
+ echo "Skipping llama-cpp xcframework build: macOS with Xcode is required."
32
+ exit 0
33
+ fi
34
+
35
+ if [ -d "$XCFRAMEWORK_DIR" ]; then
36
+ if [ -f "$BUILD_PROFILE_FILE" ] && [ "$(cat "$BUILD_PROFILE_FILE")" = "$EXPECTED_BUILD_PROFILE" ]; then
37
+ echo "llama-cpp iOS xcframework is already present at $XCFRAMEWORK_DIR"
38
+ exit 0
39
+ fi
40
+ echo "Rebuilding llama-cpp iOS xcframework (build profile changed or missing)."
41
+ rm -rf "$XCFRAMEWORK_DIR"
42
+ fi
43
+
44
+ rm -rf "$DEVICE_BUILD_DIR" "$SIM_BUILD_DIR"
45
+
46
+ if ! command -v cmake >/dev/null 2>&1; then
47
+ echo "Error: cmake is required to build llama-cpp for iOS."
48
+ exit 1
49
+ fi
50
+
51
+ build_framework() {
52
+ local build_dir="$1"
53
+ local sdk="$2"
54
+ local architectures="$3"
55
+
56
+ rm -rf "$build_dir"
57
+ mkdir -p "$build_dir"
58
+ cmake -S "$IOS_DIR" -B "$build_dir" \
59
+ -DCMAKE_BUILD_TYPE=Release \
60
+ -DCMAKE_OSX_SYSROOT="$sdk" \
61
+ -DCMAKE_OSX_ARCHITECTURES="$architectures" \
62
+ -DCMAKE_OSX_DEPLOYMENT_TARGET=15.0 \
63
+ -DCMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE=NO \
64
+ >&2
65
+
66
+ local jobs
67
+ jobs="$(sysctl -n hw.ncpu 2>/dev/null || echo 4)"
68
+ cmake --build "$build_dir" --config Release -- -j"$jobs" >&2
69
+
70
+ if [ -d "$build_dir/llama-cpp.framework" ]; then
71
+ printf '%s\n' "$build_dir/llama-cpp.framework"
72
+ return 0
73
+ fi
74
+
75
+ echo "Error: llama-cpp.framework was not produced in $build_dir" >&2
76
+ exit 1
77
+ }
78
+
79
+ echo "Building llama-cpp for iOS device (arm64)..."
80
+ DEVICE_FRAMEWORK="$(build_framework "$DEVICE_BUILD_DIR" iphoneos arm64)"
81
+
82
+ echo "Building llama-cpp for iOS simulator..."
83
+ SIM_ARCHITECTURES="arm64"
84
+ if [ "$(uname -m)" = "x86_64" ]; then
85
+ SIM_ARCHITECTURES="x86_64"
86
+ fi
87
+ SIM_FRAMEWORK="$(build_framework "$SIM_BUILD_DIR" iphonesimulator "$SIM_ARCHITECTURES")"
88
+
89
+ rm -rf "$XCFRAMEWORK_DIR"
90
+ xcodebuild -create-xcframework \
91
+ -framework "$DEVICE_FRAMEWORK" \
92
+ -framework "$SIM_FRAMEWORK" \
93
+ -output "$XCFRAMEWORK_DIR"
94
+
95
+ if [ ! -d "$XCFRAMEWORK_DIR" ]; then
96
+ echo "Error: failed to create $XCFRAMEWORK_DIR"
97
+ exit 1
98
+ fi
99
+
100
+ mkdir -p "$FRAMEWORK_DIR"
101
+ printf '%s' "$EXPECTED_BUILD_PROFILE" > "$BUILD_PROFILE_FILE"
102
+
103
+ # Keep a flat device framework copy for CocoaPods / dlopen (arm64 slice).
104
+ rm -rf "$FRAMEWORK_DIR/llama-cpp.framework"
105
+ cp -R "$DEVICE_FRAMEWORK" "$FRAMEWORK_DIR/llama-cpp.framework"
106
+
107
+ echo "Created llama-cpp xcframework at $XCFRAMEWORK_DIR"
108
+ echo "Updated device framework at $FRAMEWORK_DIR/llama-cpp.framework"
@@ -0,0 +1,45 @@
1
+ /**
2
+ * TypeScript emits extensionless relative imports under moduleResolution:node.
3
+ * Native ESM (Node + Vite exclude) needs explicit .js suffixes.
4
+ */
5
+ const { readdirSync, readFileSync, writeFileSync, statSync } = require('node:fs');
6
+ const { join, extname } = require('node:path');
7
+
8
+ const esmRoot = join(__dirname, '..', 'dist', 'esm');
9
+
10
+ const IMPORT_RE =
11
+ /(from\s+|import\s*\(\s*|export\s+\*\s+from\s+|export\s+\{[^}]*\}\s+from\s+)(['"])(\.[^'"]+?)\2/g;
12
+
13
+ function walk(dir, out = []) {
14
+ for (const name of readdirSync(dir)) {
15
+ const p = join(dir, name);
16
+ const st = statSync(p);
17
+ if (st.isDirectory()) walk(p, out);
18
+ else if (extname(p) === '.js') out.push(p);
19
+ }
20
+ return out;
21
+ }
22
+
23
+ function rewrite(source) {
24
+ return source.replace(IMPORT_RE, (full, prefix, quote, spec) => {
25
+ if (/\.(js|mjs|cjs|json|wasm)(\?|$)/.test(spec)) return full;
26
+ return `${prefix}${quote}${spec}.js${quote}`;
27
+ });
28
+ }
29
+
30
+ if (!statSync(esmRoot, { throwIfNoEntry: false })?.isDirectory()) {
31
+ console.warn('[llama-cpp-pro] fix-esm-extensions: dist/esm missing');
32
+ process.exit(0);
33
+ }
34
+
35
+ let changed = 0;
36
+ for (const file of walk(esmRoot)) {
37
+ const before = readFileSync(file, 'utf8');
38
+ const after = rewrite(before);
39
+ if (after !== before) {
40
+ writeFileSync(file, after);
41
+ changed += 1;
42
+ }
43
+ }
44
+
45
+ console.log(`[llama-cpp-pro] fixed ESM import extensions in ${changed} file(s)`);
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Runs on npm pack/install (prepare). Builds JS dist when missing; no-ops otherwise.
3
+ */
4
+ const { existsSync } = require('node:fs');
5
+ const { join } = require('node:path');
6
+ const { spawnSync } = require('node:child_process');
7
+
8
+ const root = join(__dirname, '..');
9
+ const marker = join(root, 'dist', 'esm', 'index.js');
10
+
11
+ if (existsSync(marker)) {
12
+ process.exit(0);
13
+ }
14
+
15
+ const tsc = join(root, 'node_modules', '.bin', 'tsc');
16
+ if (!existsSync(tsc)) {
17
+ console.warn(
18
+ '[llama-cpp-pro] dist/ missing and local build tools not installed yet. Run: npm run build:js',
19
+ );
20
+ process.exit(0);
21
+ }
22
+
23
+ const r = spawnSync('npm', ['run', 'build:js'], {
24
+ cwd: root,
25
+ stdio: 'inherit',
26
+ shell: process.platform === 'win32',
27
+ });
28
+ process.exit(r.status ?? 1);
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Stage sidecar binaries, ggml GPU plugins, and WASM assets into extraResources/
4
+ * for electron-builder packaging.
5
+ *
6
+ * Usage: node scripts/stage-desktop-resources.cjs [--platform darwin|linux|win32]
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const fs = require('fs');
12
+ const path = require('path');
13
+
14
+ const root = path.resolve(__dirname, '..');
15
+ const srcBin = path.join(root, 'sidecar', 'bin');
16
+ const dstRoot = path.join(root, 'extraResources', 'sidecar');
17
+
18
+ const platformArg = process.argv.find((a) => a.startsWith('--platform='));
19
+ const onlyPlatform = platformArg ? platformArg.split('=')[1] : null;
20
+
21
+ function mkdirp(p) {
22
+ fs.mkdirSync(p, { recursive: true });
23
+ }
24
+
25
+ function copyFile(src, dst) {
26
+ if (!fs.existsSync(src)) return false;
27
+ mkdirp(path.dirname(dst));
28
+ fs.copyFileSync(src, dst);
29
+ return true;
30
+ }
31
+
32
+ function copyDir(src, dst, filter) {
33
+ if (!fs.existsSync(src)) return 0;
34
+ mkdirp(dst);
35
+ let n = 0;
36
+ for (const name of fs.readdirSync(src)) {
37
+ const sp = path.join(src, name);
38
+ const dp = path.join(dst, name);
39
+ const st = fs.statSync(sp);
40
+ if (st.isDirectory()) {
41
+ n += copyDir(sp, dp, filter);
42
+ } else if (!filter || filter(name)) {
43
+ fs.copyFileSync(sp, dp);
44
+ n += 1;
45
+ }
46
+ }
47
+ return n;
48
+ }
49
+
50
+ const BIN_PATTERNS = [
51
+ /^darwin-(arm64|x64)$/,
52
+ /^linux-x64(-(rocm|cuda|vulkan|openblas))?$/,
53
+ /^win32-x64(-(rocm|cuda|vulkan|openblas))?\.exe$/,
54
+ ];
55
+
56
+ function shouldCopyBin(name) {
57
+ return BIN_PATTERNS.some((re) => re.test(name));
58
+ }
59
+
60
+ function stageSidecarBins() {
61
+ if (!fs.existsSync(srcBin)) {
62
+ console.error(`Missing ${srcBin} — run npm run build:sidecar first`);
63
+ process.exit(1);
64
+ }
65
+ mkdirp(dstRoot);
66
+ let copied = 0;
67
+ for (const name of fs.readdirSync(srcBin)) {
68
+ if (!shouldCopyBin(name)) continue;
69
+ if (onlyPlatform && !name.startsWith(onlyPlatform)) continue;
70
+ const ok = copyFile(path.join(srcBin, name), path.join(dstRoot, name));
71
+ if (ok) {
72
+ copied += 1;
73
+ console.log(` staged ${name}`);
74
+ }
75
+ }
76
+ return copied;
77
+ }
78
+
79
+ function stageGgmlPlugins() {
80
+ const srcPlugins = path.join(srcBin, 'ggml-plugins');
81
+ if (!fs.existsSync(srcPlugins)) return 0;
82
+ return copyDir(srcPlugins, path.join(dstRoot, 'ggml-plugins'), (n) =>
83
+ /\.(so|dll|dylib)/i.test(n) || !n.includes('.'),
84
+ );
85
+ }
86
+
87
+ function stageRuntimeLibs() {
88
+ const srcLibs = path.join(srcBin, 'runtime-libs');
89
+ if (!fs.existsSync(srcLibs)) return 0;
90
+ return copyDir(srcLibs, path.join(dstRoot, 'runtime-libs'), (n) =>
91
+ /\.(so|dll|dylib)/i.test(n) || !n.includes('.'),
92
+ );
93
+ }
94
+
95
+ function stageWasm() {
96
+ const srcWasm = path.join(root, 'dist', 'wasm');
97
+ const dstWasm = path.join(root, 'extraResources', 'llama-wasm');
98
+ if (!fs.existsSync(srcWasm)) {
99
+ console.warn(' wasm: dist/wasm not found — run npm run build:pwa');
100
+ return 0;
101
+ }
102
+ return copyDir(srcWasm, dstWasm);
103
+ }
104
+
105
+ console.log('Staging desktop resources...');
106
+ const bins = stageSidecarBins();
107
+ const plugins = stageGgmlPlugins();
108
+ const libs = stageRuntimeLibs();
109
+ const wasm = stageWasm();
110
+
111
+ console.log(`Done: ${bins} sidecar binary(ies), ${plugins} plugin file(s), ${libs} runtime lib(s), ${wasm} wasm file(s)`);
112
+
113
+ if (bins === 0) {
114
+ console.error('No sidecar binaries staged.');
115
+ process.exit(1);
116
+ }
@@ -0,0 +1,192 @@
1
+ # =============================================================================
2
+ # llama-cpp-sidecar — Native accelerated desktop sidecar binary
3
+ #
4
+ # Builds a standalone executable with the embedded cap-native-server HTTP API.
5
+ # GPU backends (Vulkan, CUDA, ROCm/HIP) are loaded dynamically at runtime from
6
+ # libggml-*.so / ggml-*.dll placed next to the binary (see cmake/ggml-backends.cmake).
7
+ #
8
+ # Usage:
9
+ # cmake -B build -DCMAKE_BUILD_TYPE=Release -DSIDECAR_VARIANT=<variant>
10
+ # cmake --build build --config Release
11
+ #
12
+ # Variants (set via -DSIDECAR_VARIANT):
13
+ # vulkan-openblas — CPU + dynamic Vulkan [default win/linux x64]
14
+ # vulkan — dynamic Vulkan only
15
+ # openblas — CPU-optimized (OpenBLAS when available)
16
+ # cuda — dynamic CUDA (NVIDIA)
17
+ # rocm — dynamic ROCm/HIP (AMD)
18
+ # metal — Apple Metal GPU (macOS)
19
+ # metal-coreml — Metal + CoreML ANE (macOS arm64)
20
+ # cpu — CPU-only universal fallback
21
+ # =============================================================================
22
+
23
+ cmake_minimum_required(VERSION 3.16)
24
+ project(llama-cpp-sidecar VERSION 0.2.0 LANGUAGES C CXX)
25
+
26
+ set(CMAKE_CXX_STANDARD 17)
27
+ set(CMAKE_CXX_STANDARD_REQUIRED ON)
28
+
29
+ include(${CMAKE_CURRENT_LIST_DIR}/../cmake/desktop-sources.cmake)
30
+
31
+ # ---------------------------------------------------------------------------
32
+ # Platform / architecture detection
33
+ # ---------------------------------------------------------------------------
34
+
35
+ if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
36
+ set(SIDECAR_PLATFORM "win32")
37
+ elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
38
+ set(SIDECAR_PLATFORM "darwin")
39
+ elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
40
+ set(SIDECAR_PLATFORM "linux")
41
+ else()
42
+ set(SIDECAR_PLATFORM "${CMAKE_SYSTEM_NAME}")
43
+ endif()
44
+
45
+ set(_SIDECAR_DETECTED_PROC "${CMAKE_SYSTEM_PROCESSOR}")
46
+ if(CMAKE_OSX_ARCHITECTURES AND NOT CMAKE_OSX_ARCHITECTURES STREQUAL "")
47
+ set(_SIDECAR_DETECTED_PROC "${CMAKE_OSX_ARCHITECTURES}")
48
+ endif()
49
+
50
+ if(_SIDECAR_DETECTED_PROC MATCHES "^(aarch64|arm64|ARM64)$")
51
+ set(SIDECAR_ARCH "arm64")
52
+ elseif(_SIDECAR_DETECTED_PROC MATCHES "^(x86_64|AMD64|amd64)$")
53
+ set(SIDECAR_ARCH "x64")
54
+ else()
55
+ set(SIDECAR_ARCH "${_SIDECAR_DETECTED_PROC}")
56
+ endif()
57
+
58
+ # ---------------------------------------------------------------------------
59
+ # Variant selection
60
+ # ---------------------------------------------------------------------------
61
+
62
+ set(SIDECAR_VARIANT "" CACHE STRING
63
+ "Build variant: vulkan-openblas, cuda, rocm, metal, metal-coreml, cpu, openblas, vulkan")
64
+
65
+ if(NOT SIDECAR_VARIANT)
66
+ if(SIDECAR_PLATFORM STREQUAL "darwin" AND SIDECAR_ARCH STREQUAL "arm64")
67
+ set(SIDECAR_VARIANT "metal-coreml")
68
+ elseif(SIDECAR_PLATFORM STREQUAL "darwin")
69
+ set(SIDECAR_VARIANT "metal")
70
+ else()
71
+ set(SIDECAR_VARIANT "vulkan-openblas")
72
+ endif()
73
+ endif()
74
+
75
+ set(SIDECAR_NEEDS_SUFFIX ON)
76
+ if(SIDECAR_VARIANT STREQUAL "vulkan-openblas" AND NOT SIDECAR_PLATFORM STREQUAL "darwin")
77
+ set(SIDECAR_NEEDS_SUFFIX OFF)
78
+ elseif(SIDECAR_VARIANT STREQUAL "metal-coreml" AND SIDECAR_PLATFORM STREQUAL "darwin" AND SIDECAR_ARCH STREQUAL "arm64")
79
+ set(SIDECAR_NEEDS_SUFFIX OFF)
80
+ elseif(SIDECAR_VARIANT STREQUAL "metal" AND SIDECAR_PLATFORM STREQUAL "darwin")
81
+ set(SIDECAR_NEEDS_SUFFIX OFF)
82
+ endif()
83
+
84
+ if(SIDECAR_NEEDS_SUFFIX)
85
+ set(SIDECAR_BINARY_NAME "${SIDECAR_PLATFORM}-${SIDECAR_ARCH}-${SIDECAR_VARIANT}")
86
+ else()
87
+ set(SIDECAR_BINARY_NAME "${SIDECAR_PLATFORM}-${SIDECAR_ARCH}")
88
+ endif()
89
+
90
+ message(STATUS "Sidecar target: ${SIDECAR_BINARY_NAME}")
91
+ message(STATUS "Platform: ${SIDECAR_PLATFORM} Arch: ${SIDECAR_ARCH} Variant: ${SIDECAR_VARIANT}")
92
+
93
+ # ---------------------------------------------------------------------------
94
+ # Compile definitions per variant
95
+ # ---------------------------------------------------------------------------
96
+
97
+ set(SIDECAR_COMPILE_DEFS
98
+ -DNDEBUG
99
+ -DLM_GGML_USE_CPU
100
+ )
101
+
102
+ set(SIDECAR_SOURCES ${ANNADATA_DESKTOP_CORE_SOURCES})
103
+
104
+ if(SIDECAR_VARIANT MATCHES "metal")
105
+ list(APPEND SIDECAR_SOURCES ${ANNADATA_CPP_DIR}/ggml-metal.m)
106
+ list(APPEND SIDECAR_COMPILE_DEFS
107
+ -DLM_GGML_USE_METAL
108
+ -DLM_GGML_METAL_EMBED_LIBRARY
109
+ -DLM_GGML_METAL_USE_BF16
110
+ )
111
+ if(APPLE)
112
+ list(APPEND SIDECAR_COMPILE_DEFS -DLM_GGML_USE_ACCELERATE)
113
+ endif()
114
+ endif()
115
+
116
+ # Vulkan/CUDA/ROCm are loaded dynamically via lm_ggml_backend_load_all_from_path().
117
+ # Variant names select which plugin DLLs to bundle (see scripts/build-ggml-backends.sh).
118
+
119
+ # ---------------------------------------------------------------------------
120
+ # Metal shader embedding (macOS)
121
+ # ---------------------------------------------------------------------------
122
+
123
+ if(SIDECAR_VARIANT MATCHES "metal" AND APPLE)
124
+ enable_language(ASM)
125
+ include(${CMAKE_CURRENT_LIST_DIR}/../cmake/desktop-metal-embed.cmake)
126
+ list(APPEND SIDECAR_SOURCES ${METALLIB_EMBED_ASM})
127
+ endif()
128
+
129
+ # ---------------------------------------------------------------------------
130
+ # Executable target
131
+ # ---------------------------------------------------------------------------
132
+
133
+ add_executable(${SIDECAR_BINARY_NAME}
134
+ ${CMAKE_CURRENT_SOURCE_DIR}/cap-sidecar-main.cpp
135
+ ${SIDECAR_SOURCES}
136
+ )
137
+
138
+ target_include_directories(${SIDECAR_BINARY_NAME} PRIVATE
139
+ ${ANNADATA_CPP_DIR}
140
+ ${ANNADATA_CPP_DIR}/ggml-cpu
141
+ ${ANNADATA_CPP_DIR}/tools/mtmd
142
+ ${ANNADATA_CPP_DIR}/vendor/cpp-httplib
143
+ )
144
+
145
+ target_compile_options(${SIDECAR_BINARY_NAME} PRIVATE ${SIDECAR_COMPILE_DEFS})
146
+
147
+ find_package(Threads REQUIRED)
148
+ target_link_libraries(${SIDECAR_BINARY_NAME} PRIVATE Threads::Threads)
149
+
150
+ if(APPLE)
151
+ find_library(ACCELERATE_FRAMEWORK Accelerate)
152
+ find_library(METAL_FRAMEWORK Metal)
153
+ find_library(FOUNDATION_FRAMEWORK Foundation)
154
+ find_library(METALKIT_FRAMEWORK MetalKit)
155
+ target_link_libraries(${SIDECAR_BINARY_NAME} PRIVATE
156
+ ${ACCELERATE_FRAMEWORK}
157
+ ${METAL_FRAMEWORK}
158
+ ${FOUNDATION_FRAMEWORK}
159
+ ${METALKIT_FRAMEWORK}
160
+ )
161
+ # Honor target arch (allows arm64→x86_64 cross-builds via CMAKE_OSX_ARCHITECTURES)
162
+ if(SIDECAR_ARCH STREQUAL "arm64")
163
+ set_target_properties(${SIDECAR_BINARY_NAME} PROPERTIES OSX_ARCHITECTURES "arm64")
164
+ elseif(SIDECAR_ARCH STREQUAL "x64")
165
+ set_target_properties(${SIDECAR_BINARY_NAME} PROPERTIES OSX_ARCHITECTURES "x86_64")
166
+ endif()
167
+ endif()
168
+
169
+ if(WIN32)
170
+ target_link_libraries(${SIDECAR_BINARY_NAME} PRIVATE ws2_32)
171
+ if(MSVC)
172
+ set_property(TARGET ${SIDECAR_BINARY_NAME} PROPERTY
173
+ MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
174
+ endif()
175
+ endif()
176
+
177
+ if(UNIX AND NOT APPLE)
178
+ target_link_options(${SIDECAR_BINARY_NAME} PRIVATE -static-libgcc -static-libstdc++)
179
+ endif()
180
+
181
+ set_target_properties(${SIDECAR_BINARY_NAME} PROPERTIES
182
+ RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
183
+ OUTPUT_NAME "${SIDECAR_BINARY_NAME}"
184
+ )
185
+
186
+ # Optional: build ggml backend plugins from upstream llama.cpp
187
+ set(LLAMA_CPP_UPSTREAM "" CACHE PATH "Path to upstream llama.cpp for ggml GPU backend plugins")
188
+ if(LLAMA_CPP_UPSTREAM AND EXISTS "${LLAMA_CPP_UPSTREAM}/CMakeLists.txt")
189
+ include(${CMAKE_CURRENT_LIST_DIR}/../cmake/ggml-backends.cmake)
190
+ endif()
191
+
192
+ install(TARGETS ${SIDECAR_BINARY_NAME} RUNTIME DESTINATION "sidecar")
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Standalone desktop sidecar entry point.
3
+ *
4
+ * Loads optional ggml GPU backend plugins (libggml-vulkan.so, libggml-cuda.so, …)
5
+ * from the executable directory, then runs cap_llama_server_main until SIGINT/SIGTERM.
6
+ */
7
+
8
+ #include "cap-native-server.h"
9
+ #include "ggml-backend.h"
10
+ #include "llama.h"
11
+
12
+ #include <atomic>
13
+ #include <chrono>
14
+ #include <csignal>
15
+ #include <cstring>
16
+ #include <filesystem>
17
+ #include <thread>
18
+
19
+ namespace {
20
+
21
+ std::atomic<bool> g_shutdown{false};
22
+
23
+ void on_signal(int) {
24
+ g_shutdown.store(true);
25
+ }
26
+
27
+ void install_signal_handlers() {
28
+ std::signal(SIGINT, on_signal);
29
+ std::signal(SIGTERM, on_signal);
30
+ #ifndef _WIN32
31
+ std::signal(SIGHUP, on_signal);
32
+ #endif
33
+ }
34
+
35
+ const char * resolve_backend_dir(int argc, char ** argv) {
36
+ for (int i = 1; i < argc - 1; i++) {
37
+ if (argv[i] && std::strcmp(argv[i], "--backend-dir") == 0 && argv[i + 1]) {
38
+ return argv[i + 1];
39
+ }
40
+ }
41
+ return nullptr;
42
+ }
43
+
44
+ void load_dynamic_backends(int argc, char ** argv) {
45
+ const char * dir = resolve_backend_dir(argc, argv);
46
+ lm_ggml_backend_load_all_from_path(dir);
47
+ }
48
+
49
+ } // namespace
50
+
51
+ int main(int argc, char ** argv) {
52
+ install_signal_handlers();
53
+ llama_backend_init();
54
+ load_dynamic_backends(argc, argv);
55
+
56
+ if (cap_llama_server_main(argc, argv) != 0) {
57
+ llama_backend_free();
58
+ return 1;
59
+ }
60
+
61
+ while (!g_shutdown.load() && cap_llama_server_is_running()) {
62
+ std::this_thread::sleep_for(std::chrono::milliseconds(200));
63
+ }
64
+
65
+ cap_llama_server_stop();
66
+ llama_backend_free();
67
+ return 0;
68
+ }