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

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 (701) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +83 -0
  3. package/package.json +82 -15
  4. package/src/actions/generate-media.d.ts +59 -0
  5. package/src/actions/generate-media.d.ts.map +1 -0
  6. package/src/actions/generate-media.ts +647 -0
  7. package/src/actions/identify-speaker.d.ts +23 -0
  8. package/src/actions/identify-speaker.d.ts.map +1 -0
  9. package/src/actions/identify-speaker.ts +171 -0
  10. package/src/actions/transcription-control.d.ts +29 -0
  11. package/src/actions/transcription-control.d.ts.map +1 -0
  12. package/src/actions/transcription-control.test.ts +100 -0
  13. package/src/actions/transcription-control.ts +127 -0
  14. package/src/adapters/capacitor-llama/__tests__/compat-behavior.test.ts +218 -0
  15. package/src/adapters/capacitor-llama/__tests__/index.test.ts +68 -0
  16. package/src/adapters/capacitor-llama/__tests__/structured-output.test.ts +215 -0
  17. package/src/adapters/capacitor-llama/__tests__/text-streaming.test.ts +174 -0
  18. package/src/adapters/capacitor-llama/environment.ts +71 -0
  19. package/src/adapters/capacitor-llama/index.browser.ts +83 -0
  20. package/src/adapters/capacitor-llama/index.ts +807 -0
  21. package/src/adapters/capacitor-llama/loader.ts +109 -0
  22. package/src/adapters/capacitor-llama/structured-output.ts +165 -0
  23. package/src/adapters/capacitor-llama/text-streaming.ts +227 -0
  24. package/src/adapters/capacitor-llama/types.ts +374 -0
  25. package/src/backends/apple-foundation.ts +127 -0
  26. package/src/index.d.ts +8 -0
  27. package/src/index.d.ts.map +1 -0
  28. package/src/index.ts +62 -0
  29. package/src/local-inference-routes.d.ts +38 -0
  30. package/src/local-inference-routes.d.ts.map +1 -0
  31. package/src/local-inference-routes.test.ts +344 -0
  32. package/src/local-inference-routes.ts +1543 -0
  33. package/src/provider.d.ts +21 -0
  34. package/src/provider.d.ts.map +1 -0
  35. package/src/provider.ts +1082 -0
  36. package/src/routes/compat-helpers.d.ts +18 -0
  37. package/src/routes/compat-helpers.d.ts.map +1 -0
  38. package/src/routes/compat-helpers.ts +274 -0
  39. package/src/routes/family-member-route.d.ts +62 -0
  40. package/src/routes/family-member-route.d.ts.map +1 -0
  41. package/src/routes/family-member-route.ts +353 -0
  42. package/src/routes/index.d.ts +19 -0
  43. package/src/routes/index.d.ts.map +1 -0
  44. package/src/routes/index.ts +60 -0
  45. package/src/routes/live-diarization-route.d.ts +26 -0
  46. package/src/routes/live-diarization-route.d.ts.map +1 -0
  47. package/src/routes/live-diarization-route.test.ts +213 -0
  48. package/src/routes/live-diarization-route.ts +122 -0
  49. package/src/routes/local-inference-asr-route.d.ts +4 -0
  50. package/src/routes/local-inference-asr-route.d.ts.map +1 -0
  51. package/src/routes/local-inference-asr-route.test.ts +205 -0
  52. package/src/routes/local-inference-asr-route.ts +163 -0
  53. package/src/routes/local-inference-asr-transcribe.d.ts +20 -0
  54. package/src/routes/local-inference-asr-transcribe.d.ts.map +1 -0
  55. package/src/routes/local-inference-asr-transcribe.test.ts +118 -0
  56. package/src/routes/local-inference-asr-transcribe.ts +97 -0
  57. package/src/routes/local-inference-compat-routes.d.ts +16 -0
  58. package/src/routes/local-inference-compat-routes.d.ts.map +1 -0
  59. package/src/routes/local-inference-compat-routes.test.ts +485 -0
  60. package/src/routes/local-inference-compat-routes.ts +808 -0
  61. package/src/routes/local-inference-tts-route.d.ts +7 -0
  62. package/src/routes/local-inference-tts-route.d.ts.map +1 -0
  63. package/src/routes/local-inference-tts-route.test.ts +179 -0
  64. package/src/routes/local-inference-tts-route.ts +230 -0
  65. package/src/routes/transcript-audio-store.d.ts +15 -0
  66. package/src/routes/transcript-audio-store.d.ts.map +1 -0
  67. package/src/routes/transcript-audio-store.ts +27 -0
  68. package/src/routes/transcripts-routes.d.ts +36 -0
  69. package/src/routes/transcripts-routes.d.ts.map +1 -0
  70. package/src/routes/transcripts-routes.test.ts +144 -0
  71. package/src/routes/transcripts-routes.ts +159 -0
  72. package/src/routes/voice-first-run-routes.d.ts +62 -0
  73. package/src/routes/voice-first-run-routes.d.ts.map +1 -0
  74. package/src/routes/voice-first-run-routes.ts +524 -0
  75. package/src/routes/voice-models-routes.d.ts +62 -0
  76. package/src/routes/voice-models-routes.d.ts.map +1 -0
  77. package/src/routes/voice-models-routes.ts +554 -0
  78. package/src/routes/voice-profile-plugin-routes.d.ts +19 -0
  79. package/src/routes/voice-profile-plugin-routes.d.ts.map +1 -0
  80. package/src/routes/voice-profile-plugin-routes.ts +138 -0
  81. package/src/routes/voice-profiles-management-routes.d.ts +52 -0
  82. package/src/routes/voice-profiles-management-routes.d.ts.map +1 -0
  83. package/src/routes/voice-profiles-management-routes.ts +476 -0
  84. package/src/routes/voice-speaker-profile-routes.d.ts +57 -0
  85. package/src/routes/voice-speaker-profile-routes.d.ts.map +1 -0
  86. package/src/routes/voice-speaker-profile-routes.ts +199 -0
  87. package/src/runtime/aosp-llama-loader-selection.test.ts +80 -0
  88. package/src/runtime/capacitor-llama.d.ts +25 -0
  89. package/src/runtime/embedding-manager-support.d.ts +77 -0
  90. package/src/runtime/embedding-manager-support.d.ts.map +1 -0
  91. package/src/runtime/embedding-manager-support.ts +497 -0
  92. package/src/runtime/embedding-presets.d.ts +16 -0
  93. package/src/runtime/embedding-presets.d.ts.map +1 -0
  94. package/src/runtime/embedding-presets.ts +81 -0
  95. package/src/runtime/embedding-warmup-policy.d.ts +14 -0
  96. package/src/runtime/embedding-warmup-policy.d.ts.map +1 -0
  97. package/src/runtime/embedding-warmup-policy.test.ts +53 -0
  98. package/src/runtime/embedding-warmup-policy.ts +48 -0
  99. package/src/runtime/ensure-local-inference-handler.d.ts +62 -0
  100. package/src/runtime/ensure-local-inference-handler.d.ts.map +1 -0
  101. package/src/runtime/ensure-local-inference-handler.test.ts +528 -0
  102. package/src/runtime/ensure-local-inference-handler.ts +1448 -0
  103. package/src/runtime/index.d.ts +15 -0
  104. package/src/runtime/index.d.ts.map +1 -0
  105. package/src/runtime/index.ts +33 -0
  106. package/src/runtime/mobile-local-inference-gate.d.ts +31 -0
  107. package/src/runtime/mobile-local-inference-gate.d.ts.map +1 -0
  108. package/src/runtime/mobile-local-inference-gate.test.ts +69 -0
  109. package/src/runtime/mobile-local-inference-gate.ts +44 -0
  110. package/src/runtime/voice-entity-binding.d.ts +103 -0
  111. package/src/runtime/voice-entity-binding.d.ts.map +1 -0
  112. package/src/runtime/voice-entity-binding.transcript.test.ts +69 -0
  113. package/src/runtime/voice-entity-binding.ts +328 -0
  114. package/src/services/README.md +71 -0
  115. package/src/services/__tests__/backend-selector.test.ts +101 -0
  116. package/src/services/__tests__/checkpoint-manager.test.ts +376 -0
  117. package/src/services/__tests__/gpu-autotune.test.ts +400 -0
  118. package/src/services/__tests__/llm-streaming-binding.test.ts +85 -0
  119. package/src/services/__tests__/planner-grammar.test.ts +372 -0
  120. package/src/services/__tests__/runtime-target.test.ts +176 -0
  121. package/src/services/active-model-switch-rollback.test.ts +183 -0
  122. package/src/services/active-model.d.ts +282 -0
  123. package/src/services/active-model.d.ts.map +1 -0
  124. package/src/services/active-model.ts +1213 -0
  125. package/src/services/assignments.d.ts +71 -0
  126. package/src/services/assignments.d.ts.map +1 -0
  127. package/src/services/assignments.test.ts +80 -0
  128. package/src/services/assignments.ts +230 -0
  129. package/src/services/backend-selector.ts +95 -0
  130. package/src/services/backend.d.ts +346 -0
  131. package/src/services/backend.d.ts.map +1 -0
  132. package/src/services/backend.ts +612 -0
  133. package/src/services/bionic-host-loader.d.ts +46 -0
  134. package/src/services/bionic-host-loader.d.ts.map +1 -0
  135. package/src/services/bionic-host-loader.test.ts +133 -0
  136. package/src/services/bionic-host-loader.ts +180 -0
  137. package/src/services/bundled-models.d.ts +34 -0
  138. package/src/services/bundled-models.d.ts.map +1 -0
  139. package/src/services/bundled-models.ts +129 -0
  140. package/src/services/cache-bridge.d.ts +206 -0
  141. package/src/services/cache-bridge.d.ts.map +1 -0
  142. package/src/services/cache-bridge.test.ts +516 -0
  143. package/src/services/cache-bridge.ts +423 -0
  144. package/src/services/catalog.d.ts +10 -0
  145. package/src/services/catalog.d.ts.map +1 -0
  146. package/src/services/catalog.test.ts +238 -0
  147. package/src/services/catalog.ts +27 -0
  148. package/src/services/checkpoint-client.d.ts +109 -0
  149. package/src/services/checkpoint-client.d.ts.map +1 -0
  150. package/src/services/checkpoint-client.ts +258 -0
  151. package/src/services/checkpoint-manager.ts +474 -0
  152. package/src/services/cloud-fallback.d.ts +102 -0
  153. package/src/services/cloud-fallback.d.ts.map +1 -0
  154. package/src/services/cloud-fallback.ts +230 -0
  155. package/src/services/conversation-registry.d.ts +142 -0
  156. package/src/services/conversation-registry.d.ts.map +1 -0
  157. package/src/services/conversation-registry.test.ts +235 -0
  158. package/src/services/conversation-registry.ts +264 -0
  159. package/src/services/desktop-fused-ffi-backend-runtime.d.ts +95 -0
  160. package/src/services/desktop-fused-ffi-backend-runtime.d.ts.map +1 -0
  161. package/src/services/desktop-fused-ffi-backend-runtime.ts +339 -0
  162. package/src/services/device-bridge.d.ts +188 -0
  163. package/src/services/device-bridge.d.ts.map +1 -0
  164. package/src/services/device-bridge.ts +1237 -0
  165. package/src/services/device-resource-metrics.d.ts +149 -0
  166. package/src/services/device-resource-metrics.d.ts.map +1 -0
  167. package/src/services/device-resource-metrics.test.ts +98 -0
  168. package/src/services/device-resource-metrics.ts +346 -0
  169. package/src/services/device-tier.d.ts +115 -0
  170. package/src/services/device-tier.d.ts.map +1 -0
  171. package/src/services/device-tier.test.ts +371 -0
  172. package/src/services/device-tier.ts +410 -0
  173. package/src/services/downloader.d.ts +82 -0
  174. package/src/services/downloader.d.ts.map +1 -0
  175. package/src/services/downloader.test.ts +747 -0
  176. package/src/services/downloader.ts +925 -0
  177. package/src/services/engine-direct-bundle.test.ts +58 -0
  178. package/src/services/engine-streaming.test.ts +80 -0
  179. package/src/services/engine.d.ts +540 -0
  180. package/src/services/engine.d.ts.map +1 -0
  181. package/src/services/engine.ts +1909 -0
  182. package/src/services/ensure-local-artifacts.integration.test.ts +273 -0
  183. package/src/services/ensure-local-artifacts.test.ts +368 -0
  184. package/src/services/ensure-local-artifacts.ts +351 -0
  185. package/src/services/external-scanner.d.ts +17 -0
  186. package/src/services/external-scanner.d.ts.map +1 -0
  187. package/src/services/external-scanner.ts +312 -0
  188. package/src/services/ffi-llm-mock.ts +354 -0
  189. package/src/services/ffi-llm-streaming-abi.ts +442 -0
  190. package/src/services/ffi-streaming-backend.d.ts +180 -0
  191. package/src/services/ffi-streaming-backend.d.ts.map +1 -0
  192. package/src/services/ffi-streaming-backend.ts +382 -0
  193. package/src/services/ffi-streaming-runner.d.ts +122 -0
  194. package/src/services/ffi-streaming-runner.d.ts.map +1 -0
  195. package/src/services/ffi-streaming-runner.test.ts +60 -0
  196. package/src/services/ffi-streaming-runner.ts +354 -0
  197. package/src/services/ffi-unload-ordering.test.ts +162 -0
  198. package/src/services/gpu-autotune.ts +534 -0
  199. package/src/services/gpu-detect.d.ts +56 -0
  200. package/src/services/gpu-detect.d.ts.map +1 -0
  201. package/src/services/gpu-detect.ts +139 -0
  202. package/src/services/handler-registry.d.ts +72 -0
  203. package/src/services/handler-registry.d.ts.map +1 -0
  204. package/src/services/handler-registry.ts +240 -0
  205. package/src/services/hardware.d.ts +63 -0
  206. package/src/services/hardware.d.ts.map +1 -0
  207. package/src/services/hardware.test.ts +231 -0
  208. package/src/services/hardware.ts +410 -0
  209. package/src/services/hf-search.d.ts +26 -0
  210. package/src/services/hf-search.d.ts.map +1 -0
  211. package/src/services/hf-search.test.ts +69 -0
  212. package/src/services/hf-search.ts +420 -0
  213. package/src/services/image-description-runtime.d.ts +14 -0
  214. package/src/services/image-description-runtime.d.ts.map +1 -0
  215. package/src/services/image-description-runtime.test.ts +61 -0
  216. package/src/services/image-description-runtime.ts +118 -0
  217. package/src/services/imagegen/aosp-unavailable.d.ts +134 -0
  218. package/src/services/imagegen/aosp-unavailable.d.ts.map +1 -0
  219. package/src/services/imagegen/aosp-unavailable.ts +229 -0
  220. package/src/services/imagegen/backend-selector.d.ts +118 -0
  221. package/src/services/imagegen/backend-selector.d.ts.map +1 -0
  222. package/src/services/imagegen/backend-selector.ts +277 -0
  223. package/src/services/imagegen/coreml-unavailable.d.ts +105 -0
  224. package/src/services/imagegen/coreml-unavailable.d.ts.map +1 -0
  225. package/src/services/imagegen/coreml-unavailable.ts +237 -0
  226. package/src/services/imagegen/errors.d.ts +16 -0
  227. package/src/services/imagegen/errors.d.ts.map +1 -0
  228. package/src/services/imagegen/errors.ts +40 -0
  229. package/src/services/imagegen/index.d.ts +58 -0
  230. package/src/services/imagegen/index.d.ts.map +1 -0
  231. package/src/services/imagegen/index.ts +144 -0
  232. package/src/services/imagegen/mflux.d.ts +74 -0
  233. package/src/services/imagegen/mflux.d.ts.map +1 -0
  234. package/src/services/imagegen/mflux.ts +313 -0
  235. package/src/services/imagegen/sd-cpp.d.ts +180 -0
  236. package/src/services/imagegen/sd-cpp.d.ts.map +1 -0
  237. package/src/services/imagegen/sd-cpp.ts +718 -0
  238. package/src/services/imagegen/tensorrt-unavailable.d.ts +83 -0
  239. package/src/services/imagegen/tensorrt-unavailable.d.ts.map +1 -0
  240. package/src/services/imagegen/tensorrt-unavailable.ts +295 -0
  241. package/src/services/imagegen/types.d.ts +181 -0
  242. package/src/services/imagegen/types.d.ts.map +1 -0
  243. package/src/services/imagegen/types.ts +193 -0
  244. package/src/services/index.d.ts +29 -0
  245. package/src/services/index.d.ts.map +1 -0
  246. package/src/services/index.ts +211 -0
  247. package/src/services/inference-capabilities.d.ts +132 -0
  248. package/src/services/inference-capabilities.d.ts.map +1 -0
  249. package/src/services/inference-capabilities.test.ts +75 -0
  250. package/src/services/inference-capabilities.ts +204 -0
  251. package/src/services/inference-telemetry.d.ts +59 -0
  252. package/src/services/inference-telemetry.d.ts.map +1 -0
  253. package/src/services/inference-telemetry.ts +143 -0
  254. package/src/services/ios-llama-streaming.ts +248 -0
  255. package/src/services/kv-spill.d.ts +189 -0
  256. package/src/services/kv-spill.d.ts.map +1 -0
  257. package/src/services/kv-spill.test.ts +222 -0
  258. package/src/services/kv-spill.ts +356 -0
  259. package/src/services/latency-trace.d.ts +346 -0
  260. package/src/services/latency-trace.d.ts.map +1 -0
  261. package/src/services/latency-trace.test.ts +266 -0
  262. package/src/services/latency-trace.ts +844 -0
  263. package/src/services/llama-server-metrics.ts +304 -0
  264. package/src/services/llm-streaming-binding.d.ts +96 -0
  265. package/src/services/llm-streaming-binding.d.ts.map +1 -0
  266. package/src/services/llm-streaming-binding.ts +136 -0
  267. package/src/services/load-args.d.ts +82 -0
  268. package/src/services/load-args.d.ts.map +1 -0
  269. package/src/services/load-args.ts +81 -0
  270. package/src/services/manifest/eliza-1.manifest.v1.json +708 -0
  271. package/src/services/manifest/index.d.ts +4 -0
  272. package/src/services/manifest/index.d.ts.map +1 -0
  273. package/src/services/manifest/index.ts +66 -0
  274. package/src/services/manifest/manifest.test.ts +689 -0
  275. package/src/services/manifest/schema.d.ts +713 -0
  276. package/src/services/manifest/schema.d.ts.map +1 -0
  277. package/src/services/manifest/schema.ts +653 -0
  278. package/src/services/manifest/types.d.ts +30 -0
  279. package/src/services/manifest/types.d.ts.map +1 -0
  280. package/src/services/manifest/types.ts +55 -0
  281. package/src/services/manifest/validator.d.ts +66 -0
  282. package/src/services/manifest/validator.d.ts.map +1 -0
  283. package/src/services/manifest/validator.ts +567 -0
  284. package/src/services/memory-arbiter.d.ts +318 -0
  285. package/src/services/memory-arbiter.d.ts.map +1 -0
  286. package/src/services/memory-arbiter.test.ts +419 -0
  287. package/src/services/memory-arbiter.ts +925 -0
  288. package/src/services/memory-monitor.d.ts +122 -0
  289. package/src/services/memory-monitor.d.ts.map +1 -0
  290. package/src/services/memory-monitor.test.ts +208 -0
  291. package/src/services/memory-monitor.ts +297 -0
  292. package/src/services/memory-pressure.d.ts +130 -0
  293. package/src/services/memory-pressure.d.ts.map +1 -0
  294. package/src/services/memory-pressure.ts +414 -0
  295. package/src/services/mtp-doctor.d.ts +13 -0
  296. package/src/services/mtp-doctor.d.ts.map +1 -0
  297. package/src/services/mtp-doctor.ts +78 -0
  298. package/src/services/network-policy.d.ts +127 -0
  299. package/src/services/network-policy.d.ts.map +1 -0
  300. package/src/services/network-policy.ts +346 -0
  301. package/src/services/paths.d.ts +6 -0
  302. package/src/services/paths.d.ts.map +1 -0
  303. package/src/services/paths.ts +25 -0
  304. package/src/services/planner-skeleton.d.ts +124 -0
  305. package/src/services/planner-skeleton.d.ts.map +1 -0
  306. package/src/services/planner-skeleton.ts +175 -0
  307. package/src/services/providers.d.ts +38 -0
  308. package/src/services/providers.d.ts.map +1 -0
  309. package/src/services/providers.ts +507 -0
  310. package/src/services/ram-budget-cache.test.ts +163 -0
  311. package/src/services/ram-budget.d.ts +110 -0
  312. package/src/services/ram-budget.d.ts.map +1 -0
  313. package/src/services/ram-budget.ts +0 -0
  314. package/src/services/readiness.d.ts +9 -0
  315. package/src/services/readiness.d.ts.map +1 -0
  316. package/src/services/readiness.test.ts +87 -0
  317. package/src/services/readiness.ts +238 -0
  318. package/src/services/recommendation.d.ts +111 -0
  319. package/src/services/recommendation.d.ts.map +1 -0
  320. package/src/services/recommendation.ts +671 -0
  321. package/src/services/registry.d.ts +35 -0
  322. package/src/services/registry.d.ts.map +1 -0
  323. package/src/services/registry.ts +151 -0
  324. package/src/services/router-handler.d.ts +92 -0
  325. package/src/services/router-handler.d.ts.map +1 -0
  326. package/src/services/router-handler.test.ts +45 -0
  327. package/src/services/router-handler.ts +407 -0
  328. package/src/services/routing-policy.d.ts +69 -0
  329. package/src/services/routing-policy.d.ts.map +1 -0
  330. package/src/services/routing-policy.test.ts +164 -0
  331. package/src/services/routing-policy.ts +297 -0
  332. package/src/services/routing-preferences.d.ts +8 -0
  333. package/src/services/routing-preferences.d.ts.map +1 -0
  334. package/src/services/routing-preferences.ts +17 -0
  335. package/src/services/runtime-target.d.ts +98 -0
  336. package/src/services/runtime-target.d.ts.map +1 -0
  337. package/src/services/runtime-target.ts +154 -0
  338. package/src/services/service.d.ts +128 -0
  339. package/src/services/service.d.ts.map +1 -0
  340. package/src/services/service.test.ts +223 -0
  341. package/src/services/service.ts +735 -0
  342. package/src/services/session-pool.d.ts +72 -0
  343. package/src/services/session-pool.d.ts.map +1 -0
  344. package/src/services/session-pool.ts +153 -0
  345. package/src/services/structured-output/deterministic-repair.d.ts +23 -0
  346. package/src/services/structured-output/deterministic-repair.d.ts.map +1 -0
  347. package/src/services/structured-output/deterministic-repair.test.ts +169 -0
  348. package/src/services/structured-output/deterministic-repair.ts +443 -0
  349. package/src/services/structured-output/index.ts +4 -0
  350. package/src/services/structured-output.d.ts +311 -0
  351. package/src/services/structured-output.d.ts.map +1 -0
  352. package/src/services/structured-output.test.ts +483 -0
  353. package/src/services/structured-output.ts +712 -0
  354. package/src/services/system-memory.d.ts +33 -0
  355. package/src/services/system-memory.d.ts.map +1 -0
  356. package/src/services/system-memory.test.ts +47 -0
  357. package/src/services/system-memory.ts +67 -0
  358. package/src/services/transcription-priority.test.ts +211 -0
  359. package/src/services/types.d.ts +19 -0
  360. package/src/services/types.d.ts.map +1 -0
  361. package/src/services/types.ts +55 -0
  362. package/src/services/verify-on-device.d.ts +34 -0
  363. package/src/services/verify-on-device.d.ts.map +1 -0
  364. package/src/services/verify-on-device.test.ts +87 -0
  365. package/src/services/verify-on-device.ts +127 -0
  366. package/src/services/verify.d.ts +8 -0
  367. package/src/services/verify.d.ts.map +1 -0
  368. package/src/services/verify.ts +13 -0
  369. package/src/services/vision/aosp-unavailable.d.ts +115 -0
  370. package/src/services/vision/aosp-unavailable.d.ts.map +1 -0
  371. package/src/services/vision/aosp-unavailable.ts +163 -0
  372. package/src/services/vision/capacitor-llama.d.ts +99 -0
  373. package/src/services/vision/capacitor-llama.d.ts.map +1 -0
  374. package/src/services/vision/capacitor-llama.ts +255 -0
  375. package/src/services/vision/cloud-fallback.d.ts +47 -0
  376. package/src/services/vision/cloud-fallback.d.ts.map +1 -0
  377. package/src/services/vision/cloud-fallback.test.ts +243 -0
  378. package/src/services/vision/cloud-fallback.ts +268 -0
  379. package/src/services/vision/fallback-chain.test.ts +86 -0
  380. package/src/services/vision/hash.d.ts +71 -0
  381. package/src/services/vision/hash.d.ts.map +1 -0
  382. package/src/services/vision/hash.ts +157 -0
  383. package/src/services/vision/index.d.ts +95 -0
  384. package/src/services/vision/index.d.ts.map +1 -0
  385. package/src/services/vision/index.ts +251 -0
  386. package/src/services/vision/llama-server.d.ts +73 -0
  387. package/src/services/vision/llama-server.d.ts.map +1 -0
  388. package/src/services/vision/llama-server.ts +177 -0
  389. package/src/services/vision/types.d.ts +153 -0
  390. package/src/services/vision/types.d.ts.map +1 -0
  391. package/src/services/vision/types.ts +154 -0
  392. package/src/services/vision/vast-fallback.d.ts +18 -0
  393. package/src/services/vision/vast-fallback.d.ts.map +1 -0
  394. package/src/services/vision/vast-fallback.ts +127 -0
  395. package/src/services/vision-embedding-cache.d.ts +98 -0
  396. package/src/services/vision-embedding-cache.d.ts.map +1 -0
  397. package/src/services/vision-embedding-cache.ts +189 -0
  398. package/src/services/voice/VOICE_WORKBENCH.md +88 -0
  399. package/src/services/voice/__test-helpers__/fake-ffi.ts +94 -0
  400. package/src/services/voice/__test-helpers__/synthetic-speech.ts +124 -0
  401. package/src/services/voice/__tests__/checkpoint-manager.test.ts +241 -0
  402. package/src/services/voice/__tests__/checkpoint-policy.test.ts +270 -0
  403. package/src/services/voice/__tests__/eager-context-builder.test.ts +257 -0
  404. package/src/services/voice/__tests__/eliza1-eot-scorer.test.ts +288 -0
  405. package/src/services/voice/__tests__/eot-classifier.test.ts +431 -0
  406. package/src/services/voice/__tests__/optimistic-rollback.test.ts +312 -0
  407. package/src/services/voice/__tests__/prefill-client.test.ts +266 -0
  408. package/src/services/voice/__tests__/prefix-preserving-queue.test.ts +208 -0
  409. package/src/services/voice/__tests__/streaming-asr.test.ts +450 -0
  410. package/src/services/voice/__tests__/streaming-transcriber.test.ts +339 -0
  411. package/src/services/voice/__tests__/turn-detector-resolver.test.ts +195 -0
  412. package/src/services/voice/__tests__/voice-state-machine-prefill.test.ts +275 -0
  413. package/src/services/voice/__tests__/voice-state-machine.test.ts +354 -0
  414. package/src/services/voice/asr-timed.real.test.ts +141 -0
  415. package/src/services/voice/audio-frame-consumer.d.ts +212 -0
  416. package/src/services/voice/audio-frame-consumer.d.ts.map +1 -0
  417. package/src/services/voice/audio-frame-consumer.test.ts +343 -0
  418. package/src/services/voice/audio-frame-consumer.ts +491 -0
  419. package/src/services/voice/barge-in.d.ts +112 -0
  420. package/src/services/voice/barge-in.d.ts.map +1 -0
  421. package/src/services/voice/barge-in.test.ts +244 -0
  422. package/src/services/voice/barge-in.ts +336 -0
  423. package/src/services/voice/cancellation-coordinator.d.ts +127 -0
  424. package/src/services/voice/cancellation-coordinator.d.ts.map +1 -0
  425. package/src/services/voice/cancellation-coordinator.test.ts +196 -0
  426. package/src/services/voice/cancellation-coordinator.ts +269 -0
  427. package/src/services/voice/checkpoint-manager.d.ts +199 -0
  428. package/src/services/voice/checkpoint-manager.d.ts.map +1 -0
  429. package/src/services/voice/checkpoint-manager.ts +401 -0
  430. package/src/services/voice/checkpoint-policy.ts +336 -0
  431. package/src/services/voice/composite-eot-classifier.test.ts +59 -0
  432. package/src/services/voice/e2e-harness.test.ts +182 -0
  433. package/src/services/voice/e2e-harness.ts +743 -0
  434. package/src/services/voice/eager-context-builder.d.ts +170 -0
  435. package/src/services/voice/eager-context-builder.d.ts.map +1 -0
  436. package/src/services/voice/eager-context-builder.ts +262 -0
  437. package/src/services/voice/eliza1-eot-scorer.d.ts +124 -0
  438. package/src/services/voice/eliza1-eot-scorer.d.ts.map +1 -0
  439. package/src/services/voice/eliza1-eot-scorer.ts +242 -0
  440. package/src/services/voice/embedding-server.ts +200 -0
  441. package/src/services/voice/embedding.d.ts +133 -0
  442. package/src/services/voice/embedding.d.ts.map +1 -0
  443. package/src/services/voice/embedding.test.ts +131 -0
  444. package/src/services/voice/embedding.ts +243 -0
  445. package/src/services/voice/emotion-attribution.d.ts +68 -0
  446. package/src/services/voice/emotion-attribution.d.ts.map +1 -0
  447. package/src/services/voice/emotion-attribution.test.ts +129 -0
  448. package/src/services/voice/emotion-attribution.ts +361 -0
  449. package/src/services/voice/engine-bridge-cancellation.test.ts +422 -0
  450. package/src/services/voice/engine-bridge.d.ts +759 -0
  451. package/src/services/voice/engine-bridge.d.ts.map +1 -0
  452. package/src/services/voice/engine-bridge.test.ts +384 -0
  453. package/src/services/voice/engine-bridge.ts +2302 -0
  454. package/src/services/voice/eot-classifier-ggml.d.ts +179 -0
  455. package/src/services/voice/eot-classifier-ggml.d.ts.map +1 -0
  456. package/src/services/voice/eot-classifier-ggml.ts +566 -0
  457. package/src/services/voice/eot-classifier.d.ts +214 -0
  458. package/src/services/voice/eot-classifier.d.ts.map +1 -0
  459. package/src/services/voice/eot-classifier.ts +533 -0
  460. package/src/services/voice/errors.d.ts +20 -0
  461. package/src/services/voice/errors.d.ts.map +1 -0
  462. package/src/services/voice/errors.ts +32 -0
  463. package/src/services/voice/expressive-tags.d.ts +158 -0
  464. package/src/services/voice/expressive-tags.d.ts.map +1 -0
  465. package/src/services/voice/expressive-tags.ts +405 -0
  466. package/src/services/voice/ffi-bindings.d.ts +674 -0
  467. package/src/services/voice/ffi-bindings.d.ts.map +1 -0
  468. package/src/services/voice/ffi-bindings.test.ts +728 -0
  469. package/src/services/voice/ffi-bindings.ts +3225 -0
  470. package/src/services/voice/first-line-cache.d.ts +181 -0
  471. package/src/services/voice/first-line-cache.d.ts.map +1 -0
  472. package/src/services/voice/first-line-cache.ts +725 -0
  473. package/src/services/voice/fused-eot-scorer.d.ts +51 -0
  474. package/src/services/voice/fused-eot-scorer.d.ts.map +1 -0
  475. package/src/services/voice/fused-eot-scorer.ts +135 -0
  476. package/src/services/voice/index.d.ts +91 -0
  477. package/src/services/voice/index.d.ts.map +1 -0
  478. package/src/services/voice/index.ts +481 -0
  479. package/src/services/voice/kokoro/__tests__/kokoro-backend.test.ts +151 -0
  480. package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.real.test.ts +151 -0
  481. package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.test.ts +60 -0
  482. package/src/services/voice/kokoro/__tests__/kokoro-engine-discovery.test.ts +277 -0
  483. package/src/services/voice/kokoro/__tests__/kokoro-ffi-runtime.test.ts +235 -0
  484. package/src/services/voice/kokoro/__tests__/kokoro-runtime.test.ts +95 -0
  485. package/src/services/voice/kokoro/__tests__/phonemizer.test.ts +53 -0
  486. package/src/services/voice/kokoro/__tests__/runtime-selection.test.ts +231 -0
  487. package/src/services/voice/kokoro/__tests__/voices.test.ts +57 -0
  488. package/src/services/voice/kokoro/index.ts +79 -0
  489. package/src/services/voice/kokoro/kokoro-backend.d.ts +72 -0
  490. package/src/services/voice/kokoro/kokoro-backend.d.ts.map +1 -0
  491. package/src/services/voice/kokoro/kokoro-backend.ts +207 -0
  492. package/src/services/voice/kokoro/kokoro-engine-discovery.d.ts +58 -0
  493. package/src/services/voice/kokoro/kokoro-engine-discovery.d.ts.map +1 -0
  494. package/src/services/voice/kokoro/kokoro-engine-discovery.ts +177 -0
  495. package/src/services/voice/kokoro/kokoro-ffi-runtime.d.ts +75 -0
  496. package/src/services/voice/kokoro/kokoro-ffi-runtime.d.ts.map +1 -0
  497. package/src/services/voice/kokoro/kokoro-ffi-runtime.ts +233 -0
  498. package/src/services/voice/kokoro/kokoro-runtime.d.ts +100 -0
  499. package/src/services/voice/kokoro/kokoro-runtime.d.ts.map +1 -0
  500. package/src/services/voice/kokoro/kokoro-runtime.ts +170 -0
  501. package/src/services/voice/kokoro/phoneme-stream.ts +123 -0
  502. package/src/services/voice/kokoro/phonemizer.d.ts +50 -0
  503. package/src/services/voice/kokoro/phonemizer.d.ts.map +1 -0
  504. package/src/services/voice/kokoro/phonemizer.ts +344 -0
  505. package/src/services/voice/kokoro/pick-runtime.d.ts +61 -0
  506. package/src/services/voice/kokoro/pick-runtime.d.ts.map +1 -0
  507. package/src/services/voice/kokoro/pick-runtime.test.ts +91 -0
  508. package/src/services/voice/kokoro/pick-runtime.ts +130 -0
  509. package/src/services/voice/kokoro/runtime-selection.d.ts +92 -0
  510. package/src/services/voice/kokoro/runtime-selection.d.ts.map +1 -0
  511. package/src/services/voice/kokoro/runtime-selection.ts +237 -0
  512. package/src/services/voice/kokoro/types.d.ts +82 -0
  513. package/src/services/voice/kokoro/types.d.ts.map +1 -0
  514. package/src/services/voice/kokoro/types.ts +95 -0
  515. package/src/services/voice/kokoro/voice-presets.d.ts +23 -0
  516. package/src/services/voice/kokoro/voice-presets.d.ts.map +1 -0
  517. package/src/services/voice/kokoro/voice-presets.ts +129 -0
  518. package/src/services/voice/kokoro/voices.d.ts +30 -0
  519. package/src/services/voice/kokoro/voices.d.ts.map +1 -0
  520. package/src/services/voice/kokoro/voices.ts +64 -0
  521. package/src/services/voice/lifecycle.d.ts +135 -0
  522. package/src/services/voice/lifecycle.d.ts.map +1 -0
  523. package/src/services/voice/lifecycle.test.ts +315 -0
  524. package/src/services/voice/lifecycle.ts +301 -0
  525. package/src/services/voice/live-diarization-session.d.ts +96 -0
  526. package/src/services/voice/live-diarization-session.d.ts.map +1 -0
  527. package/src/services/voice/live-diarization-session.ts +289 -0
  528. package/src/services/voice/mic-source.d.ts +136 -0
  529. package/src/services/voice/mic-source.d.ts.map +1 -0
  530. package/src/services/voice/mic-source.test.ts +210 -0
  531. package/src/services/voice/mic-source.ts +503 -0
  532. package/src/services/voice/optimistic-policy.d.ts +109 -0
  533. package/src/services/voice/optimistic-policy.d.ts.map +1 -0
  534. package/src/services/voice/optimistic-policy.test.ts +101 -0
  535. package/src/services/voice/optimistic-policy.ts +192 -0
  536. package/src/services/voice/optimistic-rollback.ts +343 -0
  537. package/src/services/voice/partial-stabilizer.d.ts +73 -0
  538. package/src/services/voice/partial-stabilizer.d.ts.map +1 -0
  539. package/src/services/voice/partial-stabilizer.test.ts +68 -0
  540. package/src/services/voice/partial-stabilizer.ts +140 -0
  541. package/src/services/voice/phoneme-tokenizer.d.ts +49 -0
  542. package/src/services/voice/phoneme-tokenizer.d.ts.map +1 -0
  543. package/src/services/voice/phoneme-tokenizer.ts +158 -0
  544. package/src/services/voice/phrase-cache.d.ts +76 -0
  545. package/src/services/voice/phrase-cache.d.ts.map +1 -0
  546. package/src/services/voice/phrase-cache.test.ts +242 -0
  547. package/src/services/voice/phrase-cache.ts +186 -0
  548. package/src/services/voice/phrase-chunker.d.ts +62 -0
  549. package/src/services/voice/phrase-chunker.d.ts.map +1 -0
  550. package/src/services/voice/phrase-chunker.test.ts +239 -0
  551. package/src/services/voice/phrase-chunker.ts +281 -0
  552. package/src/services/voice/pipeline-impls.d.ts +151 -0
  553. package/src/services/voice/pipeline-impls.d.ts.map +1 -0
  554. package/src/services/voice/pipeline-impls.l6.test.ts +110 -0
  555. package/src/services/voice/pipeline-impls.test.ts +292 -0
  556. package/src/services/voice/pipeline-impls.ts +315 -0
  557. package/src/services/voice/pipeline.d.ts +216 -0
  558. package/src/services/voice/pipeline.d.ts.map +1 -0
  559. package/src/services/voice/pipeline.ts +505 -0
  560. package/src/services/voice/prefill-client.d.ts +123 -0
  561. package/src/services/voice/prefill-client.d.ts.map +1 -0
  562. package/src/services/voice/prefill-client.ts +316 -0
  563. package/src/services/voice/prefix-preserving-queue.d.ts +113 -0
  564. package/src/services/voice/prefix-preserving-queue.d.ts.map +1 -0
  565. package/src/services/voice/prefix-preserving-queue.ts +162 -0
  566. package/src/services/voice/profile-store.d.ts +248 -0
  567. package/src/services/voice/profile-store.d.ts.map +1 -0
  568. package/src/services/voice/profile-store.ts +887 -0
  569. package/src/services/voice/real-audio-decode.test.ts +148 -0
  570. package/src/services/voice/ring-buffer.d.ts +40 -0
  571. package/src/services/voice/ring-buffer.d.ts.map +1 -0
  572. package/src/services/voice/ring-buffer.test.ts +129 -0
  573. package/src/services/voice/ring-buffer.ts +123 -0
  574. package/src/services/voice/rollback-queue.d.ts +24 -0
  575. package/src/services/voice/rollback-queue.d.ts.map +1 -0
  576. package/src/services/voice/rollback-queue.ts +74 -0
  577. package/src/services/voice/samantha-preset-placeholder.d.ts +67 -0
  578. package/src/services/voice/samantha-preset-placeholder.d.ts.map +1 -0
  579. package/src/services/voice/samantha-preset-placeholder.test.ts +97 -0
  580. package/src/services/voice/samantha-preset-placeholder.ts +148 -0
  581. package/src/services/voice/samantha-preset-regenerator.d.ts +87 -0
  582. package/src/services/voice/samantha-preset-regenerator.d.ts.map +1 -0
  583. package/src/services/voice/samantha-preset-regenerator.ts +393 -0
  584. package/src/services/voice/scheduler.d.ts +146 -0
  585. package/src/services/voice/scheduler.d.ts.map +1 -0
  586. package/src/services/voice/scheduler.t2.test.ts +141 -0
  587. package/src/services/voice/scheduler.ts +927 -0
  588. package/src/services/voice/shared-resources.d.ts +190 -0
  589. package/src/services/voice/shared-resources.d.ts.map +1 -0
  590. package/src/services/voice/shared-resources.ts +320 -0
  591. package/src/services/voice/speaker/attribution-pipeline.d.ts +74 -0
  592. package/src/services/voice/speaker/attribution-pipeline.d.ts.map +1 -0
  593. package/src/services/voice/speaker/attribution-pipeline.ts +386 -0
  594. package/src/services/voice/speaker/diarizer-fused.d.ts +59 -0
  595. package/src/services/voice/speaker/diarizer-fused.d.ts.map +1 -0
  596. package/src/services/voice/speaker/diarizer-fused.real.test.ts +100 -0
  597. package/src/services/voice/speaker/diarizer-fused.ts +154 -0
  598. package/src/services/voice/speaker/diarizer.d.ts +75 -0
  599. package/src/services/voice/speaker/diarizer.d.ts.map +1 -0
  600. package/src/services/voice/speaker/diarizer.ts +218 -0
  601. package/src/services/voice/speaker/encoder-fused.d.ts +60 -0
  602. package/src/services/voice/speaker/encoder-fused.d.ts.map +1 -0
  603. package/src/services/voice/speaker/encoder-fused.real.test.ts +113 -0
  604. package/src/services/voice/speaker/encoder-fused.ts +138 -0
  605. package/src/services/voice/speaker/encoder-ggml.d.ts +33 -0
  606. package/src/services/voice/speaker/encoder-ggml.d.ts.map +1 -0
  607. package/src/services/voice/speaker/encoder-ggml.ts +79 -0
  608. package/src/services/voice/speaker/encoder.d.ts +37 -0
  609. package/src/services/voice/speaker/encoder.d.ts.map +1 -0
  610. package/src/services/voice/speaker/encoder.ts +105 -0
  611. package/src/services/voice/speaker-imprint.d.ts +83 -0
  612. package/src/services/voice/speaker-imprint.d.ts.map +1 -0
  613. package/src/services/voice/speaker-imprint.test.ts +185 -0
  614. package/src/services/voice/speaker-imprint.ts +312 -0
  615. package/src/services/voice/speaker-preset-cache.d.ts +77 -0
  616. package/src/services/voice/speaker-preset-cache.d.ts.map +1 -0
  617. package/src/services/voice/speaker-preset-cache.test.ts +154 -0
  618. package/src/services/voice/speaker-preset-cache.ts +195 -0
  619. package/src/services/voice/streaming-asr/streaming-pipeline-adapter.ts +292 -0
  620. package/src/services/voice/system-audio-sink.d.ts +73 -0
  621. package/src/services/voice/system-audio-sink.d.ts.map +1 -0
  622. package/src/services/voice/system-audio-sink.test.ts +29 -0
  623. package/src/services/voice/system-audio-sink.ts +366 -0
  624. package/src/services/voice/transcriber.d.ts +244 -0
  625. package/src/services/voice/transcriber.d.ts.map +1 -0
  626. package/src/services/voice/transcriber.test.ts +392 -0
  627. package/src/services/voice/transcriber.ts +704 -0
  628. package/src/services/voice/transcript-knowledge.d.ts +37 -0
  629. package/src/services/voice/transcript-knowledge.d.ts.map +1 -0
  630. package/src/services/voice/transcript-knowledge.test.ts +68 -0
  631. package/src/services/voice/transcript-knowledge.ts +75 -0
  632. package/src/services/voice/transcript-service.d.ts +41 -0
  633. package/src/services/voice/transcript-service.d.ts.map +1 -0
  634. package/src/services/voice/transcript-service.test.ts +137 -0
  635. package/src/services/voice/transcript-service.ts +141 -0
  636. package/src/services/voice/transcript-store.d.ts +53 -0
  637. package/src/services/voice/transcript-store.d.ts.map +1 -0
  638. package/src/services/voice/transcript-store.test.ts +153 -0
  639. package/src/services/voice/transcript-store.ts +132 -0
  640. package/src/services/voice/turn-controller.d.ts +183 -0
  641. package/src/services/voice/turn-controller.d.ts.map +1 -0
  642. package/src/services/voice/turn-controller.test.ts +575 -0
  643. package/src/services/voice/turn-controller.ts +596 -0
  644. package/src/services/voice/types.d.ts +643 -0
  645. package/src/services/voice/types.d.ts.map +1 -0
  646. package/src/services/voice/types.ts +699 -0
  647. package/src/services/voice/vad.d.ts +282 -0
  648. package/src/services/voice/vad.d.ts.map +1 -0
  649. package/src/services/voice/vad.test.ts +480 -0
  650. package/src/services/voice/vad.ts +827 -0
  651. package/src/services/voice/vad.v1-v4.test.ts +222 -0
  652. package/src/services/voice/voice-budget.d.ts +241 -0
  653. package/src/services/voice/voice-budget.d.ts.map +1 -0
  654. package/src/services/voice/voice-budget.test.ts +418 -0
  655. package/src/services/voice/voice-budget.ts +635 -0
  656. package/src/services/voice/voice-duet.test.ts +375 -0
  657. package/src/services/voice/voice-emotion-classifier.d.ts +95 -0
  658. package/src/services/voice/voice-emotion-classifier.d.ts.map +1 -0
  659. package/src/services/voice/voice-emotion-classifier.test.ts +210 -0
  660. package/src/services/voice/voice-emotion-classifier.ts +273 -0
  661. package/src/services/voice/voice-preset-format.d.ts +158 -0
  662. package/src/services/voice/voice-preset-format.d.ts.map +1 -0
  663. package/src/services/voice/voice-preset-format.ts +700 -0
  664. package/src/services/voice/voice-preset-generator.test.ts +89 -0
  665. package/src/services/voice/voice-profile-artifact.d.ts +116 -0
  666. package/src/services/voice/voice-profile-artifact.d.ts.map +1 -0
  667. package/src/services/voice/voice-profile-artifact.test.ts +138 -0
  668. package/src/services/voice/voice-profile-artifact.ts +518 -0
  669. package/src/services/voice/voice-profile-routes.d.ts +83 -0
  670. package/src/services/voice/voice-profile-routes.d.ts.map +1 -0
  671. package/src/services/voice/voice-profile-routes.test.ts +429 -0
  672. package/src/services/voice/voice-profile-routes.ts +425 -0
  673. package/src/services/voice/voice-scenario.ts +154 -0
  674. package/src/services/voice/voice-settings.d.ts +82 -0
  675. package/src/services/voice/voice-settings.d.ts.map +1 -0
  676. package/src/services/voice/voice-settings.ts +172 -0
  677. package/src/services/voice/voice-state-machine.d.ts +364 -0
  678. package/src/services/voice/voice-state-machine.d.ts.map +1 -0
  679. package/src/services/voice/voice-state-machine.ts +727 -0
  680. package/src/services/voice/voice-workbench-report.test.ts +168 -0
  681. package/src/services/voice/voice-workbench-report.ts +326 -0
  682. package/src/services/voice/voice-workbench.test.ts +158 -0
  683. package/src/services/voice/voice.test.ts +1070 -0
  684. package/src/services/voice/wake-word-ggml.d.ts +101 -0
  685. package/src/services/voice/wake-word-ggml.d.ts.map +1 -0
  686. package/src/services/voice/wake-word-ggml.ts +320 -0
  687. package/src/services/voice/wake-word.d.ts +255 -0
  688. package/src/services/voice/wake-word.d.ts.map +1 -0
  689. package/src/services/voice/wake-word.test.ts +298 -0
  690. package/src/services/voice/wake-word.ts +554 -0
  691. package/src/services/voice/wrap-with-first-line-cache.d.ts +70 -0
  692. package/src/services/voice/wrap-with-first-line-cache.d.ts.map +1 -0
  693. package/src/services/voice/wrap-with-first-line-cache.ts +267 -0
  694. package/src/services/voice-model-updater.d.ts +240 -0
  695. package/src/services/voice-model-updater.d.ts.map +1 -0
  696. package/src/services/voice-model-updater.ts +724 -0
  697. package/src/services/voice-prewarm.d.ts +3 -0
  698. package/src/services/voice-prewarm.d.ts.map +1 -0
  699. package/src/services/voice-prewarm.ts +51 -0
  700. package/dist/index.d.ts +0 -37
  701. package/dist/index.js +0 -1098
