@elizaos/plugin-local-inference 2.0.3-beta.2 → 2.0.3-beta.4

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 (881) hide show
  1. package/README.md +84 -10
  2. package/dist/actions/generate-media.d.ts.map +1 -0
  3. package/dist/actions/identify-speaker.d.ts.map +1 -0
  4. package/dist/actions/transcription-control.d.ts.map +1 -0
  5. package/dist/adapters/capacitor-llama/environment.d.ts +12 -0
  6. package/dist/adapters/capacitor-llama/environment.d.ts.map +1 -0
  7. package/dist/adapters/capacitor-llama/index.browser.d.ts +9 -0
  8. package/dist/adapters/capacitor-llama/index.browser.d.ts.map +1 -0
  9. package/dist/adapters/capacitor-llama/index.d.ts +18 -0
  10. package/dist/adapters/capacitor-llama/index.d.ts.map +1 -0
  11. package/dist/adapters/capacitor-llama/loader.d.ts +35 -0
  12. package/dist/adapters/capacitor-llama/loader.d.ts.map +1 -0
  13. package/dist/adapters/capacitor-llama/native-voice-capture.d.ts +70 -0
  14. package/dist/adapters/capacitor-llama/native-voice-capture.d.ts.map +1 -0
  15. package/dist/adapters/capacitor-llama/structured-output.d.ts +62 -0
  16. package/dist/adapters/capacitor-llama/structured-output.d.ts.map +1 -0
  17. package/dist/adapters/capacitor-llama/text-streaming.d.ts +24 -0
  18. package/dist/adapters/capacitor-llama/text-streaming.d.ts.map +1 -0
  19. package/dist/adapters/capacitor-llama/types.d.ts +338 -0
  20. package/dist/adapters/capacitor-llama/types.d.ts.map +1 -0
  21. package/dist/adapters/capacitor-llama/voice-turn.d.ts +86 -0
  22. package/dist/adapters/capacitor-llama/voice-turn.d.ts.map +1 -0
  23. package/dist/backends/apple-foundation.d.ts +56 -0
  24. package/dist/backends/apple-foundation.d.ts.map +1 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +39647 -0
  27. package/dist/index.js.map +217 -0
  28. package/{src → dist}/local-inference-routes.d.ts +9 -0
  29. package/dist/local-inference-routes.d.ts.map +1 -0
  30. package/dist/provider.d.ts.map +1 -0
  31. package/{src → dist}/routes/compat-helpers.d.ts +1 -1
  32. package/dist/routes/compat-helpers.d.ts.map +1 -0
  33. package/dist/routes/family-member-route.d.ts.map +1 -0
  34. package/{src → dist}/routes/index.d.ts +1 -0
  35. package/dist/routes/index.d.ts.map +1 -0
  36. package/dist/routes/index.js +42040 -0
  37. package/dist/routes/index.js.map +236 -0
  38. package/{src → dist}/routes/live-diarization-route.d.ts +7 -0
  39. package/dist/routes/live-diarization-route.d.ts.map +1 -0
  40. package/dist/routes/local-inference-asr-route.d.ts.map +1 -0
  41. package/dist/routes/local-inference-asr-transcribe.d.ts.map +1 -0
  42. package/dist/routes/local-inference-compat-routes.d.ts.map +1 -0
  43. package/dist/routes/local-inference-tts-route.d.ts.map +1 -0
  44. package/dist/routes/native-pcm-turn-route.d.ts +3 -0
  45. package/dist/routes/native-pcm-turn-route.d.ts.map +1 -0
  46. package/dist/routes/transcript-audio-store.d.ts.map +1 -0
  47. package/{src → dist}/routes/transcripts-routes.d.ts +8 -0
  48. package/dist/routes/transcripts-routes.d.ts.map +1 -0
  49. package/dist/routes/voice-first-run-routes.d.ts.map +1 -0
  50. package/dist/routes/voice-models-routes.d.ts.map +1 -0
  51. package/dist/routes/voice-profile-plugin-routes.d.ts.map +1 -0
  52. package/dist/routes/voice-profiles-management-routes.d.ts.map +1 -0
  53. package/dist/routes/voice-speaker-profile-routes.d.ts.map +1 -0
  54. package/dist/runtime/embedding-manager-support.d.ts.map +1 -0
  55. package/dist/runtime/embedding-presets.d.ts.map +1 -0
  56. package/dist/runtime/embedding-warmup-policy.d.ts.map +1 -0
  57. package/{src → dist}/runtime/ensure-local-inference-handler.d.ts +8 -0
  58. package/dist/runtime/ensure-local-inference-handler.d.ts.map +1 -0
  59. package/{src → dist}/runtime/index.d.ts +1 -1
  60. package/dist/runtime/index.d.ts.map +1 -0
  61. package/dist/runtime/index.js +38768 -0
  62. package/dist/runtime/index.js.map +217 -0
  63. package/dist/runtime/mobile-local-inference-gate.d.ts +63 -0
  64. package/dist/runtime/mobile-local-inference-gate.d.ts.map +1 -0
  65. package/{src → dist}/runtime/voice-entity-binding.d.ts +10 -0
  66. package/dist/runtime/voice-entity-binding.d.ts.map +1 -0
  67. package/{src → dist}/services/active-model.d.ts +28 -0
  68. package/dist/services/active-model.d.ts.map +1 -0
  69. package/dist/services/asr-provenance.d.ts +5 -0
  70. package/dist/services/asr-provenance.d.ts.map +1 -0
  71. package/{src → dist}/services/assignments.d.ts +16 -3
  72. package/dist/services/assignments.d.ts.map +1 -0
  73. package/dist/services/backend-selector.d.ts +55 -0
  74. package/dist/services/backend-selector.d.ts.map +1 -0
  75. package/{src → dist}/services/backend.d.ts +110 -16
  76. package/dist/services/backend.d.ts.map +1 -0
  77. package/{src → dist}/services/bionic-host-loader.d.ts +21 -0
  78. package/dist/services/bionic-host-loader.d.ts.map +1 -0
  79. package/dist/services/bundled-models.d.ts.map +1 -0
  80. package/dist/services/cache-bridge.d.ts.map +1 -0
  81. package/dist/services/catalog.d.ts +10 -0
  82. package/dist/services/catalog.d.ts.map +1 -0
  83. package/dist/services/checkpoint-client.d.ts.map +1 -0
  84. package/dist/services/checkpoint-manager.d.ts +217 -0
  85. package/dist/services/checkpoint-manager.d.ts.map +1 -0
  86. package/dist/services/cloud-fallback.d.ts.map +1 -0
  87. package/dist/services/context-fit.d.ts +36 -0
  88. package/dist/services/context-fit.d.ts.map +1 -0
  89. package/dist/services/conversation-registry.d.ts.map +1 -0
  90. package/{src → dist}/services/desktop-fused-ffi-backend-runtime.d.ts +22 -6
  91. package/dist/services/desktop-fused-ffi-backend-runtime.d.ts.map +1 -0
  92. package/dist/services/device-bridge.d.ts.map +1 -0
  93. package/dist/services/device-resource-metrics.d.ts.map +1 -0
  94. package/{src → dist}/services/device-tier.d.ts +19 -1
  95. package/dist/services/device-tier.d.ts.map +1 -0
  96. package/{src → dist}/services/downloader.d.ts +16 -4
  97. package/dist/services/downloader.d.ts.map +1 -0
  98. package/{src → dist}/services/engine.d.ts +43 -4
  99. package/dist/services/engine.d.ts.map +1 -0
  100. package/dist/services/ensure-local-artifacts.d.ts +82 -0
  101. package/dist/services/ensure-local-artifacts.d.ts.map +1 -0
  102. package/dist/services/external-scanner.d.ts.map +1 -0
  103. package/dist/services/ffi-llm-mock.d.ts +90 -0
  104. package/dist/services/ffi-llm-mock.d.ts.map +1 -0
  105. package/dist/services/ffi-llm-streaming-abi.d.ts +318 -0
  106. package/dist/services/ffi-llm-streaming-abi.d.ts.map +1 -0
  107. package/{src → dist}/services/ffi-streaming-backend.d.ts +28 -7
  108. package/dist/services/ffi-streaming-backend.d.ts.map +1 -0
  109. package/{src → dist}/services/ffi-streaming-runner.d.ts +24 -0
  110. package/dist/services/ffi-streaming-runner.d.ts.map +1 -0
  111. package/dist/services/gpu-autotune.d.ts +150 -0
  112. package/dist/services/gpu-autotune.d.ts.map +1 -0
  113. package/dist/services/gpu-detect.d.ts.map +1 -0
  114. package/dist/services/handler-registry.d.ts.map +1 -0
  115. package/dist/services/hardware.d.ts.map +1 -0
  116. package/dist/services/image-description-runtime.d.ts.map +1 -0
  117. package/dist/services/imagegen/aosp-unavailable.d.ts.map +1 -0
  118. package/dist/services/imagegen/backend-selector.d.ts.map +1 -0
  119. package/dist/services/imagegen/coreml-unavailable.d.ts.map +1 -0
  120. package/dist/services/imagegen/errors.d.ts.map +1 -0
  121. package/dist/services/imagegen/index.d.ts.map +1 -0
  122. package/dist/services/imagegen/mflux.d.ts.map +1 -0
  123. package/{src → dist}/services/imagegen/sd-cpp.d.ts +1 -0
  124. package/dist/services/imagegen/sd-cpp.d.ts.map +1 -0
  125. package/dist/services/imagegen/tensorrt-unavailable.d.ts.map +1 -0
  126. package/dist/services/imagegen/types.d.ts.map +1 -0
  127. package/{src → dist}/services/index.d.ts +3 -1
  128. package/dist/services/index.d.ts.map +1 -0
  129. package/dist/services/index.js +39453 -0
  130. package/dist/services/index.js.map +227 -0
  131. package/dist/services/inference-capabilities.d.ts.map +1 -0
  132. package/dist/services/inference-telemetry.d.ts.map +1 -0
  133. package/dist/services/ios-llama-streaming.d.ts +119 -0
  134. package/dist/services/ios-llama-streaming.d.ts.map +1 -0
  135. package/dist/services/kv-spill.d.ts.map +1 -0
  136. package/dist/services/latency-trace.d.ts.map +1 -0
  137. package/dist/services/lib-target.d.ts +55 -0
  138. package/dist/services/lib-target.d.ts.map +1 -0
  139. package/dist/services/live-signals.d.ts +86 -0
  140. package/dist/services/live-signals.d.ts.map +1 -0
  141. package/dist/services/llama-server-metrics.d.ts +114 -0
  142. package/dist/services/llama-server-metrics.d.ts.map +1 -0
  143. package/dist/services/llm-streaming-binding.d.ts.map +1 -0
  144. package/dist/services/load-args.d.ts.map +1 -0
  145. package/dist/services/manifest/index.d.ts +4 -0
  146. package/dist/services/manifest/index.d.ts.map +1 -0
  147. package/{src → dist}/services/manifest/schema.d.ts +196 -6
  148. package/dist/services/manifest/schema.d.ts.map +1 -0
  149. package/{src → dist}/services/manifest/types.d.ts +3 -1
  150. package/dist/services/manifest/types.d.ts.map +1 -0
  151. package/dist/services/manifest/validator.d.ts.map +1 -0
  152. package/{src → dist}/services/memory-arbiter.d.ts +33 -3
  153. package/dist/services/memory-arbiter.d.ts.map +1 -0
  154. package/dist/services/memory-benchmark.d.ts +76 -0
  155. package/dist/services/memory-benchmark.d.ts.map +1 -0
  156. package/{src → dist}/services/memory-monitor.d.ts +6 -0
  157. package/dist/services/memory-monitor.d.ts.map +1 -0
  158. package/dist/services/memory-pressure.d.ts.map +1 -0
  159. package/dist/services/mtp-doctor.d.ts.map +1 -0
  160. package/dist/services/network-policy.d.ts.map +1 -0
  161. package/dist/services/paths.d.ts.map +1 -0
  162. package/dist/services/planner-skeleton.d.ts.map +1 -0
  163. package/dist/services/providers.d.ts.map +1 -0
  164. package/dist/services/ram-budget.d.ts.map +1 -0
  165. package/dist/services/readiness.d.ts.map +1 -0
  166. package/dist/services/recommendation.d.ts.map +1 -0
  167. package/{src → dist}/services/registry.d.ts +11 -13
  168. package/dist/services/registry.d.ts.map +1 -0
  169. package/{src → dist}/services/router-handler.d.ts +2 -2
  170. package/dist/services/router-handler.d.ts.map +1 -0
  171. package/{src → dist}/services/routing-policy.d.ts +32 -9
  172. package/dist/services/routing-policy.d.ts.map +1 -0
  173. package/dist/services/routing-preferences.d.ts.map +1 -0
  174. package/dist/services/runtime-target.d.ts.map +1 -0
  175. package/{src → dist}/services/service.d.ts +1 -1
  176. package/dist/services/service.d.ts.map +1 -0
  177. package/dist/services/session-pool.d.ts.map +1 -0
  178. package/dist/services/structured-output/deterministic-repair.d.ts.map +1 -0
  179. package/dist/services/structured-output/index.d.ts +2 -0
  180. package/dist/services/structured-output/index.d.ts.map +1 -0
  181. package/dist/services/structured-output.d.ts.map +1 -0
  182. package/dist/services/system-memory.d.ts.map +1 -0
  183. package/{src → dist}/services/types.d.ts +1 -1
  184. package/dist/services/types.d.ts.map +1 -0
  185. package/dist/services/verify-on-device.d.ts.map +1 -0
  186. package/dist/services/verify.d.ts.map +1 -0
  187. package/dist/services/vision/aosp-unavailable.d.ts.map +1 -0
  188. package/dist/services/vision/capacitor-llama.d.ts.map +1 -0
  189. package/dist/services/vision/cloud-fallback.d.ts.map +1 -0
  190. package/dist/services/vision/hash.d.ts.map +1 -0
  191. package/{src → dist}/services/vision/index.d.ts +1 -1
  192. package/dist/services/vision/index.d.ts.map +1 -0
  193. package/dist/services/vision/llama-server.d.ts.map +1 -0
  194. package/{src → dist}/services/vision/types.d.ts +13 -4
  195. package/dist/services/vision/types.d.ts.map +1 -0
  196. package/dist/services/vision/vast-fallback.d.ts.map +1 -0
  197. package/{src → dist}/services/vision-embedding-cache.d.ts +1 -1
  198. package/dist/services/vision-embedding-cache.d.ts.map +1 -0
  199. package/dist/services/voice/__test-helpers__/fake-ffi.d.ts +27 -0
  200. package/dist/services/voice/__test-helpers__/fake-ffi.d.ts.map +1 -0
  201. package/dist/services/voice/__test-helpers__/synthetic-speech.d.ts +66 -0
  202. package/dist/services/voice/__test-helpers__/synthetic-speech.d.ts.map +1 -0
  203. package/dist/services/voice/acoustic-speaker-attribution.d.ts +61 -0
  204. package/dist/services/voice/acoustic-speaker-attribution.d.ts.map +1 -0
  205. package/{src → dist}/services/voice/audio-frame-consumer.d.ts +82 -0
  206. package/dist/services/voice/audio-frame-consumer.d.ts.map +1 -0
  207. package/dist/services/voice/barge-in.d.ts.map +1 -0
  208. package/dist/services/voice/cancellation-coordinator.d.ts.map +1 -0
  209. package/dist/services/voice/checkpoint-manager.d.ts.map +1 -0
  210. package/dist/services/voice/checkpoint-policy.d.ts +178 -0
  211. package/dist/services/voice/checkpoint-policy.d.ts.map +1 -0
  212. package/dist/services/voice/corpus-augment.d.ts +111 -0
  213. package/dist/services/voice/corpus-augment.d.ts.map +1 -0
  214. package/dist/services/voice/corpus-generator.d.ts +134 -0
  215. package/dist/services/voice/corpus-generator.d.ts.map +1 -0
  216. package/dist/services/voice/diarization-error-rate.d.ts +40 -0
  217. package/dist/services/voice/diarization-error-rate.d.ts.map +1 -0
  218. package/dist/services/voice/e2e-harness.d.ts +297 -0
  219. package/dist/services/voice/e2e-harness.d.ts.map +1 -0
  220. package/dist/services/voice/eager-context-builder.d.ts.map +1 -0
  221. package/dist/services/voice/echo-delay.d.ts +67 -0
  222. package/dist/services/voice/echo-delay.d.ts.map +1 -0
  223. package/dist/services/voice/echo-metrics.d.ts +7 -0
  224. package/dist/services/voice/echo-metrics.d.ts.map +1 -0
  225. package/dist/services/voice/echo-reference-buffer.d.ts +65 -0
  226. package/dist/services/voice/echo-reference-buffer.d.ts.map +1 -0
  227. package/{src → dist}/services/voice/eliza1-eot-scorer.d.ts +8 -8
  228. package/dist/services/voice/eliza1-eot-scorer.d.ts.map +1 -0
  229. package/dist/services/voice/embedding-server.d.ts +37 -0
  230. package/dist/services/voice/embedding-server.d.ts.map +1 -0
  231. package/{src → dist}/services/voice/embedding.d.ts +2 -3
  232. package/dist/services/voice/embedding.d.ts.map +1 -0
  233. package/dist/services/voice/emotion-attribution.d.ts.map +1 -0
  234. package/{src → dist}/services/voice/engine-bridge.d.ts +8 -5
  235. package/dist/services/voice/engine-bridge.d.ts.map +1 -0
  236. package/{src → dist}/services/voice/eot-classifier-ggml.d.ts +22 -22
  237. package/dist/services/voice/eot-classifier-ggml.d.ts.map +1 -0
  238. package/{src → dist}/services/voice/eot-classifier.d.ts +9 -12
  239. package/dist/services/voice/eot-classifier.d.ts.map +1 -0
  240. package/{src → dist}/services/voice/errors.d.ts +1 -1
  241. package/dist/services/voice/errors.d.ts.map +1 -0
  242. package/{src → dist}/services/voice/expressive-tags.d.ts +5 -5
  243. package/dist/services/voice/expressive-tags.d.ts.map +1 -0
  244. package/{src → dist}/services/voice/ffi-bindings.d.ts +26 -4
  245. package/dist/services/voice/ffi-bindings.d.ts.map +1 -0
  246. package/dist/services/voice/first-line-cache.d.ts.map +1 -0
  247. package/{src → dist}/services/voice/fused-eot-scorer.d.ts +6 -6
  248. package/dist/services/voice/fused-eot-scorer.d.ts.map +1 -0
  249. package/{src → dist}/services/voice/index.d.ts +8 -3
  250. package/dist/services/voice/index.d.ts.map +1 -0
  251. package/dist/services/voice/kokoro/index.d.ts +24 -0
  252. package/dist/services/voice/kokoro/index.d.ts.map +1 -0
  253. package/{src → dist}/services/voice/kokoro/kokoro-backend.d.ts +15 -0
  254. package/dist/services/voice/kokoro/kokoro-backend.d.ts.map +1 -0
  255. package/{src → dist}/services/voice/kokoro/kokoro-engine-discovery.d.ts +1 -1
  256. package/dist/services/voice/kokoro/kokoro-engine-discovery.d.ts.map +1 -0
  257. package/{src → dist}/services/voice/kokoro/kokoro-ffi-runtime.d.ts +3 -3
  258. package/dist/services/voice/kokoro/kokoro-ffi-runtime.d.ts.map +1 -0
  259. package/dist/services/voice/kokoro/kokoro-runtime.d.ts.map +1 -0
  260. package/dist/services/voice/kokoro/phoneme-stream.d.ts +51 -0
  261. package/dist/services/voice/kokoro/phoneme-stream.d.ts.map +1 -0
  262. package/dist/services/voice/kokoro/phonemizer.d.ts.map +1 -0
  263. package/{src → dist}/services/voice/kokoro/pick-runtime.d.ts +1 -1
  264. package/dist/services/voice/kokoro/pick-runtime.d.ts.map +1 -0
  265. package/dist/services/voice/kokoro/runtime-selection.d.ts +31 -0
  266. package/dist/services/voice/kokoro/runtime-selection.d.ts.map +1 -0
  267. package/dist/services/voice/kokoro/types.d.ts.map +1 -0
  268. package/dist/services/voice/kokoro/voice-presets.d.ts.map +1 -0
  269. package/dist/services/voice/kokoro/voices.d.ts.map +1 -0
  270. package/dist/services/voice/lifecycle.d.ts.map +1 -0
  271. package/dist/services/voice/live-diarization-session.d.ts +196 -0
  272. package/dist/services/voice/live-diarization-session.d.ts.map +1 -0
  273. package/dist/services/voice/metric-math.d.ts +10 -0
  274. package/dist/services/voice/metric-math.d.ts.map +1 -0
  275. package/{src → dist}/services/voice/mic-source.d.ts +1 -1
  276. package/dist/services/voice/mic-source.d.ts.map +1 -0
  277. package/dist/services/voice/nlms-echo-canceller.d.ts +137 -0
  278. package/dist/services/voice/nlms-echo-canceller.d.ts.map +1 -0
  279. package/dist/services/voice/optimistic-policy.d.ts.map +1 -0
  280. package/dist/services/voice/optimistic-rollback.d.ts +151 -0
  281. package/dist/services/voice/optimistic-rollback.d.ts.map +1 -0
  282. package/{src → dist}/services/voice/partial-stabilizer.d.ts +1 -1
  283. package/dist/services/voice/partial-stabilizer.d.ts.map +1 -0
  284. package/dist/services/voice/phoneme-tokenizer.d.ts.map +1 -0
  285. package/dist/services/voice/phrase-cache.d.ts.map +1 -0
  286. package/dist/services/voice/phrase-chunker.d.ts.map +1 -0
  287. package/dist/services/voice/pipeline-impls.d.ts.map +1 -0
  288. package/dist/services/voice/pipeline.d.ts.map +1 -0
  289. package/dist/services/voice/prefill-client.d.ts.map +1 -0
  290. package/dist/services/voice/prefix-preserving-queue.d.ts.map +1 -0
  291. package/dist/services/voice/profile-store.d.ts.map +1 -0
  292. package/dist/services/voice/ring-buffer.d.ts.map +1 -0
  293. package/dist/services/voice/rollback-queue.d.ts.map +1 -0
  294. package/dist/services/voice/samantha-preset-placeholder.d.ts.map +1 -0
  295. package/dist/services/voice/samantha-preset-regenerator.d.ts.map +1 -0
  296. package/dist/services/voice/scheduler.d.ts.map +1 -0
  297. package/dist/services/voice/self-voice-imprint.d.ts +33 -0
  298. package/dist/services/voice/self-voice-imprint.d.ts.map +1 -0
  299. package/{src → dist}/services/voice/shared-resources.d.ts +14 -0
  300. package/dist/services/voice/shared-resources.d.ts.map +1 -0
  301. package/dist/services/voice/speaker/attribution-pipeline.d.ts.map +1 -0
  302. package/dist/services/voice/speaker/diarizer-fused.d.ts.map +1 -0
  303. package/dist/services/voice/speaker/diarizer.d.ts.map +1 -0
  304. package/dist/services/voice/speaker/encoder-fused.d.ts.map +1 -0
  305. package/dist/services/voice/speaker/encoder-ggml.d.ts.map +1 -0
  306. package/dist/services/voice/speaker/encoder.d.ts.map +1 -0
  307. package/dist/services/voice/speaker-imprint.d.ts.map +1 -0
  308. package/dist/services/voice/speaker-preset-cache.d.ts.map +1 -0
  309. package/dist/services/voice/streaming-asr/streaming-pipeline-adapter.d.ts +160 -0
  310. package/dist/services/voice/streaming-asr/streaming-pipeline-adapter.d.ts.map +1 -0
  311. package/dist/services/voice/system-audio-sink.d.ts.map +1 -0
  312. package/{src → dist}/services/voice/transcriber.d.ts +4 -4
  313. package/dist/services/voice/transcriber.d.ts.map +1 -0
  314. package/dist/services/voice/transcript-knowledge.d.ts.map +1 -0
  315. package/{src → dist}/services/voice/transcript-service.d.ts +20 -1
  316. package/dist/services/voice/transcript-service.d.ts.map +1 -0
  317. package/{src → dist}/services/voice/transcript-store.d.ts +12 -1
  318. package/dist/services/voice/transcript-store.d.ts.map +1 -0
  319. package/dist/services/voice/turn-controller.d.ts.map +1 -0
  320. package/{src → dist}/services/voice/types.d.ts +6 -6
  321. package/dist/services/voice/types.d.ts.map +1 -0
  322. package/{src → dist}/services/voice/vad.d.ts +6 -5
  323. package/dist/services/voice/vad.d.ts.map +1 -0
  324. package/dist/services/voice/voice-budget.d.ts.map +1 -0
  325. package/dist/services/voice/voice-emotion-classifier.d.ts.map +1 -0
  326. package/dist/services/voice/voice-preload-predictor.d.ts +76 -0
  327. package/dist/services/voice/voice-preload-predictor.d.ts.map +1 -0
  328. package/{src → dist}/services/voice/voice-preset-format.d.ts +2 -2
  329. package/dist/services/voice/voice-preset-format.d.ts.map +1 -0
  330. package/dist/services/voice/voice-profile-artifact.d.ts.map +1 -0
  331. package/dist/services/voice/voice-profile-routes.d.ts.map +1 -0
  332. package/dist/services/voice/voice-scenario.d.ts +131 -0
  333. package/dist/services/voice/voice-scenario.d.ts.map +1 -0
  334. package/dist/services/voice/voice-state-machine.d.ts.map +1 -0
  335. package/dist/services/voice/voice-workbench-report.d.ts +117 -0
  336. package/dist/services/voice/voice-workbench-report.d.ts.map +1 -0
  337. package/{src → dist}/services/voice/wake-word-ggml.d.ts +8 -9
  338. package/dist/services/voice/wake-word-ggml.d.ts.map +1 -0
  339. package/dist/services/voice/wake-word.d.ts.map +1 -0
  340. package/dist/services/voice/wav-codec.d.ts +11 -0
  341. package/dist/services/voice/wav-codec.d.ts.map +1 -0
  342. package/dist/services/voice/workbench-entrypoint.d.ts +42 -0
  343. package/dist/services/voice/workbench-entrypoint.d.ts.map +1 -0
  344. package/dist/services/voice/workbench-headless-runner.d.ts +102 -0
  345. package/dist/services/voice/workbench-headless-runner.d.ts.map +1 -0
  346. package/dist/services/voice/workbench-logic-services.d.ts +36 -0
  347. package/dist/services/voice/workbench-logic-services.d.ts.map +1 -0
  348. package/dist/services/voice/workbench-real-services.d.ts +17 -0
  349. package/dist/services/voice/workbench-real-services.d.ts.map +1 -0
  350. package/dist/services/voice/workbench-scenarios.d.ts +24 -0
  351. package/dist/services/voice/workbench-scenarios.d.ts.map +1 -0
  352. package/dist/services/voice/wrap-with-first-line-cache.d.ts.map +1 -0
  353. package/dist/services/voice-model-updater.d.ts.map +1 -0
  354. package/dist/services/voice-prewarm.d.ts.map +1 -0
  355. package/dist/voice-workbench.d.ts +18 -0
  356. package/dist/voice-workbench.d.ts.map +1 -0
  357. package/dist/voice-workbench.js +5259 -0
  358. package/dist/voice-workbench.js.map +34 -0
  359. package/package.json +28 -9
  360. package/registry-entry.json +137 -0
  361. package/src/adapters/capacitor-llama/__tests__/voice-turn.test.ts +293 -0
  362. package/src/adapters/capacitor-llama/environment.ts +1 -1
  363. package/src/adapters/capacitor-llama/index.ts +28 -4
  364. package/src/adapters/capacitor-llama/native-voice-capture.ts +140 -0
  365. package/src/adapters/capacitor-llama/text-streaming.ts +2 -2
  366. package/src/adapters/capacitor-llama/voice-turn.ts +178 -0
  367. package/src/backends/apple-foundation.ts +1 -1
  368. package/src/local-inference-routes.test.ts +57 -11
  369. package/src/local-inference-routes.ts +90 -8
  370. package/src/provider.ts +32 -3
  371. package/src/routes/compat-helpers.ts +2 -1
  372. package/src/routes/index.ts +1 -0
  373. package/src/routes/live-diarization-route.test.ts +134 -0
  374. package/src/routes/live-diarization-route.ts +79 -3
  375. package/src/routes/local-inference-asr-route.test.ts +43 -2
  376. package/src/routes/local-inference-asr-route.ts +7 -4
  377. package/src/routes/local-inference-asr-transcribe.test.ts +4 -4
  378. package/src/routes/local-inference-asr-transcribe.ts +1 -1
  379. package/src/routes/local-inference-compat-routes.test.ts +3 -3
  380. package/src/routes/local-inference-compat-routes.ts +23 -56
  381. package/src/routes/native-pcm-turn-route.test.ts +136 -0
  382. package/src/routes/native-pcm-turn-route.ts +121 -0
  383. package/src/routes/transcripts-routes.test.ts +51 -0
  384. package/src/routes/transcripts-routes.ts +35 -3
  385. package/src/runtime/bionic-wire-encoding.test.ts +147 -0
  386. package/src/runtime/ensure-local-inference-handler.test.ts +203 -5
  387. package/src/runtime/ensure-local-inference-handler.ts +203 -11
  388. package/src/runtime/index.ts +4 -1
  389. package/src/runtime/mobile-local-inference-gate.test.ts +85 -2
  390. package/src/runtime/mobile-local-inference-gate.ts +60 -5
  391. package/src/runtime/voice-entity-binding.transcript.test.ts +29 -0
  392. package/src/runtime/voice-entity-binding.ts +46 -6
  393. package/src/runtime/voice-speaker-entity-contract.test.ts +149 -0
  394. package/src/services/README.md +2 -2
  395. package/src/services/__tests__/backend-selector.precedence.test.ts +333 -0
  396. package/src/services/active-model-context-fit.test.ts +125 -0
  397. package/src/services/active-model.ts +211 -8
  398. package/src/services/asr-provenance.ts +68 -0
  399. package/src/services/assignment-validation.test.ts +118 -0
  400. package/src/services/assignments.test.ts +26 -0
  401. package/src/services/assignments.ts +52 -4
  402. package/src/services/backend.test.ts +84 -0
  403. package/src/services/backend.ts +198 -19
  404. package/src/services/bionic-host-loader.test.ts +94 -1
  405. package/src/services/bionic-host-loader.ts +72 -0
  406. package/src/services/cache-bridge.test.ts +7 -7
  407. package/src/services/catalog.test.ts +32 -11
  408. package/src/services/catalog.ts +6 -0
  409. package/src/services/cloud-fallback.ts +1 -1
  410. package/src/services/context-fit.test.ts +121 -0
  411. package/src/services/context-fit.ts +113 -0
  412. package/src/services/desktop-fused-ffi-backend-runtime.ts +99 -7
  413. package/src/services/device-tier.test.ts +89 -2
  414. package/src/services/device-tier.ts +103 -11
  415. package/src/services/downloader.test.ts +199 -58
  416. package/src/services/downloader.ts +141 -27
  417. package/src/services/engine-direct-bundle.test.ts +38 -6
  418. package/src/services/engine.ts +291 -104
  419. package/src/services/ensure-local-artifacts.ts +1 -1
  420. package/src/services/ffi-llm-streaming-abi.ts +6 -3
  421. package/src/services/ffi-streaming-backend.ts +44 -8
  422. package/src/services/ffi-streaming-runner.test.ts +163 -3
  423. package/src/services/ffi-streaming-runner.ts +54 -1
  424. package/src/services/ffi-unload-ordering.test.ts +5 -1
  425. package/src/services/fused-eliza1-no-regression.test.ts +144 -0
  426. package/src/services/hardware.test.ts +7 -2
  427. package/src/services/hardware.ts +28 -0
  428. package/src/services/imagegen/backend-selector.test.ts +190 -0
  429. package/src/services/imagegen/sd-cpp.ts +6 -9
  430. package/src/services/index.ts +18 -0
  431. package/src/services/ios-llama-streaming.ts +1 -1
  432. package/src/services/kv-spill.ts +6 -5
  433. package/src/services/lib-target.test.ts +145 -0
  434. package/src/services/lib-target.ts +102 -0
  435. package/src/services/live-signals.test.ts +132 -0
  436. package/src/services/live-signals.ts +177 -0
  437. package/src/services/llama-server-metrics.test.ts +168 -0
  438. package/src/services/manifest/eliza-1.manifest.v1.json +84 -2
  439. package/src/services/manifest/index.ts +6 -0
  440. package/src/services/manifest/manifest.test.ts +156 -54
  441. package/src/services/manifest/schema.ts +160 -52
  442. package/src/services/manifest/types.ts +6 -0
  443. package/src/services/manifest/validator.ts +91 -25
  444. package/src/services/memory-arbiter.test.ts +139 -0
  445. package/src/services/memory-arbiter.ts +81 -15
  446. package/src/services/memory-benchmark.test.ts +91 -0
  447. package/src/services/memory-benchmark.ts +354 -0
  448. package/src/services/memory-monitor.test.ts +24 -0
  449. package/src/services/memory-monitor.ts +12 -0
  450. package/src/services/mtp-doctor.ts +10 -2
  451. package/src/services/network-policy.ts +5 -5
  452. package/src/services/ram-budget-cache.test.ts +2 -1
  453. package/src/services/ram-budget.ts +0 -0
  454. package/src/services/recommendation.test.ts +216 -0
  455. package/src/services/registry.ts +25 -19
  456. package/src/services/required-kernels-gate.test.ts +64 -0
  457. package/src/services/router-handler.ts +43 -24
  458. package/src/services/routing-policy.test.ts +211 -23
  459. package/src/services/routing-policy.ts +92 -22
  460. package/src/services/service.test.ts +3 -3
  461. package/src/services/service.ts +22 -7
  462. package/src/services/transcription-priority.test.ts +2 -2
  463. package/src/services/types.ts +4 -0
  464. package/src/services/verify-on-device.test.ts +2 -2
  465. package/src/services/vision/hash.ts +1 -1
  466. package/src/services/vision/index.ts +2 -2
  467. package/src/services/vision/llama-server.ts +1 -1
  468. package/src/services/vision/types.ts +13 -4
  469. package/src/services/vision-embedding-cache.ts +1 -1
  470. package/src/services/voice/VOICE_WORKBENCH.md +71 -26
  471. package/src/services/voice/__fixtures__/voice-workbench-logic-baseline.json +180 -0
  472. package/src/services/voice/__test-helpers__/synthetic-speech.ts +72 -2
  473. package/src/services/voice/__tests__/eliza1-eot-scorer.test.ts +29 -29
  474. package/src/services/voice/__tests__/streaming-asr.test.ts +1 -1
  475. package/src/services/voice/acoustic-speaker-attribution.test.ts +165 -0
  476. package/src/services/voice/acoustic-speaker-attribution.ts +336 -0
  477. package/src/services/voice/asr-timed.real.test.ts +6 -8
  478. package/src/services/voice/audio-frame-consumer.test.ts +327 -1
  479. package/src/services/voice/audio-frame-consumer.ts +165 -5
  480. package/src/services/voice/barge-in.ts +2 -3
  481. package/src/services/voice/corpus-augment.test.ts +276 -0
  482. package/src/services/voice/corpus-augment.ts +451 -0
  483. package/src/services/voice/corpus-generator.test.ts +201 -0
  484. package/src/services/voice/corpus-generator.ts +413 -0
  485. package/src/services/voice/diarization-error-rate.greedy.test.ts +140 -0
  486. package/src/services/voice/diarization-error-rate.test.ts +100 -0
  487. package/src/services/voice/diarization-error-rate.ts +249 -0
  488. package/src/services/voice/e2e-harness.der.test.ts +94 -0
  489. package/src/services/voice/e2e-harness.respond-eot-entity.test.ts +277 -0
  490. package/src/services/voice/e2e-harness.security-echo.test.ts +103 -0
  491. package/src/services/voice/e2e-harness.test.ts +2 -2
  492. package/src/services/voice/e2e-harness.ts +175 -16
  493. package/src/services/voice/echo-delay.test.ts +118 -0
  494. package/src/services/voice/echo-delay.ts +135 -0
  495. package/src/services/voice/echo-metrics.test.ts +17 -0
  496. package/src/services/voice/echo-metrics.ts +20 -0
  497. package/src/services/voice/echo-reference-buffer.test.ts +86 -0
  498. package/src/services/voice/echo-reference-buffer.ts +165 -0
  499. package/src/services/voice/eliza1-eot-scorer.ts +22 -22
  500. package/src/services/voice/embedding.ts +2 -3
  501. package/src/services/voice/engine-bridge-transcript-join.test.ts +278 -0
  502. package/src/services/voice/engine-bridge.ts +151 -110
  503. package/src/services/voice/eot-classifier-ggml.ts +42 -39
  504. package/src/services/voice/eot-classifier.test.ts +98 -0
  505. package/src/services/voice/eot-classifier.ts +11 -122
  506. package/src/services/voice/errors.ts +2 -0
  507. package/src/services/voice/expressive-tags.asr.test.ts +77 -0
  508. package/src/services/voice/expressive-tags.test.ts +102 -0
  509. package/src/services/voice/expressive-tags.ts +8 -8
  510. package/src/services/voice/ffi-bindings.test.ts +10 -3
  511. package/src/services/voice/ffi-bindings.ts +177 -15
  512. package/src/services/voice/fused-eot-scorer.ts +17 -13
  513. package/src/services/voice/index.ts +33 -12
  514. package/src/services/voice/kokoro/__tests__/kokoro-backend.test.ts +112 -1
  515. package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.real.test.ts +88 -3
  516. package/src/services/voice/kokoro/__tests__/runtime-selection.test.ts +37 -201
  517. package/src/services/voice/kokoro/kokoro-backend.ts +16 -0
  518. package/src/services/voice/kokoro/kokoro-engine-discovery.ts +1 -1
  519. package/src/services/voice/kokoro/kokoro-ffi-runtime.ts +3 -3
  520. package/src/services/voice/kokoro/pick-runtime.ts +1 -1
  521. package/src/services/voice/kokoro/runtime-selection.ts +28 -201
  522. package/src/services/voice/live-diarization-session.echo.test.ts +232 -0
  523. package/src/services/voice/live-diarization-session.ts +335 -2
  524. package/src/services/voice/metric-math.test.ts +61 -0
  525. package/src/services/voice/metric-math.ts +25 -0
  526. package/src/services/voice/mic-source.ts +1 -1
  527. package/src/services/voice/nlms-echo-canceller.test.ts +244 -0
  528. package/src/services/voice/nlms-echo-canceller.ts +317 -0
  529. package/src/services/voice/optimistic-policy.power-source.test.ts +36 -0
  530. package/src/services/voice/partial-stabilizer.ts +1 -1
  531. package/src/services/voice/pipeline.ts +3 -4
  532. package/src/services/voice/research/VOICE_8785_ASSESSMENT.md +141 -0
  533. package/src/services/voice/research/VOICE_PIPELINE_RESEARCH_2026.md +117 -0
  534. package/src/services/voice/research/VOICE_VALIDATION_RUNBOOK.md +135 -0
  535. package/src/services/voice/samantha-preset-regenerator.wav.test.ts +90 -0
  536. package/src/services/voice/self-voice-imprint.test.ts +59 -0
  537. package/src/services/voice/self-voice-imprint.ts +102 -0
  538. package/src/services/voice/shared-resources.ts +23 -0
  539. package/src/services/voice/speaker/attribution-pipeline.test.ts +221 -0
  540. package/src/services/voice/speaker/attribution-pipeline.ts +85 -22
  541. package/src/services/voice/speaker/encoder-ggml.test.ts +59 -0
  542. package/src/services/voice/transcriber.asr-backend.test.ts +76 -0
  543. package/src/services/voice/transcriber.ts +4 -4
  544. package/src/services/voice/transcript-service.test.ts +58 -0
  545. package/src/services/voice/transcript-service.ts +64 -0
  546. package/src/services/voice/transcript-store.test.ts +36 -0
  547. package/src/services/voice/transcript-store.ts +32 -0
  548. package/src/services/voice/types.ts +7 -7
  549. package/src/services/voice/vad.test.ts +33 -15
  550. package/src/services/voice/vad.ts +25 -20
  551. package/src/services/voice/voice-budget.test.ts +0 -3
  552. package/src/services/voice/voice-budget.ts +6 -6
  553. package/src/services/voice/voice-duet.test.ts +1 -1
  554. package/src/services/voice/voice-hardening.fuzz.test.ts +116 -0
  555. package/src/services/voice/voice-preload-predictor.test.ts +130 -0
  556. package/src/services/voice/voice-preload-predictor.ts +113 -0
  557. package/src/services/voice/voice-preset-format.fuzz.test.ts +89 -0
  558. package/src/services/voice/voice-preset-format.test.ts +75 -0
  559. package/src/services/voice/voice-preset-format.ts +17 -4
  560. package/src/services/voice/voice-scenario.test.ts +159 -0
  561. package/src/services/voice/voice-scenario.ts +133 -7
  562. package/src/services/voice/voice-scenario.turn-helpers.test.ts +77 -0
  563. package/src/services/voice/voice-workbench-report.ts +58 -17
  564. package/src/services/voice/wake-word-ggml.ts +12 -13
  565. package/src/services/voice/wav-codec.fuzz.test.ts +59 -0
  566. package/src/services/voice/wav-codec.test.ts +32 -0
  567. package/src/services/voice/wav-codec.ts +101 -0
  568. package/src/services/voice/workbench-entrypoint.test.ts +55 -0
  569. package/src/services/voice/workbench-entrypoint.ts +88 -0
  570. package/src/services/voice/workbench-headless-runner.test.ts +162 -0
  571. package/src/services/voice/workbench-headless-runner.ts +396 -0
  572. package/src/services/voice/workbench-logic-services.test.ts +225 -0
  573. package/src/services/voice/workbench-logic-services.ts +184 -0
  574. package/src/services/voice/workbench-real-services.ts +629 -0
  575. package/src/services/voice/workbench-scenarios.ts +407 -0
  576. package/src/services/voice-prewarm.ts +1 -1
  577. package/src/voice-workbench.ts +71 -0
  578. package/src/actions/generate-media.d.ts.map +0 -1
  579. package/src/actions/identify-speaker.d.ts.map +0 -1
  580. package/src/actions/transcription-control.d.ts.map +0 -1
  581. package/src/index.d.ts.map +0 -1
  582. package/src/local-inference-routes.d.ts.map +0 -1
  583. package/src/provider.d.ts.map +0 -1
  584. package/src/routes/compat-helpers.d.ts.map +0 -1
  585. package/src/routes/family-member-route.d.ts.map +0 -1
  586. package/src/routes/index.d.ts.map +0 -1
  587. package/src/routes/live-diarization-route.d.ts.map +0 -1
  588. package/src/routes/local-inference-asr-route.d.ts.map +0 -1
  589. package/src/routes/local-inference-asr-transcribe.d.ts.map +0 -1
  590. package/src/routes/local-inference-compat-routes.d.ts.map +0 -1
  591. package/src/routes/local-inference-tts-route.d.ts.map +0 -1
  592. package/src/routes/transcript-audio-store.d.ts.map +0 -1
  593. package/src/routes/transcripts-routes.d.ts.map +0 -1
  594. package/src/routes/voice-first-run-routes.d.ts.map +0 -1
  595. package/src/routes/voice-models-routes.d.ts.map +0 -1
  596. package/src/routes/voice-profile-plugin-routes.d.ts.map +0 -1
  597. package/src/routes/voice-profiles-management-routes.d.ts.map +0 -1
  598. package/src/routes/voice-speaker-profile-routes.d.ts.map +0 -1
  599. package/src/runtime/embedding-manager-support.d.ts.map +0 -1
  600. package/src/runtime/embedding-presets.d.ts.map +0 -1
  601. package/src/runtime/embedding-warmup-policy.d.ts.map +0 -1
  602. package/src/runtime/ensure-local-inference-handler.d.ts.map +0 -1
  603. package/src/runtime/index.d.ts.map +0 -1
  604. package/src/runtime/mobile-local-inference-gate.d.ts +0 -31
  605. package/src/runtime/mobile-local-inference-gate.d.ts.map +0 -1
  606. package/src/runtime/voice-entity-binding.d.ts.map +0 -1
  607. package/src/services/active-model.d.ts.map +0 -1
  608. package/src/services/assignments.d.ts.map +0 -1
  609. package/src/services/backend.d.ts.map +0 -1
  610. package/src/services/bionic-host-loader.d.ts.map +0 -1
  611. package/src/services/bundled-models.d.ts.map +0 -1
  612. package/src/services/cache-bridge.d.ts.map +0 -1
  613. package/src/services/catalog.d.ts +0 -10
  614. package/src/services/catalog.d.ts.map +0 -1
  615. package/src/services/checkpoint-client.d.ts.map +0 -1
  616. package/src/services/cloud-fallback.d.ts.map +0 -1
  617. package/src/services/conversation-registry.d.ts.map +0 -1
  618. package/src/services/desktop-fused-ffi-backend-runtime.d.ts.map +0 -1
  619. package/src/services/device-bridge.d.ts.map +0 -1
  620. package/src/services/device-resource-metrics.d.ts.map +0 -1
  621. package/src/services/device-tier.d.ts.map +0 -1
  622. package/src/services/downloader.d.ts.map +0 -1
  623. package/src/services/engine.d.ts.map +0 -1
  624. package/src/services/external-scanner.d.ts.map +0 -1
  625. package/src/services/ffi-streaming-backend.d.ts.map +0 -1
  626. package/src/services/ffi-streaming-runner.d.ts.map +0 -1
  627. package/src/services/gpu-detect.d.ts.map +0 -1
  628. package/src/services/handler-registry.d.ts.map +0 -1
  629. package/src/services/hardware.d.ts.map +0 -1
  630. package/src/services/hf-search.d.ts +0 -26
  631. package/src/services/hf-search.d.ts.map +0 -1
  632. package/src/services/hf-search.test.ts +0 -69
  633. package/src/services/hf-search.ts +0 -420
  634. package/src/services/image-description-runtime.d.ts.map +0 -1
  635. package/src/services/imagegen/aosp-unavailable.d.ts.map +0 -1
  636. package/src/services/imagegen/backend-selector.d.ts.map +0 -1
  637. package/src/services/imagegen/coreml-unavailable.d.ts.map +0 -1
  638. package/src/services/imagegen/errors.d.ts.map +0 -1
  639. package/src/services/imagegen/index.d.ts.map +0 -1
  640. package/src/services/imagegen/mflux.d.ts.map +0 -1
  641. package/src/services/imagegen/sd-cpp.d.ts.map +0 -1
  642. package/src/services/imagegen/tensorrt-unavailable.d.ts.map +0 -1
  643. package/src/services/imagegen/types.d.ts.map +0 -1
  644. package/src/services/index.d.ts.map +0 -1
  645. package/src/services/inference-capabilities.d.ts.map +0 -1
  646. package/src/services/inference-telemetry.d.ts.map +0 -1
  647. package/src/services/kv-spill.d.ts.map +0 -1
  648. package/src/services/latency-trace.d.ts.map +0 -1
  649. package/src/services/llm-streaming-binding.d.ts.map +0 -1
  650. package/src/services/load-args.d.ts.map +0 -1
  651. package/src/services/manifest/index.d.ts +0 -4
  652. package/src/services/manifest/index.d.ts.map +0 -1
  653. package/src/services/manifest/schema.d.ts.map +0 -1
  654. package/src/services/manifest/types.d.ts.map +0 -1
  655. package/src/services/manifest/validator.d.ts.map +0 -1
  656. package/src/services/memory-arbiter.d.ts.map +0 -1
  657. package/src/services/memory-monitor.d.ts.map +0 -1
  658. package/src/services/memory-pressure.d.ts.map +0 -1
  659. package/src/services/mtp-doctor.d.ts.map +0 -1
  660. package/src/services/network-policy.d.ts.map +0 -1
  661. package/src/services/paths.d.ts.map +0 -1
  662. package/src/services/planner-skeleton.d.ts.map +0 -1
  663. package/src/services/providers.d.ts.map +0 -1
  664. package/src/services/ram-budget.d.ts.map +0 -1
  665. package/src/services/readiness.d.ts.map +0 -1
  666. package/src/services/recommendation.d.ts.map +0 -1
  667. package/src/services/registry.d.ts.map +0 -1
  668. package/src/services/router-handler.d.ts.map +0 -1
  669. package/src/services/routing-policy.d.ts.map +0 -1
  670. package/src/services/routing-preferences.d.ts.map +0 -1
  671. package/src/services/runtime-target.d.ts.map +0 -1
  672. package/src/services/service.d.ts.map +0 -1
  673. package/src/services/session-pool.d.ts.map +0 -1
  674. package/src/services/structured-output/deterministic-repair.d.ts.map +0 -1
  675. package/src/services/structured-output.d.ts.map +0 -1
  676. package/src/services/system-memory.d.ts.map +0 -1
  677. package/src/services/types.d.ts.map +0 -1
  678. package/src/services/verify-on-device.d.ts.map +0 -1
  679. package/src/services/verify.d.ts.map +0 -1
  680. package/src/services/vision/aosp-unavailable.d.ts.map +0 -1
  681. package/src/services/vision/capacitor-llama.d.ts.map +0 -1
  682. package/src/services/vision/cloud-fallback.d.ts.map +0 -1
  683. package/src/services/vision/hash.d.ts.map +0 -1
  684. package/src/services/vision/index.d.ts.map +0 -1
  685. package/src/services/vision/llama-server.d.ts.map +0 -1
  686. package/src/services/vision/types.d.ts.map +0 -1
  687. package/src/services/vision/vast-fallback.d.ts.map +0 -1
  688. package/src/services/vision-embedding-cache.d.ts.map +0 -1
  689. package/src/services/voice/audio-frame-consumer.d.ts.map +0 -1
  690. package/src/services/voice/barge-in.d.ts.map +0 -1
  691. package/src/services/voice/cancellation-coordinator.d.ts.map +0 -1
  692. package/src/services/voice/checkpoint-manager.d.ts.map +0 -1
  693. package/src/services/voice/eager-context-builder.d.ts.map +0 -1
  694. package/src/services/voice/eliza1-eot-scorer.d.ts.map +0 -1
  695. package/src/services/voice/embedding.d.ts.map +0 -1
  696. package/src/services/voice/emotion-attribution.d.ts.map +0 -1
  697. package/src/services/voice/engine-bridge.d.ts.map +0 -1
  698. package/src/services/voice/eot-classifier-ggml.d.ts.map +0 -1
  699. package/src/services/voice/eot-classifier.d.ts.map +0 -1
  700. package/src/services/voice/errors.d.ts.map +0 -1
  701. package/src/services/voice/expressive-tags.d.ts.map +0 -1
  702. package/src/services/voice/ffi-bindings.d.ts.map +0 -1
  703. package/src/services/voice/first-line-cache.d.ts.map +0 -1
  704. package/src/services/voice/fused-eot-scorer.d.ts.map +0 -1
  705. package/src/services/voice/index.d.ts.map +0 -1
  706. package/src/services/voice/kokoro/kokoro-backend.d.ts.map +0 -1
  707. package/src/services/voice/kokoro/kokoro-engine-discovery.d.ts.map +0 -1
  708. package/src/services/voice/kokoro/kokoro-ffi-runtime.d.ts.map +0 -1
  709. package/src/services/voice/kokoro/kokoro-runtime.d.ts.map +0 -1
  710. package/src/services/voice/kokoro/phonemizer.d.ts.map +0 -1
  711. package/src/services/voice/kokoro/pick-runtime.d.ts.map +0 -1
  712. package/src/services/voice/kokoro/runtime-selection.d.ts +0 -92
  713. package/src/services/voice/kokoro/runtime-selection.d.ts.map +0 -1
  714. package/src/services/voice/kokoro/types.d.ts.map +0 -1
  715. package/src/services/voice/kokoro/voice-presets.d.ts.map +0 -1
  716. package/src/services/voice/kokoro/voices.d.ts.map +0 -1
  717. package/src/services/voice/lifecycle.d.ts.map +0 -1
  718. package/src/services/voice/live-diarization-session.d.ts +0 -96
  719. package/src/services/voice/live-diarization-session.d.ts.map +0 -1
  720. package/src/services/voice/mic-source.d.ts.map +0 -1
  721. package/src/services/voice/optimistic-policy.d.ts.map +0 -1
  722. package/src/services/voice/partial-stabilizer.d.ts.map +0 -1
  723. package/src/services/voice/phoneme-tokenizer.d.ts.map +0 -1
  724. package/src/services/voice/phrase-cache.d.ts.map +0 -1
  725. package/src/services/voice/phrase-chunker.d.ts.map +0 -1
  726. package/src/services/voice/pipeline-impls.d.ts.map +0 -1
  727. package/src/services/voice/pipeline.d.ts.map +0 -1
  728. package/src/services/voice/prefill-client.d.ts.map +0 -1
  729. package/src/services/voice/prefix-preserving-queue.d.ts.map +0 -1
  730. package/src/services/voice/profile-store.d.ts.map +0 -1
  731. package/src/services/voice/ring-buffer.d.ts.map +0 -1
  732. package/src/services/voice/rollback-queue.d.ts.map +0 -1
  733. package/src/services/voice/samantha-preset-placeholder.d.ts.map +0 -1
  734. package/src/services/voice/samantha-preset-regenerator.d.ts.map +0 -1
  735. package/src/services/voice/scheduler.d.ts.map +0 -1
  736. package/src/services/voice/shared-resources.d.ts.map +0 -1
  737. package/src/services/voice/speaker/attribution-pipeline.d.ts.map +0 -1
  738. package/src/services/voice/speaker/diarizer-fused.d.ts.map +0 -1
  739. package/src/services/voice/speaker/diarizer.d.ts.map +0 -1
  740. package/src/services/voice/speaker/encoder-fused.d.ts.map +0 -1
  741. package/src/services/voice/speaker/encoder-ggml.d.ts.map +0 -1
  742. package/src/services/voice/speaker/encoder.d.ts.map +0 -1
  743. package/src/services/voice/speaker-imprint.d.ts.map +0 -1
  744. package/src/services/voice/speaker-preset-cache.d.ts.map +0 -1
  745. package/src/services/voice/system-audio-sink.d.ts.map +0 -1
  746. package/src/services/voice/transcriber.d.ts.map +0 -1
  747. package/src/services/voice/transcript-knowledge.d.ts.map +0 -1
  748. package/src/services/voice/transcript-service.d.ts.map +0 -1
  749. package/src/services/voice/transcript-store.d.ts.map +0 -1
  750. package/src/services/voice/turn-controller.d.ts.map +0 -1
  751. package/src/services/voice/types.d.ts.map +0 -1
  752. package/src/services/voice/vad.d.ts.map +0 -1
  753. package/src/services/voice/voice-budget.d.ts.map +0 -1
  754. package/src/services/voice/voice-emotion-classifier.d.ts.map +0 -1
  755. package/src/services/voice/voice-preset-format.d.ts.map +0 -1
  756. package/src/services/voice/voice-profile-artifact.d.ts.map +0 -1
  757. package/src/services/voice/voice-profile-routes.d.ts.map +0 -1
  758. package/src/services/voice/voice-settings.d.ts +0 -82
  759. package/src/services/voice/voice-settings.d.ts.map +0 -1
  760. package/src/services/voice/voice-settings.ts +0 -172
  761. package/src/services/voice/voice-state-machine.d.ts.map +0 -1
  762. package/src/services/voice/wake-word-ggml.d.ts.map +0 -1
  763. package/src/services/voice/wake-word.d.ts.map +0 -1
  764. package/src/services/voice/wrap-with-first-line-cache.d.ts.map +0 -1
  765. package/src/services/voice-model-updater.d.ts.map +0 -1
  766. package/src/services/voice-prewarm.d.ts.map +0 -1
  767. /package/{src → dist}/actions/generate-media.d.ts +0 -0
  768. /package/{src → dist}/actions/identify-speaker.d.ts +0 -0
  769. /package/{src → dist}/actions/transcription-control.d.ts +0 -0
  770. /package/{src → dist}/index.d.ts +0 -0
  771. /package/{src → dist}/provider.d.ts +0 -0
  772. /package/{src → dist}/routes/family-member-route.d.ts +0 -0
  773. /package/{src → dist}/routes/local-inference-asr-route.d.ts +0 -0
  774. /package/{src → dist}/routes/local-inference-asr-transcribe.d.ts +0 -0
  775. /package/{src → dist}/routes/local-inference-compat-routes.d.ts +0 -0
  776. /package/{src → dist}/routes/local-inference-tts-route.d.ts +0 -0
  777. /package/{src → dist}/routes/transcript-audio-store.d.ts +0 -0
  778. /package/{src → dist}/routes/voice-first-run-routes.d.ts +0 -0
  779. /package/{src → dist}/routes/voice-models-routes.d.ts +0 -0
  780. /package/{src → dist}/routes/voice-profile-plugin-routes.d.ts +0 -0
  781. /package/{src → dist}/routes/voice-profiles-management-routes.d.ts +0 -0
  782. /package/{src → dist}/routes/voice-speaker-profile-routes.d.ts +0 -0
  783. /package/{src → dist}/runtime/embedding-manager-support.d.ts +0 -0
  784. /package/{src → dist}/runtime/embedding-presets.d.ts +0 -0
  785. /package/{src → dist}/runtime/embedding-warmup-policy.d.ts +0 -0
  786. /package/{src → dist}/services/bundled-models.d.ts +0 -0
  787. /package/{src → dist}/services/cache-bridge.d.ts +0 -0
  788. /package/{src → dist}/services/checkpoint-client.d.ts +0 -0
  789. /package/{src → dist}/services/cloud-fallback.d.ts +0 -0
  790. /package/{src → dist}/services/conversation-registry.d.ts +0 -0
  791. /package/{src → dist}/services/device-bridge.d.ts +0 -0
  792. /package/{src → dist}/services/device-resource-metrics.d.ts +0 -0
  793. /package/{src → dist}/services/external-scanner.d.ts +0 -0
  794. /package/{src → dist}/services/gpu-detect.d.ts +0 -0
  795. /package/{src → dist}/services/handler-registry.d.ts +0 -0
  796. /package/{src → dist}/services/hardware.d.ts +0 -0
  797. /package/{src → dist}/services/image-description-runtime.d.ts +0 -0
  798. /package/{src → dist}/services/imagegen/aosp-unavailable.d.ts +0 -0
  799. /package/{src → dist}/services/imagegen/backend-selector.d.ts +0 -0
  800. /package/{src → dist}/services/imagegen/coreml-unavailable.d.ts +0 -0
  801. /package/{src → dist}/services/imagegen/errors.d.ts +0 -0
  802. /package/{src → dist}/services/imagegen/index.d.ts +0 -0
  803. /package/{src → dist}/services/imagegen/mflux.d.ts +0 -0
  804. /package/{src → dist}/services/imagegen/tensorrt-unavailable.d.ts +0 -0
  805. /package/{src → dist}/services/imagegen/types.d.ts +0 -0
  806. /package/{src → dist}/services/inference-capabilities.d.ts +0 -0
  807. /package/{src → dist}/services/inference-telemetry.d.ts +0 -0
  808. /package/{src → dist}/services/kv-spill.d.ts +0 -0
  809. /package/{src → dist}/services/latency-trace.d.ts +0 -0
  810. /package/{src → dist}/services/llm-streaming-binding.d.ts +0 -0
  811. /package/{src → dist}/services/load-args.d.ts +0 -0
  812. /package/{src → dist}/services/manifest/validator.d.ts +0 -0
  813. /package/{src → dist}/services/memory-pressure.d.ts +0 -0
  814. /package/{src → dist}/services/mtp-doctor.d.ts +0 -0
  815. /package/{src → dist}/services/network-policy.d.ts +0 -0
  816. /package/{src → dist}/services/paths.d.ts +0 -0
  817. /package/{src → dist}/services/planner-skeleton.d.ts +0 -0
  818. /package/{src → dist}/services/providers.d.ts +0 -0
  819. /package/{src → dist}/services/ram-budget.d.ts +0 -0
  820. /package/{src → dist}/services/readiness.d.ts +0 -0
  821. /package/{src → dist}/services/recommendation.d.ts +0 -0
  822. /package/{src → dist}/services/routing-preferences.d.ts +0 -0
  823. /package/{src → dist}/services/runtime-target.d.ts +0 -0
  824. /package/{src → dist}/services/session-pool.d.ts +0 -0
  825. /package/{src → dist}/services/structured-output/deterministic-repair.d.ts +0 -0
  826. /package/{src → dist}/services/structured-output.d.ts +0 -0
  827. /package/{src → dist}/services/system-memory.d.ts +0 -0
  828. /package/{src → dist}/services/verify-on-device.d.ts +0 -0
  829. /package/{src → dist}/services/verify.d.ts +0 -0
  830. /package/{src → dist}/services/vision/aosp-unavailable.d.ts +0 -0
  831. /package/{src → dist}/services/vision/capacitor-llama.d.ts +0 -0
  832. /package/{src → dist}/services/vision/cloud-fallback.d.ts +0 -0
  833. /package/{src → dist}/services/vision/hash.d.ts +0 -0
  834. /package/{src → dist}/services/vision/llama-server.d.ts +0 -0
  835. /package/{src → dist}/services/vision/vast-fallback.d.ts +0 -0
  836. /package/{src → dist}/services/voice/barge-in.d.ts +0 -0
  837. /package/{src → dist}/services/voice/cancellation-coordinator.d.ts +0 -0
  838. /package/{src → dist}/services/voice/checkpoint-manager.d.ts +0 -0
  839. /package/{src → dist}/services/voice/eager-context-builder.d.ts +0 -0
  840. /package/{src → dist}/services/voice/emotion-attribution.d.ts +0 -0
  841. /package/{src → dist}/services/voice/first-line-cache.d.ts +0 -0
  842. /package/{src → dist}/services/voice/kokoro/kokoro-runtime.d.ts +0 -0
  843. /package/{src → dist}/services/voice/kokoro/phonemizer.d.ts +0 -0
  844. /package/{src → dist}/services/voice/kokoro/types.d.ts +0 -0
  845. /package/{src → dist}/services/voice/kokoro/voice-presets.d.ts +0 -0
  846. /package/{src → dist}/services/voice/kokoro/voices.d.ts +0 -0
  847. /package/{src → dist}/services/voice/lifecycle.d.ts +0 -0
  848. /package/{src → dist}/services/voice/optimistic-policy.d.ts +0 -0
  849. /package/{src → dist}/services/voice/phoneme-tokenizer.d.ts +0 -0
  850. /package/{src → dist}/services/voice/phrase-cache.d.ts +0 -0
  851. /package/{src → dist}/services/voice/phrase-chunker.d.ts +0 -0
  852. /package/{src → dist}/services/voice/pipeline-impls.d.ts +0 -0
  853. /package/{src → dist}/services/voice/pipeline.d.ts +0 -0
  854. /package/{src → dist}/services/voice/prefill-client.d.ts +0 -0
  855. /package/{src → dist}/services/voice/prefix-preserving-queue.d.ts +0 -0
  856. /package/{src → dist}/services/voice/profile-store.d.ts +0 -0
  857. /package/{src → dist}/services/voice/ring-buffer.d.ts +0 -0
  858. /package/{src → dist}/services/voice/rollback-queue.d.ts +0 -0
  859. /package/{src → dist}/services/voice/samantha-preset-placeholder.d.ts +0 -0
  860. /package/{src → dist}/services/voice/samantha-preset-regenerator.d.ts +0 -0
  861. /package/{src → dist}/services/voice/scheduler.d.ts +0 -0
  862. /package/{src → dist}/services/voice/speaker/attribution-pipeline.d.ts +0 -0
  863. /package/{src → dist}/services/voice/speaker/diarizer-fused.d.ts +0 -0
  864. /package/{src → dist}/services/voice/speaker/diarizer.d.ts +0 -0
  865. /package/{src → dist}/services/voice/speaker/encoder-fused.d.ts +0 -0
  866. /package/{src → dist}/services/voice/speaker/encoder-ggml.d.ts +0 -0
  867. /package/{src → dist}/services/voice/speaker/encoder.d.ts +0 -0
  868. /package/{src → dist}/services/voice/speaker-imprint.d.ts +0 -0
  869. /package/{src → dist}/services/voice/speaker-preset-cache.d.ts +0 -0
  870. /package/{src → dist}/services/voice/system-audio-sink.d.ts +0 -0
  871. /package/{src → dist}/services/voice/transcript-knowledge.d.ts +0 -0
  872. /package/{src → dist}/services/voice/turn-controller.d.ts +0 -0
  873. /package/{src → dist}/services/voice/voice-budget.d.ts +0 -0
  874. /package/{src → dist}/services/voice/voice-emotion-classifier.d.ts +0 -0
  875. /package/{src → dist}/services/voice/voice-profile-artifact.d.ts +0 -0
  876. /package/{src → dist}/services/voice/voice-profile-routes.d.ts +0 -0
  877. /package/{src → dist}/services/voice/voice-state-machine.d.ts +0 -0
  878. /package/{src → dist}/services/voice/wake-word.d.ts +0 -0
  879. /package/{src → dist}/services/voice/wrap-with-first-line-cache.d.ts +0 -0
  880. /package/{src → dist}/services/voice-model-updater.d.ts +0 -0
  881. /package/{src → dist}/services/voice-prewarm.d.ts +0 -0
