@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
@@ -2,11 +2,21 @@ import { type AgentRuntime, ModelType } from "@elizaos/core";
2
2
  import { beforeEach, describe, expect, it, vi } from "vitest";
3
3
 
4
4
  const modeState = vi.hoisted(() => ({ mode: "local" }));
5
+ const assignmentsState = vi.hoisted(() => ({
6
+ assignments: {} as Record<string, string>,
7
+ }));
8
+ const registryState = vi.hoisted(() => ({
9
+ installed: [] as Array<{ id: string; path: string }>,
10
+ }));
11
+ const hardwareState = vi.hoisted(() => ({
12
+ probe: { memory: { totalGb: 8 } },
13
+ }));
5
14
  const engineState = vi.hoisted(() => ({
6
15
  activeBackendId: vi.fn(() => "llama-server"),
7
16
  available: vi.fn(async () => true),
8
17
  conversation: vi.fn(() => null),
9
18
  currentModelPath: vi.fn(() => null),
19
+ ensureActiveBundleAsrReady: vi.fn(async () => undefined),
10
20
  ensureActiveBundleVoiceReady: vi.fn(async () => undefined),
11
21
  generate: vi.fn(async () => "ok"),
12
22
  generateInConversation: vi.fn(async () => ({
@@ -42,7 +52,7 @@ vi.mock("../services/active-model", () => ({
42
52
 
43
53
  vi.mock("../services/assignments", () => ({
44
54
  autoAssignAtBoot: vi.fn(async () => null),
45
- readEffectiveAssignments: vi.fn(async () => ({})),
55
+ readEffectiveAssignments: vi.fn(async () => assignmentsState.assignments),
46
56
  }));
47
57
 
48
58
  vi.mock("../services/cache-bridge", () => ({
@@ -71,12 +81,16 @@ vi.mock("../services/handler-registry", () => ({
71
81
  },
72
82
  }));
73
83
 
84
+ vi.mock("../services/hardware", () => ({
85
+ probeHardware: vi.fn(async () => hardwareState.probe),
86
+ }));
87
+
74
88
  vi.mock("../services/memory-arbiter", () => ({
75
89
  tryGetMemoryArbiter: vi.fn(() => arbiterState),
76
90
  }));
77
91
 
78
92
  vi.mock("../services/registry", () => ({
79
- listInstalledModels: vi.fn(async () => []),
93
+ listInstalledModels: vi.fn(async () => registryState.installed),
80
94
  }));
81
95
 
82
96
  vi.mock("../services/router-handler", () => ({
@@ -90,6 +104,8 @@ vi.mock("../services/voice", () => ({
90
104
  })),
91
105
  }));
92
106
 
107
+ import { resolveLocalInferenceLoadArgs } from "../services/active-model";
108
+ import { probeHardware } from "../services/hardware";
93
109
  import { installRouterHandler } from "../services/router-handler";
94
110
  import { VoiceStartupError } from "../services/voice/errors";
95
111
  import { ensureLocalInferenceHandler } from "./ensure-local-inference-handler";
@@ -151,6 +167,9 @@ function findRegisteredHandler(
151
167
  beforeEach(() => {
152
168
  vi.clearAllMocks();
153
169
  modeState.mode = "local";
170
+ assignmentsState.assignments = {};
171
+ registryState.installed = [];
172
+ hardwareState.probe = { memory: { totalGb: 8 } };
154
173
  delete process.env.ELIZA_LOCAL_LLAMA;
155
174
  delete process.env.ELIZA_DEVICE_BRIDGE_ENABLED;
156
175
  delete process.env.ELIZA_DISABLE_LOCAL_EMBEDDINGS;
@@ -164,6 +183,9 @@ beforeEach(() => {
164
183
  title: "A small image",
165
184
  description: "A tiny synthetic image.",
166
185
  });
186
+ vi.mocked(resolveLocalInferenceLoadArgs).mockImplementation(
187
+ async (target) => target,
188
+ );
167
189
  });
168
190
 
169
191
  describe("ensureLocalInferenceHandler", () => {
@@ -297,6 +319,88 @@ describe("ensureLocalInferenceHandler", () => {
297
319
  );
298
320
  });
299
321
 
322
+ it("uses a fine-grained maxTokensPerStep for user-visible streaming, coarse for internal calls", async () => {
323
+ const prior = process.env.ELIZA_LOCAL_STREAM_TOKENS_PER_STEP;
324
+ delete process.env.ELIZA_LOCAL_STREAM_TOKENS_PER_STEP;
325
+ try {
326
+ const { registrations, runtime } = makeRuntime();
327
+ engineState.hasLoadedModel.mockReturnValue(true);
328
+
329
+ await ensureLocalInferenceHandler(runtime);
330
+ const handler = findRegisteredHandler(
331
+ registrations,
332
+ ModelType.TEXT_LARGE,
333
+ );
334
+
335
+ // Streaming reply (onStreamChunk wired) → tuned fine-grained step (8).
336
+ await handler(runtime, {
337
+ prompt: "hi",
338
+ stream: true,
339
+ onStreamChunk: () => {},
340
+ });
341
+ expect(engineState.generate).toHaveBeenLastCalledWith(
342
+ expect.objectContaining({ maxTokensPerStep: 8 }),
343
+ );
344
+
345
+ // Internal / non-streamed call → no override (runner keeps coarse 32).
346
+ await handler(runtime, { prompt: "hi" });
347
+ expect(engineState.generate).toHaveBeenLastCalledWith(
348
+ expect.objectContaining({ maxTokensPerStep: undefined }),
349
+ );
350
+
351
+ // The shared env knob overrides the tuned streaming default.
352
+ process.env.ELIZA_LOCAL_STREAM_TOKENS_PER_STEP = "4";
353
+ await handler(runtime, {
354
+ prompt: "hi",
355
+ stream: true,
356
+ onStreamChunk: () => {},
357
+ });
358
+ expect(engineState.generate).toHaveBeenLastCalledWith(
359
+ expect.objectContaining({ maxTokensPerStep: 4 }),
360
+ );
361
+ } finally {
362
+ if (prior === undefined) {
363
+ delete process.env.ELIZA_LOCAL_STREAM_TOKENS_PER_STEP;
364
+ } else {
365
+ process.env.ELIZA_LOCAL_STREAM_TOKENS_PER_STEP = prior;
366
+ }
367
+ }
368
+ });
369
+
370
+ it("passes hardware-aware load args through desktop lazy assignment loads", async () => {
371
+ const installed = {
372
+ id: "eliza-1-2b",
373
+ path: "/models/eliza-1-2b.gguf",
374
+ };
375
+ const resolved = {
376
+ ...installed,
377
+ modelPath: installed.path,
378
+ contextSize: 32_768,
379
+ };
380
+ assignmentsState.assignments = { TEXT_SMALL: installed.id };
381
+ registryState.installed = [installed];
382
+ engineState.hasLoadedModel.mockReturnValue(true);
383
+ vi.mocked(resolveLocalInferenceLoadArgs).mockResolvedValueOnce(
384
+ resolved as never,
385
+ );
386
+ const { registrations, runtime } = makeRuntime();
387
+
388
+ await ensureLocalInferenceHandler(runtime);
389
+ const handler = findRegisteredHandler(registrations, ModelType.TEXT_SMALL);
390
+
391
+ await handler(runtime, {
392
+ messages: [{ role: "user", content: "hello" }],
393
+ });
394
+
395
+ expect(probeHardware).toHaveBeenCalledTimes(1);
396
+ expect(resolveLocalInferenceLoadArgs).toHaveBeenCalledWith(
397
+ installed,
398
+ undefined,
399
+ { hardware: hardwareState.probe },
400
+ );
401
+ expect(engineState.load).toHaveBeenCalledWith(installed.path, resolved);
402
+ });
403
+
300
404
  it.each([
301
405
  [ModelType.TEXT_SMALL, "TEXT_SMALL"],
302
406
  [ModelType.TEXT_LARGE, "TEXT_LARGE"],
@@ -348,6 +452,8 @@ describe("ensureLocalInferenceHandler", () => {
348
452
 
349
453
  it("routes image description through the Eliza-1 vision arbiter", async () => {
350
454
  const { registrations, runtime } = makeRuntime();
455
+ const signal = new AbortController().signal;
456
+ const onStreamChunk = vi.fn();
351
457
 
352
458
  await ensureLocalInferenceHandler(runtime);
353
459
  const registration = registrations.find(
@@ -365,24 +471,65 @@ describe("ensureLocalInferenceHandler", () => {
365
471
  handler?.(runtime, {
366
472
  imageUrl: "data:image/png;base64,AAAA",
367
473
  prompt: "describe this",
474
+ stream: true,
475
+ signal,
476
+ onStreamChunk,
368
477
  }),
369
478
  ).resolves.toEqual({
370
479
  title: "A small image",
371
480
  description: "A tiny synthetic image.",
372
481
  });
373
482
  expect(arbiterState.requestVisionDescribe).toHaveBeenCalledWith({
374
- modelKey: "qwen3-vl",
483
+ modelKey: "gemma-vl",
375
484
  payload: {
376
485
  image: { kind: "dataUrl", dataUrl: "data:image/png;base64,AAAA" },
377
486
  prompt: "describe this",
487
+ signal,
488
+ onTextChunk: expect.any(Function),
378
489
  },
379
490
  });
491
+ const payload = arbiterState.requestVisionDescribe.mock.calls[0]?.[0]
492
+ ?.payload as { onTextChunk?: (chunk: string) => void | Promise<void> };
493
+ await payload.onTextChunk?.("token");
494
+ expect(onStreamChunk).toHaveBeenCalledWith("token");
380
495
  expect(runtime.setSetting).toHaveBeenCalledWith(
381
496
  "ELIZA1_VISION_HANDLER_PRESENT",
382
497
  "1",
383
498
  );
384
499
  });
385
500
 
501
+ it("keeps image description buffered unless stream is explicitly true", async () => {
502
+ const { registrations, runtime } = makeRuntime();
503
+ const onStreamChunk = vi.fn();
504
+
505
+ await ensureLocalInferenceHandler(runtime);
506
+ const registration = registrations.find(
507
+ (entry) => entry.modelType === ModelType.IMAGE_DESCRIPTION,
508
+ );
509
+ const handler = registration?.handler as
510
+ | ((
511
+ runtime: AgentRuntime,
512
+ params: Record<string, unknown>,
513
+ ) => Promise<{ title: string; description: string }>)
514
+ | undefined;
515
+ expect(handler).toBeDefined();
516
+
517
+ await handler?.(runtime, {
518
+ imageUrl: "https://example.test/image.png",
519
+ prompt: "describe this",
520
+ onStreamChunk,
521
+ });
522
+
523
+ expect(arbiterState.requestVisionDescribe).toHaveBeenCalledWith({
524
+ modelKey: "gemma-vl",
525
+ payload: {
526
+ image: { kind: "url", url: "https://example.test/image.png" },
527
+ prompt: "describe this",
528
+ },
529
+ });
530
+ expect(onStreamChunk).not.toHaveBeenCalled();
531
+ });
532
+
386
533
  it("arms the active voice bundle before TRANSCRIPTION", async () => {
387
534
  const { registrations, runtime } = makeRuntime();
388
535
 
@@ -402,10 +549,12 @@ describe("ensureLocalInferenceHandler", () => {
402
549
  handler?.(runtime, { audio: new Uint8Array([82, 73, 70, 70]) }),
403
550
  ).resolves.toBe("transcribed");
404
551
 
405
- expect(engineState.ensureActiveBundleVoiceReady).toHaveBeenCalledTimes(1);
552
+ expect(engineState.ensureActiveBundleAsrReady).toHaveBeenCalledTimes(1);
553
+ expect(engineState.ensureActiveBundleVoiceReady).not.toHaveBeenCalled();
406
554
  expect(engineState.transcribePcm).toHaveBeenCalledWith(
407
555
  { pcm: new Float32Array([0]), sampleRate: 16_000 },
408
556
  undefined,
557
+ undefined,
409
558
  );
410
559
  });
411
560
 
@@ -413,7 +562,7 @@ describe("ensureLocalInferenceHandler", () => {
413
562
  // The fused libelizainference ASR runtime is the sole on-device
414
563
  // transcriber. A startup failure must propagate (AGENTS.md §3) — there is
415
564
  // no whisper.cpp second attempt and no silent empty transcript.
416
- engineState.ensureActiveBundleVoiceReady.mockRejectedValueOnce(
565
+ engineState.ensureActiveBundleAsrReady.mockRejectedValueOnce(
417
566
  new VoiceStartupError("missing-bundle-root", "no bundle"),
418
567
  );
419
568
  const { registrations, runtime } = makeRuntime();
@@ -434,6 +583,7 @@ describe("ensureLocalInferenceHandler", () => {
434
583
  handler?.(runtime, { audio: new Uint8Array([82, 73, 70, 70]) }),
435
584
  ).rejects.toThrow(VoiceStartupError);
436
585
 
586
+ expect(engineState.ensureActiveBundleAsrReady).toHaveBeenCalledTimes(1);
437
587
  expect(engineState.transcribePcm).not.toHaveBeenCalled();
438
588
  });
439
589
 
@@ -504,6 +654,54 @@ describe("ensureLocalInferenceHandler", () => {
504
654
  expect(received.length).toBeGreaterThan(1);
505
655
  });
506
656
 
657
+ it("wires onTextChunk for a plain (non-structured) stream request", async () => {
658
+ // The chat path can ask for token streaming via `stream: true` without a
659
+ // response skeleton. The handler must still bridge onStreamChunk →
660
+ // onTextChunk so cloud-parity token streaming works for the local model.
661
+ const { registrations, runtime } = makeRuntime();
662
+ engineState.hasLoadedModel.mockReturnValue(true);
663
+
664
+ await ensureLocalInferenceHandler(runtime);
665
+ const handler = findRegisteredHandler(
666
+ registrations,
667
+ ModelType.RESPONSE_HANDLER,
668
+ );
669
+
670
+ await handler(runtime, {
671
+ messages: [{ role: "user", content: "hello" }],
672
+ stream: true,
673
+ onStreamChunk: vi.fn(),
674
+ });
675
+
676
+ expect(engineState.generate).toHaveBeenCalledWith(
677
+ expect.objectContaining({ onTextChunk: expect.any(Function) }),
678
+ );
679
+ });
680
+
681
+ it("does not wire onTextChunk for a non-streaming request", async () => {
682
+ // Non-streaming callers must not pay the per-chunk callback overhead:
683
+ // engineGenerateArgsFromParams only bridges the callback when the caller
684
+ // asked for streaming (`stream` or `streamStructured`).
685
+ const { registrations, runtime } = makeRuntime();
686
+ engineState.hasLoadedModel.mockReturnValue(true);
687
+
688
+ await ensureLocalInferenceHandler(runtime);
689
+ const handler = findRegisteredHandler(
690
+ registrations,
691
+ ModelType.RESPONSE_HANDLER,
692
+ );
693
+
694
+ await handler(runtime, {
695
+ messages: [{ role: "user", content: "hello" }],
696
+ onStreamChunk: vi.fn(),
697
+ });
698
+
699
+ const args = engineState.generate.mock.calls.at(-1)?.[0] as {
700
+ onTextChunk?: unknown;
701
+ };
702
+ expect(args.onTextChunk).toBeUndefined();
703
+ });
704
+
507
705
  it("threads eliza thinking provider options into local engine args", async () => {
508
706
  const { registrations, runtime } = makeRuntime();
509
707
  engineState.hasLoadedModel.mockReturnValue(true);
@@ -57,6 +57,7 @@ import {
57
57
  import { deviceBridge } from "../services/device-bridge";
58
58
  import { localInferenceEngine } from "../services/engine";
59
59
  import { handlerRegistry } from "../services/handler-registry";
60
+ import { probeHardware } from "../services/hardware";
60
61
  import { tryGetMemoryArbiter } from "../services/memory-arbiter";
61
62
  import { listInstalledModels } from "../services/registry";
62
63
  import { installRouterHandler } from "../services/router-handler";
@@ -270,10 +271,18 @@ async function ensureAssignedModelLoaded(
270
271
  }
271
272
 
272
273
  if (loader) {
274
+ const hardware = await probeHardware();
275
+ const resolved = await resolveLocalInferenceLoadArgs(target, undefined, {
276
+ hardware,
277
+ });
273
278
  await loader.unloadModel();
274
- await loader.loadModel(await resolveLocalInferenceLoadArgs(target));
279
+ await loader.loadModel(resolved);
275
280
  } else {
276
- await localInferenceEngine.load(target.path);
281
+ const hardware = await probeHardware();
282
+ const resolved = await resolveLocalInferenceLoadArgs(target, undefined, {
283
+ hardware,
284
+ });
285
+ await localInferenceEngine.load(target.path, resolved);
277
286
  }
278
287
  }
279
288
 
@@ -337,6 +346,26 @@ function extractThinkingControl(
337
346
  * honours them (the forced-span / prefill / grammar / prefill-plan path is
338
347
  * local-model-only).
339
348
  */
349
+ /**
350
+ * Per-step token cap for USER-VISIBLE local streaming (chat replies).
351
+ *
352
+ * Benchmarked on the fused eliza-1 model (#9174): the per-`llmStreamNext` step
353
+ * carries a large fixed FFI overhead, so the throughput↔smoothness curve has a
354
+ * knee around 8 — `8` yields ~10 UI updates per 80 tokens (clearly streaming)
355
+ * at a modest decode-throughput cost, whereas 1–4 fall off a throughput cliff
356
+ * and 16–32 look jumpy. Internal / planner / voice calls do NOT set this and
357
+ * keep the coarse, throughput-tuned runner default (32). Overridable via the
358
+ * shared `ELIZA_LOCAL_STREAM_TOKENS_PER_STEP` env knob; the runner clamps it.
359
+ */
360
+ const DEFAULT_CHAT_STREAM_TOKENS_PER_STEP = 8;
361
+ function resolveChatStreamTokensPerStep(): number {
362
+ const raw = process.env.ELIZA_LOCAL_STREAM_TOKENS_PER_STEP?.trim();
363
+ const parsed = raw ? Number.parseInt(raw, 10) : Number.NaN;
364
+ return Number.isFinite(parsed) && parsed > 0
365
+ ? parsed
366
+ : DEFAULT_CHAT_STREAM_TOKENS_PER_STEP;
367
+ }
368
+
340
369
  function engineGenerateArgsFromParams(
341
370
  params: GenerateTextParams,
342
371
  cacheKey: string | undefined,
@@ -356,6 +385,7 @@ function engineGenerateArgsFromParams(
356
385
  spanSamplerPlan?: GenerateTextParams["spanSamplerPlan"];
357
386
  thinking?: "auto" | "on" | "off";
358
387
  onTextChunk?: (chunk: string) => void | Promise<void>;
388
+ maxTokensPerStep?: number;
359
389
  voiceOutput?: "user-visible" | "internal";
360
390
  } {
361
391
  const renderContent = (content: unknown): string => {
@@ -419,6 +449,13 @@ function engineGenerateArgsFromParams(
419
449
  spanSamplerPlan: params.spanSamplerPlan,
420
450
  thinking: extractThinkingControl(params.providerOptions),
421
451
  onTextChunk,
452
+ // Stream user-visible replies in fine-grained steps so the dashboard
453
+ // renders token-by-token instead of in ~32-token jumps. Only when
454
+ // streaming (onTextChunk set) — internal/planner calls keep the coarse,
455
+ // throughput-tuned default. See resolveChatStreamTokensPerStep (#9174).
456
+ maxTokensPerStep: onTextChunk
457
+ ? resolveChatStreamTokensPerStep()
458
+ : undefined,
422
459
  voiceOutput:
423
460
  params.voiceOutput ??
424
461
  (typeof params.onStreamChunk === "function" ? "user-visible" : undefined),
@@ -847,9 +884,32 @@ function makeTranscriptionHandler(): TranscriptionHandler {
847
884
  // The fused libelizainference ASR runtime is the sole on-device
848
885
  // transcriber. A startup/availability failure propagates (AGENTS.md §3) —
849
886
  // there is no whisper.cpp second attempt and no silent empty transcript.
850
- await localInferenceEngine.ensureActiveBundleVoiceReady();
887
+ await localInferenceEngine.ensureActiveBundleAsrReady();
851
888
  throwIfAborted(signal);
852
- const transcript = await localInferenceEngine.transcribePcm(audio, signal);
889
+ // Stream partial transcripts through the same pipe as chat text when the
890
+ // runtime wired a chunk sink (useModel injects onStreamChunk into local
891
+ // model params inside a streaming reply turn). The fused streaming-ASR
892
+ // session surfaces each running partial; we forward the deltas. Read the
893
+ // sink structurally so this stays robust to the core param type surface.
894
+ const streamSink =
895
+ params && typeof params === "object"
896
+ ? (
897
+ params as {
898
+ onStreamChunk?: (chunk: string) => void | Promise<void>;
899
+ }
900
+ ).onStreamChunk
901
+ : undefined;
902
+ const onPartial =
903
+ typeof streamSink === "function"
904
+ ? (delta: string) => {
905
+ void streamSink(delta);
906
+ }
907
+ : undefined;
908
+ const transcript = await localInferenceEngine.transcribePcm(
909
+ audio,
910
+ signal,
911
+ onPartial,
912
+ );
853
913
  throwIfAborted(signal);
854
914
  return transcript;
855
915
  };
@@ -858,6 +918,8 @@ function makeTranscriptionHandler(): TranscriptionHandler {
858
918
  function paramsToVisionRequest(params: ImageDescriptionParams | string): {
859
919
  image: { kind: "dataUrl"; dataUrl: string } | { kind: "url"; url: string };
860
920
  prompt?: string;
921
+ signal?: AbortSignal;
922
+ onTextChunk?: (chunk: string) => void | Promise<void>;
861
923
  } {
862
924
  const url = typeof params === "string" ? params : params.imageUrl;
863
925
  if (typeof url !== "string" || url.length === 0) {
@@ -866,10 +928,36 @@ function paramsToVisionRequest(params: ImageDescriptionParams | string): {
866
928
  );
867
929
  }
868
930
  const prompt = typeof params === "object" ? params.prompt : undefined;
931
+ const signal =
932
+ typeof params === "object"
933
+ ? (params as { signal?: AbortSignal }).signal
934
+ : undefined;
935
+ const wantsStream =
936
+ typeof params === "object" &&
937
+ (params as { stream?: boolean }).stream === true;
938
+ const streamSink =
939
+ wantsStream && typeof params === "object"
940
+ ? (params as { onStreamChunk?: (chunk: string) => void | Promise<void> })
941
+ .onStreamChunk
942
+ : undefined;
943
+ const onTextChunk =
944
+ typeof streamSink === "function"
945
+ ? (chunk: string) => streamSink(chunk)
946
+ : undefined;
869
947
  if (url.startsWith("data:")) {
870
- return { image: { kind: "dataUrl", dataUrl: url }, prompt };
948
+ return {
949
+ image: { kind: "dataUrl", dataUrl: url },
950
+ prompt,
951
+ ...(signal ? { signal } : {}),
952
+ ...(onTextChunk ? { onTextChunk } : {}),
953
+ };
871
954
  }
872
- return { image: { kind: "url", url }, prompt };
955
+ return {
956
+ image: { kind: "url", url },
957
+ prompt,
958
+ ...(signal ? { signal } : {}),
959
+ ...(onTextChunk ? { onTextChunk } : {}),
960
+ };
873
961
  }
874
962
 
875
963
  function normalizeImageDescription(
@@ -948,7 +1036,7 @@ function makeImageDescriptionHandler(): ImageDescriptionHandler {
948
1036
  const modelKey =
949
1037
  typeof modelKeyCandidate === "string" && modelKeyCandidate
950
1038
  ? modelKeyCandidate
951
- : "qwen3-vl";
1039
+ : "gemma-vl";
952
1040
  const request = paramsToVisionRequest(params);
953
1041
  const result = await arbiter.requestVisionDescribe<
954
1042
  typeof request,
@@ -958,6 +1046,102 @@ function makeImageDescriptionHandler(): ImageDescriptionHandler {
958
1046
  };
959
1047
  }
960
1048
 
1049
+ // ── Bionic-host TRANSCRIPTION / IMAGE_DESCRIPTION (Android GPU delegation) ──
1050
+ //
1051
+ // On the bionic-delegated path the musl agent can't load the fused
1052
+ // libelizainference, so the engine-driven transcriber / memory-arbiter vision
1053
+ // paths above can't run here. Instead the audio / image bytes are forwarded to
1054
+ // the in-process bionic host over the UDS (op="asr" / op="image"), which runs
1055
+ // the fused Gemma ASR + mmproj vision path on the Mali GPU and returns text.
1056
+ // This is the same delegation `BionicHostLoader` already does for text
1057
+ // generation.
1058
+
1059
+ /** The bionic-host loader when registered (exposes transcribe + describeImage). */
1060
+ function getBionicHostLoader(runtime: IAgentRuntime): BionicHostLoader | null {
1061
+ const svc = (
1062
+ runtime as { getService?: (name: string) => unknown }
1063
+ ).getService?.("localInferenceLoader");
1064
+ if (
1065
+ svc &&
1066
+ typeof (svc as BionicHostLoader).transcribe === "function" &&
1067
+ typeof (svc as BionicHostLoader).describeImage === "function"
1068
+ ) {
1069
+ return svc as BionicHostLoader;
1070
+ }
1071
+ return null;
1072
+ }
1073
+
1074
+ /** Pack a mono fp32 PCM buffer little-endian and base64-encode it for the UDS frame. */
1075
+ export function float32ToBase64LE(pcm: Float32Array): string {
1076
+ const buf = Buffer.allocUnsafe(pcm.length * 4);
1077
+ for (let i = 0; i < pcm.length; i++) {
1078
+ buf.writeFloatLE(pcm[i] ?? 0, i * 4);
1079
+ }
1080
+ return buf.toString("base64");
1081
+ }
1082
+
1083
+ /** Resolve a vision request to base64 image bytes for the bionic host. */
1084
+ export async function imageRequestToBase64(image: {
1085
+ kind: "dataUrl" | "url";
1086
+ dataUrl?: string;
1087
+ url?: string;
1088
+ }): Promise<string> {
1089
+ if (image.kind === "dataUrl" && image.dataUrl) {
1090
+ const comma = image.dataUrl.indexOf(",");
1091
+ return comma >= 0 ? image.dataUrl.slice(comma + 1) : image.dataUrl;
1092
+ }
1093
+ if (image.kind === "url" && image.url) {
1094
+ const resp = await fetch(image.url);
1095
+ if (!resp.ok) {
1096
+ throw new Error(
1097
+ `[local-inference] IMAGE_DESCRIPTION failed to fetch ${image.url}: ${resp.status}`,
1098
+ );
1099
+ }
1100
+ return Buffer.from(await resp.arrayBuffer()).toString("base64");
1101
+ }
1102
+ throw new Error(
1103
+ "[local-inference] IMAGE_DESCRIPTION could not resolve image bytes",
1104
+ );
1105
+ }
1106
+
1107
+ function makeBionicTranscriptionHandler(): TranscriptionHandler {
1108
+ return async (runtime, params) => {
1109
+ const signal = extractTranscriptionSignal(params);
1110
+ throwIfAborted(signal);
1111
+ const loader = getBionicHostLoader(runtime);
1112
+ if (!loader) {
1113
+ throw new Error(
1114
+ "[local-inference] bionic-host TRANSCRIPTION requires the bionic-host loader (localInferenceLoader service)",
1115
+ );
1116
+ }
1117
+ const audio = extractTranscriptionAudio(params);
1118
+ throwIfAborted(signal);
1119
+ const transcript = await loader.transcribe({
1120
+ pcmBase64: float32ToBase64LE(audio.pcm),
1121
+ sampleRate: audio.sampleRate,
1122
+ });
1123
+ throwIfAborted(signal);
1124
+ return transcript;
1125
+ };
1126
+ }
1127
+
1128
+ function makeBionicImageDescriptionHandler(): ImageDescriptionHandler {
1129
+ return async (runtime, params) => {
1130
+ const loader = getBionicHostLoader(runtime);
1131
+ if (!loader) {
1132
+ throw new Error(
1133
+ "[local-inference] bionic-host IMAGE_DESCRIPTION requires the bionic-host loader (localInferenceLoader service)",
1134
+ );
1135
+ }
1136
+ const request = paramsToVisionRequest(params);
1137
+ const description = await loader.describeImage({
1138
+ imageBase64: await imageRequestToBase64(request.image),
1139
+ prompt: request.prompt,
1140
+ });
1141
+ return normalizeImageDescription(description);
1142
+ };
1143
+ }
1144
+
961
1145
  /**
962
1146
  * Register the device-bridge loader on the runtime. Accepts load/generate
963
1147
  * calls whether or not a mobile device is currently connected — parked
@@ -1395,25 +1579,33 @@ export async function ensureLocalInferenceHandler(
1395
1579
  // priority (0). It is the last-resort handler: any cloud / other-plugin
1396
1580
  // TRANSCRIPTION handler registers above 0 and wins. When the handler
1397
1581
  // does run, it drives the fused libelizainference ASR runtime — the sole
1398
- // on-device transcriber (Qwen3-ASR streaming → fused batch interim →
1582
+ // on-device transcriber (Gemma ASR streaming → fused batch interim →
1399
1583
  // AsrUnavailableError) via the engine's armed voice bridge — see
1400
1584
  // makeTranscriptionHandler / EngineVoiceBridge.createStreamingTranscriber.
1401
1585
  // (The old ELIZA_LOCAL_TRANSCRIPTION env gate is removed — voice is a
1402
1586
  // first-class Eliza-1 surface, not opt-in.)
1587
+ // On the bionic-delegated path the fused lib lives in the app process, not
1588
+ // this musl agent — so transcription + vision must forward audio/image
1589
+ // bytes to the bionic host (op="asr" / op="image") rather than the
1590
+ // in-process engine / memory-arbiter, which can't load the lib here.
1403
1591
  runtimeWithRegistration.registerModel(
1404
1592
  ModelType.TRANSCRIPTION,
1405
- makeTranscriptionHandler(),
1593
+ bionicHostRegistered
1594
+ ? makeBionicTranscriptionHandler()
1595
+ : makeTranscriptionHandler(),
1406
1596
  provider,
1407
1597
  LOCAL_INFERENCE_PRIORITY,
1408
1598
  );
1409
1599
  runtimeWithRegistration.registerModel(
1410
1600
  ModelType.IMAGE_DESCRIPTION,
1411
- makeImageDescriptionHandler(),
1601
+ bionicHostRegistered
1602
+ ? makeBionicImageDescriptionHandler()
1603
+ : makeImageDescriptionHandler(),
1412
1604
  provider,
1413
1605
  LOCAL_INFERENCE_PRIORITY,
1414
1606
  );
1415
1607
  logger.info(
1416
- `[local-inference] Registered ${provider} voice and vision handlers for TEXT_TO_SPEECH / TRANSCRIPTION / IMAGE_DESCRIPTION at priority ${LOCAL_INFERENCE_PRIORITY}`,
1608
+ `[local-inference] Registered ${provider} voice and vision handlers for TEXT_TO_SPEECH / TRANSCRIPTION / IMAGE_DESCRIPTION at priority ${LOCAL_INFERENCE_PRIORITY}${bionicHostRegistered ? " (bionic-host delegated)" : ""}`,
1417
1609
  );
1418
1610
  } catch (err) {
1419
1611
  logger.warn(
@@ -23,7 +23,10 @@ export {
23
23
  export { detectEmbeddingPreset } from "./embedding-presets.js";
24
24
  export { shouldWarmupLocalEmbeddingModel } from "./embedding-warmup-policy.js";
25
25
  export { ensureLocalInferenceHandler } from "./ensure-local-inference-handler.js";
26
- export { shouldEnableMobileLocalInference } from "./mobile-local-inference-gate.js";
26
+ export {
27
+ shouldEnableMobileLocalInference,
28
+ warnIfMobileGateActiveWithoutPlatform,
29
+ } from "./mobile-local-inference-gate.js";
27
30
  export {
28
31
  type EmitVoiceTurnObservedArgs,
29
32
  emitVoiceTurnObserved,