@elizaos/plugin-local-inference 2.0.0-beta.1 → 2.0.3-beta.3

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 (893) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +157 -0
  3. package/dist/actions/generate-media.d.ts +59 -0
  4. package/dist/actions/generate-media.d.ts.map +1 -0
  5. package/dist/actions/identify-speaker.d.ts +23 -0
  6. package/dist/actions/identify-speaker.d.ts.map +1 -0
  7. package/dist/actions/transcription-control.d.ts +29 -0
  8. package/dist/actions/transcription-control.d.ts.map +1 -0
  9. package/dist/adapters/capacitor-llama/environment.d.ts +12 -0
  10. package/dist/adapters/capacitor-llama/environment.d.ts.map +1 -0
  11. package/dist/adapters/capacitor-llama/index.browser.d.ts +9 -0
  12. package/dist/adapters/capacitor-llama/index.browser.d.ts.map +1 -0
  13. package/dist/adapters/capacitor-llama/index.d.ts +18 -0
  14. package/dist/adapters/capacitor-llama/index.d.ts.map +1 -0
  15. package/dist/adapters/capacitor-llama/loader.d.ts +35 -0
  16. package/dist/adapters/capacitor-llama/loader.d.ts.map +1 -0
  17. package/dist/adapters/capacitor-llama/native-voice-capture.d.ts +70 -0
  18. package/dist/adapters/capacitor-llama/native-voice-capture.d.ts.map +1 -0
  19. package/dist/adapters/capacitor-llama/structured-output.d.ts +62 -0
  20. package/dist/adapters/capacitor-llama/structured-output.d.ts.map +1 -0
  21. package/dist/adapters/capacitor-llama/text-streaming.d.ts +24 -0
  22. package/dist/adapters/capacitor-llama/text-streaming.d.ts.map +1 -0
  23. package/dist/adapters/capacitor-llama/types.d.ts +338 -0
  24. package/dist/adapters/capacitor-llama/types.d.ts.map +1 -0
  25. package/dist/adapters/capacitor-llama/voice-turn.d.ts +86 -0
  26. package/dist/adapters/capacitor-llama/voice-turn.d.ts.map +1 -0
  27. package/dist/backends/apple-foundation.d.ts +56 -0
  28. package/dist/backends/apple-foundation.d.ts.map +1 -0
  29. package/dist/index.d.ts +8 -37
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +38979 -430
  32. package/dist/index.js.map +217 -0
  33. package/dist/local-inference-routes.d.ts +47 -0
  34. package/dist/local-inference-routes.d.ts.map +1 -0
  35. package/dist/provider.d.ts +21 -0
  36. package/dist/provider.d.ts.map +1 -0
  37. package/dist/routes/compat-helpers.d.ts +18 -0
  38. package/dist/routes/compat-helpers.d.ts.map +1 -0
  39. package/dist/routes/family-member-route.d.ts +62 -0
  40. package/dist/routes/family-member-route.d.ts.map +1 -0
  41. package/dist/routes/index.d.ts +20 -0
  42. package/dist/routes/index.d.ts.map +1 -0
  43. package/dist/routes/index.js +42040 -0
  44. package/dist/routes/index.js.map +236 -0
  45. package/dist/routes/live-diarization-route.d.ts +33 -0
  46. package/dist/routes/live-diarization-route.d.ts.map +1 -0
  47. package/dist/routes/local-inference-asr-route.d.ts +4 -0
  48. package/dist/routes/local-inference-asr-route.d.ts.map +1 -0
  49. package/dist/routes/local-inference-asr-transcribe.d.ts +20 -0
  50. package/dist/routes/local-inference-asr-transcribe.d.ts.map +1 -0
  51. package/dist/routes/local-inference-compat-routes.d.ts +16 -0
  52. package/dist/routes/local-inference-compat-routes.d.ts.map +1 -0
  53. package/dist/routes/local-inference-tts-route.d.ts +7 -0
  54. package/dist/routes/local-inference-tts-route.d.ts.map +1 -0
  55. package/dist/routes/native-pcm-turn-route.d.ts +3 -0
  56. package/dist/routes/native-pcm-turn-route.d.ts.map +1 -0
  57. package/dist/routes/transcript-audio-store.d.ts +15 -0
  58. package/dist/routes/transcript-audio-store.d.ts.map +1 -0
  59. package/dist/routes/transcripts-routes.d.ts +44 -0
  60. package/dist/routes/transcripts-routes.d.ts.map +1 -0
  61. package/dist/routes/voice-first-run-routes.d.ts +62 -0
  62. package/dist/routes/voice-first-run-routes.d.ts.map +1 -0
  63. package/dist/routes/voice-models-routes.d.ts +62 -0
  64. package/dist/routes/voice-models-routes.d.ts.map +1 -0
  65. package/dist/routes/voice-profile-plugin-routes.d.ts +19 -0
  66. package/dist/routes/voice-profile-plugin-routes.d.ts.map +1 -0
  67. package/dist/routes/voice-profiles-management-routes.d.ts +52 -0
  68. package/dist/routes/voice-profiles-management-routes.d.ts.map +1 -0
  69. package/dist/routes/voice-speaker-profile-routes.d.ts +57 -0
  70. package/dist/routes/voice-speaker-profile-routes.d.ts.map +1 -0
  71. package/dist/runtime/embedding-manager-support.d.ts +77 -0
  72. package/dist/runtime/embedding-manager-support.d.ts.map +1 -0
  73. package/dist/runtime/embedding-presets.d.ts +16 -0
  74. package/dist/runtime/embedding-presets.d.ts.map +1 -0
  75. package/dist/runtime/embedding-warmup-policy.d.ts +14 -0
  76. package/dist/runtime/embedding-warmup-policy.d.ts.map +1 -0
  77. package/dist/runtime/ensure-local-inference-handler.d.ts +70 -0
  78. package/dist/runtime/ensure-local-inference-handler.d.ts.map +1 -0
  79. package/dist/runtime/index.d.ts +15 -0
  80. package/dist/runtime/index.d.ts.map +1 -0
  81. package/dist/runtime/index.js +38768 -0
  82. package/dist/runtime/index.js.map +217 -0
  83. package/dist/runtime/mobile-local-inference-gate.d.ts +63 -0
  84. package/dist/runtime/mobile-local-inference-gate.d.ts.map +1 -0
  85. package/dist/runtime/voice-entity-binding.d.ts +113 -0
  86. package/dist/runtime/voice-entity-binding.d.ts.map +1 -0
  87. package/dist/services/active-model.d.ts +310 -0
  88. package/dist/services/active-model.d.ts.map +1 -0
  89. package/dist/services/asr-provenance.d.ts +5 -0
  90. package/dist/services/asr-provenance.d.ts.map +1 -0
  91. package/dist/services/assignments.d.ts +84 -0
  92. package/dist/services/assignments.d.ts.map +1 -0
  93. package/dist/services/backend-selector.d.ts +55 -0
  94. package/dist/services/backend-selector.d.ts.map +1 -0
  95. package/dist/services/backend.d.ts +440 -0
  96. package/dist/services/backend.d.ts.map +1 -0
  97. package/dist/services/bionic-host-loader.d.ts +67 -0
  98. package/dist/services/bionic-host-loader.d.ts.map +1 -0
  99. package/dist/services/bundled-models.d.ts +34 -0
  100. package/dist/services/bundled-models.d.ts.map +1 -0
  101. package/dist/services/cache-bridge.d.ts +206 -0
  102. package/dist/services/cache-bridge.d.ts.map +1 -0
  103. package/dist/services/catalog.d.ts +10 -0
  104. package/dist/services/catalog.d.ts.map +1 -0
  105. package/dist/services/checkpoint-client.d.ts +109 -0
  106. package/dist/services/checkpoint-client.d.ts.map +1 -0
  107. package/dist/services/checkpoint-manager.d.ts +217 -0
  108. package/dist/services/checkpoint-manager.d.ts.map +1 -0
  109. package/dist/services/cloud-fallback.d.ts +102 -0
  110. package/dist/services/cloud-fallback.d.ts.map +1 -0
  111. package/dist/services/context-fit.d.ts +36 -0
  112. package/dist/services/context-fit.d.ts.map +1 -0
  113. package/dist/services/conversation-registry.d.ts +142 -0
  114. package/dist/services/conversation-registry.d.ts.map +1 -0
  115. package/dist/services/desktop-fused-ffi-backend-runtime.d.ts +111 -0
  116. package/dist/services/desktop-fused-ffi-backend-runtime.d.ts.map +1 -0
  117. package/dist/services/device-bridge.d.ts +188 -0
  118. package/dist/services/device-bridge.d.ts.map +1 -0
  119. package/dist/services/device-resource-metrics.d.ts +149 -0
  120. package/dist/services/device-resource-metrics.d.ts.map +1 -0
  121. package/dist/services/device-tier.d.ts +133 -0
  122. package/dist/services/device-tier.d.ts.map +1 -0
  123. package/dist/services/downloader.d.ts +94 -0
  124. package/dist/services/downloader.d.ts.map +1 -0
  125. package/dist/services/engine.d.ts +579 -0
  126. package/dist/services/engine.d.ts.map +1 -0
  127. package/dist/services/ensure-local-artifacts.d.ts +82 -0
  128. package/dist/services/ensure-local-artifacts.d.ts.map +1 -0
  129. package/dist/services/external-scanner.d.ts +17 -0
  130. package/dist/services/external-scanner.d.ts.map +1 -0
  131. package/dist/services/ffi-llm-mock.d.ts +90 -0
  132. package/dist/services/ffi-llm-mock.d.ts.map +1 -0
  133. package/dist/services/ffi-llm-streaming-abi.d.ts +318 -0
  134. package/dist/services/ffi-llm-streaming-abi.d.ts.map +1 -0
  135. package/dist/services/ffi-streaming-backend.d.ts +201 -0
  136. package/dist/services/ffi-streaming-backend.d.ts.map +1 -0
  137. package/dist/services/ffi-streaming-runner.d.ts +146 -0
  138. package/dist/services/ffi-streaming-runner.d.ts.map +1 -0
  139. package/dist/services/gpu-autotune.d.ts +150 -0
  140. package/dist/services/gpu-autotune.d.ts.map +1 -0
  141. package/dist/services/gpu-detect.d.ts +56 -0
  142. package/dist/services/gpu-detect.d.ts.map +1 -0
  143. package/dist/services/handler-registry.d.ts +72 -0
  144. package/dist/services/handler-registry.d.ts.map +1 -0
  145. package/dist/services/hardware.d.ts +63 -0
  146. package/dist/services/hardware.d.ts.map +1 -0
  147. package/dist/services/image-description-runtime.d.ts +14 -0
  148. package/dist/services/image-description-runtime.d.ts.map +1 -0
  149. package/dist/services/imagegen/aosp-unavailable.d.ts +134 -0
  150. package/dist/services/imagegen/aosp-unavailable.d.ts.map +1 -0
  151. package/dist/services/imagegen/backend-selector.d.ts +118 -0
  152. package/dist/services/imagegen/backend-selector.d.ts.map +1 -0
  153. package/dist/services/imagegen/coreml-unavailable.d.ts +105 -0
  154. package/dist/services/imagegen/coreml-unavailable.d.ts.map +1 -0
  155. package/dist/services/imagegen/errors.d.ts +16 -0
  156. package/dist/services/imagegen/errors.d.ts.map +1 -0
  157. package/dist/services/imagegen/index.d.ts +58 -0
  158. package/dist/services/imagegen/index.d.ts.map +1 -0
  159. package/dist/services/imagegen/mflux.d.ts +74 -0
  160. package/dist/services/imagegen/mflux.d.ts.map +1 -0
  161. package/dist/services/imagegen/sd-cpp.d.ts +181 -0
  162. package/dist/services/imagegen/sd-cpp.d.ts.map +1 -0
  163. package/dist/services/imagegen/tensorrt-unavailable.d.ts +83 -0
  164. package/dist/services/imagegen/tensorrt-unavailable.d.ts.map +1 -0
  165. package/dist/services/imagegen/types.d.ts +181 -0
  166. package/dist/services/imagegen/types.d.ts.map +1 -0
  167. package/dist/services/index.d.ts +31 -0
  168. package/dist/services/index.d.ts.map +1 -0
  169. package/dist/services/index.js +39453 -0
  170. package/dist/services/index.js.map +227 -0
  171. package/dist/services/inference-capabilities.d.ts +132 -0
  172. package/dist/services/inference-capabilities.d.ts.map +1 -0
  173. package/dist/services/inference-telemetry.d.ts +59 -0
  174. package/dist/services/inference-telemetry.d.ts.map +1 -0
  175. package/dist/services/ios-llama-streaming.d.ts +119 -0
  176. package/dist/services/ios-llama-streaming.d.ts.map +1 -0
  177. package/dist/services/kv-spill.d.ts +189 -0
  178. package/dist/services/kv-spill.d.ts.map +1 -0
  179. package/dist/services/latency-trace.d.ts +346 -0
  180. package/dist/services/latency-trace.d.ts.map +1 -0
  181. package/dist/services/lib-target.d.ts +55 -0
  182. package/dist/services/lib-target.d.ts.map +1 -0
  183. package/dist/services/live-signals.d.ts +86 -0
  184. package/dist/services/live-signals.d.ts.map +1 -0
  185. package/dist/services/llama-server-metrics.d.ts +114 -0
  186. package/dist/services/llama-server-metrics.d.ts.map +1 -0
  187. package/dist/services/llm-streaming-binding.d.ts +96 -0
  188. package/dist/services/llm-streaming-binding.d.ts.map +1 -0
  189. package/dist/services/load-args.d.ts +82 -0
  190. package/dist/services/load-args.d.ts.map +1 -0
  191. package/dist/services/manifest/index.d.ts +4 -0
  192. package/dist/services/manifest/index.d.ts.map +1 -0
  193. package/dist/services/manifest/schema.d.ts +903 -0
  194. package/dist/services/manifest/schema.d.ts.map +1 -0
  195. package/dist/services/manifest/types.d.ts +32 -0
  196. package/dist/services/manifest/types.d.ts.map +1 -0
  197. package/dist/services/manifest/validator.d.ts +66 -0
  198. package/dist/services/manifest/validator.d.ts.map +1 -0
  199. package/dist/services/memory-arbiter.d.ts +348 -0
  200. package/dist/services/memory-arbiter.d.ts.map +1 -0
  201. package/dist/services/memory-benchmark.d.ts +76 -0
  202. package/dist/services/memory-benchmark.d.ts.map +1 -0
  203. package/dist/services/memory-monitor.d.ts +128 -0
  204. package/dist/services/memory-monitor.d.ts.map +1 -0
  205. package/dist/services/memory-pressure.d.ts +130 -0
  206. package/dist/services/memory-pressure.d.ts.map +1 -0
  207. package/dist/services/mtp-doctor.d.ts +13 -0
  208. package/dist/services/mtp-doctor.d.ts.map +1 -0
  209. package/dist/services/network-policy.d.ts +127 -0
  210. package/dist/services/network-policy.d.ts.map +1 -0
  211. package/dist/services/paths.d.ts +6 -0
  212. package/dist/services/paths.d.ts.map +1 -0
  213. package/dist/services/planner-skeleton.d.ts +124 -0
  214. package/dist/services/planner-skeleton.d.ts.map +1 -0
  215. package/dist/services/providers.d.ts +38 -0
  216. package/dist/services/providers.d.ts.map +1 -0
  217. package/dist/services/ram-budget.d.ts +110 -0
  218. package/dist/services/ram-budget.d.ts.map +1 -0
  219. package/dist/services/readiness.d.ts +9 -0
  220. package/dist/services/readiness.d.ts.map +1 -0
  221. package/dist/services/recommendation.d.ts +111 -0
  222. package/dist/services/recommendation.d.ts.map +1 -0
  223. package/dist/services/registry.d.ts +33 -0
  224. package/dist/services/registry.d.ts.map +1 -0
  225. package/dist/services/router-handler.d.ts +92 -0
  226. package/dist/services/router-handler.d.ts.map +1 -0
  227. package/dist/services/routing-policy.d.ts +92 -0
  228. package/dist/services/routing-policy.d.ts.map +1 -0
  229. package/dist/services/routing-preferences.d.ts +8 -0
  230. package/dist/services/routing-preferences.d.ts.map +1 -0
  231. package/dist/services/runtime-target.d.ts +98 -0
  232. package/dist/services/runtime-target.d.ts.map +1 -0
  233. package/dist/services/service.d.ts +128 -0
  234. package/dist/services/service.d.ts.map +1 -0
  235. package/dist/services/session-pool.d.ts +72 -0
  236. package/dist/services/session-pool.d.ts.map +1 -0
  237. package/dist/services/structured-output/deterministic-repair.d.ts +23 -0
  238. package/dist/services/structured-output/deterministic-repair.d.ts.map +1 -0
  239. package/dist/services/structured-output/index.d.ts +2 -0
  240. package/dist/services/structured-output/index.d.ts.map +1 -0
  241. package/dist/services/structured-output.d.ts +311 -0
  242. package/dist/services/structured-output.d.ts.map +1 -0
  243. package/dist/services/system-memory.d.ts +33 -0
  244. package/dist/services/system-memory.d.ts.map +1 -0
  245. package/dist/services/types.d.ts +19 -0
  246. package/dist/services/types.d.ts.map +1 -0
  247. package/dist/services/verify-on-device.d.ts +34 -0
  248. package/dist/services/verify-on-device.d.ts.map +1 -0
  249. package/dist/services/verify.d.ts +8 -0
  250. package/dist/services/verify.d.ts.map +1 -0
  251. package/dist/services/vision/aosp-unavailable.d.ts +115 -0
  252. package/dist/services/vision/aosp-unavailable.d.ts.map +1 -0
  253. package/dist/services/vision/capacitor-llama.d.ts +99 -0
  254. package/dist/services/vision/capacitor-llama.d.ts.map +1 -0
  255. package/dist/services/vision/cloud-fallback.d.ts +47 -0
  256. package/dist/services/vision/cloud-fallback.d.ts.map +1 -0
  257. package/dist/services/vision/hash.d.ts +71 -0
  258. package/dist/services/vision/hash.d.ts.map +1 -0
  259. package/dist/services/vision/index.d.ts +95 -0
  260. package/dist/services/vision/index.d.ts.map +1 -0
  261. package/dist/services/vision/llama-server.d.ts +73 -0
  262. package/dist/services/vision/llama-server.d.ts.map +1 -0
  263. package/dist/services/vision/types.d.ts +162 -0
  264. package/dist/services/vision/types.d.ts.map +1 -0
  265. package/dist/services/vision/vast-fallback.d.ts +18 -0
  266. package/dist/services/vision/vast-fallback.d.ts.map +1 -0
  267. package/dist/services/vision-embedding-cache.d.ts +98 -0
  268. package/dist/services/vision-embedding-cache.d.ts.map +1 -0
  269. package/dist/services/voice/__test-helpers__/fake-ffi.d.ts +27 -0
  270. package/dist/services/voice/__test-helpers__/fake-ffi.d.ts.map +1 -0
  271. package/dist/services/voice/__test-helpers__/synthetic-speech.d.ts +66 -0
  272. package/dist/services/voice/__test-helpers__/synthetic-speech.d.ts.map +1 -0
  273. package/dist/services/voice/acoustic-speaker-attribution.d.ts +61 -0
  274. package/dist/services/voice/acoustic-speaker-attribution.d.ts.map +1 -0
  275. package/dist/services/voice/audio-frame-consumer.d.ts +294 -0
  276. package/dist/services/voice/audio-frame-consumer.d.ts.map +1 -0
  277. package/dist/services/voice/barge-in.d.ts +112 -0
  278. package/dist/services/voice/barge-in.d.ts.map +1 -0
  279. package/dist/services/voice/cancellation-coordinator.d.ts +127 -0
  280. package/dist/services/voice/cancellation-coordinator.d.ts.map +1 -0
  281. package/dist/services/voice/checkpoint-manager.d.ts +199 -0
  282. package/dist/services/voice/checkpoint-manager.d.ts.map +1 -0
  283. package/dist/services/voice/checkpoint-policy.d.ts +178 -0
  284. package/dist/services/voice/checkpoint-policy.d.ts.map +1 -0
  285. package/dist/services/voice/corpus-augment.d.ts +111 -0
  286. package/dist/services/voice/corpus-augment.d.ts.map +1 -0
  287. package/dist/services/voice/corpus-generator.d.ts +134 -0
  288. package/dist/services/voice/corpus-generator.d.ts.map +1 -0
  289. package/dist/services/voice/diarization-error-rate.d.ts +40 -0
  290. package/dist/services/voice/diarization-error-rate.d.ts.map +1 -0
  291. package/dist/services/voice/e2e-harness.d.ts +297 -0
  292. package/dist/services/voice/e2e-harness.d.ts.map +1 -0
  293. package/dist/services/voice/eager-context-builder.d.ts +170 -0
  294. package/dist/services/voice/eager-context-builder.d.ts.map +1 -0
  295. package/dist/services/voice/echo-delay.d.ts +67 -0
  296. package/dist/services/voice/echo-delay.d.ts.map +1 -0
  297. package/dist/services/voice/echo-metrics.d.ts +7 -0
  298. package/dist/services/voice/echo-metrics.d.ts.map +1 -0
  299. package/dist/services/voice/echo-reference-buffer.d.ts +65 -0
  300. package/dist/services/voice/echo-reference-buffer.d.ts.map +1 -0
  301. package/dist/services/voice/eliza1-eot-scorer.d.ts +124 -0
  302. package/dist/services/voice/eliza1-eot-scorer.d.ts.map +1 -0
  303. package/dist/services/voice/embedding-server.d.ts +37 -0
  304. package/dist/services/voice/embedding-server.d.ts.map +1 -0
  305. package/dist/services/voice/embedding.d.ts +132 -0
  306. package/dist/services/voice/embedding.d.ts.map +1 -0
  307. package/dist/services/voice/emotion-attribution.d.ts +68 -0
  308. package/dist/services/voice/emotion-attribution.d.ts.map +1 -0
  309. package/dist/services/voice/engine-bridge.d.ts +762 -0
  310. package/dist/services/voice/engine-bridge.d.ts.map +1 -0
  311. package/dist/services/voice/eot-classifier-ggml.d.ts +179 -0
  312. package/dist/services/voice/eot-classifier-ggml.d.ts.map +1 -0
  313. package/dist/services/voice/eot-classifier.d.ts +211 -0
  314. package/dist/services/voice/eot-classifier.d.ts.map +1 -0
  315. package/dist/services/voice/errors.d.ts +20 -0
  316. package/dist/services/voice/errors.d.ts.map +1 -0
  317. package/dist/services/voice/expressive-tags.d.ts +158 -0
  318. package/dist/services/voice/expressive-tags.d.ts.map +1 -0
  319. package/dist/services/voice/ffi-bindings.d.ts +696 -0
  320. package/dist/services/voice/ffi-bindings.d.ts.map +1 -0
  321. package/dist/services/voice/first-line-cache.d.ts +181 -0
  322. package/dist/services/voice/first-line-cache.d.ts.map +1 -0
  323. package/dist/services/voice/fused-eot-scorer.d.ts +51 -0
  324. package/dist/services/voice/fused-eot-scorer.d.ts.map +1 -0
  325. package/dist/services/voice/index.d.ts +96 -0
  326. package/dist/services/voice/index.d.ts.map +1 -0
  327. package/dist/services/voice/kokoro/index.d.ts +24 -0
  328. package/dist/services/voice/kokoro/index.d.ts.map +1 -0
  329. package/dist/services/voice/kokoro/kokoro-backend.d.ts +87 -0
  330. package/dist/services/voice/kokoro/kokoro-backend.d.ts.map +1 -0
  331. package/dist/services/voice/kokoro/kokoro-engine-discovery.d.ts +58 -0
  332. package/dist/services/voice/kokoro/kokoro-engine-discovery.d.ts.map +1 -0
  333. package/dist/services/voice/kokoro/kokoro-ffi-runtime.d.ts +75 -0
  334. package/dist/services/voice/kokoro/kokoro-ffi-runtime.d.ts.map +1 -0
  335. package/dist/services/voice/kokoro/kokoro-runtime.d.ts +100 -0
  336. package/dist/services/voice/kokoro/kokoro-runtime.d.ts.map +1 -0
  337. package/dist/services/voice/kokoro/phoneme-stream.d.ts +51 -0
  338. package/dist/services/voice/kokoro/phoneme-stream.d.ts.map +1 -0
  339. package/dist/services/voice/kokoro/phonemizer.d.ts +50 -0
  340. package/dist/services/voice/kokoro/phonemizer.d.ts.map +1 -0
  341. package/dist/services/voice/kokoro/pick-runtime.d.ts +61 -0
  342. package/dist/services/voice/kokoro/pick-runtime.d.ts.map +1 -0
  343. package/dist/services/voice/kokoro/runtime-selection.d.ts +31 -0
  344. package/dist/services/voice/kokoro/runtime-selection.d.ts.map +1 -0
  345. package/dist/services/voice/kokoro/types.d.ts +82 -0
  346. package/dist/services/voice/kokoro/types.d.ts.map +1 -0
  347. package/dist/services/voice/kokoro/voice-presets.d.ts +23 -0
  348. package/dist/services/voice/kokoro/voice-presets.d.ts.map +1 -0
  349. package/dist/services/voice/kokoro/voices.d.ts +30 -0
  350. package/dist/services/voice/kokoro/voices.d.ts.map +1 -0
  351. package/dist/services/voice/lifecycle.d.ts +135 -0
  352. package/dist/services/voice/lifecycle.d.ts.map +1 -0
  353. package/dist/services/voice/live-diarization-session.d.ts +196 -0
  354. package/dist/services/voice/live-diarization-session.d.ts.map +1 -0
  355. package/dist/services/voice/metric-math.d.ts +10 -0
  356. package/dist/services/voice/metric-math.d.ts.map +1 -0
  357. package/dist/services/voice/mic-source.d.ts +136 -0
  358. package/dist/services/voice/mic-source.d.ts.map +1 -0
  359. package/dist/services/voice/nlms-echo-canceller.d.ts +137 -0
  360. package/dist/services/voice/nlms-echo-canceller.d.ts.map +1 -0
  361. package/dist/services/voice/optimistic-policy.d.ts +109 -0
  362. package/dist/services/voice/optimistic-policy.d.ts.map +1 -0
  363. package/dist/services/voice/optimistic-rollback.d.ts +151 -0
  364. package/dist/services/voice/optimistic-rollback.d.ts.map +1 -0
  365. package/dist/services/voice/partial-stabilizer.d.ts +73 -0
  366. package/dist/services/voice/partial-stabilizer.d.ts.map +1 -0
  367. package/dist/services/voice/phoneme-tokenizer.d.ts +49 -0
  368. package/dist/services/voice/phoneme-tokenizer.d.ts.map +1 -0
  369. package/dist/services/voice/phrase-cache.d.ts +76 -0
  370. package/dist/services/voice/phrase-cache.d.ts.map +1 -0
  371. package/dist/services/voice/phrase-chunker.d.ts +62 -0
  372. package/dist/services/voice/phrase-chunker.d.ts.map +1 -0
  373. package/dist/services/voice/pipeline-impls.d.ts +151 -0
  374. package/dist/services/voice/pipeline-impls.d.ts.map +1 -0
  375. package/dist/services/voice/pipeline.d.ts +216 -0
  376. package/dist/services/voice/pipeline.d.ts.map +1 -0
  377. package/dist/services/voice/prefill-client.d.ts +123 -0
  378. package/dist/services/voice/prefill-client.d.ts.map +1 -0
  379. package/dist/services/voice/prefix-preserving-queue.d.ts +113 -0
  380. package/dist/services/voice/prefix-preserving-queue.d.ts.map +1 -0
  381. package/dist/services/voice/profile-store.d.ts +248 -0
  382. package/dist/services/voice/profile-store.d.ts.map +1 -0
  383. package/dist/services/voice/ring-buffer.d.ts +40 -0
  384. package/dist/services/voice/ring-buffer.d.ts.map +1 -0
  385. package/dist/services/voice/rollback-queue.d.ts +24 -0
  386. package/dist/services/voice/rollback-queue.d.ts.map +1 -0
  387. package/dist/services/voice/samantha-preset-placeholder.d.ts +67 -0
  388. package/dist/services/voice/samantha-preset-placeholder.d.ts.map +1 -0
  389. package/dist/services/voice/samantha-preset-regenerator.d.ts +87 -0
  390. package/dist/services/voice/samantha-preset-regenerator.d.ts.map +1 -0
  391. package/dist/services/voice/scheduler.d.ts +146 -0
  392. package/dist/services/voice/scheduler.d.ts.map +1 -0
  393. package/dist/services/voice/self-voice-imprint.d.ts +33 -0
  394. package/dist/services/voice/self-voice-imprint.d.ts.map +1 -0
  395. package/dist/services/voice/shared-resources.d.ts +204 -0
  396. package/dist/services/voice/shared-resources.d.ts.map +1 -0
  397. package/dist/services/voice/speaker/attribution-pipeline.d.ts +74 -0
  398. package/dist/services/voice/speaker/attribution-pipeline.d.ts.map +1 -0
  399. package/dist/services/voice/speaker/diarizer-fused.d.ts +59 -0
  400. package/dist/services/voice/speaker/diarizer-fused.d.ts.map +1 -0
  401. package/dist/services/voice/speaker/diarizer.d.ts +75 -0
  402. package/dist/services/voice/speaker/diarizer.d.ts.map +1 -0
  403. package/dist/services/voice/speaker/encoder-fused.d.ts +60 -0
  404. package/dist/services/voice/speaker/encoder-fused.d.ts.map +1 -0
  405. package/dist/services/voice/speaker/encoder-ggml.d.ts +33 -0
  406. package/dist/services/voice/speaker/encoder-ggml.d.ts.map +1 -0
  407. package/dist/services/voice/speaker/encoder.d.ts +37 -0
  408. package/dist/services/voice/speaker/encoder.d.ts.map +1 -0
  409. package/dist/services/voice/speaker-imprint.d.ts +83 -0
  410. package/dist/services/voice/speaker-imprint.d.ts.map +1 -0
  411. package/dist/services/voice/speaker-preset-cache.d.ts +77 -0
  412. package/dist/services/voice/speaker-preset-cache.d.ts.map +1 -0
  413. package/dist/services/voice/streaming-asr/streaming-pipeline-adapter.d.ts +160 -0
  414. package/dist/services/voice/streaming-asr/streaming-pipeline-adapter.d.ts.map +1 -0
  415. package/dist/services/voice/system-audio-sink.d.ts +73 -0
  416. package/dist/services/voice/system-audio-sink.d.ts.map +1 -0
  417. package/dist/services/voice/transcriber.d.ts +244 -0
  418. package/dist/services/voice/transcriber.d.ts.map +1 -0
  419. package/dist/services/voice/transcript-knowledge.d.ts +37 -0
  420. package/dist/services/voice/transcript-knowledge.d.ts.map +1 -0
  421. package/dist/services/voice/transcript-service.d.ts +60 -0
  422. package/dist/services/voice/transcript-service.d.ts.map +1 -0
  423. package/dist/services/voice/transcript-store.d.ts +64 -0
  424. package/dist/services/voice/transcript-store.d.ts.map +1 -0
  425. package/dist/services/voice/turn-controller.d.ts +183 -0
  426. package/dist/services/voice/turn-controller.d.ts.map +1 -0
  427. package/dist/services/voice/types.d.ts +643 -0
  428. package/dist/services/voice/types.d.ts.map +1 -0
  429. package/dist/services/voice/vad.d.ts +283 -0
  430. package/dist/services/voice/vad.d.ts.map +1 -0
  431. package/dist/services/voice/voice-budget.d.ts +241 -0
  432. package/dist/services/voice/voice-budget.d.ts.map +1 -0
  433. package/dist/services/voice/voice-emotion-classifier.d.ts +95 -0
  434. package/dist/services/voice/voice-emotion-classifier.d.ts.map +1 -0
  435. package/dist/services/voice/voice-preload-predictor.d.ts +76 -0
  436. package/dist/services/voice/voice-preload-predictor.d.ts.map +1 -0
  437. package/dist/services/voice/voice-preset-format.d.ts +158 -0
  438. package/dist/services/voice/voice-preset-format.d.ts.map +1 -0
  439. package/dist/services/voice/voice-profile-artifact.d.ts +116 -0
  440. package/dist/services/voice/voice-profile-artifact.d.ts.map +1 -0
  441. package/dist/services/voice/voice-profile-routes.d.ts +83 -0
  442. package/dist/services/voice/voice-profile-routes.d.ts.map +1 -0
  443. package/dist/services/voice/voice-scenario.d.ts +131 -0
  444. package/dist/services/voice/voice-scenario.d.ts.map +1 -0
  445. package/dist/services/voice/voice-state-machine.d.ts +364 -0
  446. package/dist/services/voice/voice-state-machine.d.ts.map +1 -0
  447. package/dist/services/voice/voice-workbench-report.d.ts +117 -0
  448. package/dist/services/voice/voice-workbench-report.d.ts.map +1 -0
  449. package/dist/services/voice/wake-word-ggml.d.ts +100 -0
  450. package/dist/services/voice/wake-word-ggml.d.ts.map +1 -0
  451. package/dist/services/voice/wake-word.d.ts +255 -0
  452. package/dist/services/voice/wake-word.d.ts.map +1 -0
  453. package/dist/services/voice/wav-codec.d.ts +11 -0
  454. package/dist/services/voice/wav-codec.d.ts.map +1 -0
  455. package/dist/services/voice/workbench-entrypoint.d.ts +42 -0
  456. package/dist/services/voice/workbench-entrypoint.d.ts.map +1 -0
  457. package/dist/services/voice/workbench-headless-runner.d.ts +102 -0
  458. package/dist/services/voice/workbench-headless-runner.d.ts.map +1 -0
  459. package/dist/services/voice/workbench-logic-services.d.ts +36 -0
  460. package/dist/services/voice/workbench-logic-services.d.ts.map +1 -0
  461. package/dist/services/voice/workbench-real-services.d.ts +17 -0
  462. package/dist/services/voice/workbench-real-services.d.ts.map +1 -0
  463. package/dist/services/voice/workbench-scenarios.d.ts +24 -0
  464. package/dist/services/voice/workbench-scenarios.d.ts.map +1 -0
  465. package/dist/services/voice/wrap-with-first-line-cache.d.ts +70 -0
  466. package/dist/services/voice/wrap-with-first-line-cache.d.ts.map +1 -0
  467. package/dist/services/voice-model-updater.d.ts +240 -0
  468. package/dist/services/voice-model-updater.d.ts.map +1 -0
  469. package/dist/services/voice-prewarm.d.ts +3 -0
  470. package/dist/services/voice-prewarm.d.ts.map +1 -0
  471. package/dist/voice-workbench.d.ts +18 -0
  472. package/dist/voice-workbench.d.ts.map +1 -0
  473. package/dist/voice-workbench.js +5259 -0
  474. package/dist/voice-workbench.js.map +34 -0
  475. package/package.json +101 -15
  476. package/registry-entry.json +137 -0
  477. package/src/actions/generate-media.ts +647 -0
  478. package/src/actions/identify-speaker.ts +171 -0
  479. package/src/actions/transcription-control.test.ts +100 -0
  480. package/src/actions/transcription-control.ts +127 -0
  481. package/src/adapters/capacitor-llama/__tests__/compat-behavior.test.ts +218 -0
  482. package/src/adapters/capacitor-llama/__tests__/index.test.ts +68 -0
  483. package/src/adapters/capacitor-llama/__tests__/structured-output.test.ts +215 -0
  484. package/src/adapters/capacitor-llama/__tests__/text-streaming.test.ts +174 -0
  485. package/src/adapters/capacitor-llama/__tests__/voice-turn.test.ts +293 -0
  486. package/src/adapters/capacitor-llama/environment.ts +71 -0
  487. package/src/adapters/capacitor-llama/index.browser.ts +83 -0
  488. package/src/adapters/capacitor-llama/index.ts +831 -0
  489. package/src/adapters/capacitor-llama/loader.ts +109 -0
  490. package/src/adapters/capacitor-llama/native-voice-capture.ts +140 -0
  491. package/src/adapters/capacitor-llama/structured-output.ts +165 -0
  492. package/src/adapters/capacitor-llama/text-streaming.ts +227 -0
  493. package/src/adapters/capacitor-llama/types.ts +374 -0
  494. package/src/adapters/capacitor-llama/voice-turn.ts +178 -0
  495. package/src/backends/apple-foundation.ts +127 -0
  496. package/src/index.ts +62 -0
  497. package/src/local-inference-routes.test.ts +390 -0
  498. package/src/local-inference-routes.ts +1625 -0
  499. package/src/provider.ts +1111 -0
  500. package/src/routes/compat-helpers.ts +275 -0
  501. package/src/routes/family-member-route.ts +353 -0
  502. package/src/routes/index.ts +61 -0
  503. package/src/routes/live-diarization-route.test.ts +347 -0
  504. package/src/routes/live-diarization-route.ts +198 -0
  505. package/src/routes/local-inference-asr-route.test.ts +246 -0
  506. package/src/routes/local-inference-asr-route.ts +166 -0
  507. package/src/routes/local-inference-asr-transcribe.test.ts +118 -0
  508. package/src/routes/local-inference-asr-transcribe.ts +97 -0
  509. package/src/routes/local-inference-compat-routes.test.ts +485 -0
  510. package/src/routes/local-inference-compat-routes.ts +775 -0
  511. package/src/routes/local-inference-tts-route.test.ts +179 -0
  512. package/src/routes/local-inference-tts-route.ts +230 -0
  513. package/src/routes/native-pcm-turn-route.test.ts +136 -0
  514. package/src/routes/native-pcm-turn-route.ts +121 -0
  515. package/src/routes/transcript-audio-store.ts +27 -0
  516. package/src/routes/transcripts-routes.test.ts +195 -0
  517. package/src/routes/transcripts-routes.ts +191 -0
  518. package/src/routes/voice-first-run-routes.ts +524 -0
  519. package/src/routes/voice-models-routes.ts +554 -0
  520. package/src/routes/voice-profile-plugin-routes.ts +138 -0
  521. package/src/routes/voice-profiles-management-routes.ts +476 -0
  522. package/src/routes/voice-speaker-profile-routes.ts +199 -0
  523. package/src/runtime/aosp-llama-loader-selection.test.ts +80 -0
  524. package/src/runtime/bionic-wire-encoding.test.ts +147 -0
  525. package/src/runtime/capacitor-llama.d.ts +25 -0
  526. package/src/runtime/embedding-manager-support.ts +497 -0
  527. package/src/runtime/embedding-presets.ts +81 -0
  528. package/src/runtime/embedding-warmup-policy.test.ts +53 -0
  529. package/src/runtime/embedding-warmup-policy.ts +48 -0
  530. package/src/runtime/ensure-local-inference-handler.test.ts +726 -0
  531. package/src/runtime/ensure-local-inference-handler.ts +1640 -0
  532. package/src/runtime/index.ts +36 -0
  533. package/src/runtime/mobile-local-inference-gate.test.ts +152 -0
  534. package/src/runtime/mobile-local-inference-gate.ts +99 -0
  535. package/src/runtime/voice-entity-binding.transcript.test.ts +98 -0
  536. package/src/runtime/voice-entity-binding.ts +368 -0
  537. package/src/runtime/voice-speaker-entity-contract.test.ts +149 -0
  538. package/src/services/README.md +71 -0
  539. package/src/services/__tests__/backend-selector.precedence.test.ts +333 -0
  540. package/src/services/__tests__/backend-selector.test.ts +101 -0
  541. package/src/services/__tests__/checkpoint-manager.test.ts +376 -0
  542. package/src/services/__tests__/gpu-autotune.test.ts +400 -0
  543. package/src/services/__tests__/llm-streaming-binding.test.ts +85 -0
  544. package/src/services/__tests__/planner-grammar.test.ts +372 -0
  545. package/src/services/__tests__/runtime-target.test.ts +176 -0
  546. package/src/services/active-model-context-fit.test.ts +125 -0
  547. package/src/services/active-model-switch-rollback.test.ts +183 -0
  548. package/src/services/active-model.ts +1416 -0
  549. package/src/services/asr-provenance.ts +68 -0
  550. package/src/services/assignment-validation.test.ts +118 -0
  551. package/src/services/assignments.test.ts +106 -0
  552. package/src/services/assignments.ts +278 -0
  553. package/src/services/backend-selector.ts +95 -0
  554. package/src/services/backend.test.ts +84 -0
  555. package/src/services/backend.ts +791 -0
  556. package/src/services/bionic-host-loader.test.ts +226 -0
  557. package/src/services/bionic-host-loader.ts +252 -0
  558. package/src/services/bundled-models.ts +129 -0
  559. package/src/services/cache-bridge.test.ts +516 -0
  560. package/src/services/cache-bridge.ts +423 -0
  561. package/src/services/catalog.test.ts +259 -0
  562. package/src/services/catalog.ts +33 -0
  563. package/src/services/checkpoint-client.ts +258 -0
  564. package/src/services/checkpoint-manager.ts +474 -0
  565. package/src/services/cloud-fallback.ts +230 -0
  566. package/src/services/context-fit.test.ts +121 -0
  567. package/src/services/context-fit.ts +113 -0
  568. package/src/services/conversation-registry.test.ts +235 -0
  569. package/src/services/conversation-registry.ts +264 -0
  570. package/src/services/desktop-fused-ffi-backend-runtime.ts +431 -0
  571. package/src/services/device-bridge.ts +1237 -0
  572. package/src/services/device-resource-metrics.test.ts +98 -0
  573. package/src/services/device-resource-metrics.ts +346 -0
  574. package/src/services/device-tier.test.ts +458 -0
  575. package/src/services/device-tier.ts +502 -0
  576. package/src/services/downloader.test.ts +888 -0
  577. package/src/services/downloader.ts +1039 -0
  578. package/src/services/engine-direct-bundle.test.ts +90 -0
  579. package/src/services/engine-streaming.test.ts +80 -0
  580. package/src/services/engine.ts +2096 -0
  581. package/src/services/ensure-local-artifacts.integration.test.ts +273 -0
  582. package/src/services/ensure-local-artifacts.test.ts +368 -0
  583. package/src/services/ensure-local-artifacts.ts +351 -0
  584. package/src/services/external-scanner.ts +312 -0
  585. package/src/services/ffi-llm-mock.ts +354 -0
  586. package/src/services/ffi-llm-streaming-abi.ts +445 -0
  587. package/src/services/ffi-streaming-backend.ts +418 -0
  588. package/src/services/ffi-streaming-runner.test.ts +220 -0
  589. package/src/services/ffi-streaming-runner.ts +407 -0
  590. package/src/services/ffi-unload-ordering.test.ts +166 -0
  591. package/src/services/fused-eliza1-no-regression.test.ts +144 -0
  592. package/src/services/gpu-autotune.ts +534 -0
  593. package/src/services/gpu-detect.ts +139 -0
  594. package/src/services/handler-registry.ts +240 -0
  595. package/src/services/hardware.test.ts +236 -0
  596. package/src/services/hardware.ts +438 -0
  597. package/src/services/image-description-runtime.test.ts +61 -0
  598. package/src/services/image-description-runtime.ts +118 -0
  599. package/src/services/imagegen/aosp-unavailable.ts +229 -0
  600. package/src/services/imagegen/backend-selector.test.ts +190 -0
  601. package/src/services/imagegen/backend-selector.ts +277 -0
  602. package/src/services/imagegen/coreml-unavailable.ts +237 -0
  603. package/src/services/imagegen/errors.ts +40 -0
  604. package/src/services/imagegen/index.ts +144 -0
  605. package/src/services/imagegen/mflux.ts +313 -0
  606. package/src/services/imagegen/sd-cpp.ts +715 -0
  607. package/src/services/imagegen/tensorrt-unavailable.ts +295 -0
  608. package/src/services/imagegen/types.ts +193 -0
  609. package/src/services/index.ts +229 -0
  610. package/src/services/inference-capabilities.test.ts +75 -0
  611. package/src/services/inference-capabilities.ts +204 -0
  612. package/src/services/inference-telemetry.ts +143 -0
  613. package/src/services/ios-llama-streaming.ts +248 -0
  614. package/src/services/kv-spill.test.ts +222 -0
  615. package/src/services/kv-spill.ts +357 -0
  616. package/src/services/latency-trace.test.ts +266 -0
  617. package/src/services/latency-trace.ts +844 -0
  618. package/src/services/lib-target.test.ts +145 -0
  619. package/src/services/lib-target.ts +102 -0
  620. package/src/services/live-signals.test.ts +132 -0
  621. package/src/services/live-signals.ts +177 -0
  622. package/src/services/llama-server-metrics.test.ts +168 -0
  623. package/src/services/llama-server-metrics.ts +304 -0
  624. package/src/services/llm-streaming-binding.ts +136 -0
  625. package/src/services/load-args.ts +81 -0
  626. package/src/services/manifest/eliza-1.manifest.v1.json +790 -0
  627. package/src/services/manifest/index.ts +72 -0
  628. package/src/services/manifest/manifest.test.ts +791 -0
  629. package/src/services/manifest/schema.ts +761 -0
  630. package/src/services/manifest/types.ts +61 -0
  631. package/src/services/manifest/validator.ts +633 -0
  632. package/src/services/memory-arbiter.test.ts +558 -0
  633. package/src/services/memory-arbiter.ts +991 -0
  634. package/src/services/memory-benchmark.test.ts +91 -0
  635. package/src/services/memory-benchmark.ts +354 -0
  636. package/src/services/memory-monitor.test.ts +232 -0
  637. package/src/services/memory-monitor.ts +309 -0
  638. package/src/services/memory-pressure.ts +414 -0
  639. package/src/services/mtp-doctor.ts +86 -0
  640. package/src/services/network-policy.ts +346 -0
  641. package/src/services/paths.ts +25 -0
  642. package/src/services/planner-skeleton.ts +175 -0
  643. package/src/services/providers.ts +507 -0
  644. package/src/services/ram-budget-cache.test.ts +164 -0
  645. package/src/services/ram-budget.ts +309 -0
  646. package/src/services/readiness.test.ts +87 -0
  647. package/src/services/readiness.ts +238 -0
  648. package/src/services/recommendation.test.ts +216 -0
  649. package/src/services/recommendation.ts +671 -0
  650. package/src/services/registry.ts +157 -0
  651. package/src/services/required-kernels-gate.test.ts +64 -0
  652. package/src/services/router-handler.test.ts +45 -0
  653. package/src/services/router-handler.ts +426 -0
  654. package/src/services/routing-policy.test.ts +352 -0
  655. package/src/services/routing-policy.ts +367 -0
  656. package/src/services/routing-preferences.ts +17 -0
  657. package/src/services/runtime-target.ts +154 -0
  658. package/src/services/service.test.ts +223 -0
  659. package/src/services/service.ts +750 -0
  660. package/src/services/session-pool.ts +153 -0
  661. package/src/services/structured-output/deterministic-repair.test.ts +169 -0
  662. package/src/services/structured-output/deterministic-repair.ts +443 -0
  663. package/src/services/structured-output/index.ts +4 -0
  664. package/src/services/structured-output.test.ts +483 -0
  665. package/src/services/structured-output.ts +712 -0
  666. package/src/services/system-memory.test.ts +47 -0
  667. package/src/services/system-memory.ts +67 -0
  668. package/src/services/transcription-priority.test.ts +211 -0
  669. package/src/services/types.ts +59 -0
  670. package/src/services/verify-on-device.test.ts +87 -0
  671. package/src/services/verify-on-device.ts +127 -0
  672. package/src/services/verify.ts +13 -0
  673. package/src/services/vision/aosp-unavailable.ts +163 -0
  674. package/src/services/vision/capacitor-llama.ts +255 -0
  675. package/src/services/vision/cloud-fallback.test.ts +243 -0
  676. package/src/services/vision/cloud-fallback.ts +268 -0
  677. package/src/services/vision/fallback-chain.test.ts +86 -0
  678. package/src/services/vision/hash.ts +157 -0
  679. package/src/services/vision/index.ts +251 -0
  680. package/src/services/vision/llama-server.ts +177 -0
  681. package/src/services/vision/types.ts +163 -0
  682. package/src/services/vision/vast-fallback.ts +127 -0
  683. package/src/services/vision-embedding-cache.ts +189 -0
  684. package/src/services/voice/VOICE_WORKBENCH.md +133 -0
  685. package/src/services/voice/__fixtures__/voice-workbench-logic-baseline.json +180 -0
  686. package/src/services/voice/__test-helpers__/fake-ffi.ts +94 -0
  687. package/src/services/voice/__test-helpers__/synthetic-speech.ts +194 -0
  688. package/src/services/voice/__tests__/checkpoint-manager.test.ts +241 -0
  689. package/src/services/voice/__tests__/checkpoint-policy.test.ts +270 -0
  690. package/src/services/voice/__tests__/eager-context-builder.test.ts +257 -0
  691. package/src/services/voice/__tests__/eliza1-eot-scorer.test.ts +288 -0
  692. package/src/services/voice/__tests__/eot-classifier.test.ts +431 -0
  693. package/src/services/voice/__tests__/optimistic-rollback.test.ts +312 -0
  694. package/src/services/voice/__tests__/prefill-client.test.ts +266 -0
  695. package/src/services/voice/__tests__/prefix-preserving-queue.test.ts +208 -0
  696. package/src/services/voice/__tests__/streaming-asr.test.ts +450 -0
  697. package/src/services/voice/__tests__/streaming-transcriber.test.ts +339 -0
  698. package/src/services/voice/__tests__/turn-detector-resolver.test.ts +195 -0
  699. package/src/services/voice/__tests__/voice-state-machine-prefill.test.ts +275 -0
  700. package/src/services/voice/__tests__/voice-state-machine.test.ts +354 -0
  701. package/src/services/voice/acoustic-speaker-attribution.test.ts +165 -0
  702. package/src/services/voice/acoustic-speaker-attribution.ts +336 -0
  703. package/src/services/voice/asr-timed.real.test.ts +139 -0
  704. package/src/services/voice/audio-frame-consumer.test.ts +669 -0
  705. package/src/services/voice/audio-frame-consumer.ts +651 -0
  706. package/src/services/voice/barge-in.test.ts +244 -0
  707. package/src/services/voice/barge-in.ts +335 -0
  708. package/src/services/voice/cancellation-coordinator.test.ts +196 -0
  709. package/src/services/voice/cancellation-coordinator.ts +269 -0
  710. package/src/services/voice/checkpoint-manager.ts +401 -0
  711. package/src/services/voice/checkpoint-policy.ts +336 -0
  712. package/src/services/voice/composite-eot-classifier.test.ts +59 -0
  713. package/src/services/voice/corpus-augment.test.ts +276 -0
  714. package/src/services/voice/corpus-augment.ts +451 -0
  715. package/src/services/voice/corpus-generator.test.ts +201 -0
  716. package/src/services/voice/corpus-generator.ts +413 -0
  717. package/src/services/voice/diarization-error-rate.greedy.test.ts +140 -0
  718. package/src/services/voice/diarization-error-rate.test.ts +100 -0
  719. package/src/services/voice/diarization-error-rate.ts +249 -0
  720. package/src/services/voice/e2e-harness.der.test.ts +94 -0
  721. package/src/services/voice/e2e-harness.respond-eot-entity.test.ts +277 -0
  722. package/src/services/voice/e2e-harness.security-echo.test.ts +103 -0
  723. package/src/services/voice/e2e-harness.test.ts +182 -0
  724. package/src/services/voice/e2e-harness.ts +902 -0
  725. package/src/services/voice/eager-context-builder.ts +262 -0
  726. package/src/services/voice/echo-delay.test.ts +118 -0
  727. package/src/services/voice/echo-delay.ts +135 -0
  728. package/src/services/voice/echo-metrics.test.ts +17 -0
  729. package/src/services/voice/echo-metrics.ts +20 -0
  730. package/src/services/voice/echo-reference-buffer.test.ts +86 -0
  731. package/src/services/voice/echo-reference-buffer.ts +165 -0
  732. package/src/services/voice/eliza1-eot-scorer.ts +242 -0
  733. package/src/services/voice/embedding-server.ts +200 -0
  734. package/src/services/voice/embedding.test.ts +131 -0
  735. package/src/services/voice/embedding.ts +242 -0
  736. package/src/services/voice/emotion-attribution.test.ts +129 -0
  737. package/src/services/voice/emotion-attribution.ts +361 -0
  738. package/src/services/voice/engine-bridge-cancellation.test.ts +422 -0
  739. package/src/services/voice/engine-bridge-transcript-join.test.ts +278 -0
  740. package/src/services/voice/engine-bridge.test.ts +384 -0
  741. package/src/services/voice/engine-bridge.ts +2343 -0
  742. package/src/services/voice/eot-classifier-ggml.ts +569 -0
  743. package/src/services/voice/eot-classifier.test.ts +98 -0
  744. package/src/services/voice/eot-classifier.ts +422 -0
  745. package/src/services/voice/errors.ts +34 -0
  746. package/src/services/voice/expressive-tags.asr.test.ts +77 -0
  747. package/src/services/voice/expressive-tags.test.ts +102 -0
  748. package/src/services/voice/expressive-tags.ts +405 -0
  749. package/src/services/voice/ffi-bindings.test.ts +735 -0
  750. package/src/services/voice/ffi-bindings.ts +3387 -0
  751. package/src/services/voice/first-line-cache.ts +725 -0
  752. package/src/services/voice/fused-eot-scorer.ts +139 -0
  753. package/src/services/voice/index.ts +502 -0
  754. package/src/services/voice/kokoro/__tests__/kokoro-backend.test.ts +262 -0
  755. package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.real.test.ts +236 -0
  756. package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.test.ts +60 -0
  757. package/src/services/voice/kokoro/__tests__/kokoro-engine-discovery.test.ts +277 -0
  758. package/src/services/voice/kokoro/__tests__/kokoro-ffi-runtime.test.ts +235 -0
  759. package/src/services/voice/kokoro/__tests__/kokoro-runtime.test.ts +95 -0
  760. package/src/services/voice/kokoro/__tests__/phonemizer.test.ts +53 -0
  761. package/src/services/voice/kokoro/__tests__/runtime-selection.test.ts +67 -0
  762. package/src/services/voice/kokoro/__tests__/voices.test.ts +57 -0
  763. package/src/services/voice/kokoro/index.ts +79 -0
  764. package/src/services/voice/kokoro/kokoro-backend.ts +223 -0
  765. package/src/services/voice/kokoro/kokoro-engine-discovery.ts +177 -0
  766. package/src/services/voice/kokoro/kokoro-ffi-runtime.ts +233 -0
  767. package/src/services/voice/kokoro/kokoro-runtime.ts +170 -0
  768. package/src/services/voice/kokoro/phoneme-stream.ts +123 -0
  769. package/src/services/voice/kokoro/phonemizer.ts +344 -0
  770. package/src/services/voice/kokoro/pick-runtime.test.ts +91 -0
  771. package/src/services/voice/kokoro/pick-runtime.ts +130 -0
  772. package/src/services/voice/kokoro/runtime-selection.ts +64 -0
  773. package/src/services/voice/kokoro/types.ts +95 -0
  774. package/src/services/voice/kokoro/voice-presets.ts +129 -0
  775. package/src/services/voice/kokoro/voices.ts +64 -0
  776. package/src/services/voice/lifecycle.test.ts +315 -0
  777. package/src/services/voice/lifecycle.ts +301 -0
  778. package/src/services/voice/live-diarization-session.echo.test.ts +232 -0
  779. package/src/services/voice/live-diarization-session.ts +622 -0
  780. package/src/services/voice/metric-math.test.ts +61 -0
  781. package/src/services/voice/metric-math.ts +25 -0
  782. package/src/services/voice/mic-source.test.ts +210 -0
  783. package/src/services/voice/mic-source.ts +503 -0
  784. package/src/services/voice/nlms-echo-canceller.test.ts +244 -0
  785. package/src/services/voice/nlms-echo-canceller.ts +317 -0
  786. package/src/services/voice/optimistic-policy.power-source.test.ts +36 -0
  787. package/src/services/voice/optimistic-policy.test.ts +101 -0
  788. package/src/services/voice/optimistic-policy.ts +192 -0
  789. package/src/services/voice/optimistic-rollback.ts +343 -0
  790. package/src/services/voice/partial-stabilizer.test.ts +68 -0
  791. package/src/services/voice/partial-stabilizer.ts +140 -0
  792. package/src/services/voice/phoneme-tokenizer.ts +158 -0
  793. package/src/services/voice/phrase-cache.test.ts +242 -0
  794. package/src/services/voice/phrase-cache.ts +186 -0
  795. package/src/services/voice/phrase-chunker.test.ts +239 -0
  796. package/src/services/voice/phrase-chunker.ts +281 -0
  797. package/src/services/voice/pipeline-impls.l6.test.ts +110 -0
  798. package/src/services/voice/pipeline-impls.test.ts +292 -0
  799. package/src/services/voice/pipeline-impls.ts +315 -0
  800. package/src/services/voice/pipeline.ts +504 -0
  801. package/src/services/voice/prefill-client.ts +316 -0
  802. package/src/services/voice/prefix-preserving-queue.ts +162 -0
  803. package/src/services/voice/profile-store.ts +887 -0
  804. package/src/services/voice/real-audio-decode.test.ts +148 -0
  805. package/src/services/voice/research/VOICE_8785_ASSESSMENT.md +141 -0
  806. package/src/services/voice/research/VOICE_PIPELINE_RESEARCH_2026.md +117 -0
  807. package/src/services/voice/research/VOICE_VALIDATION_RUNBOOK.md +135 -0
  808. package/src/services/voice/ring-buffer.test.ts +129 -0
  809. package/src/services/voice/ring-buffer.ts +123 -0
  810. package/src/services/voice/rollback-queue.ts +74 -0
  811. package/src/services/voice/samantha-preset-placeholder.test.ts +97 -0
  812. package/src/services/voice/samantha-preset-placeholder.ts +148 -0
  813. package/src/services/voice/samantha-preset-regenerator.ts +393 -0
  814. package/src/services/voice/samantha-preset-regenerator.wav.test.ts +90 -0
  815. package/src/services/voice/scheduler.t2.test.ts +141 -0
  816. package/src/services/voice/scheduler.ts +927 -0
  817. package/src/services/voice/self-voice-imprint.test.ts +59 -0
  818. package/src/services/voice/self-voice-imprint.ts +102 -0
  819. package/src/services/voice/shared-resources.ts +343 -0
  820. package/src/services/voice/speaker/attribution-pipeline.test.ts +221 -0
  821. package/src/services/voice/speaker/attribution-pipeline.ts +449 -0
  822. package/src/services/voice/speaker/diarizer-fused.real.test.ts +100 -0
  823. package/src/services/voice/speaker/diarizer-fused.ts +154 -0
  824. package/src/services/voice/speaker/diarizer.ts +218 -0
  825. package/src/services/voice/speaker/encoder-fused.real.test.ts +113 -0
  826. package/src/services/voice/speaker/encoder-fused.ts +138 -0
  827. package/src/services/voice/speaker/encoder-ggml.test.ts +59 -0
  828. package/src/services/voice/speaker/encoder-ggml.ts +79 -0
  829. package/src/services/voice/speaker/encoder.ts +105 -0
  830. package/src/services/voice/speaker-imprint.test.ts +185 -0
  831. package/src/services/voice/speaker-imprint.ts +312 -0
  832. package/src/services/voice/speaker-preset-cache.test.ts +154 -0
  833. package/src/services/voice/speaker-preset-cache.ts +195 -0
  834. package/src/services/voice/streaming-asr/streaming-pipeline-adapter.ts +292 -0
  835. package/src/services/voice/system-audio-sink.test.ts +29 -0
  836. package/src/services/voice/system-audio-sink.ts +366 -0
  837. package/src/services/voice/transcriber.asr-backend.test.ts +76 -0
  838. package/src/services/voice/transcriber.test.ts +392 -0
  839. package/src/services/voice/transcriber.ts +704 -0
  840. package/src/services/voice/transcript-knowledge.test.ts +68 -0
  841. package/src/services/voice/transcript-knowledge.ts +75 -0
  842. package/src/services/voice/transcript-service.test.ts +195 -0
  843. package/src/services/voice/transcript-service.ts +205 -0
  844. package/src/services/voice/transcript-store.test.ts +189 -0
  845. package/src/services/voice/transcript-store.ts +164 -0
  846. package/src/services/voice/turn-controller.test.ts +575 -0
  847. package/src/services/voice/turn-controller.ts +596 -0
  848. package/src/services/voice/types.ts +699 -0
  849. package/src/services/voice/vad.test.ts +498 -0
  850. package/src/services/voice/vad.ts +832 -0
  851. package/src/services/voice/vad.v1-v4.test.ts +222 -0
  852. package/src/services/voice/voice-budget.test.ts +415 -0
  853. package/src/services/voice/voice-budget.ts +635 -0
  854. package/src/services/voice/voice-duet.test.ts +375 -0
  855. package/src/services/voice/voice-emotion-classifier.test.ts +210 -0
  856. package/src/services/voice/voice-emotion-classifier.ts +273 -0
  857. package/src/services/voice/voice-hardening.fuzz.test.ts +116 -0
  858. package/src/services/voice/voice-preload-predictor.test.ts +130 -0
  859. package/src/services/voice/voice-preload-predictor.ts +113 -0
  860. package/src/services/voice/voice-preset-format.fuzz.test.ts +89 -0
  861. package/src/services/voice/voice-preset-format.test.ts +75 -0
  862. package/src/services/voice/voice-preset-format.ts +713 -0
  863. package/src/services/voice/voice-preset-generator.test.ts +89 -0
  864. package/src/services/voice/voice-profile-artifact.test.ts +138 -0
  865. package/src/services/voice/voice-profile-artifact.ts +518 -0
  866. package/src/services/voice/voice-profile-routes.test.ts +429 -0
  867. package/src/services/voice/voice-profile-routes.ts +425 -0
  868. package/src/services/voice/voice-scenario.test.ts +159 -0
  869. package/src/services/voice/voice-scenario.ts +280 -0
  870. package/src/services/voice/voice-scenario.turn-helpers.test.ts +77 -0
  871. package/src/services/voice/voice-state-machine.ts +727 -0
  872. package/src/services/voice/voice-workbench-report.test.ts +168 -0
  873. package/src/services/voice/voice-workbench-report.ts +367 -0
  874. package/src/services/voice/voice-workbench.test.ts +158 -0
  875. package/src/services/voice/voice.test.ts +1070 -0
  876. package/src/services/voice/wake-word-ggml.ts +319 -0
  877. package/src/services/voice/wake-word.test.ts +298 -0
  878. package/src/services/voice/wake-word.ts +554 -0
  879. package/src/services/voice/wav-codec.fuzz.test.ts +59 -0
  880. package/src/services/voice/wav-codec.test.ts +32 -0
  881. package/src/services/voice/wav-codec.ts +101 -0
  882. package/src/services/voice/workbench-entrypoint.test.ts +55 -0
  883. package/src/services/voice/workbench-entrypoint.ts +88 -0
  884. package/src/services/voice/workbench-headless-runner.test.ts +162 -0
  885. package/src/services/voice/workbench-headless-runner.ts +396 -0
  886. package/src/services/voice/workbench-logic-services.test.ts +225 -0
  887. package/src/services/voice/workbench-logic-services.ts +184 -0
  888. package/src/services/voice/workbench-real-services.ts +629 -0
  889. package/src/services/voice/workbench-scenarios.ts +407 -0
  890. package/src/services/voice/wrap-with-first-line-cache.ts +267 -0
  891. package/src/services/voice-model-updater.ts +724 -0
  892. package/src/services/voice-prewarm.ts +51 -0
  893. package/src/voice-workbench.ts +71 -0