@@ -27,6 +27,14 @@
27
27
  * 3–4 GB ceiling; Android foreground-service requirement).
28
28
  */
29
29
 
30
+ import { isMobilePlatform } from "@elizaos/shared";
31
+ import {
32
+ type Eliza1Fit,
33
+ // Aliased to a distinct name (no shared `selectBestEliza1Fit*` prefix with the
34
+ // local `selectBestEliza1FitForDevice`) — the mobile Bun.build minifier was
35
+ // observed to mangle the same-prefix pair into a dangling `…Fit2` reference.
36
+ selectBestEliza1Fit as resolveBestEliza1FitForRam,
37
+ } from "@elizaos/shared/local-inference";
30
38
  import type { HardwareProbe } from "./types";
31
39
 
32
40
  /** The four device tiers used by the runtime + UI. */
@@ -67,7 +75,11 @@ export const DEVICE_TIER_THRESHOLDS = {
67
75
  effectiveModelMemoryGb: 6,
68
76
  freeRamGbAtSession: 3,
69
77
  minTotalRamGb: 16,
70
- mobileMinTotalRamGb: 12,
78
+ // A phone can run eliza-1 2B (≈2.5 GB resident) locally — 6 GB+ total /
79
+ // ≈3 GB effective is enough — so an 8 GB Pixel is OKAY (local-capable),
80
+ // not POOR/cloud-only. The desktop floors stay higher.
81
+ mobileMinTotalRamGb: 6,
82
+ mobileEffectiveModelMemoryGb: 3,
71
83
  },