@@ -0,0 +1,366 @@
1
+ /**
2
+ * System audio sinks for the interactive voice harness.
3
+ *
4
+ * The voice scheduler writes synthesized PCM (`Float32Array` mono in
5
+ * [-1, 1] at the bridge sample rate) into an {@link AudioSink}. For tests
6
+ * and headless runs `InMemoryAudioSink` (in `./ring-buffer`) captures the
7
+ * samples; for an interactive session the harness needs the audio to
8
+ * actually come out of the speakers.
9
+ *
10
+ * `SystemAudioSink` shells out to a long-lived player that reads raw 16-bit
11
+ * signed-LE PCM on stdin. Per-platform selection (priority order):
12
+ * - Linux: `aplay` (alsa-utils), else `paplay` (PulseAudio), else
13
+ * `play`/`sox` (sox), else `ffplay` (ffmpeg).
14
+ * - macOS: `play`/`sox` (sox), else `ffplay` (ffmpeg). `afplay` needs a
15
+ * file (no stdin) so it cannot be used for streaming.
16
+ * - Windows: `ffplay` (ffmpeg), else `play`/`sox` if installed. PowerShell's
17
+ * `Media.SoundPlayer` also needs a file, not a stream, so it's not
18
+ * used here — the renderer's `AudioContext` path (feeding nothing
19
+ * here; the renderer plays directly) is the no-ffmpeg route.
20
+ * If no player is on `PATH`, `available()` returns false and the harness
21
+ * falls back to `WavFileAudioSink` (writes a rolling WAV) — never silence.
22
+ *
23
+ * `WavFileAudioSink` accumulates everything written and serializes a
24
+ * single mono PCM16 WAV on `finalize()` — used by `--no-audio` and as the
25
+ * no-player fallback.
26
+ */
27
+
28
+ import { type ChildProcessByStdio, spawn } from "node:child_process";
29
+ import { existsSync } from "node:fs";
30
+ import fs from "node:fs/promises";
31
+ import path from "node:path";
32
+ import process from "node:process";
33
+ import type { Writable } from "node:stream";
34
+ import type { AudioSink } from "./types";
35
+
36
+ function which(bin: string): string | null {
37
+ const pathEnv = process.env.PATH ?? "";
38
+ const exts =
39
+ process.platform === "win32" ? [".exe", ".cmd", ".bat", ""] : [""];
40
+ for (const dir of pathEnv.split(path.delimiter)) {
41
+ for (const ext of exts) {
42
+ const candidate = path.join(dir, bin + ext);
43
+ if (existsSync(candidate)) return candidate;
44
+ }
45
+ }
46
+ return null;
47
+ }
48
+
49
+ function floatToPcm16(pcm: Float32Array): Buffer {
50
+ const out = Buffer.allocUnsafe(pcm.length * 2);
51
+ for (let i = 0; i < pcm.length; i++) {
52
+ let s = pcm[i];
53
+ if (s > 1) s = 1;
54
+ else if (s < -1) s = -1;
55
+ out.writeInt16LE((s * 0x7fff) | 0, i * 2);
56
+ }
57
+ return out;
58
+ }
59
+
60
+ function soxRawArgs(sampleRate: number): string[] {
61
+ return [
62
+ "-q",
63
+ "-t",
64
+ "raw",
65
+ "-r",
66
+ String(sampleRate),
67
+ "-e",
68
+ "signed",
69
+ "-b",
70
+ "16",
71
+ "-c",
72
+ "1",
73
+ "-",
74
+ ];
75
+ }
76
+
77
+ function ffplayRawArgs(sampleRate: number): string[] {
78
+ // ffplay reads raw PCM with -f s16le; -nodisp suppresses the window,
79
+ // -autoexit quits at EOF, -i - reads stdin.
80
+ return [
81
+ "-loglevel",
82
+ "error",
83
+ "-nodisp",
84
+ "-autoexit",
85
+ "-f",
86
+ "s16le",
87
+ "-ar",
88
+ String(sampleRate),
89
+ "-ac",
90
+ "1",
91
+ "-i",
92
+ "-",
93
+ ];
94
+ }
95
+
96
+ /** Pick a CLI player that reads raw PCM16-LE on stdin, for the host platform. */
97
+ function resolvePlayer(
98
+ sampleRate: number,
99
+ ): { bin: string; args: string[] } | null {
100
+ if (process.platform === "linux") {
101
+ const aplay = which("aplay");
102
+ if (aplay) {
103
+ return {
104
+ bin: aplay,
105
+ args: [
106
+ "-q",
107
+ "-f",
108
+ "S16_LE",
109
+ "-c",
110
+ "1",
111
+ "-r",
112
+ String(sampleRate),
113
+ "-t",
114
+ "raw",
115
+ "-",
116
+ ],
117
+ };
118
+ }
119
+ const paplay = which("paplay");
120
+ if (paplay) {
121
+ return {
122
+ bin: paplay,
123
+ args: [
124
+ "--raw",
125
+ `--format=s16le`,
126
+ "--channels=1",
127
+ `--rate=${sampleRate}`,
128
+ ],
129
+ };
130
+ }
131
+ const play = which("play");
132
+ if (play) return { bin: play, args: soxRawArgs(sampleRate) };
133
+ const sox = which("sox");
134
+ if (sox) return { bin: sox, args: [...soxRawArgs(sampleRate), "-d"] };
135
+ const ffplay = which("ffplay");
136
+ if (ffplay) return { bin: ffplay, args: ffplayRawArgs(sampleRate) };
137
+ return null;
138
+ }
139
+ if (process.platform === "darwin") {
140
+ // `afplay` needs a file (no stdin), so it can't stream — use sox/ffplay.
141
+ const play = which("play");
142
+ if (play) return { bin: play, args: soxRawArgs(sampleRate) };
143
+ const sox = which("sox");
144
+ if (sox) return { bin: sox, args: [...soxRawArgs(sampleRate), "-d"] };
145
+ const ffplay = which("ffplay");
146
+ if (ffplay) return { bin: ffplay, args: ffplayRawArgs(sampleRate) };
147
+ return null;
148
+ }
149
+ if (process.platform === "win32") {
150
+ const ffplay = which("ffplay");
151
+ if (ffplay) return { bin: ffplay, args: ffplayRawArgs(sampleRate) };
152
+ const play = which("play");
153
+ if (play) return { bin: play, args: soxRawArgs(sampleRate) };
154
+ const sox = which("sox");
155
+ if (sox) return { bin: sox, args: [...soxRawArgs(sampleRate), "-d"] };
156
+ return null;
157
+ }
158
+ // Other (BSD, etc.) — best-effort sox/ffplay.
159
+ const play = which("play");
160
+ if (play) return { bin: play, args: soxRawArgs(sampleRate) };
161
+ const ffplay = which("ffplay");
162
+ if (ffplay) return { bin: ffplay, args: ffplayRawArgs(sampleRate) };
163
+ return null;
164
+ }
165
+
166
+ /**
167
+ * Exported view of {@link resolvePlayer} for the cross-platform preflight
168
+ * (`voice:interactive --platform-report`). Returns the bare program name
169
+ * (no args) the host would stream synthesized audio to, or `null`.
170
+ */
171
+ export function resolveSystemPlayerName(sampleRate = 24_000): string | null {
172
+ const spec = resolvePlayer(sampleRate);
173
+ return spec ? path.basename(spec.bin) : null;
174
+ }
175
+
176
+ export interface SystemAudioSinkOptions {
177
+ sampleRate: number;
178
+ }
179
+
180
+ /**
181
+ * Streams synthesized PCM to a long-lived CLI player (`aplay` / `paplay` /
182
+ * sox `play`). `write()` is non-blocking — PCM is buffered into the
183
+ * player's stdin pipe. `drain()` is a barge-in hook: it kills the current
184
+ * player so queued audio stops within a tick, then a fresh player is
185
+ * spawned lazily on the next `write()`.
186
+ */
187
+ type StdinPipeProcess = ChildProcessByStdio<Writable, null, null>;
188
+
189
+ export class SystemAudioSink implements AudioSink {
190
+ private readonly sampleRate: number;
191
+ private readonly playerSpec: { bin: string; args: string[] } | null;
192
+ private proc: StdinPipeProcess | null = null;
193
+ private buffered = 0;
194
+
195
+ constructor(opts: SystemAudioSinkOptions) {
196
+ this.sampleRate = opts.sampleRate;
197
+ this.playerSpec = resolvePlayer(opts.sampleRate);
198
+ }
199
+
200
+ available(): boolean {
201
+ return this.playerSpec !== null;
202
+ }
203
+
204
+ player(): string {
205
+ return this.playerSpec ? path.basename(this.playerSpec.bin) : "(none)";
206
+ }
207
+
208
+ private ensureProc(): StdinPipeProcess | null {
209
+ if (!this.playerSpec) return null;
210
+ if (this.proc && !this.proc.killed && this.proc.exitCode === null)
211
+ return this.proc;
212
+ const child = spawn(this.playerSpec.bin, this.playerSpec.args, {
213
+ stdio: ["pipe", "ignore", "ignore"] as const,
214
+ });
215
+ child.on("error", () => {
216
+ // Player vanished mid-stream — drop it; next write retries.
217
+ if (this.proc === child) this.proc = null;
218
+ });
219
+ child.on("exit", () => {
220
+ if (this.proc === child) this.proc = null;
221
+ this.buffered = 0;
222
+ });
223
+ this.proc = child;
224
+ return child;
225
+ }
226
+
227
+ write(pcm: Float32Array, _sampleRate: number): void {
228
+ const child = this.ensureProc();
229
+ if (!child?.stdin.writable) return;
230
+ const bytes = floatToPcm16(pcm);
231
+ this.buffered += pcm.length;
232
+ child.stdin.write(bytes, () => {
233
+ this.buffered = Math.max(0, this.buffered - pcm.length);
234
+ });
235
+ }
236
+
237
+ drain(): void {
238
+ // Barge-in: stop the player immediately. The next write spawns a fresh
239
+ // one so the new turn's audio isn't queued behind cancelled audio.
240
+ if (this.proc) {
241
+ try {
242
+ this.proc.stdin.destroy();
243
+ } catch {
244
+ /* ignore */
245
+ }
246
+ try {
247
+ this.proc.kill("SIGKILL");
248
+ } catch {
249
+ /* ignore */
250
+ }
251
+ this.proc = null;
252
+ }
253
+ this.buffered = 0;
254
+ }
255
+
256
+ bufferedSamples(): number {
257
+ return this.buffered;
258
+ }
259
+
260
+ /** Flush + close the player. Idempotent. */
261
+ async dispose(): Promise<void> {
262
+ const child = this.proc;
263
+ this.proc = null;
264
+ if (!child) return;
265
+ await new Promise<void>((resolve) => {
266
+ let done = false;
267
+ const finish = () => {
268
+ if (done) return;
269
+ done = true;
270
+ resolve();
271
+ };
272
+ child.on("exit", finish);
273
+ child.on("error", finish);
274
+ try {
275
+ child.stdin.end();
276
+ } catch {
277
+ finish();
278
+ }
279
+ // Don't hang on a stuck player.
280
+ setTimeout(() => {
281
+ try {
282
+ child.kill("SIGKILL");
283
+ } catch {
284
+ /* ignore */
285
+ }
286
+ finish();
287
+ }, 1500);
288
+ });
289
+ }
290
+ }
291
+
292
+ export interface WavFileAudioSinkOptions {
293
+ sampleRate: number;
294
+ filePath: string;
295
+ }
296
+
297
+ /**
298
+ * Accumulates all written PCM and serializes a single mono PCM16 WAV on
299
+ * {@link finalize}. Used by `--no-audio` and as the no-player fallback so
300
+ * a headless run still produces an inspectable artifact (never silence).
301
+ */
302
+ export class WavFileAudioSink implements AudioSink {
303
+ private readonly sampleRate: number;
304
+ private readonly filePath: string;
305
+ private readonly chunks: Float32Array[] = [];
306
+ private buffered = 0;
307
+
308
+ constructor(opts: WavFileAudioSinkOptions) {
309
+ this.sampleRate = opts.sampleRate;
310
+ this.filePath = opts.filePath;
311
+ }
312
+
313
+ write(pcm: Float32Array, _sampleRate: number): void {
314
+ this.chunks.push(pcm.slice());
315
+ this.buffered += pcm.length;
316
+ }
317
+
318
+ drain(): void {
319
+ // The WAV sink keeps everything (it's an artifact, not a live stream),
320
+ // so `drain()` only resets the "buffered" counter the scheduler reads.
321
+ this.buffered = 0;
322
+ }
323
+
324
+ bufferedSamples(): number {
325
+ return this.buffered;
326
+ }
327
+
328
+ totalSamples(): number {
329
+ let n = 0;
330
+ for (const c of this.chunks) n += c.length;
331
+ return n;
332
+ }
333
+
334
+ async finalize(): Promise<string> {
335
+ const total = this.totalSamples();
336
+ const dataBytes = total * 2;
337
+ const header = Buffer.allocUnsafe(44);
338
+ header.write("RIFF", 0, "ascii");
339
+ header.writeUInt32LE(36 + dataBytes, 4);
340
+ header.write("WAVE", 8, "ascii");
341
+ header.write("fmt ", 12, "ascii");
342
+ header.writeUInt32LE(16, 16); // PCM fmt chunk size
343
+ header.writeUInt16LE(1, 20); // PCM
344
+ header.writeUInt16LE(1, 22); // mono
345
+ header.writeUInt32LE(this.sampleRate, 24);
346
+ header.writeUInt32LE(this.sampleRate * 2, 28); // byte rate
347
+ header.writeUInt16LE(2, 32); // block align
348
+ header.writeUInt16LE(16, 34); // bits per sample
349
+ header.write("data", 36, "ascii");
350
+ header.writeUInt32LE(dataBytes, 40);
351
+ const body = Buffer.allocUnsafe(dataBytes);
352
+ let off = 0;
353
+ for (const chunk of this.chunks) {
354
+ for (let i = 0; i < chunk.length; i++) {
355
+ let s = chunk[i];
356
+ if (s > 1) s = 1;
357
+ else if (s < -1) s = -1;
358
+ body.writeInt16LE((s * 0x7fff) | 0, off);
359
+ off += 2;
360
+ }
361
+ }
362
+ await fs.mkdir(path.dirname(this.filePath), { recursive: true });
363
+ await fs.writeFile(this.filePath, Buffer.concat([header, body]));
364
+ return this.filePath;
365
+ }
366
+ }
@@ -0,0 +1,244 @@
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 the Qwen2-BPE text-vocab (AGENTS.md §1/§4), so it does not
24
+ * vendor a second 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
+ import type { ElizaInferenceContextHandle, ElizaInferenceFfi } from "./ffi-bindings";
34
+ import type { PcmFrame, StreamingTranscriber, TranscriberEventListener, TranscriptUpdate, VadEventSource, VoiceInputSource, VoiceSpeaker, VoiceTurnMetadata } from "./types";
35
+ /** The local voice runtime resamples mic input to 16 kHz mono for ASR. */
36
+ export declare const ASR_SAMPLE_RATE = 16000;
37
+ /**
38
+ * Raised when no ASR backend can be resolved. Distinct error class so the
39
+ * caller (engine, `TRANSCRIPTION` model handler) can surface "ASR is not
40
+ * installed" with an actionable message rather than treating an empty
41
+ * string as a successful transcription.
42
+ */
43
+ export declare class AsrUnavailableError extends Error {
44
+ constructor(message: string);
45
+ }
46
+ export type AsrBackendPreference = "auto" | "fused" | "ffi-batch";
47
+ export declare function normalizeAsrBackendPreference(value: string | null | undefined): AsrBackendPreference | null;
48
+ export declare function readAsrBackendPreferenceFromEnv(env?: NodeJS.ProcessEnv): AsrBackendPreference | null;
49
+ /**
50
+ * Linear-interpolation resample of mono fp32 PCM. Used to coerce mic
51
+ * frames (commonly 16 / 24 / 48 kHz) to the ASR rate. Not a polyphase
52
+ * filter — adequate for speech ASR; the fused build does its own
53
+ * resampling so this is interim-batch only.
54
+ */
55
+ export declare function resampleLinear(pcm: Float32Array, fromRate: number, toRate: number): Float32Array;
56
+ /**
57
+ * Base implementing the boilerplate every adapter shares: listener
58
+ * fan-out, the `words`-once-per-segment latch, and (optional) VAD-event
59
+ * gating. Subclasses implement `onFrame` / `onFlush` / `onDispose` and
60
+ * call `emitPartial` / `emitFinal`.
61
+ */
62
+ export declare abstract class BaseStreamingTranscriber implements StreamingTranscriber {
63
+ private readonly listeners;
64
+ private metadata;
65
+ /** True between `speech-start`/first-frame and the next `flush()`. */
66
+ protected segmentOpen: boolean;
67
+ /** Latched once `words` is emitted for the current segment. */
68
+ private wordsEmitted;
69
+ /** When set, frames are only forwarded while the VAD is in an active speech window. */
70
+ private vadActive;
71
+ private readonly vadPrerollFrames;
72
+ private vadUnsub;
73
+ private disposed;
74
+ constructor(vad?: VadEventSource, metadata?: TranscriptMetadataDefaults);
75
+ on(listener: TranscriberEventListener): () => void;
76
+ /**
77
+ * Update the metadata defaults that `withMetadata()` merges into every
78
+ * partial / final emission. The voice pipeline calls this once the
79
+ * async speaker-ID / diarizer lookup resolves, so the speaker /
80
+ * segments are attached to the rest of the turn without buffering all
81
+ * partials for the lookup.
82
+ */
83
+ setMetadataDefaults(metadata: TranscriptMetadataDefaults): void;
84
+ feed(frame: PcmFrame): void;
85
+ flush(): Promise<TranscriptUpdate>;
86
+ dispose(): void;
87
+ /** Subclass hook: a (VAD-gated) PCM frame for the current speech segment. */
88
+ protected abstract onFrame(frame: PcmFrame): void;
89
+ /** Subclass hook: drain buffered audio, run a final decode, return the final transcript. */
90
+ protected abstract onFlush(): Promise<TranscriptUpdate>;
91
+ /** Subclass hook: release native resources. */
92
+ protected abstract onDispose(): void;
93
+ private rememberVadPreroll;
94
+ private drainVadPreroll;
95
+ /** Emit a running-partial event and (the first time it has words) a `words` event. */
96
+ protected emitPartial(update: TranscriptUpdate): void;
97
+ private withMetadata;
98
+ private emit;
99
+ private onVadEvent;
100
+ }
101
+ export interface TranscriptMetadataDefaults {
102
+ source?: VoiceInputSource;
103
+ speaker?: VoiceSpeaker;
104
+ turn?: VoiceTurnMetadata;
105
+ }
106
+ /**
107
+ * True when the loaded fused library has a working streaming ASR decoder
108
+ * (not just the v2 symbols — an ABI-only build exports them but `asrStreamSupported`
109
+ * returns false). This is the gate `createStreamingTranscriber` uses to
110
+ * pick the fused path over the fused-batch interim adapter.
111
+ */
112
+ export declare function ffiSupportsStreamingAsr(ffi: ElizaInferenceFfi | null | undefined): boolean;
113
+ /**
114
+ * `StreamingTranscriber` over the fused `libelizainference` streaming ASR
115
+ * ABI. Each `feed()` forwards the (resampled) PCM into `asrStreamFeed`;
116
+ * after a feed it reads the running partial via `asrStreamPartial`.
117
+ * `flush()` calls `asrStreamFinish` then re-opens a fresh stream for the
118
+ * next segment. Token ids, when the library returns them, are surfaced in
119
+ * `TranscriptUpdate.tokens` — the fused build shares the text vocabulary
120
+ * (AGENTS.md §1) so they feed STT-finish token injection directly.
121
+ *
122
+ * The C side is owned by W7; until the fused build implements these
123
+ * symbols every call throws (the binding maps `ELIZA_ERR_NOT_IMPLEMENTED`
124
+ * to a `VoiceLifecycleError`). That is intentional — no fake transcripts.
125
+ */
126
+ export declare class FfiStreamingTranscriber extends BaseStreamingTranscriber {
127
+ private readonly ffi;
128
+ private readonly getContext;
129
+ /** Token count to ask the library for per partial; 0 = don't request tokens. */
130
+ private readonly maxTokens;
131
+ private stream;
132
+ constructor(args: {
133
+ ffi: ElizaInferenceFfi;
134
+ getContext: () => ElizaInferenceContextHandle;
135
+ vad?: VadEventSource;
136
+ metadata?: TranscriptMetadataDefaults;
137
+ source?: VoiceInputSource;
138
+ /** Cap on token ids read back per transcript snapshot. Default 256. */
139
+ maxTokens?: number;
140
+ });
141
+ private ensureStream;
142
+ protected onFrame(frame: PcmFrame): void;
143
+ protected onFlush(): Promise<TranscriptUpdate>;
144
+ protected onDispose(): void;
145
+ }
146
+ export interface FfiBatchTranscriberOptions {
147
+ ffi: ElizaInferenceFfi;
148
+ getContext: () => ElizaInferenceContextHandle;
149
+ vad?: VadEventSource;
150
+ metadata?: TranscriptMetadataDefaults;
151
+ source?: VoiceInputSource;
152
+ /** Sliding-window length, seconds. Each batch decode covers ≤ this + overlap. Default 6.0. */
153
+ windowSeconds?: number;
154
+ /** Trailing overlap kept when committing a prefix chunk, seconds. Default 1.0. */
155
+ overlapSeconds?: number;
156
+ /** Minimum new audio (seconds) accumulated before the next decode pass. Default 1.2. */
157
+ stepSeconds?: number;
158
+ }
159
+ /**
160
+ * Interim streaming-ASR adapter over the fused `libelizainference` **batch**
161
+ * decoder (`eliza_inference_asr_transcribe`, ABI v1). The fused build's true
162
+ * streaming decoder (`eliza_inference_asr_stream_*`, ABI v2) reports unsupported
163
+ * until its runtime lands; this adapter is the contract-clean interim — it runs
164
+ * inside the one shipped llama.cpp/GGML build and emits
165
+ * Qwen2-BPE token-vocab text (AGENTS.md §1, §4), so no second ggml is
166
+ * vendored and no tokenizer-family mismatch is introduced.
167
+ *
168
+ * It runs a *windowed re-transcription with overlap* strategy: a prefix older
169
+ * than `windowSeconds` is committed (decoded once, in window-sized chunks
170
+ * with `overlapSeconds` carry-over) and only the tail window is re-decoded
171
+ * each step. So each `asr_transcribe` call is bounded by `windowSeconds +
172
+ * overlap` of audio (≈6–7 s) — incremental, not "buffer the whole utterance,
173
+ * run one giant batch decode". Decodes run serially on the shared ASR mutex
174
+ * (the fused context's ASR region is single-threaded).
175
+ *
176
+ * Requires `ffi.mmapAcquire(ctx, "asr")` to have been called on `getContext()`
177
+ * — the `EngineVoiceBridge` lifecycle does this when voice input is armed.
178
+ */
179
+ export declare class FfiBatchTranscriber extends BaseStreamingTranscriber {
180
+ private readonly ffi;
181
+ private readonly getContext;
182
+ private readonly windowSamples;
183
+ private readonly overlapSamples;
184
+ private readonly stepSamples;
185
+ /** All 16 kHz samples accumulated for the current speech segment. */
186
+ private buf;
187
+ /** Samples in `buf` already folded into `committed`. */
188
+ private committedSamples;
189
+ /** Text decoded from `buf[0 .. committedSamples)`. */
190
+ private committed;
191
+ /** `buf.length` at the last decode pass — throttles to `stepSamples`. */
192
+ private lastDecodeAt;
193
+ /** Decode chain — `asr_transcribe` calls serialize on the native ASR mutex anyway. */
194
+ private decodeChain;
195
+ constructor(opts: FfiBatchTranscriberOptions);
196
+ private decodeWindow;
197
+ protected onFrame(frame: PcmFrame): void;
198
+ protected onFlush(): Promise<TranscriptUpdate>;
199
+ protected onDispose(): void;
200
+ private resetSegment;
201
+ private scheduleDecode;
202
+ private runDecode;
203
+ }
204
+ export interface CreateStreamingTranscriberOptions {
205
+ /** Fused FFI handle (when a `libelizainference` build is loaded), else null. */
206
+ ffi?: ElizaInferenceFfi | null;
207
+ /** Provider for the fused context pointer (the bridge owns the lazy create). */
208
+ getContext?: () => ElizaInferenceContextHandle;
209
+ /**
210
+ * Whether a bundled ASR model directory is present. The fused path is
211
+ * only chosen when this is true AND the library advertises streaming
212
+ * ASR.
213
+ */
214
+ asrBundlePresent?: boolean;
215
+ /** VAD event stream to gate decoding (W1). */
216
+ vad?: VadEventSource;
217
+ /** Optional attribution metadata stamped onto emitted transcript updates. */
218
+ metadata?: TranscriptMetadataDefaults;
219
+ /** Convenience shorthand for `metadata.source`. */
220
+ source?: VoiceInputSource;
221
+ /** Fused-batch-interim window/step overrides (see `FfiBatchTranscriber`). */
222
+ ffiBatch?: Omit<FfiBatchTranscriberOptions, "ffi" | "getContext">;
223
+ /**
224
+ * Force a specific fused backend.
225
+ * `"fused"` → fused streaming ASR only (throws if unavailable),
226
+ * `"ffi-batch"` → fused batch (interim) only (throws if unavailable),
227
+ * `"auto"` (default) → fused streaming → fused batch → throw.
228
+ */
229
+ prefer?: AsrBackendPreference;
230
+ }
231
+ /**
232
+ * Resolve the fused ASR adapter chain:
233
+ * 1. fused streaming ASR (`eliza_inference_asr_stream_*`, ABI v2 — the FINAL
234
+ * path, W7),
235
+ * 2. fused batch (interim) — windowed `eliza_inference_asr_transcribe` (ABI
236
+ * v1); contract-clean (one ggml, shared text vocab) and available now.
237
+ *
238
+ * The fused `libelizainference` build is the SOLE on-device ASR runtime. There
239
+ * is no whisper.cpp (or other second-runtime) fallback: if no fused decoder is
240
+ * available the caller gets a hard, actionable failure (AGENTS.md §3 + §9) —
241
+ * never a silent empty transcript.
242
+ */
243
+ export declare function createStreamingTranscriber(opts?: CreateStreamingTranscriberOptions): StreamingTranscriber;
244
+ //# sourceMappingURL=transcriber.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcriber.d.ts","sourceRoot":"","sources":["transcriber.ts"],"names":[],"mappings":"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"}