@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
@@ -13,6 +13,7 @@
13
13
  * `ensure-local-inference-handler.ts`).
14
14
  */
15
15
 
16
+ import { existsSync, readdirSync, statSync } from "node:fs";
16
17
  import path from "node:path";
17
18
  import {
18
19
  logger,
@@ -21,6 +22,10 @@ import {
21
22
  } from "@elizaos/core";
22
23
  import { isMobilePlatform } from "@elizaos/shared";
23
24
  import type { LocalInferenceLoadArgs } from "./active-model";
25
+ import {
26
+ bundleHasAsrModelFiles,
27
+ readBundleAsrProvenanceBlockers,
28
+ } from "./asr-provenance";
24
29
  import { readEffectiveAssignments } from "./assignments";
25
30
  import type {
26
31
  GenerateArgs as BackendGenerateArgs,
@@ -40,6 +45,7 @@ import {
40
45
  } from "./conversation-registry";
41
46
  import { desktopFusedFfiBackendRuntime } from "./desktop-fused-ffi-backend-runtime";
42
47
  import { FfiStreamingBackend } from "./ffi-streaming-backend";
48
+ import { estimateDecodeTokens, recordDecodeThroughput } from "./live-signals";
43
49
  import { MemoryMonitor } from "./memory-monitor";
44
50
  import { listInstalledModels } from "./registry";
45
51
  import { resolveDefaultPoolSize } from "./session-pool";
@@ -50,7 +56,6 @@ import {
50
56
  createKokoroTtsBackend,
51
57
  EngineVoiceBridge,
52
58
  type EngineVoiceBridgeOptions,
53
- isOmniVoiceBundleAvailable,
54
59
  VoiceStartupError,
55
60
  } from "./voice/engine-bridge";
56
61
  import type { AsrWordTiming } from "./voice/ffi-bindings";
@@ -58,7 +63,6 @@ import { resolveKokoroEngineConfig } from "./voice/kokoro/kokoro-engine-discover
58
63
  import {
59
64
  readVoiceBackendModeFromEnv,
60
65
  selectVoiceBackend,
61
- type VoiceBackendChoice,
62
66
  } from "./voice/kokoro/runtime-selection";
63
67
  import type { VoicePipelineEvents } from "./voice/pipeline";
64
68
  import { type MtpTextRunner, mtpTextRunner } from "./voice/pipeline-impls";
@@ -138,6 +142,9 @@ function skeletonHasFreeStringKey(
138
142
  const DEFAULT_IDLE_UNLOAD_MS = 15 * 60 * 1000;
139
143
  /** How often the idle-unload timer checks the activity clock. */
140
144
  const IDLE_UNLOAD_CHECK_INTERVAL_MS = 60 * 1000;
145
+ const BYTES_PER_MIB = 1024 * 1024;
146
+ const GIB_PER_GB = 1024;
147
+ const TEXT_RESIDENT_OVERHEAD_MB = 512;
141
148
 
142
149
  export function resolveIdleUnloadMs(): number {
143
150
  const raw = process.env.ELIZA_LOCAL_IDLE_UNLOAD_MS?.trim();
@@ -178,34 +185,71 @@ export type GenerateArgs = BackendGenerateArgs;
178
185
  interface ActiveEliza1Bundle {
179
186
  root: string;
180
187
  tierId: Eliza1TierId;
181
- voiceBackends?: ReadonlyArray<VoiceBackendChoice>;
182
188
  }
183
189
 
184
190
  function resolveActiveEliza1Bundle(
185
191
  target: InstalledModel | undefined,
186
- catalog: ReturnType<typeof findCatalogModel>,
187
192
  ): ActiveEliza1Bundle | null {
188
193
  if (!target?.bundleRoot) return null;
189
194
  if (!ELIZA_1_PLACEHOLDER_IDS.has(target.id)) return null;
190
195
  return {
191
196
  root: target.bundleRoot,
192
197
  tierId: target.id as Eliza1TierId,
193
- voiceBackends: catalog?.voiceBackends,
194
198
  };
195
199
  }
196
200
 
197
201
  function resolveDirectEliza1Bundle(
198
202
  args: LocalInferenceLoadArgs | undefined,
199
- catalog: ReturnType<typeof findCatalogModel>,
200
203
  ): ActiveEliza1Bundle | null {
201
204
  if (!args?.modelId || !ELIZA_1_PLACEHOLDER_IDS.has(args.modelId)) return null;
202
205
  return {
203
206
  root: path.dirname(path.dirname(args.modelPath)),
204
207
  tierId: args.modelId as Eliza1TierId,
205
- voiceBackends: catalog?.voiceBackends,
206
208
  };
207
209
  }
208
210
 
211
+ function estimateTextResidentMb(
212
+ installed: InstalledModel | undefined,
213
+ catalog: ReturnType<typeof findCatalogModel>,
214
+ ): number {
215
+ const installedMb =
216
+ typeof installed?.sizeBytes === "number" && installed.sizeBytes > 0
217
+ ? Math.ceil(installed.sizeBytes / BYTES_PER_MIB)
218
+ : 0;
219
+ const catalogMb =
220
+ typeof catalog?.sizeGb === "number" && catalog.sizeGb > 0
221
+ ? Math.ceil(catalog.sizeGb * GIB_PER_GB)
222
+ : 0;
223
+ const baseMb = Math.max(installedMb, catalogMb);
224
+ return baseMb > 0 ? baseMb + TEXT_RESIDENT_OVERHEAD_MB : 0;
225
+ }
226
+
227
+ function stagedLitertModelPath(
228
+ bundleRoot: string,
229
+ modelId: string | undefined,
230
+ ): string | undefined {
231
+ const textDir = path.join(bundleRoot, "text");
232
+ if (!existsSync(textDir) || !statSync(textDir).isDirectory()) {
233
+ return undefined;
234
+ }
235
+
236
+ if (modelId?.startsWith("eliza-1-")) {
237
+ const expected = path.join(textDir, `${modelId}.litertlm`);
238
+ if (existsSync(expected) && statSync(expected).isFile()) {
239
+ return expected;
240
+ }
241
+ }
242
+
243
+ const candidates = readdirSync(textDir)
244
+ .filter((name) => name.endsWith(".litertlm"))
245
+ .sort();
246
+ if (candidates.length === 1) {
247
+ const candidate = path.join(textDir, candidates[0]);
248
+ if (statSync(candidate).isFile()) return candidate;
249
+ }
250
+ return undefined;
251
+ }
252
+
209
253
  /**
210
254
  * Project a fully-resolved `LocalInferenceLoadArgs` onto the subset that
211
255
  * the dispatcher cares about. Keeps `BackendLoadOverrides` framework-free
@@ -235,6 +279,8 @@ function toBackendLoadOverrides(
235
279
  const bundleRoot = path.dirname(path.dirname(args.modelPath));
236
280
  overrides.bundleRoot = bundleRoot;
237
281
  overrides.manifestPath = path.join(bundleRoot, "eliza-1.manifest.json");
282
+ const litertModelPath = stagedLitertModelPath(bundleRoot, args.modelId);
283
+ if (litertModelPath) overrides.litertModelPath = litertModelPath;
238
284
  }
239
285
  return overrides;
240
286
  }
@@ -256,7 +302,7 @@ export class LocalInferenceEngine {
256
302
  /**
257
303
  * In-process FFI backend — the sole text runtime, served by the FUSED
258
304
  * `libelizainference` (`desktop-fused-ffi-backend-runtime.ts`). Text gen,
259
- * same-file MTP speculative decoding, KV-cache quant, native tokenization,
305
+ * MTP speculative decoding, KV-cache quant, native tokenization,
260
306
  * and vision-describe all run through the one fused lib the voice subsystem
261
307
  * already loads (ABI v9). libllama has been retired: a fused lib that is
262
308
  * absent or lacks the v9 capabilities is a loud `LocalInferenceUnavailable`
@@ -279,6 +325,7 @@ export class LocalInferenceEngine {
279
325
  */
280
326
  private voiceBridge: EngineVoiceBridge | null = null;
281
327
  private voiceReadyPromise: Promise<EngineVoiceBridge> | null = null;
328
+ private asrReadyPromise: Promise<EngineVoiceBridge> | null = null;
282
329
 
283
330
  /**
284
331
  * The general onload/offload coordinator (W10 / J5). One registry per
@@ -316,6 +363,14 @@ export class LocalInferenceEngine {
316
363
  private idleUnloadTimer: NodeJS.Timeout | null = null;
317
364
  /** Evictable text-target role id registered on `sharedResources`, or null. */
318
365
  private textTargetRoleId: string | null = null;
366
+ /**
367
+ * Ids of evictable roles THIS engine registered on `sharedResources`
368
+ * (text-target today). `getResidentFootprintMb()` sums only these so the
369
+ * arbiter never double-counts its own vision/image-gen registry roles.
370
+ */
371
+ private readonly ownedEvictableRoleIds = new Set<string>();
372
+ /** Best-effort resident footprint for the active text bundle, in MiB. */
373
+ private textTargetEstimatedMb = 0;
319
374
  /** Evictable drafter role id registered on `sharedResources`, or null. */
320
375
 
321
376
  /**
@@ -337,6 +392,28 @@ export class LocalInferenceEngine {
337
392
  return this.sharedResources;
338
393
  }
339
394
 
395
+ /**
396
+ * Resident RAM footprint (MB) of the model weights this engine owns on the
397
+ * shared registry — the active text/embedding bundle today, plus any future
398
+ * engine-registered role (drafter, voice). This is the term `service.ts`
399
+ * feeds into the `MemoryArbiter` as `externalFootprintMb` so the arbiter's
400
+ * proactive `evictToFit` path accounts for the dominant resident consumer
401
+ * (the text target) instead of seeing only its own vision/image-gen handles
402
+ * and never tripping (#8809 AC#1). Summed by role id so it never
403
+ * double-counts the arbiter's own registry roles (vision/image-gen), which
404
+ * the arbiter already counts in its resident map.
405
+ */
406
+ getResidentFootprintMb(): number {
407
+ if (this.ownedEvictableRoleIds.size === 0) return 0;
408
+ let mb = 0;
409
+ for (const role of this.sharedResources.evictableRoles()) {
410
+ if (this.ownedEvictableRoleIds.has(role.id)) {
411
+ mb += role.estimatedResidentMb();
412
+ }
413
+ }
414
+ return mb;
415
+ }
416
+
340
417
  /** The RAM-pressure monitor. Exposed for diagnostics / tests. */
341
418
  getMemoryMonitor(): MemoryMonitor {
342
419
  return this.memoryMonitor;
@@ -372,6 +449,7 @@ export class LocalInferenceEngine {
372
449
  if (this.textTargetRoleId === null) {
373
450
  const role = createEvictableModelRole({
374
451
  role: "text-target",
452
+ estimatedMb: this.textTargetEstimatedMb,
375
453
  isResident: () => this.hasLoadedModel(),
376
454
  evict: async () => {
377
455
  // Last thing to go. Evicting the text target = unload it; the
@@ -381,6 +459,7 @@ export class LocalInferenceEngine {
381
459
  });
382
460
  this.sharedResources.acquire(role);
383
461
  this.textTargetRoleId = role.id;
462
+ this.ownedEvictableRoleIds.add(role.id);
384
463
  }
385
464
  }
386
465
 
@@ -390,6 +469,7 @@ export class LocalInferenceEngine {
390
469
  );
391
470
  this.textTargetRoleId = null;
392
471
  for (const id of ids) {
472
+ this.ownedEvictableRoleIds.delete(id);
393
473
  try {
394
474
  await this.sharedResources.release(id);
395
475
  } catch {
@@ -480,7 +560,7 @@ export class LocalInferenceEngine {
480
560
  return this.dispatcher.hasLoadedModel();
481
561
  }
482
562
 
483
- activeBackendId(): "capacitor-llama" | "llama-cpp" | null {
563
+ activeBackendId(): "llama-cpp" | null {
484
564
  return this.dispatcher.activeBackendId();
485
565
  }
486
566
 
@@ -489,23 +569,28 @@ export class LocalInferenceEngine {
489
569
  return this.dispatcher.currentRuntimeLoadConfig();
490
570
  }
491
571
 
572
+ private async disposeVoiceBridge(bridge: EngineVoiceBridge): Promise<void> {
573
+ try {
574
+ await bridge.disarm();
575
+ await bridge.settle();
576
+ } finally {
577
+ bridge.dispose();
578
+ if (this.voiceBridge === bridge) this.voiceBridge = null;
579
+ }
580
+ }
581
+
492
582
  async unload(): Promise<void> {
493
583
  // Stop the memory monitor + idle timer and deregister evictable roles
494
584
  // before anything else — they reference the model that's about to go.
495
585
  await this.stopBackgroundManagement();
496
586
  this.activeEliza1Bundle = null;
587
+ this.textTargetEstimatedMb = 0;
497
588
  const bridge = this.voiceBridge;
498
589
  if (bridge) {
499
590
  // Drop voice resources before tearing down text. Disarm is a
500
591
  // no-op when the lifecycle is already in voice-off, so this is
501
592
  // safe even if the caller never called startVoice().
502
- try {
503
- await bridge.disarm();
504
- await bridge.settle();
505
- } finally {
506
- bridge.dispose();
507
- if (this.voiceBridge === bridge) this.voiceBridge = null;
508
- }
593
+ await this.disposeVoiceBridge(bridge);
509
594
  }
510
595
  await this.dispatcher.unload();
511
596
  }
@@ -518,6 +603,7 @@ export class LocalInferenceEngine {
518
603
  const target = installed.find((m) => m.path === modelPath);
519
604
  const modelId = target?.id ?? resolved?.modelId;
520
605
  const catalog = modelId ? findCatalogModel(modelId) : undefined;
606
+ this.textTargetEstimatedMb = estimateTextResidentMb(target, catalog);
521
607
 
522
608
  // Resolve the active Eliza-1 bundle (root + tier) so voice setup can
523
609
  // find the bundle-relative Kokoro TTS root and the per-tier EOT
@@ -525,8 +611,7 @@ export class LocalInferenceEngine {
525
611
  // `bundleRoot` and an `eliza-1-<tier>` id. Reset on every load — a
526
612
  // non-Eliza-1 model clears it.
527
613
  this.activeEliza1Bundle =
528
- resolveActiveEliza1Bundle(target, catalog) ??
529
- resolveDirectEliza1Bundle(resolved, catalog);
614
+ resolveActiveEliza1Bundle(target) ?? resolveDirectEliza1Bundle(resolved);
530
615
 
531
616
  // Resolved args (when provided) carry the merged catalog defaults +
532
617
  // per-load overrides from the active-model coordinator. Project them
@@ -543,10 +628,8 @@ export class LocalInferenceEngine {
543
628
  overrides,
544
629
  };
545
630
 
546
- // The in-process FFI runtime (fused libelizainference, or the
547
- // libllama + eliza-llama-shim fallback) is the sole text backend. A
548
- // load failure surfaces directly — there is no second runtime to fall
549
- // back to.
631
+ // The local stack is Eliza-1 only: the dispatcher routes every load to the
632
+ // fused libelizainference runtime. A load failure surfaces directly.
550
633
  await this.dispatcher.load(plan);
551
634
  this.startBackgroundManagement();
552
635
  }
@@ -554,7 +637,15 @@ export class LocalInferenceEngine {
554
637
  async generate(args: GenerateArgs): Promise<string> {
555
638
  this.markActivity();
556
639
  const streaming = this.voiceStreamingArgs(args);
640
+ const startedAt = Date.now();
557
641
  const text = await this.dispatcher.generate(streaming.args);
642
+ // Decode-throughput routing signal. `generate()` returns only text, so the
643
+ // decoded-token count is approximated from the output length (the exact
644
+ // usage block is only available on the `generateInConversation` path).
645
+ recordDecodeThroughput({
646
+ tokens: estimateDecodeTokens(text),
647
+ elapsedMs: Date.now() - startedAt,
648
+ });
558
649
  await streaming.finish(text);
559
650
  return text;
560
651
  }
@@ -575,6 +666,9 @@ export class LocalInferenceEngine {
575
666
  maxTokens?: number;
576
667
  temperature?: number;
577
668
  signal?: AbortSignal;
669
+ /** Per-token callback for streaming vision describe (ABI v13). */
670
+ onTextChunk?: (chunk: string) => void | Promise<void>;
671
+ maxTokensPerStep?: number;
578
672
  }): Promise<{
579
673
  text: string;
580
674
  projectorMs?: number;
@@ -668,12 +762,25 @@ export class LocalInferenceEngine {
668
762
  const cacheKey = `conv:${handle.conversationId}`;
669
763
  const streaming = this.voiceStreamingArgs(args);
670
764
  if (this.activeBackendId() === "llama-cpp") {
765
+ const startedAt = Date.now();
671
766
  const result: LocalGenerateWithUsageResult =
672
767
  await this.dispatcher.generateWithUsage({
673
768
  ...streaming.args,
674
769
  cacheKey,
675
770
  slotId: handle.slotId,
676
771
  });
772
+ const elapsedMs = Date.now() - startedAt;
773
+ // Decode-throughput routing signal. Prefer the exact decoded-token count
774
+ // from the backend usage block; estimate from the text only if the
775
+ // backend omitted it.
776
+ const decodedTokens = Number(result.usage?.completion_tokens);
777
+ recordDecodeThroughput({
778
+ tokens:
779
+ Number.isFinite(decodedTokens) && decodedTokens > 0
780
+ ? decodedTokens
781
+ : estimateDecodeTokens(result.text),
782
+ elapsedMs,
783
+ });
677
784
  await streaming.finish(result.text);
678
785
  return {
679
786
  text: result.text,
@@ -857,6 +964,15 @@ export class LocalInferenceEngine {
857
964
  "[voice] Voice session is already active. Call stopVoice() before starting a new one.",
858
965
  );
859
966
  }
967
+ if (opts.useFfiBackend && bundleHasAsrModelFiles(opts.bundleRoot)) {
968
+ const blockers = readBundleAsrProvenanceBlockers(opts.bundleRoot);
969
+ if (blockers.length > 0) {
970
+ throw new VoiceStartupError(
971
+ "blocked-asr-provenance",
972
+ `[voice] Cannot start fused local voice: ${blockers.join("; ")}`,
973
+ );
974
+ }
975
+ }
860
976
  // Pass the engine's shared-resource registry through so voice ref-counts
861
977
  // against the same canonical resources as text and the `MemoryMonitor`
862
978
  // sees voice's evictable roles too. The engine's registry is canonical —
@@ -919,34 +1035,143 @@ export class LocalInferenceEngine {
919
1035
  }
920
1036
  }
921
1037
 
1038
+ private async activateAssignedBundleForVoice(): Promise<void> {
1039
+ if (this.activeEliza1Bundle || this.dispatcher.hasLoadedModel()) return;
1040
+ try {
1041
+ const assignments = await readEffectiveAssignments();
1042
+ const textModelId = assignments.TEXT_LARGE ?? assignments.TEXT_SMALL;
1043
+ if (!textModelId) return;
1044
+ const installed = await listInstalledModels();
1045
+ const target = installed.find((m) => m.id === textModelId);
1046
+ if (!target) return;
1047
+ logger.info(
1048
+ `[voice] Pre-loading text model ${textModelId} to activate Eliza-1 bundle for voice`,
1049
+ );
1050
+ await this.load(target.path);
1051
+ } catch (err) {
1052
+ logger.warn(
1053
+ `[voice] Failed to pre-load text model for bundle activation: ${
1054
+ err instanceof Error ? err.message : String(err)
1055
+ }`,
1056
+ );
1057
+ }
1058
+ }
1059
+
1060
+ private localAsrBlockersForBundle(bundle: ActiveEliza1Bundle): string[] {
1061
+ const blockers: string[] = [];
1062
+ if (!bundleHasAsrModelFiles(bundle.root)) {
1063
+ blockers.push(
1064
+ `files.asr: no ASR model artifacts are staged under ${path.join(
1065
+ bundle.root,
1066
+ "asr",
1067
+ )}`,
1068
+ );
1069
+ }
1070
+ blockers.push(...readBundleAsrProvenanceBlockers(bundle.root));
1071
+ return blockers;
1072
+ }
1073
+
1074
+ private assertLocalAsrEligible(bundle: ActiveEliza1Bundle): void {
1075
+ const blockers = this.localAsrBlockersForBundle(bundle);
1076
+ if (blockers.length === 0) return;
1077
+ const code = blockers.some((blocker) => blocker.startsWith("files.asr:"))
1078
+ ? "missing-asr-model"
1079
+ : "blocked-asr-provenance";
1080
+ throw new VoiceStartupError(
1081
+ code,
1082
+ `[voice] Cannot start local Gemma ASR for ${bundle.tierId}: ${blockers.join("; ")}`,
1083
+ );
1084
+ }
1085
+
1086
+ private async assignedLocalAsrBundle(): Promise<ActiveEliza1Bundle | null> {
1087
+ if (this.activeEliza1Bundle) return this.activeEliza1Bundle;
1088
+ const assignments = await readEffectiveAssignments();
1089
+ const modelId =
1090
+ assignments.TRANSCRIPTION ??
1091
+ assignments.TEXT_LARGE ??
1092
+ assignments.TEXT_SMALL;
1093
+ if (!modelId) return null;
1094
+ const installed = await listInstalledModels();
1095
+ const target = installed.find((m) => m.id === modelId);
1096
+ return resolveActiveEliza1Bundle(target);
1097
+ }
1098
+
1099
+ async canTranscribeLocally(): Promise<boolean> {
1100
+ try {
1101
+ const bridge = this.voiceBridge;
1102
+ if (bridge?.asrAvailable) return true;
1103
+ const bundle = await this.assignedLocalAsrBundle();
1104
+ return (
1105
+ bundle !== null && this.localAsrBlockersForBundle(bundle).length === 0
1106
+ );
1107
+ } catch (err) {
1108
+ logger.warn(
1109
+ `[voice] Local ASR readiness check failed: ${
1110
+ err instanceof Error ? err.message : String(err)
1111
+ }`,
1112
+ );
1113
+ return false;
1114
+ }
1115
+ }
1116
+
1117
+ async ensureActiveBundleAsrReady(): Promise<EngineVoiceBridge> {
1118
+ if (this.asrReadyPromise) return this.asrReadyPromise;
1119
+ this.asrReadyPromise = this.ensureActiveBundleAsrReadyOnce();
1120
+ try {
1121
+ return await this.asrReadyPromise;
1122
+ } finally {
1123
+ this.asrReadyPromise = null;
1124
+ }
1125
+ }
1126
+
1127
+ private async ensureActiveBundleAsrReadyOnce(): Promise<EngineVoiceBridge> {
1128
+ await this.activateAssignedBundleForVoice();
1129
+ const bundle = this.activeEliza1Bundle;
1130
+ if (!bundle) {
1131
+ throw new VoiceStartupError(
1132
+ "missing-bundle-root",
1133
+ "[voice] Cannot start local ASR: no active Eliza-1 bundle is loaded. Install and activate a Gemma ASR-capable Eliza-1 bundle.",
1134
+ );
1135
+ }
1136
+ this.assertLocalAsrEligible(bundle);
1137
+
1138
+ let bridge = this.voiceBridge;
1139
+ if (bridge?.asrAvailable) {
1140
+ await bridge.arm();
1141
+ return bridge;
1142
+ }
1143
+ if (bridge) {
1144
+ await this.disposeVoiceBridge(bridge);
1145
+ }
1146
+
1147
+ const bundleKokoroRoot = path.join(bundle.root, "tts", "kokoro");
1148
+ const kokoro =
1149
+ resolveKokoroEngineConfig(bundleKokoroRoot) ??
1150
+ resolveKokoroEngineConfig();
1151
+ const kokoroOverrides = kokoro
1152
+ ? {
1153
+ ttsBackendOverride: createKokoroTtsBackend(kokoro, {
1154
+ bundleRoot: bundle.root,
1155
+ }),
1156
+ speakerPresetOverride: createKokoroSpeakerPreset(kokoro),
1157
+ }
1158
+ : {};
1159
+ bridge = this.startVoice({
1160
+ bundleRoot: bundle.root,
1161
+ useFfiBackend: true,
1162
+ ...kokoroOverrides,
1163
+ });
1164
+ await bridge.arm();
1165
+ return bridge;
1166
+ }
1167
+
922
1168
  private async ensureActiveBundleVoiceReadyOnce(): Promise<EngineVoiceBridge> {
923
1169
  let bridge = this.voiceBridge;
924
1170
  if (!bridge) {
925
1171
  // If no text model is loaded yet, try to load the assigned one so
926
1172
  // the Eliza-1 bundle activates before voice needs it. This covers
927
1173
  // the boot-time warmup race where TTS fires before any text request.
928
- if (!this.activeEliza1Bundle && !this.dispatcher.hasLoadedModel()) {
929
- try {
930
- const assignments = await readEffectiveAssignments();
931
- const textModelId = assignments.TEXT_LARGE ?? assignments.TEXT_SMALL;
932
- if (textModelId) {
933
- const installed = await listInstalledModels();
934
- const target = installed.find((m) => m.id === textModelId);
935
- if (target) {
936
- logger.info(
937
- `[voice] Pre-loading text model ${textModelId} to activate Eliza-1 bundle for voice`,
938
- );
939
- await this.load(target.path);
940
- }
941
- }
942
- } catch (err) {
943
- logger.warn(
944
- `[voice] Failed to pre-load text model for bundle activation: ${
945
- err instanceof Error ? err.message : String(err)
946
- }`,
947
- );
948
- }
949
- }
1174
+ await this.activateAssignedBundleForVoice();
950
1175
  const bundle = this.activeEliza1Bundle;
951
1176
  if (bundle) {
952
1177
  const bundleKokoroRoot = path.join(bundle.root, "tts", "kokoro");
@@ -958,67 +1183,21 @@ export class LocalInferenceEngine {
958
1183
  mode,
959
1184
  mobile: isMobilePlatform(),
960
1185
  kokoroAvailable: kokoro !== null,
961
- omnivoiceAvailable: isOmniVoiceBundleAvailable(bundle.root),
962
- tierVoiceBackends: bundle.voiceBackends,
963
1186
  });
964
- console.info(
1187
+ logger.info(
965
1188
  `[voice] Selected ${decision.backend} backend for ${bundle.tierId}: ${decision.reason}`,
966
1189
  );
967
- if (decision.backend === "kokoro") {
968
- if (!kokoro) {
969
- throw new VoiceStartupError(
970
- "missing-bundle-root",
971
- "[voice] Kokoro was selected but its model artifacts are not staged under <stateDir>/local-inference/models/kokoro/.",
972
- );
973
- }
974
- bridge = this.startVoice({
975
- bundleRoot: "",
976
- useFfiBackend: false,
977
- kokoroOnly: kokoro,
978
- });
979
- } else {
980
- const { ensureSamanthaPresetReady } = await import(
981
- "./voice/samantha-preset-regenerator"
1190
+ if (!kokoro) {
1191
+ throw new VoiceStartupError(
1192
+ "missing-bundle-root",
1193
+ "[voice] Kokoro was selected but its model artifacts are not staged under <stateDir>/local-inference/models/kokoro/.",
982
1194
  );
983
- const outcome = await ensureSamanthaPresetReady(bundle.root);
984
- if (outcome.kind === "regenerated") {
985
- logger.info(
986
- `[voice] regenerated Samantha preset on first boot: ${outcome.bytes} bytes (K=${outcome.K}, refT=${outcome.refT})`,
987
- );
988
- } else if (outcome.kind === "placeholder-no-regen") {
989
- logger.warn(
990
- `[voice] Samantha preset is the I-wave placeholder and on-the-fly regen is unavailable (reason=${outcome.reason}, detail=${outcome.detail}). Run packages/training/scripts/voice/samantha_lora/RUNBOOK.md or plugins/plugin-local-inference/scripts/regenerate-samantha-preset.mjs to produce a real preset.`,
991
- );
992
- if (
993
- mode !== "omnivoice" &&
994
- kokoro &&
995
- bundle.voiceBackends?.includes("kokoro")
996
- ) {
997
- logger.warn(
998
- `[voice] Falling back to bundled Kokoro voice ${kokoro.defaultVoiceId} from ${kokoro.layout.root} because OmniVoice has only the placeholder Samantha preset.`,
999
- );
1000
- bridge = this.startVoice({
1001
- bundleRoot: bundle.root,
1002
- useFfiBackend: true,
1003
- speakerPresetOverride: createKokoroSpeakerPreset(kokoro),
1004
- ttsBackendOverride: createKokoroTtsBackend(kokoro, {
1005
- bundleRoot: bundle.root,
1006
- }),
1007
- });
1008
- } else if (mode !== "omnivoice") {
1009
- throw new VoiceStartupError(
1010
- "missing-speaker-preset",
1011
- `[voice] OmniVoice selected for ${bundle.tierId}, but its Samantha preset is still the placeholder and no bundle-supported Kokoro fallback is staged. ${outcome.detail}`,
1012
- );
1013
- }
1014
- }
1015
- if (!bridge) {
1016
- bridge = this.startVoice({
1017
- bundleRoot: bundle.root,
1018
- useFfiBackend: true,
1019
- });
1020
- }
1021
1195
  }
1196
+ bridge = this.startVoice({
1197
+ bundleRoot: "",
1198
+ useFfiBackend: false,
1199
+ kokoroOnly: kokoro,
1200
+ });
1022
1201
  } else {
1023
1202
  // No Eliza-1 bundle. Fall back to the Kokoro-only path when its
1024
1203
  // artifacts are staged. No silent degrade: when both are absent
@@ -1086,7 +1265,7 @@ export class LocalInferenceEngine {
1086
1265
  /**
1087
1266
  * Use the already-loaded eliza-1 text model as the EOT classifier — see
1088
1267
  * `voice/eliza1-eot-scorer.ts`. When set, the runtime skips the
1089
- * separate LiveKit/Turnsense ONNX and reads P(`<|im_end|>`) directly
1268
+ * separate LiveKit/Turnsense ONNX and reads P(`<end_of_turn>`) directly
1090
1269
  * off the live model.
1091
1270
  *
1092
1271
  * `"auto"` (default): use eliza-1 EOT when `ELIZA_VOICE_EOT_BACKEND=eliza-1`
@@ -1197,7 +1376,7 @@ export class LocalInferenceEngine {
1197
1376
  // Voice Wave 2 (2026-05-14): tier-aware turn-detector revision selection.
1198
1377
  // `2b` (the entry tier) ships the ~66 MB EN-only SmolLM2-135M distill
1199
1378
  // (`v1.2.2-en`); `4b`+ ship the ~396 MB multilingual pruned
1200
- // Qwen2.5-0.5B (`v0.4.1-intl`). The on-disk layout is per-tier so the
1379
+ // semantic detector (`v0.4.1-intl`). The on-disk layout is per-tier so the
1201
1380
  // bundle dir already contains the matching ONNX — `revision` here is a
1202
1381
  // telemetry label (the upstream tag the bundle was staged from). When no
1203
1382
  // active bundle is resolvable we omit the hint and the resolver falls
@@ -1225,7 +1404,7 @@ export class LocalInferenceEngine {
1225
1404
  }
1226
1405
  // Fused end-of-turn scorer (ABI v11): the model-based turn detector now
1227
1406
  // runs in-process through libelizainference — a composite of the fused
1228
- // semantic scorer (P(<|im_end|>) over the loaded text model) and the
1407
+ // semantic scorer (P(<end_of_turn>) over the loaded text model) and the
1229
1408
  // heuristic syntactic co-signal. Built only when the loaded fused build
1230
1409
  // wires the v11 EOT symbol; null on a pre-v11 library, in which case the
1231
1410
  // resolver falls through to the heuristic-only classifier.
@@ -1524,6 +1703,7 @@ export class LocalInferenceEngine {
1524
1703
  async transcribePcm(
1525
1704
  args: TranscriptionAudio,
1526
1705
  signal?: AbortSignal,
1706
+ onPartial?: (delta: string) => void,
1527
1707
  ): Promise<string> {
1528
1708
  this.markActivity();
1529
1709
  if (signal?.aborted) {
@@ -1533,7 +1713,7 @@ export class LocalInferenceEngine {
1533
1713
  }
1534
1714
  const transcript = await this.requireVoiceBridge(
1535
1715
  "transcribe audio",
1536
- ).transcribePcm(args, signal);
1716
+ ).transcribePcm(args, signal, onPartial);
1537
1717
  if (signal?.aborted) {
1538
1718
  throw signal.reason instanceof Error
1539
1719
  ? signal.reason
@@ -1570,6 +1750,13 @@ export class LocalInferenceEngine {
1570
1750
  * {@link MtpTextRunner}. When omitted, the active local dispatcher is
1571
1751
  * used.
1572
1752
  *
1753
+ * Production caller: the on-device device bridge, via `runDeviceVoiceTurn`
1754
+ * (`adapters/capacitor-llama/voice-turn.ts`), which wraps the loaded
1755
+ * `CapacitorLlamaContext` in an `MtpTextRunner` and passes it here so the
1756
+ * draft/verify loop runs on the on-device text model. The native mic
1757
+ * capture hands `runDeviceVoiceTurn` the PCM; everything downstream is
1758
+ * in-process JS + the fused FFI (no HTTP, no second voice path).
1759
+ *
1573
1760
  * Resolves with the turn's exit reason (`done` / `token-cap` /
1574
1761
  * `cancelled`). A missing ASR region in voice mode surfaces as a
1575
1762
  * `VoiceStartupError` — no silent cloud fallback (AGENTS.md §3).
@@ -12,7 +12,7 @@
12
12
  * settings UI / a CLI.
13
13
  *
14
14
  * Today every Eliza-1 tier ships every component (text + voice + asr +
15
- * embedding + mtp drafter + cache) as one HuggingFace bundle. The
15
+ * embedding + embedded-draft-head MTP metadata + cache) as one HuggingFace bundle. The
16
16
  * orchestrator picks a tier per artifact kind (always the same tier today —
17
17
  * tier resolution is centralised on the recommender) and triggers parallel
18
18
  * `service.startDownload(modelId)` calls per kind. The downloader is
@@ -406,11 +406,14 @@ export function detectMobileCapabilities(
406
406
  // ttsStreamSupported(). Cast to unknown to peek at the full binding if
407
407
  // it happens to be the fused omnivoice build — but don't fail if it
408
408
  // isn't; omnivoiceStreaming gracefully defaults to false.
409
- const anyFfi = ffi as unknown as Record<string, unknown>;
409
+ const anyFfi = ffi as FfiLlmStreamingAbi & {
410
+ llmStreamSupported?: () => boolean;
411
+ ttsStreamSupported?: () => boolean;
412
+ };
410
413
 
411
414
  const streamingLlm =
412
415
  typeof anyFfi.llmStreamSupported === "function"
413
- ? (anyFfi.llmStreamSupported as () => boolean)()
416
+ ? anyFfi.llmStreamSupported()
414
417
  : // If the binding doesn't expose a supported() query but was handed
415
418
  // to us at all, assume yes — the caller already verified the symbols
416
419
  // exist via `llmStreamOpen !== undefined` elsewhere.
@@ -418,7 +421,7 @@ export function detectMobileCapabilities(
418
421
 
419
422
  const omnivoiceStreaming =
420
423
  typeof anyFfi.ttsStreamSupported === "function"
421
- ? (anyFfi.ttsStreamSupported as () => boolean)()
424
+ ? anyFfi.ttsStreamSupported()
422
425
  : false;
423
426
 
424
427
  // mtpSupported requires a drafter bundle probe that is not part of