72
84
  } as const;
73
85
 
@@ -87,6 +99,12 @@ export interface DeviceTierAssessment {
87
99
  canRunLocalVoice: boolean;
88
100
  /** Default backend mode for the user. */
89
101
  recommendedMode: RecommendedMode;
102
+ /**
103
+ * The biggest eliza-1 tier (+ 128k-targeted QJL context) that fits this device,
104
+ * or `null` when nothing local fits and the modality should route to Cloud.
105
+ * This is the single forced-model decision the consumer UI renders read-only.
106
+ */
107
+ recommendedFit: Eliza1Fit | null;
90
108
  /** Numeric snapshot to drive UI badges and first-run copy. */
91
109
  numericContext: {
92
110
  totalRamGb: number;
@@ -114,6 +132,72 @@ export function effectiveModelMemoryGb(probe: HardwareProbe): number {
114
132
  return probe.totalRamGb * 0.5;
115
133
  }
116
134
 
135
+ /**
136
+ * Mobile OS background-task model makes large local tiers unsafe regardless of how
137
+ * much RAM the phone reports, so cap mobile fit at the 4B floor. A strong phone may
138
+ * run 4B; a typical one lands on 2B; both still flow through `selectBestEliza1Fit`.
139
+ */
140
+ const MOBILE_FIT_CEILING_GB = 6;
141
+
142
+ /**
143
+ * Largest context window we advertise on a phone. A full 128k QJL KV cache does
144
+ * not fit alongside the weights in a handset's real free RAM (the resident agent +
145
+ * WebView + OS leave well under `totalRam × 0.5`), so we clamp mobile windows here
146
+ * even when the coarse RAM math would allow more.
147
+ */
148
+ const MOBILE_CONTEXT_CEILING = 65536; // 64k
149
+
150
+ /**
151
+ * True when this host should be treated as a phone for fit purposes. The on-device
152
+ * bun agent's hardware probe often reports `platform: "linux"` with no `mobile`
153
+ * field (it sees the bionic/musl env as linux), so the probe alone under-detects
154
+ * Android/iOS — fall back to the runtime `ELIZA_PLATFORM` signal so the mobile cap
155
+ * still applies. Without this, a high-RAM phone would be handed a 9B+ tier.
156
+ */
157
+ function isMobileHost(probe: HardwareProbe): boolean {
158
+ return isMobile(probe) || isMobilePlatform();
159
+ }
160
+
161
+ /**
162
+ * The canonical "biggest eliza-1 that fits this device" decision: normalize the
163
+ * hardware probe to usable model memory, then pick the largest tier at a 128k QJL
164
+ * window (or a downscaled 2B window, or `null` → route to Cloud). This is the one
165
+ * function callers should use to answer "what local model runs here" — it always
166
+ * applies TurboQuant weights + the QJL KV cache and targets a 128k window. On
167
+ * mobile it caps the tier at 4B and the context at 64k (a phone cannot hold a 128k
168
+ * cache).
169
+ */
170
+ export function selectBestEliza1FitForDevice(
171
+ probe: HardwareProbe,
172
+ ): Eliza1Fit | null {
173
+ const mobile = isMobileHost(probe);
174
+ let memGb = effectiveModelMemoryGb(probe);
175
+ if (mobile) memGb = Math.min(memGb, MOBILE_FIT_CEILING_GB);
176
+ let fit: Eliza1Fit | null;
177
+ try {
178
+ fit = resolveBestEliza1FitForRam(memGb);
179
+ } catch (err) {
180
+ // `recommendedFit` is an advisory hint, never a routing gate — but
181
+ // `classifyDeviceTier` (which embeds it) IS called on the routing hot path.
182
+ // A mobile-bundle minifier artifact has been observed to leave a dangling
183
+ // reference at this cross-module call, so guard it: degrade to no
184
+ // recommendation rather than letting an undefined-symbol error crash the
185
+ // whole device-tier assessment (and with it the AUTO router) on-device.
186
+ console.warn(
187
+ `[device-tier] recommendedFit unavailable: ${err instanceof Error ? err.message : String(err)}`,
188
+ );
189
+ return null;
190
+ }
191
+ if (fit && mobile && fit.contextLength > MOBILE_CONTEXT_CEILING) {
192
+ return {
193
+ ...fit,
194
+ contextLength: MOBILE_CONTEXT_CEILING,
195
+ contextDownscaled: true,
196
+ };
197
+ }
198
+ return fit;
199
+ }
200
+
117
201
  /**
118
202
  * Treat the host as a mobile device. Mobile clamps to OKAY at best
119
203
  * regardless of RAM because the OS background-task model breaks
@@ -127,19 +211,22 @@ function isMobile(probe: HardwareProbe): boolean {
127
211
 
128
212
  /**
129
213
  * Compute the CPU SIMD baseline. The hardware probe has no direct AVX2 field
130
- * today for x86_64, so Linux/Win x86_64 ≥ 4 cores qualifies. ARM must expose
131
- * NEON/Advanced SIMD in the probe; when ARM feature data is absent, do not
132
- * claim the CPU route.
214
+ * today for x86_64, so Linux/Win x86_64 ≥ 4 cores qualifies.
215
+ *
216
+ * **arm64 / ARMv8-A architecturally MANDATES NEON (Advanced SIMD)** — every arm64
217
+ * phone has it — so we trust the architecture rather than the probe's
218
+ * `cpuFeatures.neon` (the on-device os-fallback probe omits it, which used to
219
+ * misclassify every Pixel as POOR → cloud-only even though it runs local 2B fine).
220
+ * We do not support 32-bit ARM (ARMv7), so it (and any other non-x64 arch) is
221
+ * treated as unsupported.
133
222
  *
134
223
  * This is a coarse heuristic; the precise check belongs in the FFI layer
135
224
  * (it can `cpuid` the actual flags). The tier classifier just refuses POOR
136
225
  * when the probe is clearly under-equipped.
137
226
  */
138
227
  function hasAvx2Baseline(probe: HardwareProbe): boolean {
139
- if (probe.arch === "arm64" || probe.arch === "arm") {
140
- return probe.cpuFeatures?.neon === true && probe.cpuCores >= 4;
141
- }
142
- if (probe.arch !== "x64") return false;
228
+ if (probe.arch === "arm64") return probe.cpuCores >= 4;
229
+ if (probe.arch !== "x64") return false; // 32-bit ARM + others: unsupported
143
230
  return probe.cpuCores >= 4;
144
231
  }
145
232
 
@@ -167,7 +254,9 @@ function isAppleSilicon8gb(probe: HardwareProbe): boolean {
167
254
  export function classifyDeviceTier(probe: HardwareProbe): DeviceTierAssessment {
168
255
  const reasons: string[] = [];
169
256
  const effective = effectiveModelMemoryGb(probe);
170
- const mobile = isMobile(probe);
257
+ // isMobileHost (not isMobile) so a phone whose bun-agent probe reports
258
+ // platform:"linux" with no mobile field still gets mobile thresholds + clamp.
259
+ const mobile = isMobileHost(probe);
171
260
  const avx2 = hasAvx2Baseline(probe);
172
261
  const vramGb = probe.gpu?.totalVramGb ?? null;
173
262
  const cpuCores = probe.cpuCores;
@@ -230,6 +319,7 @@ export function classifyDeviceTier(probe: HardwareProbe): DeviceTierAssessment {
230
319
  canRunLocalLm,
231
320
  canRunLocalVoice,
232
321
  recommendedMode,
322
+ recommendedFit: selectBestEliza1FitForDevice(probe),
233
323
  numericContext: {
234
324
  totalRamGb,
235
325
  freeRamGb,
@@ -319,8 +409,10 @@ function classifyRawTier(args: ClassifyArgs): DeviceTier {
319
409
  return "GOOD";
320
410
  }
321
411
 
322
- // OKAY gate.
323
- const meetsOkayEffective = effective >= okay.effectiveModelMemoryGb;
412
+ // OKAY gate. Mobile uses lower effective/total floors — a phone runs 2B fine.
413
+ const meetsOkayEffective =
414
+ effective >=
415
+ (mobile ? okay.mobileEffectiveModelMemoryGb : okay.effectiveModelMemoryGb);
324
416
  const meetsOkayFree = freeRamGb >= okay.freeRamGbAtSession;
325
417
  const meetsOkayTotal =
326
418
  totalRamGb >= (mobile ? okay.mobileMinTotalRamGb : okay.minTotalRamGb);
@@ -7,8 +7,29 @@ import { readAssignments } from "./assignments";
7
7
  import { findCatalogModel } from "./catalog";
8
8
  import { Downloader } from "./downloader";
9
9
  import type { Eliza1DeviceCaps } from "./manifest";
10
- import { listInstalledModels } from "./registry";
11
- import type { DownloadJob } from "./types";
10
+ import { registryPath } from "./paths";
11
+ import type {
12
+ CatalogModel,
13
+ DownloadJob,
14
+ HardwareProbe,
15
+ InstalledModel,
16
+ } from "./types";
17
+
18
+ /** Minimal HardwareProbe with a controllable free-disk value for preflight tests. */
19
+ function fakeProbe(freeDiskGb: number): HardwareProbe {
20
+ return {
21
+ totalRamGb: 32,
22
+ freeRamGb: 16,
23
+ freeDiskGb,
24
+ gpu: null,
25
+ cpuCores: 8,
26
+ platform: "darwin",
27
+ arch: "arm64",
28
+ appleSilicon: true,
29
+ recommendedBucket: "mid",
30
+ source: "os-fallback",
31
+ };
32
+ }
12
33
 
13
34
  function eliza1Manifest(overrides: {
14
35
  ramBudgetMin?: number;
@@ -22,7 +43,6 @@ function eliza1Manifest(overrides: {
22
43
  const textPath = "text/eliza-1-2b-128k.gguf";
23
44
  const voicePath = "tts/voice.gguf";
24
45
  const asrPath = "asr/asr.gguf";
25
- const drafterPath = "mtp/drafter-2b.gguf";
26
46
  const cachePath = "cache/voice-preset-default.bin";
27
47
  const vadPath = "vad/eliza-1-vad.onnx";
28
48
  const visionPath = "vision/mmproj-2b.gguf";
@@ -43,10 +63,14 @@ function eliza1Manifest(overrides: {
43
63
  voice: { base: "eliza-1-voice", license: "test" },
44
64
  asr: { base: "eliza-1-asr", license: "test" },
45
65
  vad: { base: "eliza-1-vad", license: "test" },
46
- drafter: { base: "eliza-1-drafter", license: "test" },
47
66
  vision: { base: "eliza-1-vision", license: "test" },
48
67
  },
49
68
  defaultEligible: true,
69
+ // Downloader-mechanics fixture: MTP mode is incidental here, so this
70
+ // bundle is the legacy embedded-draft-head shape (no separate drafter
71
+ // GGUF to serve). The Gemma-4 separate-drafter contract is exercised in
72
+ // manifest.test.ts.
73
+ mtp: "embedded-draft-head",
50
74
  files: {
51
75
  text: [
52
76
  {
@@ -58,12 +82,7 @@ function eliza1Manifest(overrides: {
58
82
  voice: [{ path: voicePath, sha256: overrides.shaFor("voice") }],
59
83
  asr: [{ path: asrPath, sha256: overrides.shaFor("asr") }],
60
84
  vision: [{ path: visionPath, sha256: overrides.shaFor("vision") }],
61
- mtp: [
62
- {
63
- path: drafterPath,
64
- sha256: overrides.shaFor("drafter"),
65
- },
66
- ],
85
+ mtp: [],
67
86
  cache: [
68
87
  {
69
88
  path: cachePath,
@@ -167,6 +186,14 @@ function sha256(content: string): string {
167
186
  return createHash("sha256").update(content).digest("hex");
168
187
  }
169
188
 
189
+ function readOwnedRegistryModels(): InstalledModel[] {
190
+ if (!fs.existsSync(registryPath())) return [];
191
+ const parsed = JSON.parse(fs.readFileSync(registryPath(), "utf8")) as {
192
+ models?: InstalledModel[];
193
+ };
194
+ return parsed.models ?? [];
195
+ }
196
+
170
197
  function installFetchFixture(files: Map<string, string>): void {
171
198
  globalThis.fetch = vi.fn(async (url: string | URL | Request) => {
172
199
  const href =
@@ -243,7 +270,7 @@ describe("local inference downloader status", () => {
243
270
  expect(job?.error).toBe("network reset");
244
271
  });
245
272
 
246
- it("installs Eliza-1 manifest bundles with the bundled MTP drafter", async () => {
273
+ it("installs Eliza-1 manifest bundles with embedded-draft-head MTP metadata", async () => {
247
274
  const root = fs.mkdtempSync(path.join(os.tmpdir(), "eliza-download-test-"));
248
275
  process.env.ELIZA_STATE_DIR = root;
249
276
  const model = findCatalogModel("eliza-1-2b");
@@ -256,14 +283,12 @@ describe("local inference downloader status", () => {
256
283
  const voice = "GGUF voice model";
257
284
  const asr = "GGUF ASR model";
258
285
  const vad = "VAD model";
259
- const drafter = "GGUF drafter model";
260
286
  const cache = "voice preset";
261
287
  const vision = "vision projector";
262
288
  const textPath = "text/eliza-1-2b-128k.gguf";
263
289
  const voicePath = "tts/voice.gguf";
264
290
  const asrPath = "asr/asr.gguf";
265
291
  const vadPath = "vad/eliza-1-vad.onnx";
266
- const drafterPath = "mtp/drafter-2b.gguf";
267
292
  const cachePath = "cache/voice-preset-default.bin";
268
293
  const visionPath = "vision/mmproj-2b.gguf";
269
294
  const manifest = JSON.stringify({
@@ -276,10 +301,10 @@ describe("local inference downloader status", () => {
276
301
  voice: { base: "eliza-1-voice", license: "test" },
277
302
  asr: { base: "eliza-1-asr", license: "test" },
278
303
  vad: { base: "eliza-1-vad", license: "test" },
279
- drafter: { base: "eliza-1-drafter", license: "test" },
280
304
  vision: { base: "eliza-1-vision", license: "test" },
281
305
  },
282
306
  defaultEligible: true,
307
+ mtp: "embedded-draft-head",
283
308
  files: {
284
309
  text: [
285
310
  {
@@ -291,12 +316,7 @@ describe("local inference downloader status", () => {
291
316
  voice: [{ path: voicePath, sha256: sha256(voice) }],
292
317
  asr: [{ path: asrPath, sha256: sha256(asr) }],
293
318
  vision: [{ path: visionPath, sha256: sha256(vision) }],
294
- mtp: [
295
- {
296
- path: drafterPath,
297
- sha256: sha256(drafter),
298
- },
299
- ],
319
+ mtp: [],
300
320
  cache: [
301
321
  {
302
322
  path: cachePath,
@@ -354,7 +374,6 @@ describe("local inference downloader status", () => {
354
374
  [bundleRemotePath(model, voicePath), voice],
355
375
  [bundleRemotePath(model, asrPath), asr],
356
376
  [bundleRemotePath(model, vadPath), vad],
357
- [bundleRemotePath(model, drafterPath), drafter],
358
377
  [bundleRemotePath(model, cachePath), cache],
359
378
  [bundleRemotePath(model, visionPath), vision],
360
379
  ]),
@@ -366,7 +385,7 @@ describe("local inference downloader status", () => {
366
385
  const completed = waitForTerminal(downloader, model.id);
367
386
  await downloader.start(model);
368
387
  const job = await completed;
369
- const installed = await listInstalledModels();
388
+ const installed = readOwnedRegistryModels();
370
389
  const main = installed.find((entry) => entry.id === model.id);
371
390
  expect(main).toBeDefined();
372
391
  const bundleRoot = main?.bundleRoot;
@@ -389,7 +408,6 @@ describe("local inference downloader status", () => {
389
408
  expect(fs.existsSync(path.join(bundleRoot, asrPath))).toBe(true);
390
409
  expect(fs.existsSync(path.join(bundleRoot, vadPath))).toBe(true);
391
410
  expect(fs.existsSync(path.join(bundleRoot, visionPath))).toBe(true);
392
- expect(fs.existsSync(path.join(bundleRoot, drafterPath))).toBe(true);
393
411
  expect(installed.some((entry) => entry.id.endsWith("-drafter"))).toBe(
394
412
  false,
395
413
  );
@@ -406,7 +424,6 @@ describe("local inference downloader status", () => {
406
424
  const fetchSpy = installManifestOnlyFetch("tampered manifest");
407
425
  const pinnedModel = {
408
426
  ...model,
409
- id: "eliza-1-2b-manifest-hash-test",
410
427
  companionModelIds: [],
411
428
  bundleManifestSha256: sha256("expected manifest"),
412
429
  };
@@ -415,7 +432,7 @@ describe("local inference downloader status", () => {
415
432
  });
416
433
  const failed = new Promise<DownloadJob>((resolve) => {
417
434
  const unsub = downloader.subscribe((event) => {
418
- if (event.job.modelId === pinnedModel.id && event.type === "failed") {
435
+ if (event.job.modelId === model.id && event.type === "failed") {
419
436
  unsub();
420
437
  resolve(event.job);
421
438
  }
@@ -431,12 +448,12 @@ describe("local inference downloader status", () => {
431
448
  expect(fetchSpy).toHaveBeenCalledTimes(1);
432
449
  });
433
450
 
434
- it("restarts single-file partial downloads when a server ignores Range", async () => {
451
+ it("rejects custom CatalogModel specs before starting a download", async () => {
435
452
  const root = fs.mkdtempSync(path.join(os.tmpdir(), "eliza-download-test-"));
436
453
  process.env.ELIZA_STATE_DIR = root;
437
454
  const baseModel = findCatalogModel("eliza-1-2b");
438
455
  if (!baseModel) throw new Error("missing test catalog model");
439
- const model = {
456
+ const customSpec: CatalogModel = {
440
457
  ...baseModel,
441
458
  id: "hf:test/partial::model.gguf",
442
459
  displayName: "Partial Test Model",
@@ -447,28 +464,13 @@ describe("local inference downloader status", () => {
447
464
  runtimeRole: undefined,
448
465
  };
449
466
 
450
- const body = "complete model";
451
- installFetchFixture(
452
- new Map([[bundleRemotePath(model, model.ggufFile), body]]),
453
- );
454
-
455
- const downloadsDir = path.join(root, "local-inference", "downloads");
456
- fs.mkdirSync(downloadsDir, { recursive: true });
457
- fs.writeFileSync(
458
- path.join(downloadsDir, "hf_test_partial__model.gguf.part"),
459
- "stale partial",
460
- );
461
-
462
467
  const downloader = new Downloader();
463
- const completed = waitForTerminal(downloader, model.id);
464
- await downloader.start(model);
465
- await completed;
468
+ await expect(downloader.start(customSpec)).rejects.toThrow(
469
+ /Custom model downloads are disabled/i,
470
+ );
466
471
 
467
- const installed = await listInstalledModels();
468
- const entry = installed.find((m) => m.id === model.id);
469
- expect(entry).toBeDefined();
470
- if (!entry) throw new Error("missing installed model");
471
- expect(fs.readFileSync(entry.path, "utf8")).toBe(body);
472
+ expect(fs.existsSync(registryPath())).toBe(false);
473
+ expect(downloader.snapshot()).toEqual([]);
472
474
  });
473
475
 
474
476
  it("aborts before any weight byte when no verified backend overlaps the device", async () => {
@@ -492,7 +494,6 @@ describe("local inference downloader status", () => {
492
494
 
493
495
  const textPath = model.ggufFile;
494
496
  const voicePath = "tts/voice.gguf";
495
- const drafterPath = "mtp/drafter-27b-256k.gguf";
496
497
  const cachePath = "cache/voice-preset-default.bin";
497
498
  const visionPath = "vision/mmproj-27b-256k.gguf";
498
499
  const manifest = JSON.stringify({
@@ -503,7 +504,6 @@ describe("local inference downloader status", () => {
503
504
  lineage: {
504
505
  text: { base: "eliza-1-text", license: "test" },
505
506
  voice: { base: "eliza-1-voice", license: "test" },
506
- drafter: { base: "eliza-1-drafter", license: "test" },
507
507
  vision: { base: "eliza-1-vision", license: "test" },
508
508
  },
509
509
  defaultEligible: false,
@@ -518,7 +518,7 @@ describe("local inference downloader status", () => {
518
518
  voice: [{ path: voicePath, sha256: sha256("v") }],
519
519
  asr: [],
520
520
  vision: [{ path: visionPath, sha256: sha256("vision") }],
521
- mtp: [{ path: drafterPath, sha256: sha256("d") }],
521
+ mtp: [],
522
522
  cache: [{ path: cachePath, sha256: sha256("c") }],
523
523
  },
524
524
  kernels: {
@@ -565,7 +565,7 @@ describe("local inference downloader status", () => {
565
565
  ([u]) => remotePathOf(u) !== bundleRemotePath(model, manifestFile),
566
566
  );
567
567
  expect(weightFetches).toHaveLength(0);
568
- expect((await listInstalledModels()).some((m) => m.id === model.id)).toBe(
568
+ expect(readOwnedRegistryModels().some((m) => m.id === model.id)).toBe(
569
569
  false,
570
570
  );
571
571
  });
@@ -597,7 +597,7 @@ describe("local inference downloader status", () => {
597
597
  await downloader.start(model.id);
598
598
  const job = await failed;
599
599
  expect(job.error).toMatch(/needs at least 999999 MB RAM/);
600
- expect((await listInstalledModels()).some((m) => m.id === model.id)).toBe(
600
+ expect(readOwnedRegistryModels().some((m) => m.id === model.id)).toBe(
601
601
  false,
602
602
  );
603
603
  });
@@ -613,7 +613,6 @@ describe("local inference downloader status", () => {
613
613
  voice: "GGUF voice",
614
614
  asr: "GGUF asr",
615
615
  vad: "VAD onnx",
616
- drafter: "GGUF drafter",
617
616
  cache: "voice preset",
618
617
  vision: "vision projector",
619
618
  } as const;
@@ -627,7 +626,6 @@ describe("local inference downloader status", () => {
627
626
  [eliza1BundleRemotePath("tts/voice.gguf"), bytes.voice],
628
627
  [eliza1BundleRemotePath("asr/asr.gguf"), bytes.asr],
629
628
  [eliza1BundleRemotePath("vad/eliza-1-vad.onnx"), bytes.vad],
630
- [eliza1BundleRemotePath("mtp/drafter-2b.gguf"), bytes.drafter],
631
629
  [eliza1BundleRemotePath("cache/voice-preset-default.bin"), bytes.cache],
632
630
  [eliza1BundleRemotePath("vision/mmproj-2b.gguf"), bytes.vision],
633
631
  ]),
@@ -662,7 +660,7 @@ describe("local inference downloader status", () => {
662
660
  .normalize(verifyCalls[0]?.textGgufPath ?? "")
663
661
  .endsWith(path.normalize("text/eliza-1-2b-128k.gguf")),
664
662
  ).toBe(true);
665
- const installed = await listInstalledModels();
663
+ const installed = readOwnedRegistryModels();
666
664
  const main = installed.find((m) => m.id === model.id);
667
665
  expect(main?.bundleVerifiedAt).toBeTruthy();
668
666
  expect(verifyCalls[0]?.bundleRoot).toBe(main?.bundleRoot);
@@ -680,7 +678,6 @@ describe("local inference downloader status", () => {
680
678
  voice: "GGUF voice",
681
679
  asr: "GGUF asr",
682
680
  vad: "VAD onnx",
683
- drafter: "GGUF drafter",
684
681
  cache: "voice preset",
685
682
  vision: "vision projector",
686
683
  } as const;
@@ -694,7 +691,6 @@ describe("local inference downloader status", () => {
694
691
  [eliza1BundleRemotePath("tts/voice.gguf"), bytes.voice],
695
692
  [eliza1BundleRemotePath("asr/asr.gguf"), bytes.asr],
696
693
  [eliza1BundleRemotePath("vad/eliza-1-vad.onnx"), bytes.vad],
697
- [eliza1BundleRemotePath("mtp/drafter-2b.gguf"), bytes.drafter],
698
694
  [eliza1BundleRemotePath("cache/voice-preset-default.bin"), bytes.cache],
699
695
  [eliza1BundleRemotePath("vision/mmproj-2b.gguf"), bytes.vision],
700
696
  ]),
@@ -717,7 +713,7 @@ describe("local inference downloader status", () => {
717
713
  await downloader.start(model.id);
718
714
  const job = await failed;
719
715
  expect(job.error).toMatch(/barge-in cancel test failed/);
720
- expect((await listInstalledModels()).some((m) => m.id === model.id)).toBe(
716
+ expect(readOwnedRegistryModels().some((m) => m.id === model.id)).toBe(
721
717
  false,
722
718
  );
723
719
  });
@@ -744,4 +740,149 @@ describe("local inference downloader status", () => {
744
740
  ).toHaveLength(1);
745
741
  downloader.cancel(model.id);
746
742
  });
743
+
744
+ it("rejects a non-GGUF (HTML) body on the single-file path", async () => {
745
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), "eliza-download-test-"));
746
+ process.env.ELIZA_STATE_DIR = root;
747
+ const base = findCatalogModel("eliza-1-2b");
748
+ if (!base) throw new Error("missing test catalog model");
749
+ // Decorate a default-eligible id as a single-file (non-bundle) download so
750
+ // it routes through runJob's single-file path.
751
+ const singleFileSpec: CatalogModel = {
752
+ ...base,
753
+ hfRepo: "test/single-file",
754
+ ggufFile: "model.gguf",
755
+ sizeGb: 0.000001,
756
+ bundleManifestFile: undefined,
757
+ bundleManifestSha256: undefined,
758
+ companionModelIds: [],
759
+ runtimeRole: undefined,
760
+ };
761
+
762
+ // A gated repo can answer HTTP 200 with an HTML login page.
763
+ globalThis.fetch = vi.fn(
764
+ async () =>
765
+ new Response("<html><body>Sign in to HuggingFace</body></html>", {
766
+ status: 200,
767
+ headers: { "content-type": "text/html" },
768
+ }),
769
+ ) as unknown as typeof fetch;
770
+
771
+ const downloader = new Downloader({
772
+ probeDeviceCaps: async () => cpuOnlyCaps,
773
+ probeHardware: async () => fakeProbe(100),
774
+ });
775
+ const failed = new Promise<DownloadJob>((resolve) => {
776
+ const unsub = downloader.subscribe((event) => {
777
+ if (event.job.modelId === base.id && event.type === "failed") {
778
+ unsub();
779
+ resolve(event.job);
780
+ }
781
+ });
782
+ });
783
+
784
+ await downloader.start(singleFileSpec);
785
+ const job = await failed;
786
+
787
+ expect(job.error).toContain("not a valid GGUF");
788
+ // The HTML body must never be registered or left on disk as a model.
789
+ const finalPath = path.join(
790
+ root,
791
+ "local-inference",
792
+ "models",
793
+ "eliza-1-2b.gguf",
794
+ );
795
+ // (registry path lives elsewhere; the rejected file is removed regardless)
796
+ expect(fs.existsSync(finalPath)).toBe(false);
797
+ });
798
+
799
+ it("forwards the Eliza Cloud bearer on a single-file download when cloud-linked", async () => {
800
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), "eliza-download-test-"));
801
+ process.env.ELIZA_STATE_DIR = root;
802
+ // The product never holds a local HF token. When cloud-linked, all HF
803
+ // resolve traffic is routed through the cloud HF proxy and authenticated
804
+ // with the Eliza Cloud API key (the proxy attaches the cloud-side HF_TOKEN).
805
+ const savedKey = process.env.ELIZAOS_CLOUD_API_KEY;
806
+ process.env.ELIZAOS_CLOUD_API_KEY = "secret-token";
807
+
808
+ const base = findCatalogModel("eliza-1-2b");
809
+ if (!base) throw new Error("missing test catalog model");
810
+ const singleFileSpec: CatalogModel = {
811
+ ...base,
812
+ hfRepo: "test/single-file",
813
+ ggufFile: "model.gguf",
814
+ sizeGb: 0.000001,
815
+ bundleManifestFile: undefined,
816
+ bundleManifestSha256: undefined,
817
+ companionModelIds: [],
818
+ runtimeRole: undefined,
819
+ };
820
+
821
+ const ggufBody = Buffer.concat([Buffer.from("GGUF"), Buffer.alloc(60, 0)]);
822
+ let capturedAuth: string | undefined;
823
+ globalThis.fetch = vi.fn(
824
+ async (_url: string | URL | Request, init?: RequestInit) => {
825
+ const headers = (init?.headers ?? {}) as Record<string, string>;
826
+ capturedAuth = headers.authorization;
827
+ return new Response(ggufBody, {
828
+ status: 200,
829
+ headers: { "content-length": String(ggufBody.length) },
830
+ });
831
+ },
832
+ ) as unknown as typeof fetch;
833
+
834
+ const downloader = new Downloader({
835
+ probeDeviceCaps: async () => cpuOnlyCaps,
836
+ probeHardware: async () => fakeProbe(100),
837
+ });
838
+ const completed = new Promise<DownloadJob>((resolve) => {
839
+ const unsub = downloader.subscribe((event) => {
840
+ if (event.job.modelId === base.id && event.type === "completed") {
841
+ unsub();
842
+ resolve(event.job);
843
+ }
844
+ });
845
+ });
846
+
847
+ try {
848
+ await downloader.start(singleFileSpec);
849
+ await completed;
850
+ expect(capturedAuth).toBe("Bearer secret-token");
851
+ } finally {
852
+ if (savedKey === undefined) delete process.env.ELIZAOS_CLOUD_API_KEY;
853
+ else process.env.ELIZAOS_CLOUD_API_KEY = savedKey;
854
+ }
855
+ });
856
+
857
+ it("blocks a download that does not fit on the models volume", async () => {
858
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), "eliza-download-test-"));
859
+ process.env.ELIZA_STATE_DIR = root;
860
+ const model = findCatalogModel("eliza-1-2b");
861
+ if (!model) throw new Error("missing test catalog model");
862
+
863
+ // Fetch must never be called: the preflight fails before any byte.
864
+ const fetchSpy = vi.fn(async () => {
865
+ throw new Error("network must not be touched when disk is full");
866
+ });
867
+ globalThis.fetch = fetchSpy as unknown as typeof fetch;
868
+
869
+ const downloader = new Downloader({
870
+ probeDeviceCaps: async () => cpuOnlyCaps,
871
+ probeHardware: async () => fakeProbe(0.05),
872
+ });
873
+ const failed = new Promise<DownloadJob>((resolve) => {
874
+ const unsub = downloader.subscribe((event) => {
875
+ if (event.job.modelId === model.id && event.type === "failed") {
876
+ unsub();
877
+ resolve(event.job);
878
+ }
879
+ });
880
+ });
881
+
882
+ await downloader.start(model.id);
883
+ const job = await failed;
884
+
885
+ expect(job.error).toContain("Not enough disk space");
886
+ expect(fetchSpy).not.toHaveBeenCalled();
887
+ });
747
888
  });