@@ -0,0 +1,157 @@
1
+ /**
2
+ * On-disk registry of installed models.
3
+ *
4
+ * The default registry contains only Eliza-owned downloads
5
+ * (source: "eliza-download") written on successful completion by the
6
+ * curated bundle downloader. External scans are developer-only diagnostics
7
+ * behind `ELIZA_LOCAL_INFERENCE_ENABLE_EXTERNAL_SCAN=1`; they never enter
8
+ * first-run, setup, or normal Settings surfaces.
9
+ */
10
+
11
+ import fs from "node:fs/promises";
12
+ import path from "node:path";
13
+ import { scanExternalModels } from "./external-scanner";
14
+ import { isWithinElizaRoot, localInferenceRoot, registryPath } from "./paths";
15
+ import { type InstalledModel, withRuntimeClass } from "./types";
16
+
17
+ interface RegistryFile {
18
+ version: 1;
19
+ models: InstalledModel[];
20
+ }
21
+
22
+ async function ensureRootDir(): Promise<void> {
23
+ await fs.mkdir(localInferenceRoot(), { recursive: true });
24
+ }
25
+
26
+ async function readElizaOwned(): Promise<InstalledModel[]> {
27
+ try {
28
+ const raw = await fs.readFile(registryPath(), "utf8");
29
+ const parsed = JSON.parse(raw) as RegistryFile;
30
+ if (parsed?.version !== 1 || !Array.isArray(parsed.models)) {
31
+ return [];
32
+ }
33
+ return parsed.models.filter(
34
+ (m): m is InstalledModel =>
35
+ m && typeof m === "object" && m.source === "eliza-download",
36
+ );
37
+ } catch {
38
+ return [];
39
+ }
40
+ }
41
+
42
+ async function writeElizaOwned(models: InstalledModel[]): Promise<void> {
43
+ await ensureRootDir();
44
+ const tmp = `${registryPath()}.tmp`;
45
+ const payload: RegistryFile = { version: 1, models };
46
+ await fs.writeFile(tmp, JSON.stringify(payload, null, 2), "utf8");
47
+ await fs.rename(tmp, registryPath());
48
+ }
49
+
50
+ function externalScanEnabled(): boolean {
51
+ const value =
52
+ process.env.ELIZA_LOCAL_INFERENCE_ENABLE_EXTERNAL_SCAN?.trim().toLowerCase();
53
+ return value === "1" || value === "true" || value === "yes";
54
+ }
55
+
56
+ /**
57
+ * Return models currently usable by the curated local-inference path.
58
+ *
59
+ * Normal product behavior is Eliza-1 only. The external scan remains available
60
+ * only to developers who explicitly opt into the old arbitrary-GGUF diagnostic
61
+ * path with `ELIZA_LOCAL_INFERENCE_ENABLE_EXTERNAL_SCAN=1`.
62
+ */
63
+ export async function listInstalledModels(): Promise<InstalledModel[]> {
64
+ const owned = await readElizaOwned();
65
+ if (!externalScanEnabled()) return owned;
66
+
67
+ // Filter out Eliza-owned files that also survived a reboot of the local
68
+ // file and got re-detected by the scanner.
69
+ const external = await scanExternalModels();
70
+ const ownedPaths = new Set(owned.map((m) => path.resolve(m.path)));
71
+ const dedupedExternal = external.filter(
72
+ (m) => !ownedPaths.has(path.resolve(m.path)),
73
+ );
74
+
75
+ // Backfill `runtimeClass` once, at the canonical read boundary: legacy
76
+ // registry rows and freshly scanned external models predate the field.
77
+ // Downstream (dispatcher, load-arg resolver, UI) reads the field rather
78
+ // than re-deriving the class from the id.
79
+ return [...owned, ...dedupedExternal].map(withRuntimeClass);
80
+ }
81
+
82
+ /** Add or update a Eliza-owned entry. External entries are rejected. */
83
+ export async function upsertElizaModel(model: InstalledModel): Promise<void> {
84
+ if (model.source !== "eliza-download") {
85
+ throw new Error(
86
+ "[local-inference] registry only accepts Eliza-owned models",
87
+ );
88
+ }
89
+ if (!isWithinElizaRoot(model.path)) {
90
+ throw new Error(
91
+ "[local-inference] Eliza-owned models must live under the local-inference root",
92
+ );
93
+ }
94
+ if (model.bundleRoot && !isWithinElizaRoot(model.bundleRoot)) {
95
+ throw new Error(
96
+ "[local-inference] Eliza-owned bundle roots must live under the local-inference root",
97
+ );
98
+ }
99
+ if (model.manifestPath && !isWithinElizaRoot(model.manifestPath)) {
100
+ throw new Error(
101
+ "[local-inference] Eliza-owned manifests must live under the local-inference root",
102
+ );
103
+ }
104
+ const owned = await readElizaOwned();
105
+ const withoutCurrent = owned.filter((m) => m.id !== model.id);
106
+ withoutCurrent.push(model);
107
+ await writeElizaOwned(withoutCurrent);
108
+ }
109
+
110
+ /** Mark an existing Eliza-owned model as most-recently-used. */
111
+ export async function touchElizaModel(id: string): Promise<void> {
112
+ const owned = await readElizaOwned();
113
+ const target = owned.find((m) => m.id === id);
114
+ if (!target) return;
115
+ target.lastUsedAt = new Date().toISOString();
116
+ await writeElizaOwned(owned);
117
+ }
118
+
119
+ /**
120
+ * Delete a Eliza-owned model from the registry and from disk.
121
+ *
122
+ * Refuses if the model was discovered from another tool — Eliza must not
123
+ * touch files it doesn't own. Callers surface that refusal as a 4xx.
124
+ */
125
+ export async function removeElizaModel(id: string): Promise<{
126
+ removed: boolean;
127
+ reason?: "external" | "not-found";
128
+ }> {
129
+ const owned = await readElizaOwned();
130
+ const target = owned.find((m) => m.id === id);
131
+ if (!target) {
132
+ // Check whether it's a known external entry so we can return a
133
+ // helpful error message instead of 404.
134
+ const external = await scanExternalModels();
135
+ if (external.some((m) => m.id === id)) {
136
+ return { removed: false, reason: "external" };
137
+ }
138
+ return { removed: false, reason: "not-found" };
139
+ }
140
+
141
+ if (!isWithinElizaRoot(target.path)) {
142
+ return { removed: false, reason: "external" };
143
+ }
144
+
145
+ const removePath =
146
+ target.bundleRoot && isWithinElizaRoot(target.bundleRoot)
147
+ ? target.bundleRoot
148
+ : target.path;
149
+ try {
150
+ await fs.rm(removePath, { recursive: true, force: true });
151
+ } catch {
152
+ // If the file was already gone we still want to clear the registry entry.
153
+ }
154
+
155
+ await writeElizaOwned(owned.filter((m) => m.id !== id));
156
+ return { removed: true };
157
+ }
@@ -0,0 +1,64 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import {
3
+ assertRequiredKernelsPresent,
4
+ MissingRequiredKernelsError,
5
+ } from "./active-model";
6
+ import type { Eliza1Manifest } from "./manifest";
7
+ import { REQUIRED_KERNELS_BY_TIER } from "./manifest";
8
+ import type { ManifestLoader } from "./ram-budget";
9
+ import type { InstalledModel } from "./types";
10
+
11
+ function installed2b(): InstalledModel {
12
+ return {
13
+ id: "eliza-1-2b",
14
+ displayName: "Eliza-1 2B",
15
+ path: "/tmp/eliza-1-2b/text/model.gguf",
16
+ sizeBytes: 1024,
17
+ installedAt: "2026-05-15T00:00:00.000Z",
18
+ lastUsedAt: null,
19
+ source: "eliza-download",
20
+ };
21
+ }
22
+
23
+ /**
24
+ * `assertRequiredKernelsPresent` reads only `manifest.tier` and
25
+ * `manifest.kernels.required`, so a minimal manifest is sufficient.
26
+ */
27
+ function manifestWithKernels(required: readonly string[]): Eliza1Manifest {
28
+ return {
29
+ tier: "2b",
30
+ kernels: { required },
31
+ } as unknown as Eliza1Manifest;
32
+ }
33
+
34
+ describe("assertRequiredKernelsPresent (native/CLAUDE.md §3#5)", () => {
35
+ it("is a no-op when no manifest is present (bare-GGUF/dev path)", () => {
36
+ const noManifest: ManifestLoader = () => null;
37
+ expect(() =>
38
+ assertRequiredKernelsPresent(installed2b(), noManifest),
39
+ ).not.toThrow();
40
+ });
41
+
42
+ it("is a no-op when the manifest declares every required kernel", () => {
43
+ const ok: ManifestLoader = () =>
44
+ manifestWithKernels(REQUIRED_KERNELS_BY_TIER["2b"]);
45
+ expect(() => assertRequiredKernelsPresent(installed2b(), ok)).not.toThrow();
46
+ });
47
+
48
+ it("throws MissingRequiredKernelsError when a required kernel is absent", () => {
49
+ // The 2B tier requires `turboquant_q4`; a manifest that only declares an
50
+ // optional KV kernel is missing it.
51
+ const broken: ManifestLoader = () => manifestWithKernels(["qjl"]);
52
+ let thrown: unknown;
53
+ try {
54
+ assertRequiredKernelsPresent(installed2b(), broken);
55
+ } catch (err) {
56
+ thrown = err;
57
+ }
58
+ expect(thrown).toBeInstanceOf(MissingRequiredKernelsError);
59
+ const err = thrown as MissingRequiredKernelsError;
60
+ expect(err.tier).toBe("2b");
61
+ expect(err.missing).toContain("turboquant_q4");
62
+ expect(err.modelId).toBe("eliza-1-2b");
63
+ });
64
+ });
@@ -0,0 +1,45 @@
1
+ import { type AgentRuntime, ModelType } from "@elizaos/core";
2
+ import { describe, expect, it, vi } from "vitest";
3
+ import { installRouterHandler, ROUTER_PROVIDER } from "./router-handler";
4
+
5
+ describe("installRouterHandler", () => {
6
+ it("does not register router handlers for skipped slots", () => {
7
+ const registrations: Array<{
8
+ modelType: string;
9
+ provider: string;
10
+ priority?: number;
11
+ }> = [];
12
+ const runtime = {
13
+ registerModel: vi.fn(
14
+ (
15
+ modelType: string,
16
+ _handler: unknown,
17
+ provider: string,
18
+ priority?: number,
19
+ ) => {
20
+ registrations.push({ modelType, provider, priority });
21
+ },
22
+ ),
23
+ } as unknown as AgentRuntime;
24
+
25
+ installRouterHandler(runtime, { skipSlots: ["TEXT_EMBEDDING"] });
26
+
27
+ expect(registrations).toEqual(
28
+ expect.arrayContaining([
29
+ expect.objectContaining({
30
+ modelType: ModelType.TEXT_SMALL,
31
+ provider: ROUTER_PROVIDER,
32
+ }),
33
+ expect.objectContaining({
34
+ modelType: ModelType.TEXT_LARGE,
35
+ provider: ROUTER_PROVIDER,
36
+ }),
37
+ ]),
38
+ );
39
+ expect(
40
+ registrations.some(
41
+ (registration) => registration.modelType === ModelType.TEXT_EMBEDDING,
42
+ ),
43
+ ).toBe(false);
44
+ });
45
+ });
@@ -0,0 +1,426 @@
1
+ /**
2
+ * Top-priority router handler.
3
+ *
4
+ * Registers a model handler for every `AgentModelSlot` at priority
5
+ * `Number.MAX_SAFE_INTEGER`, which guarantees the runtime dispatches to
6
+ * us first. At dispatch time we:
7
+ *
8
+ * 1. Read the user's per-slot policy + preferred-provider choice from
9
+ * `routing-preferences.ts`.
10
+ * 2. Ask the `policyEngine` to pick a provider from the handler
11
+ * registry's current set (excluding ourselves).
12
+ * 3. Invoke that provider's original handler directly — bypassing
13
+ * `runtime.useModel` which would recurse into us.
14
+ * 4. Record the observed latency so later "fastest" picks have data.
15
+ * 5. On handler failure: retry the next eligible provider in priority
16
+ * order until exhausted (except in `manual` mode with an explicit
17
+ * preferred provider — that throws verbatim).
18
+ *
19
+ * If no other handler exists we throw a clear error rather than return
20
+ * garbage — the caller is meant to see "no provider configured" so they
21
+ * know to set one up.
22
+ *
23
+ * Because the router sits at the top of the priority stack, the user's
24
+ * preference is always authoritative regardless of what plugins register
25
+ * at lower priorities. This is the mechanism that unifies cloud + local
26
+ * + device-bridge routing from one settings panel.
27
+ *
28
+ * ## TTS routing precedence (`TEXT_TO_SPEECH` slot)
29
+ *
30
+ * The default per-slot policy is `prefer-local` (see
31
+ * `DEFAULT_ROUTING_POLICY` in `routing-preferences.ts`), which the
32
+ * policyEngine implements by short-circuiting to whichever candidate
33
+ * has provider `eliza-local-inference` / `capacitor-llama` /
34
+ * `eliza-device-bridge`. So even though `plugin-elizacloud` registers
35
+ * its TTS handler at plugin priority 50 (higher than the default 0 of
36
+ * direct providers like ElevenLabs / OpenAI / Groq / Edge-TTS), the
37
+ * router prefers local first when local is registered AND
38
+ * `local-inference` has a TTS-capable handler.
39
+ *
40
+ * Documented routing precedence for `TEXT_TO_SPEECH`:
41
+ *
42
+ * 1. **Local (`eliza-local-inference`)** — tier-aware Eliza-1 voice,
43
+ * using the ordered `ELIZA_1_VOICE_BACKENDS` policy in
44
+ * `@elizaos/shared/local-inference/catalog` (OmniVoice first where
45
+ * bundled, Kokoro fallback where bundled). Always preferred when
46
+ * available.
47
+ * 2. **Eliza Cloud (`elizacloud`)** — managed cloud proxy. Picked when
48
+ * local is unavailable. Throws `CloudTtsUnavailableError` when
49
+ * cloud isn't connected, which the loop above catches and falls
50
+ * through to step 3.
51
+ * 3. **ElevenLabs (`elevenlabs`)** — direct API key path.
52
+ * 4. **OpenAI (`openai`)** — direct API key path.
53
+ * 5. **Groq (`groq`)** — direct API key path.
54
+ * 6. **Edge-TTS (`edge-tts`)** — free Microsoft Edge endpoint, no key.
55
+ *
56
+ * Same precedence applies to `TRANSCRIPTION`, with the local side using
57
+ * the fused Gemma ASR path when the active bundle stages eligible ASR
58
+ * artifacts (no whisper.cpp fallback).
59
+ *
60
+ * Users can override this per slot via the routing-preferences settings
61
+ * panel (`prefer-local` ↔ `manual` + explicit `preferredProvider`).
62
+ */
63
+
64
+ import type { AgentRuntime, IAgentRuntime } from "@elizaos/core";
65
+ import {
66
+ logger,
67
+ ModelType,
68
+ NoModelProviderConfiguredError,
69
+ } from "@elizaos/core";
70
+ import { readEffectiveAssignments } from "./assignments";
71
+ import { classifyDeviceTier, type DeviceTierAssessment } from "./device-tier";
72
+ import { localInferenceEngine } from "./engine";
73
+ import type { HandlerRegistration } from "./handler-registry";
74
+ import { handlerRegistry } from "./handler-registry";
75
+ import { probeHardware } from "./hardware";
76
+ import { type LiveDeviceSignals, readLiveDeviceSignals } from "./live-signals";
77
+ import { policyEngine } from "./routing-policy";
78
+ import {
79
+ DEFAULT_ROUTING_POLICY,
80
+ type RoutingPolicy,
81
+ readRoutingPreferences,
82
+ } from "./routing-preferences";
83
+ import { AGENT_MODEL_SLOTS, type AgentModelSlot } from "./types";
84
+
85
+ export const ROUTER_PROVIDER = "eliza-router";
86
+ /**
87
+ * Max safe integer keeps us at the top even if a plugin registers with
88
+ * a very high priority. If someone deliberately wants to outrank us,
89
+ * they can register with Infinity — unlikely in practice.
90
+ */
91
+ const ROUTER_PRIORITY = Number.MAX_SAFE_INTEGER;
92
+
93
+ /**
94
+ * The device-tier assessment drives the `auto` policy (and softly hints
95
+ * `prefer-local`). Probing hardware is cheap but not free, so cache the
96
+ * assessment for a short window — long enough to avoid re-probing on every
97
+ * model call, short enough that the live free-RAM demotion stays roughly
98
+ * current. The live thermal / throughput signals are read fresh per call (they
99
+ * change fast and are cheap to read), not cached.
100
+ */
101
+ const DEVICE_TIER_TTL_MS = 30_000;
102
+ let cachedDeviceTier: { at: number; assessment: DeviceTierAssessment } | null =
103
+ null;
104
+
105
+ async function resolveDeviceTier(): Promise<DeviceTierAssessment | null> {
106
+ const now = Date.now();
107
+ if (cachedDeviceTier && now - cachedDeviceTier.at < DEVICE_TIER_TTL_MS) {
108
+ return cachedDeviceTier.assessment;
109
+ }
110
+ const probe = await probeHardware();
111
+ const assessment = classifyDeviceTier(probe);
112
+ cachedDeviceTier = { at: now, assessment };
113
+ return assessment;
114
+ }
115
+
116
+ function readBooleanEnv(name: string): boolean {
117
+ const value =
118
+ typeof process !== "undefined" ? process.env[name]?.trim() : undefined;
119
+ if (!value) {
120
+ return false;
121
+ }
122
+ return value === "1" || value.toLowerCase() === "true";
123
+ }
124
+
125
+ /**
126
+ * Runtime's registerModel type, narrowed for our use. The core signature
127
+ * lets the handler return any model type; for routing we only care that
128
+ * we can call it and await a result.
129
+ */
130
+ type AnyHandler = (
131
+ runtime: IAgentRuntime,
132
+ params: Record<string, unknown>,
133
+ ) => Promise<unknown>;
134
+
135
+ function slotToModelType(slot: AgentModelSlot): string | undefined {
136
+ switch (slot) {
137
+ case "TEXT_SMALL":
138
+ return ModelType.TEXT_SMALL;
139
+ case "TEXT_LARGE":
140
+ return ModelType.TEXT_LARGE;
141
+ case "TEXT_EMBEDDING":
142
+ return ModelType.TEXT_EMBEDDING;
143
+ case "TEXT_TO_SPEECH":
144
+ return ModelType.TEXT_TO_SPEECH;
145
+ case "TRANSCRIPTION":
146
+ return ModelType.TRANSCRIPTION;
147
+ }
148
+ }
149
+
150
+ function modelTypeToSlot(modelType: string): AgentModelSlot | null {
151
+ for (const slot of AGENT_MODEL_SLOTS) {
152
+ if (slotToModelType(slot) === modelType) return slot;
153
+ }
154
+ return null;
155
+ }
156
+
157
+ function shouldForceLocalInference(
158
+ policy: string,
159
+ preferredProvider: string | null,
160
+ ): boolean {
161
+ // Keep the local-inference candidate even when no text model is assigned/loaded
162
+ // when the policy guarantees on-device routing: an explicit manual pin, or the
163
+ // `local-only` policy (which must never fall back to cloud).
164
+ if (policy === "local-only") return true;
165
+ return policy === "manual" && preferredProvider === "eliza-local-inference";
166
+ }
167
+
168
+ function getRuntimeModelCandidates(
169
+ runtime: IAgentRuntime,
170
+ modelType: string,
171
+ ): HandlerRegistration[] {
172
+ const models = (runtime as { models?: unknown }).models;
173
+ if (!(models instanceof Map)) return [];
174
+ const registrations = models.get(modelType);
175
+ if (!Array.isArray(registrations)) return [];
176
+ return registrations
177
+ .filter(
178
+ (
179
+ entry,
180
+ ): entry is {
181
+ provider: string;
182
+ priority?: number;
183
+ handler: HandlerRegistration["handler"];
184
+ } =>
185
+ entry &&
186
+ typeof entry === "object" &&
187
+ typeof (entry as { provider?: unknown }).provider === "string" &&
188
+ (entry as { provider: string }).provider !== ROUTER_PROVIDER &&
189
+ typeof (entry as { handler?: unknown }).handler === "function",
190
+ )
191
+ .map((entry) => ({
192
+ modelType,
193
+ provider: entry.provider,
194
+ priority: typeof entry.priority === "number" ? entry.priority : 0,
195
+ registeredAt: "runtime-introspection",
196
+ handler: entry.handler,
197
+ }))
198
+ .sort((a, b) => b.priority - a.priority);
199
+ }
200
+
201
+ export function filterUnavailableLocalInferenceCandidates(
202
+ candidates: HandlerRegistration[],
203
+ localInferenceAvailable: boolean,
204
+ forceLocalInference: boolean,
205
+ ): HandlerRegistration[] {
206
+ if (forceLocalInference || localInferenceAvailable) {
207
+ return candidates;
208
+ }
209
+
210
+ return candidates.filter(
211
+ (candidate) => candidate.provider !== "eliza-local-inference",
212
+ );
213
+ }
214
+
215
+ export async function filterUnavailableLocalInference(
216
+ slot: AgentModelSlot,
217
+ policy: string,
218
+ preferredProvider: string | null,
219
+ candidates: HandlerRegistration[],
220
+ ): Promise<HandlerRegistration[]> {
221
+ // TTS is self-sufficient: its handler calls ensureActiveBundleVoiceReady()
222
+ // internally and can use the Kokoro-only bridge on demand.
223
+ if (slot === "TEXT_TO_SPEECH") {
224
+ return candidates;
225
+ }
226
+
227
+ if (slot === "TRANSCRIPTION") {
228
+ return filterUnavailableLocalInferenceCandidates(
229
+ candidates,
230
+ await localInferenceEngine.canTranscribeLocally(),
231
+ shouldForceLocalInference(policy, preferredProvider),
232
+ );
233
+ }
234
+
235
+ const hasLocalInference = candidates.some(
236
+ (candidate) => candidate.provider === "eliza-local-inference",
237
+ );
238
+ if (!hasLocalInference) {
239
+ return candidates;
240
+ }
241
+
242
+ const assignments = await readEffectiveAssignments();
243
+ return filterUnavailableLocalInferenceCandidates(
244
+ candidates,
245
+ Boolean(assignments[slot]) || localInferenceEngine.hasLoadedModel(),
246
+ shouldForceLocalInference(policy, preferredProvider),
247
+ );
248
+ }
249
+
250
+ function makeRouterHandler(slot: AgentModelSlot): AnyHandler {
251
+ return async (runtime, params) => {
252
+ const modelType = slotToModelType(slot);
253
+ if (!modelType) {
254
+ throw new Error(`[router] Unknown agent slot: ${slot}`);
255
+ }
256
+
257
+ // Read the user's policy for this slot. The per-slot policy is canonical;
258
+ // when absent it falls back to the local-first default. ELIZA_LOCAL_ONLY
259
+ // is retained for back-compat only: it sets the *global default* to
260
+ // `local-only`, but an explicit per-slot policy always wins.
261
+ const prefs = await readRoutingPreferences();
262
+ const globalDefault: RoutingPolicy = readBooleanEnv("ELIZA_LOCAL_ONLY")
263
+ ? "local-only"
264
+ : DEFAULT_ROUTING_POLICY;
265
+ const policy: RoutingPolicy = prefs.policy[slot] ?? globalDefault;
266
+ const preferred = prefs.preferredProvider[slot] ?? null;
267
+
268
+ // Ask the policy engine which handler to dispatch to. For automatic
269
+ // policies, honor the documented fallback behaviour: if the selected
270
+ // provider throws, try the next eligible provider instead of surfacing a
271
+ // local/model-specific failure while cloud providers are available.
272
+ const registeredCandidates = handlerRegistry.getForTypeExcluding(
273
+ modelType,
274
+ ROUTER_PROVIDER,
275
+ );
276
+ const candidates = await filterUnavailableLocalInference(
277
+ slot,
278
+ policy,
279
+ preferred,
280
+ registeredCandidates.length > 0
281
+ ? registeredCandidates
282
+ : getRuntimeModelCandidates(runtime, modelType),
283
+ );
284
+
285
+ // Only the capability-aware policies need the hardware assessment + live
286
+ // signals. The tier is cached; the live signals are read fresh.
287
+ let deviceTier: DeviceTierAssessment | null = null;
288
+ let liveSignals: LiveDeviceSignals | null = null;
289
+ if (policy === "auto" || policy === "prefer-local") {
290
+ deviceTier = await resolveDeviceTier();
291
+ }
292
+ if (policy === "auto") {
293
+ liveSignals = readLiveDeviceSignals();
294
+ }
295
+
296
+ const failedProviders = new Set<string>();
297
+ let lastError: unknown = null;
298
+
299
+ while (true) {
300
+ const remaining = candidates.filter(
301
+ (candidate) => !failedProviders.has(candidate.provider),
302
+ );
303
+ const pick = policyEngine.pickProvider({
304
+ modelType,
305
+ policy,
306
+ preferredProvider: preferred,
307
+ candidates: remaining,
308
+ selfProvider: ROUTER_PROVIDER,
309
+ slot,
310
+ deviceTier,
311
+ liveSignals,
312
+ });
313
+
314
+ if (!pick) {
315
+ if (lastError) {
316
+ throw lastError;
317
+ }
318
+ throw new NoModelProviderConfiguredError(
319
+ `[router] No provider registered for ${slot}. Configure a cloud provider, enable local inference, or pair a device.`,
320
+ );
321
+ }
322
+
323
+ policyEngine.recordPick(pick.provider, modelType);
324
+ const start = Date.now();
325
+ try {
326
+ const result = await pick.handler(runtime, params);
327
+ policyEngine.recordLatency(
328
+ pick.provider,
329
+ modelType,
330
+ Date.now() - start,
331
+ );
332
+ return result;
333
+ } catch (err) {
334
+ // Record the timing even on failure so "fastest" doesn't silently
335
+ // prefer providers that error out fast.
336
+ policyEngine.recordLatency(
337
+ pick.provider,
338
+ modelType,
339
+ Date.now() - start,
340
+ );
341
+
342
+ const manualPreferred =
343
+ policy === "manual" &&
344
+ preferred !== null &&
345
+ pick.provider === preferred;
346
+ const hasAlternative = remaining.some(
347
+ (candidate) => candidate.provider !== pick.provider,
348
+ );
349
+ if (manualPreferred || !hasAlternative) {
350
+ throw err;
351
+ }
352
+
353
+ failedProviders.add(pick.provider);
354
+ lastError = err;
355
+ logger.info(
356
+ `[router] Provider ${pick.provider} failed for ${slot}; trying fallback provider (${err instanceof Error ? err.message : String(err)})`,
357
+ );
358
+ }
359
+ }
360
+ };
361
+ }
362
+
363
+ /**
364
+ * Install the router as the top-priority handler for every slot.
365
+ *
366
+ * Idempotent per-runtime via the handler-registry's "last write wins"
367
+ * behaviour — re-registering our handlers just refreshes them in place.
368
+ * Called from `ensure-local-inference-handler.ts` after `handlerRegistry`
369
+ * has been installed on the runtime.
370
+ */
371
+ export interface RouterInstallOptions {
372
+ skipSlots?: readonly AgentModelSlot[];
373
+ }
374
+
375
+ export function installRouterHandler(
376
+ runtime: AgentRuntime,
377
+ options: RouterInstallOptions = {},
378
+ ): void {
379
+ const rt = runtime as AgentRuntime & {
380
+ registerModel?: (
381
+ modelType: string,
382
+ handler: AnyHandler,
383
+ provider: string,
384
+ priority?: number,
385
+ ) => void;
386
+ };
387
+ if (typeof rt.registerModel !== "function") return;
388
+
389
+ const skippedSlots = new Set(options.skipSlots ?? []);
390
+ for (const slot of AGENT_MODEL_SLOTS) {
391
+ if (skippedSlots.has(slot)) continue;
392
+ const modelType = slotToModelType(slot);
393
+ if (!modelType) continue;
394
+ rt.registerModel(
395
+ modelType,
396
+ makeRouterHandler(slot),
397
+ ROUTER_PROVIDER,
398
+ ROUTER_PRIORITY,
399
+ );
400
+ }
401
+ }
402
+
403
+ /** Public helper — useful for diagnostics endpoints. */
404
+ export function describeCurrentRouting(): Array<{
405
+ slot: AgentModelSlot;
406
+ modelType: string;
407
+ candidates: Array<{
408
+ provider: string;
409
+ priority: number;
410
+ }>;
411
+ }> {
412
+ const out: ReturnType<typeof describeCurrentRouting> = [];
413
+ for (const slot of AGENT_MODEL_SLOTS) {
414
+ const modelType = slotToModelType(slot);
415
+ if (!modelType) continue;
416
+ const candidates = handlerRegistry
417
+ .getForTypeExcluding(modelType, ROUTER_PROVIDER)
418
+ .map((c) => ({ provider: c.provider, priority: c.priority }));
419
+ out.push({ slot, modelType, candidates });
420
+ }
421
+ return out;
422
+ }
423
+
424
+ // Re-export so the handler registry can tell whether it's looking at a
425
+ // recursive router registration when filtering.
426
+ export { modelTypeToSlot };