@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,704 @@
1
+ /**
2
+ * Streaming ASR adapters for the local voice pipeline.
3
+ *
4
+ * Implements the `StreamingTranscriber` contract from `voice/types.ts`:
5
+ * PCM frames in (`feed`), running partial-transcript events out, `flush()`
6
+ * to force-finalize on `speech-end`. Two adapters, resolved in priority
7
+ * order by `createStreamingTranscriber()` — both backed by the single fused
8
+ * `libelizainference` build (the SOLE on-device ASR runtime):
9
+ *
10
+ * 1. `FfiStreamingTranscriber` — the FINAL path. Drives the fused
11
+ * `libelizainference` streaming ASR ABI (`eliza_inference_asr_stream_*`,
12
+ * ABI v2 — declared in `packages/app-core/scripts/omnivoice-fuse/ffi.h`,
13
+ * bound in `voice/ffi-bindings.ts`). The C side is W7's job; until the
14
+ * real fused build advertises streaming ASR the binding's `mmap`/`asr`
15
+ * calls return `ELIZA_ERR_NOT_IMPLEMENTED`, which surfaces as a thrown
16
+ * error here. Selected only when `ffi.asrStreamSupported()` is true.
17
+ *
18
+ * 2. `FfiBatchTranscriber` — the contract-clean INTERIM path. Runs the
19
+ * fused build's *batch* decoder (`eliza_inference_asr_transcribe`, ABI
20
+ * v1) over a sliding window with overlap, so each call covers ≤ ~6–7 s
21
+ * of audio — incremental, not "buffer the whole utterance, one giant
22
+ * decode". It lives inside the single shipped llama.cpp/GGML build and
23
+ * emits Gemma text-vocabulary tokens, so it does not vendor a second
24
+ * ggml or introduce a tokenizer-family mismatch.
25
+ * Selected whenever a `libelizainference` handle + bundled ASR model are
26
+ * present (which is always true when the fused build is loaded).
27
+ *
28
+ * If no fused ASR backend can be resolved, `createStreamingTranscriber()`
29
+ * throws `AsrUnavailableError` — a real failure, never a silent
30
+ * empty-transcript degrade and never a fall back to a second ASR runtime
31
+ * (AGENTS.md §3 + §9).
32
+ */
33
+
34
+ import type {
35
+ ElizaInferenceContextHandle,
36
+ ElizaInferenceFfi,
37
+ } from "./ffi-bindings";
38
+ import type {
39
+ PcmFrame,
40
+ StreamingTranscriber,
41
+ TranscriberEvent,
42
+ TranscriberEventListener,
43
+ TranscriptUpdate,
44
+ VadEvent,
45
+ VadEventSource,
46
+ VoiceInputSource,
47
+ VoiceSpeaker,
48
+ VoiceTurnMetadata,
49
+ } from "./types";
50
+
51
+ /** The local voice runtime resamples mic input to 16 kHz mono for ASR. */
52
+ export const ASR_SAMPLE_RATE = 16_000;
53
+
54
+ /**
55
+ * Raised when no ASR backend can be resolved. Distinct error class so the
56
+ * caller (engine, `TRANSCRIPTION` model handler) can surface "ASR is not
57
+ * installed" with an actionable message rather than treating an empty
58
+ * string as a successful transcription.
59
+ */
60
+ export class AsrUnavailableError extends Error {
61
+ constructor(message: string) {
62
+ super(message);
63
+ this.name = "AsrUnavailableError";
64
+ }
65
+ }
66
+
67
+ export type AsrBackendPreference = "auto" | "fused" | "ffi-batch";
68
+
69
+ export function normalizeAsrBackendPreference(
70
+ value: string | null | undefined,
71
+ ): AsrBackendPreference | null {
72
+ const normalized = value?.trim().toLowerCase().replace(/_/g, "-");
73
+ if (!normalized) return null;
74
+ switch (normalized) {
75
+ case "auto":
76
+ return "auto";
77
+ case "fused":
78
+ case "streaming":
79
+ case "fused-streaming":
80
+ return "fused";
81
+ case "batch":
82
+ case "ffi-batch":
83
+ case "fused-batch":
84
+ return "ffi-batch";
85
+ default:
86
+ return null;
87
+ }
88
+ }
89
+
90
+ export function readAsrBackendPreferenceFromEnv(
91
+ env: NodeJS.ProcessEnv = process.env,
92
+ ): AsrBackendPreference | null {
93
+ return normalizeAsrBackendPreference(env.ELIZA_LOCAL_ASR_BACKEND);
94
+ }
95
+
96
+ /* ==================================================================== *
97
+ * Shared base — event fan-out, VAD gating, word detection.
98
+ * ==================================================================== */
99
+
100
+ const WORD_RE = /[\p{L}\p{N}][\p{L}\p{N}'-]*/gu;
101
+ const VAD_PREROLL_MAX_FRAMES = 10;
102
+
103
+ function extractWords(text: string): string[] {
104
+ const out = text.match(WORD_RE);
105
+ return out ? Array.from(out) : [];
106
+ }
107
+
108
+ /**
109
+ * Linear-interpolation resample of mono fp32 PCM. Used to coerce mic
110
+ * frames (commonly 16 / 24 / 48 kHz) to the ASR rate. Not a polyphase
111
+ * filter — adequate for speech ASR; the fused build does its own
112
+ * resampling so this is interim-batch only.
113
+ */
114
+ export function resampleLinear(
115
+ pcm: Float32Array,
116
+ fromRate: number,
117
+ toRate: number,
118
+ ): Float32Array {
119
+ if (fromRate === toRate || pcm.length === 0) return pcm;
120
+ const ratio = toRate / fromRate;
121
+ const outLen = Math.max(1, Math.round(pcm.length * ratio));
122
+ const out = new Float32Array(outLen);
123
+ for (let i = 0; i < outLen; i++) {
124
+ const srcPos = i / ratio;
125
+ const i0 = Math.floor(srcPos);
126
+ const i1 = Math.min(i0 + 1, pcm.length - 1);
127
+ const frac = srcPos - i0;
128
+ out[i] = pcm[i0] * (1 - frac) + pcm[i1] * frac;
129
+ }
130
+ return out;
131
+ }
132
+
133
+ /**
134
+ * Base implementing the boilerplate every adapter shares: listener
135
+ * fan-out, the `words`-once-per-segment latch, and (optional) VAD-event
136
+ * gating. Subclasses implement `onFrame` / `onFlush` / `onDispose` and
137
+ * call `emitPartial` / `emitFinal`.
138
+ */
139
+ export abstract class BaseStreamingTranscriber implements StreamingTranscriber {
140
+ private readonly listeners = new Set<TranscriberEventListener>();
141
+ private metadata: TranscriptMetadataDefaults;
142
+ /** True between `speech-start`/first-frame and the next `flush()`. */
143
+ protected segmentOpen = false;
144
+ /** Latched once `words` is emitted for the current segment. */
145
+ private wordsEmitted = false;
146
+ /** When set, frames are only forwarded while the VAD is in an active speech window. */
147
+ private vadActive: boolean | null = null;
148
+ private readonly vadPrerollFrames: PcmFrame[] = [];
149
+ private vadUnsub: (() => void) | null = null;
150
+ private disposed = false;
151
+
152
+ constructor(vad?: VadEventSource, metadata: TranscriptMetadataDefaults = {}) {
153
+ this.metadata = metadata;
154
+ if (vad) {
155
+ this.vadActive = false;
156
+ this.vadUnsub = vad.onVadEvent((ev) => this.onVadEvent(ev));
157
+ }
158
+ }
159
+
160
+ on(listener: TranscriberEventListener): () => void {
161
+ this.listeners.add(listener);
162
+ return () => this.listeners.delete(listener);
163
+ }
164
+
165
+ /**
166
+ * Update the metadata defaults that `withMetadata()` merges into every
167
+ * partial / final emission. The voice pipeline calls this once the
168
+ * async speaker-ID / diarizer lookup resolves, so the speaker /
169
+ * segments are attached to the rest of the turn without buffering all
170
+ * partials for the lookup.
171
+ */
172
+ setMetadataDefaults(metadata: TranscriptMetadataDefaults): void {
173
+ this.metadata = { ...this.metadata, ...metadata };
174
+ }
175
+
176
+ feed(frame: PcmFrame): void {
177
+ if (this.disposed) {
178
+ throw new Error("[asr] feed() called on a disposed transcriber");
179
+ }
180
+ if (frame.pcm.length === 0) return;
181
+ // VAD gating: while the async VAD is still deciding, retain a tiny
182
+ // leading pre-roll so the first voiced frames are not lost.
183
+ if (this.vadActive === false) {
184
+ this.rememberVadPreroll(frame);
185
+ return;
186
+ }
187
+ if (!this.segmentOpen) {
188
+ this.segmentOpen = true;
189
+ this.wordsEmitted = false;
190
+ }
191
+ this.onFrame(frame);
192
+ }
193
+
194
+ async flush(): Promise<TranscriptUpdate> {
195
+ if (this.disposed) {
196
+ throw new Error("[asr] flush() called on a disposed transcriber");
197
+ }
198
+ const update = this.withMetadata(await this.onFlush());
199
+ this.segmentOpen = false;
200
+ this.wordsEmitted = false;
201
+ this.emit({ kind: "final", update });
202
+ return update;
203
+ }
204
+
205
+ dispose(): void {
206
+ if (this.disposed) return;
207
+ this.disposed = true;
208
+ this.vadUnsub?.();
209
+ this.vadUnsub = null;
210
+ this.listeners.clear();
211
+ this.onDispose();
212
+ }
213
+
214
+ /** Subclass hook: a (VAD-gated) PCM frame for the current speech segment. */
215
+ protected abstract onFrame(frame: PcmFrame): void;
216
+ /** Subclass hook: drain buffered audio, run a final decode, return the final transcript. */
217
+ protected abstract onFlush(): Promise<TranscriptUpdate>;
218
+ /** Subclass hook: release native resources. */
219
+ protected abstract onDispose(): void;
220
+
221
+ private rememberVadPreroll(frame: PcmFrame): void {
222
+ this.vadPrerollFrames.push({
223
+ ...frame,
224
+ pcm: frame.pcm.slice(),
225
+ });
226
+ while (this.vadPrerollFrames.length > VAD_PREROLL_MAX_FRAMES) {
227
+ this.vadPrerollFrames.shift();
228
+ }
229
+ }
230
+
231
+ private drainVadPreroll(): void {
232
+ if (this.vadPrerollFrames.length === 0) return;
233
+ const frames = this.vadPrerollFrames.splice(0);
234
+ if (!this.segmentOpen) {
235
+ this.segmentOpen = true;
236
+ this.wordsEmitted = false;
237
+ }
238
+ for (const frame of frames) this.onFrame(frame);
239
+ }
240
+
241
+ /** Emit a running-partial event and (the first time it has words) a `words` event. */
242
+ protected emitPartial(update: TranscriptUpdate): void {
243
+ const enriched = this.withMetadata(update);
244
+ this.emit({ kind: "partial", update: enriched });
245
+ if (!this.wordsEmitted) {
246
+ const words = extractWords(enriched.partial);
247
+ if (words.length > 0) {
248
+ this.wordsEmitted = true;
249
+ this.emit({ kind: "words", words });
250
+ }
251
+ }
252
+ }
253
+
254
+ private withMetadata(update: TranscriptUpdate): TranscriptUpdate {
255
+ if (
256
+ !this.metadata.source &&
257
+ !this.metadata.speaker &&
258
+ !this.metadata.turn
259
+ ) {
260
+ return update;
261
+ }
262
+ const source = update.source ?? this.metadata.source;
263
+ const speaker = update.speaker ?? this.metadata.speaker;
264
+ const segments =
265
+ update.segments ?? update.turn?.segments ?? this.metadata.turn?.segments;
266
+ const turn =
267
+ update.turn || this.metadata.turn
268
+ ? {
269
+ ...this.metadata.turn,
270
+ ...update.turn,
271
+ source:
272
+ update.turn?.source ??
273
+ update.source ??
274
+ this.metadata.turn?.source ??
275
+ source,
276
+ primarySpeaker:
277
+ update.turn?.primarySpeaker ??
278
+ update.speaker ??
279
+ this.metadata.turn?.primarySpeaker ??
280
+ speaker,
281
+ }
282
+ : undefined;
283
+ return {
284
+ ...update,
285
+ ...(source ? { source } : {}),
286
+ ...(speaker ? { speaker } : {}),
287
+ ...(segments ? { segments } : {}),
288
+ ...(turn ? { turn } : {}),
289
+ };
290
+ }
291
+
292
+ private emit(event: TranscriberEvent): void {
293
+ for (const l of this.listeners) l(event);
294
+ }
295
+
296
+ private onVadEvent(ev: VadEvent): void {
297
+ switch (ev.type) {
298
+ case "speech-start":
299
+ case "speech-active":
300
+ this.vadActive = true;
301
+ this.drainVadPreroll();
302
+ break;
303
+ case "speech-pause":
304
+ // Pause keeps the segment "armed" but stops accepting new audio
305
+ // until speech resumes. The turn controller decides whether a
306
+ // pause finalizes; this layer just stops decoding.
307
+ this.vadActive = false;
308
+ break;
309
+ case "speech-end":
310
+ this.vadActive = false;
311
+ this.vadPrerollFrames.length = 0;
312
+ break;
313
+ case "blip":
314
+ // A blip never opens a speech window — ignore.
315
+ break;
316
+ }
317
+ }
318
+ }
319
+
320
+ export interface TranscriptMetadataDefaults {
321
+ source?: VoiceInputSource;
322
+ speaker?: VoiceSpeaker;
323
+ turn?: VoiceTurnMetadata;
324
+ }
325
+
326
+ /* ==================================================================== *
327
+ * Fused (final) path — eliza_inference_asr_stream_* (ABI v2).
328
+ * ==================================================================== */
329
+
330
+ /**
331
+ * True when the loaded fused library has a working streaming ASR decoder
332
+ * (not just the v2 symbols — an ABI-only build exports them but `asrStreamSupported`
333
+ * returns false). This is the gate `createStreamingTranscriber` uses to
334
+ * pick the fused path over the fused-batch interim adapter.
335
+ */
336
+ export function ffiSupportsStreamingAsr(
337
+ ffi: ElizaInferenceFfi | null | undefined,
338
+ ): boolean {
339
+ if (!ffi || typeof ffi.asrStreamSupported !== "function") return false;
340
+ return ffi.asrStreamSupported();
341
+ }
342
+
343
+ /**
344
+ * `StreamingTranscriber` over the fused `libelizainference` streaming ASR
345
+ * ABI. Each `feed()` forwards the (resampled) PCM into `asrStreamFeed`;
346
+ * after a feed it reads the running partial via `asrStreamPartial`.
347
+ * `flush()` calls `asrStreamFinish` then re-opens a fresh stream for the
348
+ * next segment. Token ids, when the library returns them, are surfaced in
349
+ * `TranscriptUpdate.tokens` — the fused build shares the text vocabulary
350
+ * (AGENTS.md §1) so they feed STT-finish token injection directly.
351
+ *
352
+ * The C side is owned by W7; until the fused build implements these
353
+ * symbols every call throws (the binding maps `ELIZA_ERR_NOT_IMPLEMENTED`
354
+ * to a `VoiceLifecycleError`). That is intentional — no fake transcripts.
355
+ */
356
+ export class FfiStreamingTranscriber extends BaseStreamingTranscriber {
357
+ private readonly ffi: ElizaInferenceFfi;
358
+ private readonly getContext: () => ElizaInferenceContextHandle;
359
+ /** Token count to ask the library for per partial; 0 = don't request tokens. */
360
+ private readonly maxTokens: number;
361
+ private stream: bigint | null = null;
362
+
363
+ constructor(args: {
364
+ ffi: ElizaInferenceFfi;
365
+ getContext: () => ElizaInferenceContextHandle;
366
+ vad?: VadEventSource;
367
+ metadata?: TranscriptMetadataDefaults;
368
+ source?: VoiceInputSource;
369
+ /** Cap on token ids read back per transcript snapshot. Default 256. */
370
+ maxTokens?: number;
371
+ }) {
372
+ super(args.vad, {
373
+ ...args.metadata,
374
+ source: args.metadata?.source ?? args.source,
375
+ });
376
+ if (!ffiSupportsStreamingAsr(args.ffi)) {
377
+ throw new AsrUnavailableError(
378
+ "[asr] fused libelizainference does not advertise a working streaming ASR decoder (eliza_inference_asr_stream_supported() == 0) — rebuild the fused omnivoice target or use the fused-batch interim adapter",
379
+ );
380
+ }
381
+ this.ffi = args.ffi;
382
+ this.getContext = args.getContext;
383
+ this.maxTokens = Math.max(0, Math.floor(args.maxTokens ?? 256));
384
+ }
385
+
386
+ private ensureStream(): bigint {
387
+ if (this.stream !== null) return this.stream;
388
+ this.stream = this.ffi.asrStreamOpen({
389
+ ctx: this.getContext(),
390
+ sampleRateHz: ASR_SAMPLE_RATE,
391
+ });
392
+ return this.stream;
393
+ }
394
+
395
+ protected onFrame(frame: PcmFrame): void {
396
+ const pcm = resampleLinear(frame.pcm, frame.sampleRate, ASR_SAMPLE_RATE);
397
+ const handle = this.ensureStream();
398
+ this.ffi.asrStreamFeed({ stream: handle, pcm });
399
+ const update = this.ffi.asrStreamPartial({
400
+ stream: handle,
401
+ maxTokens: this.maxTokens,
402
+ });
403
+ this.emitPartial({ ...update, isFinal: false });
404
+ }
405
+
406
+ protected async onFlush(): Promise<TranscriptUpdate> {
407
+ if (this.stream === null) {
408
+ return { partial: "", isFinal: true };
409
+ }
410
+ const handle = this.stream;
411
+ const update = this.ffi.asrStreamFinish({
412
+ stream: handle,
413
+ maxTokens: this.maxTokens,
414
+ });
415
+ this.ffi.asrStreamClose(handle);
416
+ this.stream = null;
417
+ return { ...update, isFinal: true };
418
+ }
419
+
420
+ protected onDispose(): void {
421
+ if (this.stream !== null) {
422
+ this.ffi.asrStreamClose(this.stream);
423
+ this.stream = null;
424
+ }
425
+ }
426
+ }
427
+
428
+ /* ==================================================================== *
429
+ * Fused batch (interim streaming) path — eliza_inference_asr_transcribe.
430
+ * ==================================================================== */
431
+
432
+ export interface FfiBatchTranscriberOptions {
433
+ ffi: ElizaInferenceFfi;
434
+ getContext: () => ElizaInferenceContextHandle;
435
+ vad?: VadEventSource;
436
+ metadata?: TranscriptMetadataDefaults;
437
+ source?: VoiceInputSource;
438
+ /** Sliding-window length, seconds. Each batch decode covers ≤ this + overlap. Default 6.0. */
439
+ windowSeconds?: number;
440
+ /** Trailing overlap kept when committing a prefix chunk, seconds. Default 1.0. */
441
+ overlapSeconds?: number;
442
+ /** Minimum new audio (seconds) accumulated before the next decode pass. Default 1.2. */
443
+ stepSeconds?: number;
444
+ }
445
+
446
+ /**
447
+ * Interim streaming-ASR adapter over the fused `libelizainference` **batch**
448
+ * decoder (`eliza_inference_asr_transcribe`, ABI v1). The fused build's true
449
+ * streaming decoder (`eliza_inference_asr_stream_*`, ABI v2) reports unsupported
450
+ * until its runtime lands; this adapter is the contract-clean interim — it runs
451
+ * inside the one shipped llama.cpp/GGML build and emits
452
+ * Gemma token-vocab text, so no second ggml is vendored and no
453
+ * tokenizer-family mismatch is introduced.
454
+ *
455
+ * It runs a *windowed re-transcription with overlap* strategy: a prefix older
456
+ * than `windowSeconds` is committed (decoded once, in window-sized chunks
457
+ * with `overlapSeconds` carry-over) and only the tail window is re-decoded
458
+ * each step. So each `asr_transcribe` call is bounded by `windowSeconds +
459
+ * overlap` of audio (≈6–7 s) — incremental, not "buffer the whole utterance,
460
+ * run one giant batch decode". Decodes run serially on the shared ASR mutex
461
+ * (the fused context's ASR region is single-threaded).
462
+ *
463
+ * Requires `ffi.mmapAcquire(ctx, "asr")` to have been called on `getContext()`
464
+ * — the `EngineVoiceBridge` lifecycle does this when voice input is armed.
465
+ */
466
+ export class FfiBatchTranscriber extends BaseStreamingTranscriber {
467
+ private readonly ffi: ElizaInferenceFfi;
468
+ private readonly getContext: () => ElizaInferenceContextHandle;
469
+ private readonly windowSamples: number;
470
+ private readonly overlapSamples: number;
471
+ private readonly stepSamples: number;
472
+ /** All 16 kHz samples accumulated for the current speech segment. */
473
+ private buf: Float32Array = new Float32Array(0);
474
+ /** Samples in `buf` already folded into `committed`. */
475
+ private committedSamples = 0;
476
+ /** Text decoded from `buf[0 .. committedSamples)`. */
477
+ private committed = "";
478
+ /** `buf.length` at the last decode pass — throttles to `stepSamples`. */
479
+ private lastDecodeAt = 0;
480
+ /** Decode chain — `asr_transcribe` calls serialize on the native ASR mutex anyway. */
481
+ private decodeChain: Promise<void> = Promise.resolve();
482
+
483
+ constructor(opts: FfiBatchTranscriberOptions) {
484
+ super(opts.vad, {
485
+ ...opts.metadata,
486
+ source: opts.metadata?.source ?? opts.source,
487
+ });
488
+ this.ffi = opts.ffi;
489
+ this.getContext = opts.getContext;
490
+ const windowSeconds = opts.windowSeconds ?? 6.0;
491
+ const overlapSeconds = Math.min(opts.overlapSeconds ?? 1.0, windowSeconds);
492
+ const stepSeconds = opts.stepSeconds ?? 1.2;
493
+ this.windowSamples = Math.round(windowSeconds * ASR_SAMPLE_RATE);
494
+ this.overlapSamples = Math.round(overlapSeconds * ASR_SAMPLE_RATE);
495
+ this.stepSamples = Math.round(stepSeconds * ASR_SAMPLE_RATE);
496
+ }
497
+
498
+ private decodeWindow(pcm16k: Float32Array): string {
499
+ if (pcm16k.length === 0) return "";
500
+ return this.ffi
501
+ .asrTranscribe({
502
+ ctx: this.getContext(),
503
+ pcm: pcm16k,
504
+ sampleRateHz: ASR_SAMPLE_RATE,
505
+ })
506
+ .trim();
507
+ }
508
+
509
+ protected onFrame(frame: PcmFrame): void {
510
+ const pcm = resampleLinear(frame.pcm, frame.sampleRate, ASR_SAMPLE_RATE);
511
+ this.buf = concatFloat32(this.buf, pcm);
512
+ if (this.buf.length - this.lastDecodeAt < this.stepSamples) return;
513
+ this.lastDecodeAt = this.buf.length;
514
+ this.scheduleDecode(false);
515
+ }
516
+
517
+ protected async onFlush(): Promise<TranscriptUpdate> {
518
+ this.scheduleDecode(true);
519
+ await this.decodeChain;
520
+ const final = this.committed.trim();
521
+ this.resetSegment();
522
+ return { partial: final, isFinal: true };
523
+ }
524
+
525
+ protected onDispose(): void {
526
+ this.resetSegment();
527
+ }
528
+
529
+ private resetSegment(): void {
530
+ this.buf = new Float32Array(0);
531
+ this.committedSamples = 0;
532
+ this.committed = "";
533
+ this.lastDecodeAt = 0;
534
+ }
535
+
536
+ private scheduleDecode(final: boolean): void {
537
+ this.decodeChain = this.decodeChain.then(() => this.runDecode(final));
538
+ }
539
+
540
+ private async runDecode(final: boolean): Promise<void> {
541
+ const total = this.buf.length;
542
+ if (total <= this.committedSamples && !final) return;
543
+
544
+ // Commit any prefix that has scrolled fully out of the sliding window.
545
+ while (total - this.committedSamples > this.windowSamples) {
546
+ const chunkEnd = Math.min(
547
+ total,
548
+ this.committedSamples + this.windowSamples,
549
+ );
550
+ const chunk = this.buf.subarray(this.committedSamples, chunkEnd);
551
+ const text = this.decodeWindow(chunk);
552
+ this.committed = joinTranscriptParts(this.committed, text);
553
+ const advance = Math.max(1, this.windowSamples - this.overlapSamples);
554
+ this.committedSamples = Math.min(total, this.committedSamples + advance);
555
+ }
556
+
557
+ const tail = this.buf.subarray(this.committedSamples, total);
558
+ const tailText = this.decodeWindow(tail);
559
+
560
+ if (final) {
561
+ this.committed = joinTranscriptParts(this.committed, tailText);
562
+ this.committedSamples = total;
563
+ return;
564
+ }
565
+
566
+ this.emitPartial({
567
+ partial: joinTranscriptParts(this.committed, tailText).trim(),
568
+ isFinal: false,
569
+ });
570
+ }
571
+ }
572
+
573
+ function concatFloat32(a: Float32Array, b: Float32Array): Float32Array {
574
+ if (a.length === 0) return b.slice();
575
+ if (b.length === 0) return a;
576
+ const out = new Float32Array(a.length + b.length);
577
+ out.set(a, 0);
578
+ out.set(b, a.length);
579
+ return out;
580
+ }
581
+
582
+ /**
583
+ * Join two transcript fragments, collapsing the seam: drop a trailing
584
+ * partial-word from `head` if `tail` begins mid-word (overlap re-decode
585
+ * can split a word at the chunk boundary). Conservative — only trims when
586
+ * both sides clearly continue the same token-ish run.
587
+ */
588
+ function joinTranscriptParts(head: string, tail: string): string {
589
+ const h = head.trimEnd();
590
+ const t = tail.trimStart();
591
+ if (!h) return t;
592
+ if (!t) return h;
593
+ // If `tail` starts with a continuation of `head`'s last word, prefer
594
+ // `tail`'s spelling of the overlap region: drop `head`'s last word when
595
+ // `tail`'s first word starts with the same prefix (case-insensitive).
596
+ const headLast = h.match(/[\p{L}\p{N}'-]+$/u)?.[0] ?? "";
597
+ const tailFirst = t.match(/^[\p{L}\p{N}'-]+/u)?.[0] ?? "";
598
+ if (headLast && tailFirst?.toLowerCase().startsWith(headLast.toLowerCase())) {
599
+ return `${h.slice(0, h.length - headLast.length).trimEnd()} ${t}`.trim();
600
+ }
601
+ return `${h} ${t}`;
602
+ }
603
+
604
+ /* ==================================================================== *
605
+ * Adapter selection.
606
+ * ==================================================================== */
607
+
608
+ export interface CreateStreamingTranscriberOptions {
609
+ /** Fused FFI handle (when a `libelizainference` build is loaded), else null. */
610
+ ffi?: ElizaInferenceFfi | null;
611
+ /** Provider for the fused context pointer (the bridge owns the lazy create). */
612
+ getContext?: () => ElizaInferenceContextHandle;
613
+ /**
614
+ * Whether a bundled ASR model directory is present. The fused path is
615
+ * only chosen when this is true AND the library advertises streaming
616
+ * ASR.
617
+ */
618
+ asrBundlePresent?: boolean;
619
+ /** VAD event stream to gate decoding (W1). */
620
+ vad?: VadEventSource;
621
+ /** Optional attribution metadata stamped onto emitted transcript updates. */
622
+ metadata?: TranscriptMetadataDefaults;
623
+ /** Convenience shorthand for `metadata.source`. */
624
+ source?: VoiceInputSource;
625
+ /** Fused-batch-interim window/step overrides (see `FfiBatchTranscriber`). */
626
+ ffiBatch?: Omit<FfiBatchTranscriberOptions, "ffi" | "getContext">;
627
+ /**
628
+ * Force a specific fused backend.
629
+ * `"fused"` → fused streaming ASR only (throws if unavailable),
630
+ * `"ffi-batch"` → fused batch (interim) only (throws if unavailable),
631
+ * `"auto"` (default) → fused streaming → fused batch → throw.
632
+ */
633
+ prefer?: AsrBackendPreference;
634
+ }
635
+
636
+ /**
637
+ * Resolve the fused ASR adapter chain:
638
+ * 1. fused streaming ASR (`eliza_inference_asr_stream_*`, ABI v2 — the FINAL
639
+ * path, W7),
640
+ * 2. fused batch (interim) — windowed `eliza_inference_asr_transcribe` (ABI
641
+ * v1); contract-clean (one ggml, shared text vocab) and available now.
642
+ *
643
+ * The fused `libelizainference` build is the SOLE on-device ASR runtime. There
644
+ * is no whisper.cpp (or other second-runtime) fallback: if no fused decoder is
645
+ * available the caller gets a hard, actionable failure (AGENTS.md §3 + §9) —
646
+ * never a silent empty transcript.
647
+ */
648
+ export function createStreamingTranscriber(
649
+ opts: CreateStreamingTranscriberOptions = {},
650
+ ): StreamingTranscriber {
651
+ const prefer = opts.prefer ?? readAsrBackendPreferenceFromEnv() ?? "auto";
652
+
653
+ const tryFusedStreaming = (): StreamingTranscriber | null => {
654
+ if (!opts.ffi || !opts.getContext) return null;
655
+ if (!opts.asrBundlePresent) return null;
656
+ if (!ffiSupportsStreamingAsr(opts.ffi)) return null;
657
+ return new FfiStreamingTranscriber({
658
+ ffi: opts.ffi,
659
+ getContext: opts.getContext,
660
+ vad: opts.vad,
661
+ metadata: opts.metadata,
662
+ source: opts.source,
663
+ });
664
+ };
665
+
666
+ const tryFusedBatch = (): StreamingTranscriber | null => {
667
+ if (!opts.ffi || !opts.getContext) return null;
668
+ if (!opts.asrBundlePresent) return null;
669
+ if (typeof opts.ffi.asrTranscribe !== "function") return null;
670
+ return new FfiBatchTranscriber({
671
+ ...opts.ffiBatch,
672
+ ffi: opts.ffi,
673
+ getContext: opts.getContext,
674
+ vad: opts.vad,
675
+ metadata: opts.metadata,
676
+ source: opts.source,
677
+ });
678
+ };
679
+
680
+ if (prefer === "fused") {
681
+ const fused = tryFusedStreaming();
682
+ if (fused) return fused;
683
+ throw new AsrUnavailableError(
684
+ "[asr] fused streaming ASR was requested but is not available (no libelizainference handle, no bundled ASR model, or the build does not export eliza_inference_asr_stream_*)",
685
+ );
686
+ }
687
+ if (prefer === "ffi-batch") {
688
+ const batch = tryFusedBatch();
689
+ if (batch) return batch;
690
+ throw new AsrUnavailableError(
691
+ "[asr] fused batch ASR was requested but is not available (no libelizainference handle, no bundled ASR model, or the build does not export eliza_inference_asr_transcribe)",
692
+ );
693
+ }
694
+
695
+ // auto
696
+ const fused = tryFusedStreaming();
697
+ if (fused) return fused;
698
+ const batch = tryFusedBatch();
699
+ if (batch) return batch;
700
+
701
+ throw new AsrUnavailableError(
702
+ "[asr] no fused ASR decoder available — load the fused libelizainference build with a bundled ASR model (eliza_inference_asr_stream_* / eliza_inference_asr_transcribe). The fused build is the sole on-device ASR runtime; there is no whisper.cpp fallback.",
703
+ );
704
+ }