@atomic-chat/core 0.19.1 → 0.20.6

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 (335) hide show
  1. package/dist/app-daemon.js +5 -0
  2. package/dist/app-daemon.js.map +1 -1
  3. package/dist/audio/args.d.ts +19 -0
  4. package/dist/audio/args.js +39 -0
  5. package/dist/audio/args.js.map +1 -0
  6. package/dist/audio/capabilities.d.ts +24 -0
  7. package/dist/audio/capabilities.js +96 -0
  8. package/dist/audio/capabilities.js.map +1 -0
  9. package/dist/audio/config.d.ts +40 -0
  10. package/dist/audio/config.js +57 -0
  11. package/dist/audio/config.js.map +1 -0
  12. package/dist/audio/errors.d.ts +23 -0
  13. package/dist/audio/errors.js +52 -0
  14. package/dist/audio/errors.js.map +1 -0
  15. package/dist/audio/gallery.d.ts +30 -0
  16. package/dist/audio/gallery.js +152 -0
  17. package/dist/audio/gallery.js.map +1 -0
  18. package/dist/audio/http.d.ts +26 -0
  19. package/dist/audio/http.js +56 -0
  20. package/dist/audio/http.js.map +1 -0
  21. package/dist/audio/idle.d.ts +22 -0
  22. package/dist/audio/idle.js +44 -0
  23. package/dist/audio/idle.js.map +1 -0
  24. package/dist/audio/index.d.ts +26 -0
  25. package/dist/audio/index.js +27 -0
  26. package/dist/audio/index.js.map +1 -0
  27. package/dist/audio/install.d.ts +57 -0
  28. package/dist/audio/install.js +196 -0
  29. package/dist/audio/install.js.map +1 -0
  30. package/dist/audio/jobs.d.ts +77 -0
  31. package/dist/audio/jobs.js +340 -0
  32. package/dist/audio/jobs.js.map +1 -0
  33. package/dist/audio/model-files.d.ts +12 -0
  34. package/dist/audio/model-files.js +42 -0
  35. package/dist/audio/model-files.js.map +1 -0
  36. package/dist/audio/output.d.ts +32 -0
  37. package/dist/audio/output.js +93 -0
  38. package/dist/audio/output.js.map +1 -0
  39. package/dist/audio/parse.d.ts +15 -0
  40. package/dist/audio/parse.js +149 -0
  41. package/dist/audio/parse.js.map +1 -0
  42. package/dist/audio/recipe.d.ts +22 -0
  43. package/dist/audio/recipe.js +92 -0
  44. package/dist/audio/recipe.js.map +1 -0
  45. package/dist/audio/request.d.ts +24 -0
  46. package/dist/audio/request.js +86 -0
  47. package/dist/audio/request.js.map +1 -0
  48. package/dist/audio/server-process.d.ts +51 -0
  49. package/dist/audio/server-process.js +202 -0
  50. package/dist/audio/server-process.js.map +1 -0
  51. package/dist/audio/service.d.ts +107 -0
  52. package/dist/audio/service.js +402 -0
  53. package/dist/audio/service.js.map +1 -0
  54. package/dist/audio/session.d.ts +73 -0
  55. package/dist/audio/session.js +216 -0
  56. package/dist/audio/session.js.map +1 -0
  57. package/dist/audio/state.d.ts +68 -0
  58. package/dist/audio/state.js +88 -0
  59. package/dist/audio/state.js.map +1 -0
  60. package/dist/audio/types.d.ts +52 -0
  61. package/dist/audio/types.js +8 -0
  62. package/dist/audio/types.js.map +1 -0
  63. package/dist/audio/wav.d.ts +22 -0
  64. package/dist/audio/wav.js +56 -0
  65. package/dist/audio/wav.js.map +1 -0
  66. package/dist/audio/wiring.d.ts +31 -0
  67. package/dist/audio/wiring.js +41 -0
  68. package/dist/audio/wiring.js.map +1 -0
  69. package/dist/backend/install/service.js +4 -2
  70. package/dist/backend/install/service.js.map +1 -1
  71. package/dist/cli/launch.js +2 -0
  72. package/dist/cli/launch.js.map +1 -1
  73. package/dist/cli/main.d.ts +1 -1
  74. package/dist/cli/main.js +5 -0
  75. package/dist/cli/main.js.map +1 -1
  76. package/dist/client/control-client.d.ts +21 -1
  77. package/dist/client/control-client.js +50 -0
  78. package/dist/client/control-client.js.map +1 -1
  79. package/dist/client/index.d.ts +1 -0
  80. package/dist/client/index.js +1 -0
  81. package/dist/client/index.js.map +1 -1
  82. package/dist/client/model-catalog.d.ts +40 -0
  83. package/dist/client/model-catalog.js +149 -0
  84. package/dist/client/model-catalog.js.map +1 -0
  85. package/dist/cloud/registry.js +1 -0
  86. package/dist/cloud/registry.js.map +1 -1
  87. package/dist/config/paths.d.ts +22 -1
  88. package/dist/config/paths.js +24 -0
  89. package/dist/config/paths.js.map +1 -1
  90. package/dist/contracts/audio.d.ts +290 -0
  91. package/dist/contracts/audio.js +24 -0
  92. package/dist/contracts/audio.js.map +1 -0
  93. package/dist/contracts/embedding.js +1 -0
  94. package/dist/contracts/embedding.js.map +1 -1
  95. package/dist/contracts/engine-builds.d.ts +10 -4
  96. package/dist/contracts/engine-builds.js +10 -2
  97. package/dist/contracts/engine-builds.js.map +1 -1
  98. package/dist/contracts/engines.d.ts +1 -1
  99. package/dist/contracts/engines.js +4 -0
  100. package/dist/contracts/engines.js.map +1 -1
  101. package/dist/contracts/errors.d.ts +14 -2
  102. package/dist/contracts/errors.js +29 -0
  103. package/dist/contracts/errors.js.map +1 -1
  104. package/dist/contracts/events.d.ts +10 -0
  105. package/dist/contracts/geniex.d.ts +98 -0
  106. package/dist/contracts/geniex.js +15 -0
  107. package/dist/contracts/geniex.js.map +1 -0
  108. package/dist/contracts/index.d.ts +2 -0
  109. package/dist/contracts/index.js +2 -0
  110. package/dist/contracts/index.js.map +1 -1
  111. package/dist/contracts/model-yml.d.ts +40 -0
  112. package/dist/contracts/model-yml.js +7 -0
  113. package/dist/contracts/model-yml.js.map +1 -1
  114. package/dist/contracts/session.d.ts +6 -1
  115. package/dist/contracts/session.js.map +1 -1
  116. package/dist/contracts/settings.d.ts +12 -1
  117. package/dist/contracts/settings.js.map +1 -1
  118. package/dist/core/atomic-core.d.ts +6 -1
  119. package/dist/core/atomic-core.js +7 -1
  120. package/dist/core/atomic-core.js.map +1 -1
  121. package/dist/core/create.js +105 -6
  122. package/dist/core/create.js.map +1 -1
  123. package/dist/core/gpu-residency.d.ts +8 -2
  124. package/dist/core/gpu-residency.js +9 -1
  125. package/dist/core/gpu-residency.js.map +1 -1
  126. package/dist/core/types.d.ts +3 -0
  127. package/dist/core/types.js.map +1 -1
  128. package/dist/diffusion/install.d.ts +6 -3
  129. package/dist/diffusion/install.js +5 -4
  130. package/dist/diffusion/install.js.map +1 -1
  131. package/dist/embedding/index.js +1 -0
  132. package/dist/embedding/index.js.map +1 -1
  133. package/dist/engine-builds/engines.d.ts +31 -8
  134. package/dist/engine-builds/engines.js +118 -14
  135. package/dist/engine-builds/engines.js.map +1 -1
  136. package/dist/engine-builds/geniex.d.ts +35 -0
  137. package/dist/engine-builds/geniex.js +111 -0
  138. package/dist/engine-builds/geniex.js.map +1 -0
  139. package/dist/engine-builds/index.d.ts +3 -2
  140. package/dist/engine-builds/index.js +3 -2
  141. package/dist/engine-builds/index.js.map +1 -1
  142. package/dist/engine-builds/manifest.d.ts +95 -5
  143. package/dist/engine-builds/manifest.js +152 -9
  144. package/dist/engine-builds/manifest.js.map +1 -1
  145. package/dist/engine-builds/order.d.ts +7 -1
  146. package/dist/engine-builds/order.js +13 -0
  147. package/dist/engine-builds/order.js.map +1 -1
  148. package/dist/engine-builds/select.d.ts +43 -11
  149. package/dist/engine-builds/select.js +64 -16
  150. package/dist/engine-builds/select.js.map +1 -1
  151. package/dist/engine-builds/service.d.ts +19 -11
  152. package/dist/engine-builds/service.js +31 -9
  153. package/dist/engine-builds/service.js.map +1 -1
  154. package/dist/engines/service.d.ts +4 -3
  155. package/dist/engines/service.js +5 -3
  156. package/dist/engines/service.js.map +1 -1
  157. package/dist/engines/versions.js +3 -0
  158. package/dist/engines/versions.js.map +1 -1
  159. package/dist/integrations/catalog.d.ts +3 -1
  160. package/dist/integrations/catalog.js +8 -2
  161. package/dist/integrations/catalog.js.map +1 -1
  162. package/dist/integrations/config-io.d.ts +45 -4
  163. package/dist/integrations/config-io.js +91 -6
  164. package/dist/integrations/config-io.js.map +1 -1
  165. package/dist/integrations/configure/codex-repair.d.ts +75 -0
  166. package/dist/integrations/configure/codex-repair.js +254 -0
  167. package/dist/integrations/configure/codex-repair.js.map +1 -0
  168. package/dist/integrations/configure/codex.d.ts +48 -10
  169. package/dist/integrations/configure/codex.js +126 -32
  170. package/dist/integrations/configure/codex.js.map +1 -1
  171. package/dist/integrations/configure/registry.d.ts +4 -1
  172. package/dist/integrations/configure/registry.js +1 -0
  173. package/dist/integrations/configure/registry.js.map +1 -1
  174. package/dist/lock/process-journal.d.ts +3 -3
  175. package/dist/models/compatibility/rules-baseline.js +1 -0
  176. package/dist/models/compatibility/rules-baseline.js.map +1 -1
  177. package/dist/models/compatibility/rules.js +1 -0
  178. package/dist/models/compatibility/rules.js.map +1 -1
  179. package/dist/models/gguf/kv-cache.d.ts +5 -0
  180. package/dist/models/gguf/kv-cache.js +35 -2
  181. package/dist/models/gguf/kv-cache.js.map +1 -1
  182. package/dist/models/gguf/reader.d.ts +5 -0
  183. package/dist/models/gguf/reader.js +15 -3
  184. package/dist/models/gguf/reader.js.map +1 -1
  185. package/dist/models/hf.d.ts +3 -0
  186. package/dist/models/hf.js +11 -4
  187. package/dist/models/hf.js.map +1 -1
  188. package/dist/router/resolve.d.ts +3 -2
  189. package/dist/router/resolve.js +3 -1
  190. package/dist/router/resolve.js.map +1 -1
  191. package/dist/runtime/geniex/accelerators.d.ts +20 -0
  192. package/dist/runtime/geniex/accelerators.js +53 -0
  193. package/dist/runtime/geniex/accelerators.js.map +1 -0
  194. package/dist/runtime/geniex/check.d.ts +34 -0
  195. package/dist/runtime/geniex/check.js +117 -0
  196. package/dist/runtime/geniex/check.js.map +1 -0
  197. package/dist/runtime/geniex/chip.d.ts +29 -0
  198. package/dist/runtime/geniex/chip.js +35 -0
  199. package/dist/runtime/geniex/chip.js.map +1 -0
  200. package/dist/runtime/geniex/devices.d.ts +13 -0
  201. package/dist/runtime/geniex/devices.js +32 -0
  202. package/dist/runtime/geniex/devices.js.map +1 -0
  203. package/dist/runtime/geniex/geniex-host.d.ts +17 -0
  204. package/dist/runtime/geniex/geniex-host.js +26 -0
  205. package/dist/runtime/geniex/geniex-host.js.map +1 -0
  206. package/dist/runtime/geniex/host/args.d.ts +56 -0
  207. package/dist/runtime/geniex/host/args.js +115 -0
  208. package/dist/runtime/geniex/host/args.js.map +1 -0
  209. package/dist/runtime/geniex/host/engine.d.ts +76 -0
  210. package/dist/runtime/geniex/host/engine.js +122 -0
  211. package/dist/runtime/geniex/host/engine.js.map +1 -0
  212. package/dist/runtime/geniex/host/ffi-bun.d.ts +15 -0
  213. package/dist/runtime/geniex/host/ffi-bun.js +415 -0
  214. package/dist/runtime/geniex/host/ffi-bun.js.map +1 -0
  215. package/dist/runtime/geniex/host/grammar.d.ts +11 -0
  216. package/dist/runtime/geniex/host/grammar.js +223 -0
  217. package/dist/runtime/geniex/host/grammar.js.map +1 -0
  218. package/dist/runtime/geniex/host/inspect.d.ts +25 -0
  219. package/dist/runtime/geniex/host/inspect.js +177 -0
  220. package/dist/runtime/geniex/host/inspect.js.map +1 -0
  221. package/dist/runtime/geniex/host/library.d.ts +117 -0
  222. package/dist/runtime/geniex/host/library.js +38 -0
  223. package/dist/runtime/geniex/host/library.js.map +1 -0
  224. package/dist/runtime/geniex/host/openai.d.ts +62 -0
  225. package/dist/runtime/geniex/host/openai.js +458 -0
  226. package/dist/runtime/geniex/host/openai.js.map +1 -0
  227. package/dist/runtime/geniex/host/run.d.ts +48 -0
  228. package/dist/runtime/geniex/host/run.js +208 -0
  229. package/dist/runtime/geniex/host/run.js.map +1 -0
  230. package/dist/runtime/geniex/host/server.d.ts +39 -0
  231. package/dist/runtime/geniex/host/server.js +232 -0
  232. package/dist/runtime/geniex/host/server.js.map +1 -0
  233. package/dist/runtime/geniex/host/worker-protocol.d.ts +76 -0
  234. package/dist/runtime/geniex/host/worker-protocol.js +116 -0
  235. package/dist/runtime/geniex/host/worker-protocol.js.map +1 -0
  236. package/dist/runtime/geniex/host/worker-source.generated.d.ts +1 -0
  237. package/dist/runtime/geniex/host/worker-source.generated.js +4 -0
  238. package/dist/runtime/geniex/host/worker-source.generated.js.map +1 -0
  239. package/dist/runtime/geniex/host/worker.d.ts +7 -0
  240. package/dist/runtime/geniex/host/worker.js +19 -0
  241. package/dist/runtime/geniex/host/worker.js.map +1 -0
  242. package/dist/runtime/geniex/host-process.d.ts +48 -0
  243. package/dist/runtime/geniex/host-process.js +104 -0
  244. package/dist/runtime/geniex/host-process.js.map +1 -0
  245. package/dist/runtime/geniex/index.d.ts +11 -0
  246. package/dist/runtime/geniex/index.js +12 -0
  247. package/dist/runtime/geniex/index.js.map +1 -0
  248. package/dist/runtime/geniex/model-yml.d.ts +8 -0
  249. package/dist/runtime/geniex/model-yml.js +98 -0
  250. package/dist/runtime/geniex/model-yml.js.map +1 -0
  251. package/dist/runtime/geniex/runtime.d.ts +94 -0
  252. package/dist/runtime/geniex/runtime.js +366 -0
  253. package/dist/runtime/geniex/runtime.js.map +1 -0
  254. package/dist/runtime/litert-lm/host/openai.d.ts +4 -37
  255. package/dist/runtime/litert-lm/host/openai.js +11 -96
  256. package/dist/runtime/litert-lm/host/openai.js.map +1 -1
  257. package/dist/runtime/litert-lm/host/pool.d.ts +1 -7
  258. package/dist/runtime/litert-lm/host/pool.js +1 -17
  259. package/dist/runtime/litert-lm/host/pool.js.map +1 -1
  260. package/dist/runtime/litert-lm/host/server.js +11 -53
  261. package/dist/runtime/litert-lm/host/server.js.map +1 -1
  262. package/dist/runtime/llamacpp/args.d.ts +5 -0
  263. package/dist/runtime/llamacpp/args.js +2 -0
  264. package/dist/runtime/llamacpp/args.js.map +1 -1
  265. package/dist/runtime/llamacpp/fit-margin.d.ts +44 -0
  266. package/dist/runtime/llamacpp/fit-margin.js +50 -0
  267. package/dist/runtime/llamacpp/fit-margin.js.map +1 -1
  268. package/dist/runtime/llamacpp/load-plan.d.ts +5 -0
  269. package/dist/runtime/llamacpp/load-plan.js +57 -22
  270. package/dist/runtime/llamacpp/load-plan.js.map +1 -1
  271. package/dist/runtime/llamacpp/runtime.d.ts +2 -1
  272. package/dist/runtime/llamacpp/runtime.js +3 -1
  273. package/dist/runtime/llamacpp/runtime.js.map +1 -1
  274. package/dist/runtime/shared/external-sessions.js +1 -0
  275. package/dist/runtime/shared/external-sessions.js.map +1 -1
  276. package/dist/runtime/shared/fifo-lock.d.ts +10 -0
  277. package/dist/runtime/shared/fifo-lock.js +21 -0
  278. package/dist/runtime/shared/fifo-lock.js.map +1 -0
  279. package/dist/runtime/shared/index.d.ts +2 -0
  280. package/dist/runtime/shared/index.js +2 -0
  281. package/dist/runtime/shared/index.js.map +1 -1
  282. package/dist/runtime/shared/openai-sse.d.ts +112 -0
  283. package/dist/runtime/shared/openai-sse.js +178 -0
  284. package/dist/runtime/shared/openai-sse.js.map +1 -0
  285. package/dist/server/control/index.d.ts +1 -1
  286. package/dist/server/control/router.js +4 -0
  287. package/dist/server/control/router.js.map +1 -1
  288. package/dist/server/control/routes/audio.d.ts +15 -0
  289. package/dist/server/control/routes/audio.js +59 -0
  290. package/dist/server/control/routes/audio.js.map +1 -0
  291. package/dist/server/control/routes/geniex.d.ts +7 -0
  292. package/dist/server/control/routes/geniex.js +22 -0
  293. package/dist/server/control/routes/geniex.js.map +1 -0
  294. package/dist/server/control/types.d.ts +36 -2
  295. package/dist/server/control/types.js.map +1 -1
  296. package/dist/server/http.js +4 -0
  297. package/dist/server/http.js.map +1 -1
  298. package/dist/server/public/audio-speech-params.d.ts +47 -0
  299. package/dist/server/public/audio-speech-params.js +177 -0
  300. package/dist/server/public/audio-speech-params.js.map +1 -0
  301. package/dist/server/public/audio-speech.d.ts +14 -0
  302. package/dist/server/public/audio-speech.js +118 -0
  303. package/dist/server/public/audio-speech.js.map +1 -0
  304. package/dist/server/public/embedding.d.ts +8 -7
  305. package/dist/server/public/embedding.js +15 -7
  306. package/dist/server/public/embedding.js.map +1 -1
  307. package/dist/server/public/forward.js +15 -1
  308. package/dist/server/public/forward.js.map +1 -1
  309. package/dist/server/public/index.d.ts +1 -1
  310. package/dist/server/public/index.js +7 -0
  311. package/dist/server/public/index.js.map +1 -1
  312. package/dist/server/public/listing.js +1 -0
  313. package/dist/server/public/listing.js.map +1 -1
  314. package/dist/server/public/responses.js +9 -0
  315. package/dist/server/public/responses.js.map +1 -1
  316. package/dist/server/public/trace.js +2 -0
  317. package/dist/server/public/trace.js.map +1 -1
  318. package/dist/server/public/types.d.ts +29 -1
  319. package/dist/server/public/validate.d.ts +32 -0
  320. package/dist/server/public/validate.js +146 -0
  321. package/dist/server/public/validate.js.map +1 -0
  322. package/dist/settings/schema/geniex.json +63 -0
  323. package/dist/settings/schema/mlx.json +1 -1
  324. package/dist/settings/schema.js +11 -0
  325. package/dist/settings/schema.js.map +1 -1
  326. package/dist/telemetry/reports.d.ts +12 -0
  327. package/dist/telemetry/reports.js +38 -0
  328. package/dist/telemetry/reports.js.map +1 -1
  329. package/dist/telemetry/subscribe.d.ts +3 -3
  330. package/dist/telemetry/subscribe.js +8 -3
  331. package/dist/telemetry/subscribe.js.map +1 -1
  332. package/dist/telemetry/types.d.ts +1 -1
  333. package/dist/version.d.ts +1 -1
  334. package/dist/version.js +1 -1
  335. package/package.json +11 -2
@@ -0,0 +1,117 @@
1
+ /**
2
+ * `POST /models/geniex/check` (openspec change `add-geniex-runtime`, task 6.5): whether a variant
3
+ * would run here. Before a download, from what core already knows — this machine's chip, the
4
+ * active build and the devices its probe found — never the network. For a model on disk, also from
5
+ * the model itself (`geniex-host inspect`, no library needed), whose facts come back in the answer
6
+ * for the client to write into `model.yml`.
7
+ */
8
+ import { realpath } from 'node:fs/promises';
9
+ import { isAbsolute, relative, resolve } from 'node:path';
10
+ import { AtomicCoreError, GENIEX_CHIPS, GENIEX_DEVICES, GENIEX_PLUGINS } from '../../contracts/index.js';
11
+ import { compareVersions } from '../../backend/index.js';
12
+ import { deviceFound, deviceMissingReason } from './devices.js';
13
+ import { readGeniexBlock } from './model-yml.js';
14
+ const verdict = (v, reason, metadata) => ({
15
+ verdict: v,
16
+ reason,
17
+ ...(metadata ? { metadata } : {}),
18
+ });
19
+ /** The verdict for a variant (`plugin`, `device`, `chip`, `min_runtime_version`), and for a model its facts. */
20
+ export function geniexVerdict(facts, request, model) {
21
+ const plugin = request.plugin ?? '';
22
+ if (!GENIEX_PLUGINS.some((known) => known === plugin))
23
+ return verdict('platform-unsupported', `This core runs no GenieX model with the "${plugin}" plugin.`, model);
24
+ const device = request.device ?? '';
25
+ if (!GENIEX_DEVICES.some((known) => known === device))
26
+ return verdict('platform-unsupported', `This core runs no GenieX model on the "${device}" device.`, model);
27
+ if (plugin === 'qairt') {
28
+ if (device !== 'npu')
29
+ return verdict('platform-unsupported', 'AI Hub bundles run on the NPU only.', model);
30
+ const chip = model?.kind === 'qairt' && model.chip ? model.chip : request.chip;
31
+ if (chip === undefined || chip === null)
32
+ return verdict('platform-unsupported', 'This bundle does not say which Snapdragon chip it is built for.', model);
33
+ if (!GENIEX_CHIPS.some((known) => known === chip))
34
+ return verdict('platform-unsupported', `This core knows no Snapdragon "${chip}".`, model);
35
+ if (chip !== facts.chip)
36
+ return verdict('platform-unsupported', `This bundle is built for the Snapdragon ${chip}; this computer has the ${facts.chip}.`, model);
37
+ }
38
+ if (model && (model.kind === 'qairt') !== (plugin === 'qairt'))
39
+ return verdict('platform-unsupported', model.kind === 'qairt'
40
+ ? 'This folder holds an AI Hub bundle, which runs with the qairt plugin.'
41
+ : 'This file is a GGUF, which runs with the llama_cpp plugin.', model);
42
+ if (!facts.build)
43
+ return verdict('engine-not-installed', 'GenieX is not installed on this computer.', model);
44
+ if (!deviceFound(device, facts.build.devices))
45
+ return verdict('accelerator-unavailable', deviceMissingReason(device), model);
46
+ const needs = (model?.kind === 'qairt' ? model.min_runtime_version : null) ?? request.min_runtime_version ?? null;
47
+ if (needs && compareVersions(needs, facts.build.version) > 0)
48
+ return verdict('requires-newer-engine', `This model needs GenieX ${needs}; the installed one is ${facts.build.version}.`, model);
49
+ return verdict('ok', null, model);
50
+ }
51
+ const VERSION_RE = /^\d+\.\d+(\.\d+)?$/;
52
+ const FIELDS = ['plugin', 'device', 'chip', 'min_runtime_version', 'path', 'model_id'];
53
+ /** The request body, strictly: a variant, a path with its plugin and device, or a model id. */
54
+ export function parseGeniexCheckRequest(body) {
55
+ const invalid = (why) => {
56
+ throw new AtomicCoreError('INVALID_ARGUMENT', why);
57
+ };
58
+ if (typeof body !== 'object' || body === null || Array.isArray(body))
59
+ return invalid('The request body must be a JSON object.');
60
+ const record = body;
61
+ const extra = Object.keys(record).filter((key) => !FIELDS.some((field) => field === key));
62
+ if (extra.length > 0)
63
+ invalid(`The request has fields this core does not know: ${extra.sort().join(', ')}.`);
64
+ const out = {};
65
+ for (const key of FIELDS) {
66
+ const value = record[key];
67
+ if (value === undefined)
68
+ continue;
69
+ if (typeof value !== 'string' || value === '')
70
+ invalid(`${key} must be text.`);
71
+ out[key] = value;
72
+ }
73
+ if (out.min_runtime_version !== undefined && !VERSION_RE.test(out.min_runtime_version))
74
+ invalid('min_runtime_version must be X.Y or X.Y.Z.');
75
+ if (out.model_id !== undefined) {
76
+ if (Object.keys(out).length > 1)
77
+ invalid('model_id is checked alone: its variant comes from model.yml.');
78
+ return out;
79
+ }
80
+ if (out.plugin === undefined || out.device === undefined)
81
+ invalid('plugin and device are required for a variant or a path.');
82
+ return out;
83
+ }
84
+ export class GeniexCheckService {
85
+ deps;
86
+ constructor(deps) {
87
+ this.deps = deps;
88
+ }
89
+ /** A path inside the models root, links resolved, or `INVALID_ARGUMENT`. */
90
+ async inRoot(path) {
91
+ const refuse = () => new AtomicCoreError('INVALID_ARGUMENT', 'path must be a file or folder inside the GenieX models folder.');
92
+ if (!isAbsolute(path))
93
+ throw new AtomicCoreError('INVALID_ARGUMENT', 'path must be absolute.');
94
+ const root = await realpath(this.deps.modelsDir).catch(() => resolve(this.deps.modelsDir));
95
+ // A model that is not there yet is judged by its spelling; one that is, by where its links lead.
96
+ const full = await realpath(path).catch(() => resolve(path));
97
+ const rel = relative(root, full);
98
+ if (rel === '' || rel.startsWith('..') || isAbsolute(rel))
99
+ throw refuse();
100
+ return resolve(path);
101
+ }
102
+ async check(request) {
103
+ let variant = request;
104
+ let path = request.path !== undefined ? await this.inRoot(request.path) : null;
105
+ if (request.model_id !== undefined) {
106
+ const yml = await this.deps.registry.read(request.model_id);
107
+ const block = readGeniexBlock(yml);
108
+ variant = { plugin: block.plugin, device: block.backend, ...(block.chip ? { chip: block.chip } : {}) };
109
+ // The registry's own path: an installed model may be a link, which the runtime loads as it is.
110
+ path = this.deps.registry.resolvePaths(yml).modelPath;
111
+ }
112
+ const facts = { chip: this.deps.chip, build: (await this.deps.resolveBuild()) ?? null };
113
+ const metadata = path ? await this.deps.inspect(path) : null;
114
+ return geniexVerdict(facts, variant, metadata);
115
+ }
116
+ }
117
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/runtime/geniex/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Where the `geniex` provider registers, and which Snapdragon chip the machine has (openspec change
3
+ * `add-geniex-runtime`, task 4.3, design D3): Windows arm64 whose processor string names a Snapdragon
4
+ * X of either generation. The AI Hub bundles are compiled per Hexagon generation, not per SKU, and
5
+ * conf spells the generations `x-elite` (Hexagon v73: X Elite `X1E…`, X Plus `X1P…`, X `X1-…`) and
6
+ * `x2-elite` (v81: X2 Elite `X2E…`, X2 Plus `X2P…`) — AI Hub itself points the X Plus at the X Elite
7
+ * zip. Other arm64 Windows machines (virtual machines, 8cx: Hexagon v69, which the SDK has no HTP
8
+ * library for) keep the provider off.
9
+ *
10
+ * The same table shape as LiteRT-LM's Intel NPU generations (`litert-lm/npu.ts`). Verified on an X2
11
+ * Elite (rulings/core.md, spike S1); the first generation is read off the part numbers only.
12
+ */
13
+ import type { GeniexChip } from '../../contracts/index.js';
14
+ export declare function geniexChip(cpuName: string): GeniexChip | null;
15
+ export interface GeniexHostFacts {
16
+ platform: NodeJS.Platform;
17
+ arch: string;
18
+ /** `Win32_Processor.Name` on Windows, as the hardware probe reports it. */
19
+ cpuName: string;
20
+ }
21
+ /** Which SDK zip this host runs and which chip it has, or why none (`EngineHostPlatform` for engine-builds). */
22
+ export type GeniexHostPlatform = {
23
+ platform: 'win-arm64';
24
+ chip: GeniexChip;
25
+ } | {
26
+ platform: null;
27
+ reason: string;
28
+ };
29
+ export declare function geniexHostPlatform(host: GeniexHostFacts): GeniexHostPlatform;
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Where the `geniex` provider registers, and which Snapdragon chip the machine has (openspec change
3
+ * `add-geniex-runtime`, task 4.3, design D3): Windows arm64 whose processor string names a Snapdragon
4
+ * X of either generation. The AI Hub bundles are compiled per Hexagon generation, not per SKU, and
5
+ * conf spells the generations `x-elite` (Hexagon v73: X Elite `X1E…`, X Plus `X1P…`, X `X1-…`) and
6
+ * `x2-elite` (v81: X2 Elite `X2E…`, X2 Plus `X2P…`) — AI Hub itself points the X Plus at the X Elite
7
+ * zip. Other arm64 Windows machines (virtual machines, 8cx: Hexagon v69, which the SDK has no HTP
8
+ * library for) keep the provider off.
9
+ *
10
+ * The same table shape as LiteRT-LM's Intel NPU generations (`litert-lm/npu.ts`). Verified on an X2
11
+ * Elite (rulings/core.md, spike S1); the first generation is read off the part numbers only.
12
+ */
13
+ /**
14
+ * The part numbers as a bare word, not a suffix: `X1E80100`, `X1E78100` (X Elite), `X1P64100` (X Plus),
15
+ * `X1-26-100` (X), `X2E88100` (X2 Elite), `X2P…` (X2 Plus).
16
+ */
17
+ const PART_RE = /(?:^|[^A-Za-z0-9])(X1E|X1P|X1(?=-\d)|X2E|X2P)\d*(?![A-Za-z])/;
18
+ export function geniexChip(cpuName) {
19
+ const part = PART_RE.exec(cpuName)?.[1];
20
+ if (!part)
21
+ return null;
22
+ return part.startsWith('X1') ? 'x-elite' : 'x2-elite';
23
+ }
24
+ export function geniexHostPlatform(host) {
25
+ if (host.platform !== 'win32' || host.arch !== 'arm64')
26
+ return { platform: null, reason: `GenieX runs on Windows arm64 only, not ${host.platform} ${host.arch}.` };
27
+ const chip = geniexChip(host.cpuName);
28
+ if (!chip)
29
+ return {
30
+ platform: null,
31
+ reason: `GenieX runs on Snapdragon X (X Elite, X Plus, X, X2 Elite, X2 Plus) only; this processor is "${host.cpuName}".`,
32
+ };
33
+ return { platform: 'win-arm64', chip };
34
+ }
35
+ //# sourceMappingURL=chip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chip.js","sourceRoot":"","sources":["../../../src/runtime/geniex/chip.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH;;;GAGG;AACH,MAAM,OAAO,GAAG,8DAA8D,CAAA;AAE9E,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACvC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAA;AACvD,CAAC;AAaD,MAAM,UAAU,kBAAkB,CAAC,IAAqB;IACtD,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;QACpD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,0CAA0C,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,GAAG,EAAE,CAAA;IAC5G,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACrC,IAAI,CAAC,IAAI;QACP,OAAO;YACL,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,gGAAgG,IAAI,CAAC,OAAO,IAAI;SACzH,CAAA;IACH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAA;AACxC,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * GenieX's device ids and the devices a model names (openspec change `add-geniex-runtime`, design
3
+ * D3): `geniex_get_device_list` of the `llama_cpp` plugin answers ids such as `HTP0` (the Hexagon
4
+ * NPU), `GPUOpenCL` (the Adreno GPU) and `CPU`; a model asks for `npu`, `gpu`, `cpu` or `hybrid`
5
+ * (NPU and GPU together). The ids are what `probe` recorded at the build's install.
6
+ */
7
+ import type { GeniexDevice } from '../../contracts/index.js';
8
+ /** Whether the library found what `device` needs; the CPU is always there. */
9
+ export declare function deviceFound(device: GeniexDevice, ids: readonly string[]): boolean;
10
+ /** Why `device` is not there, in words a card can show. */
11
+ export declare function deviceMissingReason(device: GeniexDevice): string;
12
+ /** The accelerators the library found, in the order the clients list them: the NPU, then the GPU. */
13
+ export declare function acceleratorsFound(ids: readonly string[]): Array<Extract<GeniexDevice, 'npu' | 'gpu'>>;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * GenieX's device ids and the devices a model names (openspec change `add-geniex-runtime`, design
3
+ * D3): `geniex_get_device_list` of the `llama_cpp` plugin answers ids such as `HTP0` (the Hexagon
4
+ * NPU), `GPUOpenCL` (the Adreno GPU) and `CPU`; a model asks for `npu`, `gpu`, `cpu` or `hybrid`
5
+ * (NPU and GPU together). The ids are what `probe` recorded at the build's install.
6
+ */
7
+ const hasNpu = (ids) => ids.some((id) => /^HTP/i.test(id));
8
+ const hasGpu = (ids) => ids.some((id) => /^GPU/i.test(id));
9
+ /** Whether the library found what `device` needs; the CPU is always there. */
10
+ export function deviceFound(device, ids) {
11
+ switch (device) {
12
+ case 'npu':
13
+ return hasNpu(ids);
14
+ case 'gpu':
15
+ return hasGpu(ids);
16
+ case 'hybrid':
17
+ return hasNpu(ids) && hasGpu(ids);
18
+ case 'cpu':
19
+ return true;
20
+ }
21
+ }
22
+ /** Why `device` is not there, in words a card can show. */
23
+ export function deviceMissingReason(device) {
24
+ if (device === 'gpu')
25
+ return 'GenieX found no Adreno GPU (no OpenCL device) on this computer.';
26
+ return `GenieX found no Hexagon NPU (no HTP device) on this computer${device === 'hybrid' ? ', which hybrid needs with the GPU' : ''}; check the Qualcomm NPU driver.`;
27
+ }
28
+ /** The accelerators the library found, in the order the clients list them: the NPU, then the GPU. */
29
+ export function acceleratorsFound(ids) {
30
+ return [...(hasNpu(ids) ? ['npu'] : []), ...(hasGpu(ids) ? ['gpu'] : [])];
31
+ }
32
+ //# sourceMappingURL=devices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devices.js","sourceRoot":"","sources":["../../../src/runtime/geniex/devices.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,MAAM,GAAG,CAAC,GAAsB,EAAW,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;AACtF,MAAM,MAAM,GAAG,CAAC,GAAsB,EAAW,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;AAEtF,8EAA8E;AAC9E,MAAM,UAAU,WAAW,CAAC,MAAoB,EAAE,GAAsB;IACtE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,KAAK;YACR,OAAO,MAAM,CAAC,GAAG,CAAC,CAAA;QACpB,KAAK,KAAK;YACR,OAAO,MAAM,CAAC,GAAG,CAAC,CAAA;QACpB,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAA;QACnC,KAAK,KAAK;YACR,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,mBAAmB,CAAC,MAAoB;IACtD,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,iEAAiE,CAAA;IAC9F,OAAO,+DAA+D,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC,EAAE,kCAAkC,CAAA;AACxK,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,iBAAiB,CAAC,GAAsB;IACtD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAC7F,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * `@atomic-chat/core/geniex-host`: the one entry of the hidden `geniex-host` mode (change
3
+ * `add-geniex-runtime`, design D1). The core binaries and any program that embeds the core as a
4
+ * library (`atc`) hand it the arguments after `geniex-host` before they parse their own commands,
5
+ * because `geniexHostCommand` starts the host as `<this program> geniex-host …`.
6
+ *
7
+ * Importing this file loads no `bun:*`: the library lives in a Worker the mode alone starts.
8
+ */
9
+ /**
10
+ * Runs `geniex-host <argv…>` and returns its exit code (`EXIT` in `host/run.ts`). Lines go to this
11
+ * process's stdout and stderr through writers that go quiet instead of crashing the host when the
12
+ * core closed its end of a pipe (EPIPE).
13
+ */
14
+ export declare function runGeniexHostMain(argv: readonly string[], io?: {
15
+ stdout: (text: string) => void;
16
+ stderr: (text: string) => void;
17
+ }): Promise<number>;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * `@atomic-chat/core/geniex-host`: the one entry of the hidden `geniex-host` mode (change
3
+ * `add-geniex-runtime`, design D1). The core binaries and any program that embeds the core as a
4
+ * library (`atc`) hand it the arguments after `geniex-host` before they parse their own commands,
5
+ * because `geniexHostCommand` starts the host as `<this program> geniex-host …`.
6
+ *
7
+ * Importing this file loads no `bun:*`: the library lives in a Worker the mode alone starts.
8
+ */
9
+ import { detachableWriter } from '../../cli/io.js';
10
+ import { WorkerEngine, spawnGeniexWorker } from './host/engine.js';
11
+ import { lineIo, runGeniexHost } from './host/run.js';
12
+ /**
13
+ * Runs `geniex-host <argv…>` and returns its exit code (`EXIT` in `host/run.ts`). Lines go to this
14
+ * process's stdout and stderr through writers that go quiet instead of crashing the host when the
15
+ * core closed its end of a pipe (EPIPE).
16
+ */
17
+ export async function runGeniexHostMain(argv, io = {
18
+ stdout: detachableWriter(process.stdout),
19
+ stderr: detachableWriter(process.stderr),
20
+ }) {
21
+ return runGeniexHost(argv, {
22
+ ...lineIo(io),
23
+ startEngine: async () => new WorkerEngine(await spawnGeniexWorker()),
24
+ });
25
+ }
26
+ //# sourceMappingURL=geniex-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geniex-host.js","sourceRoot":"","sources":["../../../src/runtime/geniex/geniex-host.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAClE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAErD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAuB,EACvB,KAAyE;IACvE,MAAM,EAAE,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC;IACxC,MAAM,EAAE,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC;CACzC;IAED,OAAO,aAAa,CAAC,IAAI,EAAE;QACzB,GAAG,MAAM,CAAC,EAAE,CAAC;QACb,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,YAAY,CAAC,MAAM,iBAAiB,EAAE,CAAC;KACrE,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * The arguments of the hidden `geniex-host` mode (openspec change `add-geniex-runtime`, task 5.1).
3
+ * Core is the only caller, so the parse is strict: anything unknown is a bug on core's side.
4
+ *
5
+ * geniex-host probe --lib <build>
6
+ * geniex-host inspect <file | bundle folder>
7
+ * geniex-host serve --lib <build> --engine-version <v> --model <file | bundle folder>
8
+ * --plugin llama_cpp|qairt --device npu|gpu|cpu|hybrid [--mmproj <file>]
9
+ * --nctx <n> [--threads <n>] --max-tokens <n> --power-mode <mode> --port <p, 0 for any>
10
+ * --tmp <dir> --id <model id> [--reasoning]
11
+ */
12
+ import type { GeniexDevice, GeniexPlugin } from '../../../contracts/index.js';
13
+ import type { GeniexPowerMode } from './library.js';
14
+ export type GeniexHostArgs = {
15
+ mode: 'probe';
16
+ lib: string;
17
+ } | {
18
+ mode: 'inspect';
19
+ path: string;
20
+ } | {
21
+ mode: 'serve';
22
+ /** The build directory, holding `lib/`. */
23
+ lib: string;
24
+ /** The build's GenieX version, checked against a bundle's `min_runtime_version`. */
25
+ engineVersion: string;
26
+ /** A GGUF file (`llama_cpp`) or an AI Hub bundle folder (`qairt`). */
27
+ model: string;
28
+ plugin: GeniexPlugin;
29
+ device: GeniexDevice;
30
+ /** `llama_cpp` only: the vision projector beside the GGUF file. */
31
+ mmproj?: string;
32
+ /** `n_ctx`, already cut to what the model allows. */
33
+ nCtx: number;
34
+ threads: number;
35
+ /** The default `max_tokens` of a request that names none. */
36
+ maxTokens: number;
37
+ /** The NPU power mode; ignored off the NPU. */
38
+ powerMode: GeniexPowerMode;
39
+ port: number;
40
+ /** Where request images are written for the library; created when missing. */
41
+ tmp: string;
42
+ /** The id `/v1/models` lists: core's session id. */
43
+ id: string;
44
+ /** Think by default (`model.yml` `reasoning`); a request may still turn it off. */
45
+ reasoning: boolean;
46
+ };
47
+ export declare class GeniexHostUsageError extends Error {
48
+ constructor(message: string);
49
+ }
50
+ /**
51
+ * Threads for the `llama_cpp` plugin when `--threads` is not given. Spike S3 on an 18-core X2 Elite
52
+ * (Qwen3 4B Q4_0, cpu): the plugin's own default decoded at 17.7 tok/s, 12 threads at 40.7 (conf's
53
+ * llama.cpp with `-t 12`: 39.5), 18 threads at 21.1 — the efficiency cores drag the pool down.
54
+ */
55
+ export declare function defaultGeniexThreads(): number;
56
+ export declare function parseGeniexHostArgs(argv: readonly string[]): GeniexHostArgs;
@@ -0,0 +1,115 @@
1
+ /**
2
+ * The arguments of the hidden `geniex-host` mode (openspec change `add-geniex-runtime`, task 5.1).
3
+ * Core is the only caller, so the parse is strict: anything unknown is a bug on core's side.
4
+ *
5
+ * geniex-host probe --lib <build>
6
+ * geniex-host inspect <file | bundle folder>
7
+ * geniex-host serve --lib <build> --engine-version <v> --model <file | bundle folder>
8
+ * --plugin llama_cpp|qairt --device npu|gpu|cpu|hybrid [--mmproj <file>]
9
+ * --nctx <n> [--threads <n>] --max-tokens <n> --power-mode <mode> --port <p, 0 for any>
10
+ * --tmp <dir> --id <model id> [--reasoning]
11
+ */
12
+ import { availableParallelism } from 'node:os';
13
+ import { parseArgs } from 'node:util';
14
+ import { GENIEX_DEVICES, GENIEX_PLUGINS } from '../../../contracts/index.js';
15
+ import { GENIEX_POWER_MODES } from './library.js';
16
+ export class GeniexHostUsageError extends Error {
17
+ constructor(message) {
18
+ super(message);
19
+ this.name = 'GeniexHostUsageError';
20
+ }
21
+ }
22
+ const required = (values, key) => {
23
+ const value = values[key];
24
+ if (typeof value !== 'string' || value === '')
25
+ throw new GeniexHostUsageError(`--${key} is required`);
26
+ return value;
27
+ };
28
+ const VERSION_RE = /^\d+\.\d+\.\d+$/;
29
+ function wholeNumber(values, key, min, max) {
30
+ const raw = required(values, key);
31
+ const value = Number(raw);
32
+ if (!Number.isSafeInteger(value) || value < min || value > max)
33
+ throw new GeniexHostUsageError(`--${key} ${raw} is not a whole number from ${min} to ${max}`);
34
+ return value;
35
+ }
36
+ function oneOf(values, key, known, said) {
37
+ const value = required(values, key);
38
+ if (!known.some((candidate) => candidate === value))
39
+ throw new GeniexHostUsageError(`--${key} ${value} is not ${said}`);
40
+ return value;
41
+ }
42
+ /**
43
+ * Threads for the `llama_cpp` plugin when `--threads` is not given. Spike S3 on an 18-core X2 Elite
44
+ * (Qwen3 4B Q4_0, cpu): the plugin's own default decoded at 17.7 tok/s, 12 threads at 40.7 (conf's
45
+ * llama.cpp with `-t 12`: 39.5), 18 threads at 21.1 — the efficiency cores drag the pool down.
46
+ */
47
+ export function defaultGeniexThreads() {
48
+ return Math.max(1, Math.min(12, availableParallelism()));
49
+ }
50
+ export function parseGeniexHostArgs(argv) {
51
+ const [mode, ...rest] = argv;
52
+ try {
53
+ if (mode === 'probe') {
54
+ const { values } = parseArgs({ args: rest, options: { lib: { type: 'string' } }, strict: true });
55
+ return { mode, lib: required(values, 'lib') };
56
+ }
57
+ if (mode === 'inspect') {
58
+ const { positionals } = parseArgs({ args: rest, options: {}, strict: true, allowPositionals: true });
59
+ if (positionals.length !== 1 || !positionals[0])
60
+ throw new GeniexHostUsageError('inspect takes one path');
61
+ return { mode, path: positionals[0] };
62
+ }
63
+ if (mode === 'serve') {
64
+ const { values } = parseArgs({
65
+ args: rest,
66
+ options: {
67
+ 'lib': { type: 'string' },
68
+ 'engine-version': { type: 'string' },
69
+ 'model': { type: 'string' },
70
+ 'plugin': { type: 'string' },
71
+ 'device': { type: 'string' },
72
+ 'mmproj': { type: 'string' },
73
+ 'nctx': { type: 'string' },
74
+ 'threads': { type: 'string' },
75
+ 'max-tokens': { type: 'string' },
76
+ 'power-mode': { type: 'string' },
77
+ 'port': { type: 'string' },
78
+ 'tmp': { type: 'string' },
79
+ 'id': { type: 'string' },
80
+ 'reasoning': { type: 'boolean' },
81
+ },
82
+ strict: true,
83
+ });
84
+ const lib = required(values, 'lib');
85
+ const engineVersion = required(values, 'engine-version');
86
+ if (!VERSION_RE.test(engineVersion))
87
+ throw new GeniexHostUsageError(`--engine-version ${engineVersion} is not X.Y.Z`);
88
+ const mmproj = values['mmproj'];
89
+ return {
90
+ mode,
91
+ lib,
92
+ engineVersion,
93
+ model: required(values, 'model'),
94
+ plugin: oneOf(values, 'plugin', GENIEX_PLUGINS, 'llama_cpp or qairt'),
95
+ device: oneOf(values, 'device', GENIEX_DEVICES, 'npu, gpu, cpu or hybrid'),
96
+ ...(mmproj ? { mmproj } : {}),
97
+ nCtx: wholeNumber(values, 'nctx', 1, 16_777_216),
98
+ threads: values['threads'] === undefined ? defaultGeniexThreads() : wholeNumber(values, 'threads', 1, 1024),
99
+ maxTokens: wholeNumber(values, 'max-tokens', 1, 16_777_216),
100
+ powerMode: oneOf(values, 'power-mode', GENIEX_POWER_MODES, `one of ${GENIEX_POWER_MODES.join(', ')}`),
101
+ port: wholeNumber(values, 'port', 0, 65535),
102
+ tmp: required(values, 'tmp'),
103
+ id: required(values, 'id'),
104
+ reasoning: values['reasoning'] === true,
105
+ };
106
+ }
107
+ }
108
+ catch (error) {
109
+ if (error instanceof GeniexHostUsageError)
110
+ throw error;
111
+ throw new GeniexHostUsageError(error instanceof Error ? error.message : String(error));
112
+ }
113
+ throw new GeniexHostUsageError(`geniex-host: unknown mode ${JSON.stringify(mode ?? '')} (probe, inspect, serve)`);
114
+ }
115
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../../../src/runtime/geniex/host/args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * The main thread's handle on the Worker that owns the library (openspec change `add-geniex-runtime`,
3
+ * design D1): one request at a time, each answered by the Worker's messages, tokens of a generation
4
+ * delivered as they arrive. The Worker is the web-standard one of the Bun runtime; the tests drive
5
+ * `WorkerEngine` with an in-process stand-in that runs the Worker's handler on a fake library.
6
+ */
7
+ import type { GeniexGenerateResult, GeniexGenerationConfig, GeniexModelSettings, GeniexTemplateInput } from './library.js';
8
+ /** What the engine needs of a Worker: the web `Worker` shape, which Bun's is. */
9
+ export interface WorkerLike {
10
+ postMessage(message: unknown): void;
11
+ onmessage: ((event: {
12
+ data: unknown;
13
+ }) => void) | null;
14
+ onerror: ((event: {
15
+ message?: string;
16
+ }) => void) | null;
17
+ terminate(): void;
18
+ }
19
+ export interface GeniexProbeAnswer {
20
+ version: string | null;
21
+ abi: number;
22
+ plugins: string[];
23
+ devices: string[];
24
+ }
25
+ /** The host's asynchronous view of the library; `WorkerEngine` is the one implementation. */
26
+ export interface GeniexEngine {
27
+ probe(libDir: string): Promise<GeniexProbeAnswer>;
28
+ create(libDir: string, settings: GeniexModelSettings): Promise<{
29
+ vision: boolean;
30
+ }>;
31
+ applyChatTemplate(input: GeniexTemplateInput): Promise<string>;
32
+ /**
33
+ * Tokens arrive through `onToken` as the library makes them; `cancel` (one `Int32`, set non-zero)
34
+ * ends the generation, which then resolves with `stopReason: 'cancelled'`.
35
+ */
36
+ generate(prompt: string, config: GeniexGenerationConfig, onToken: (token: string) => void, cancel: Int32Array): Promise<GeniexGenerateResult>;
37
+ destroy(): Promise<void>;
38
+ }
39
+ /** The Worker stopped before answering: a crash of the native library takes the Worker with it. */
40
+ export declare class GeniexWorkerGone extends Error {
41
+ constructor(message: string);
42
+ }
43
+ export declare class WorkerEngine implements GeniexEngine {
44
+ private readonly worker;
45
+ private tail;
46
+ private pending;
47
+ private onToken;
48
+ private nextId;
49
+ private gone;
50
+ constructor(worker: WorkerLike);
51
+ private receive;
52
+ /**
53
+ * One request, answered by the next non-token message; requests queue behind each other. `before`
54
+ * runs when the request's turn comes, not when it is queued: a generate's token handler must not
55
+ * replace the one of a generation still streaming.
56
+ */
57
+ private ask;
58
+ private static refused;
59
+ probe(libDir: string): Promise<GeniexProbeAnswer>;
60
+ create(libDir: string, settings: GeniexModelSettings): Promise<{
61
+ vision: boolean;
62
+ }>;
63
+ applyChatTemplate(input: GeniexTemplateInput): Promise<string>;
64
+ generate(prompt: string, config: GeniexGenerationConfig, onToken: (token: string) => void, cancel: Int32Array): Promise<GeniexGenerateResult>;
65
+ destroy(): Promise<void>;
66
+ }
67
+ /**
68
+ * The Worker of the compiled binaries, started from a `blob:` URL over the script that
69
+ * `scripts/build-geniex-worker.mjs` bundles out of `worker.ts` into `worker-source.generated.ts`.
70
+ * Not from a path: inside a compiled Windows binary the Bun that CI pins (1.3.10) reads a Worker's
71
+ * `B:\~BUN\root\worker.js` from the real disk (ENOENT; oven-sh/bun#16869, #29124, fixed in 1.4.1),
72
+ * and a bare `./worker.js` is resolved against the working directory. The generated module is imported
73
+ * here and only here, so a checkout without a build still loads this file; under Node there is no
74
+ * `Worker` global, and no host either.
75
+ */
76
+ export declare function spawnGeniexWorker(): Promise<WorkerLike>;