@elizaos/plugin-local-inference 2.0.3-beta.2 → 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 (881) hide show
  1. package/README.md +84 -10
  2. package/dist/actions/generate-media.d.ts.map +1 -0
  3. package/dist/actions/identify-speaker.d.ts.map +1 -0
  4. package/dist/actions/transcription-control.d.ts.map +1 -0
  5. package/dist/adapters/capacitor-llama/environment.d.ts +12 -0
  6. package/dist/adapters/capacitor-llama/environment.d.ts.map +1 -0
  7. package/dist/adapters/capacitor-llama/index.browser.d.ts +9 -0
  8. package/dist/adapters/capacitor-llama/index.browser.d.ts.map +1 -0
  9. package/dist/adapters/capacitor-llama/index.d.ts +18 -0
  10. package/dist/adapters/capacitor-llama/index.d.ts.map +1 -0
  11. package/dist/adapters/capacitor-llama/loader.d.ts +35 -0
  12. package/dist/adapters/capacitor-llama/loader.d.ts.map +1 -0
  13. package/dist/adapters/capacitor-llama/native-voice-capture.d.ts +70 -0
  14. package/dist/adapters/capacitor-llama/native-voice-capture.d.ts.map +1 -0
  15. package/dist/adapters/capacitor-llama/structured-output.d.ts +62 -0
  16. package/dist/adapters/capacitor-llama/structured-output.d.ts.map +1 -0
  17. package/dist/adapters/capacitor-llama/text-streaming.d.ts +24 -0
  18. package/dist/adapters/capacitor-llama/text-streaming.d.ts.map +1 -0
  19. package/dist/adapters/capacitor-llama/types.d.ts +338 -0
  20. package/dist/adapters/capacitor-llama/types.d.ts.map +1 -0
  21. package/dist/adapters/capacitor-llama/voice-turn.d.ts +86 -0
  22. package/dist/adapters/capacitor-llama/voice-turn.d.ts.map +1 -0
  23. package/dist/backends/apple-foundation.d.ts +56 -0
  24. package/dist/backends/apple-foundation.d.ts.map +1 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +39647 -0
  27. package/dist/index.js.map +217 -0
  28. package/{src → dist}/local-inference-routes.d.ts +9 -0
  29. package/dist/local-inference-routes.d.ts.map +1 -0
  30. package/dist/provider.d.ts.map +1 -0
  31. package/{src → dist}/routes/compat-helpers.d.ts +1 -1
  32. package/dist/routes/compat-helpers.d.ts.map +1 -0
  33. package/dist/routes/family-member-route.d.ts.map +1 -0
  34. package/{src → dist}/routes/index.d.ts +1 -0
  35. package/dist/routes/index.d.ts.map +1 -0
  36. package/dist/routes/index.js +42040 -0
  37. package/dist/routes/index.js.map +236 -0
  38. package/{src → dist}/routes/live-diarization-route.d.ts +7 -0
  39. package/dist/routes/live-diarization-route.d.ts.map +1 -0
  40. package/dist/routes/local-inference-asr-route.d.ts.map +1 -0
  41. package/dist/routes/local-inference-asr-transcribe.d.ts.map +1 -0
  42. package/dist/routes/local-inference-compat-routes.d.ts.map +1 -0
  43. package/dist/routes/local-inference-tts-route.d.ts.map +1 -0
  44. package/dist/routes/native-pcm-turn-route.d.ts +3 -0
  45. package/dist/routes/native-pcm-turn-route.d.ts.map +1 -0
  46. package/dist/routes/transcript-audio-store.d.ts.map +1 -0
  47. package/{src → dist}/routes/transcripts-routes.d.ts +8 -0
  48. package/dist/routes/transcripts-routes.d.ts.map +1 -0
  49. package/dist/routes/voice-first-run-routes.d.ts.map +1 -0
  50. package/dist/routes/voice-models-routes.d.ts.map +1 -0
  51. package/dist/routes/voice-profile-plugin-routes.d.ts.map +1 -0
  52. package/dist/routes/voice-profiles-management-routes.d.ts.map +1 -0
  53. package/dist/routes/voice-speaker-profile-routes.d.ts.map +1 -0
  54. package/dist/runtime/embedding-manager-support.d.ts.map +1 -0
  55. package/dist/runtime/embedding-presets.d.ts.map +1 -0
  56. package/dist/runtime/embedding-warmup-policy.d.ts.map +1 -0
  57. package/{src → dist}/runtime/ensure-local-inference-handler.d.ts +8 -0
  58. package/dist/runtime/ensure-local-inference-handler.d.ts.map +1 -0
  59. package/{src → dist}/runtime/index.d.ts +1 -1
  60. package/dist/runtime/index.d.ts.map +1 -0
  61. package/dist/runtime/index.js +38768 -0
  62. package/dist/runtime/index.js.map +217 -0
  63. package/dist/runtime/mobile-local-inference-gate.d.ts +63 -0
  64. package/dist/runtime/mobile-local-inference-gate.d.ts.map +1 -0
  65. package/{src → dist}/runtime/voice-entity-binding.d.ts +10 -0
  66. package/dist/runtime/voice-entity-binding.d.ts.map +1 -0
  67. package/{src → dist}/services/active-model.d.ts +28 -0
  68. package/dist/services/active-model.d.ts.map +1 -0
  69. package/dist/services/asr-provenance.d.ts +5 -0
  70. package/dist/services/asr-provenance.d.ts.map +1 -0
  71. package/{src → dist}/services/assignments.d.ts +16 -3
  72. package/dist/services/assignments.d.ts.map +1 -0
  73. package/dist/services/backend-selector.d.ts +55 -0
  74. package/dist/services/backend-selector.d.ts.map +1 -0
  75. package/{src → dist}/services/backend.d.ts +110 -16
  76. package/dist/services/backend.d.ts.map +1 -0
  77. package/{src → dist}/services/bionic-host-loader.d.ts +21 -0
  78. package/dist/services/bionic-host-loader.d.ts.map +1 -0
  79. package/dist/services/bundled-models.d.ts.map +1 -0
  80. package/dist/services/cache-bridge.d.ts.map +1 -0
  81. package/dist/services/catalog.d.ts +10 -0
  82. package/dist/services/catalog.d.ts.map +1 -0
  83. package/dist/services/checkpoint-client.d.ts.map +1 -0
  84. package/dist/services/checkpoint-manager.d.ts +217 -0
  85. package/dist/services/checkpoint-manager.d.ts.map +1 -0
  86. package/dist/services/cloud-fallback.d.ts.map +1 -0
  87. package/dist/services/context-fit.d.ts +36 -0
  88. package/dist/services/context-fit.d.ts.map +1 -0
  89. package/dist/services/conversation-registry.d.ts.map +1 -0
  90. package/{src → dist}/services/desktop-fused-ffi-backend-runtime.d.ts +22 -6
  91. package/dist/services/desktop-fused-ffi-backend-runtime.d.ts.map +1 -0
  92. package/dist/services/device-bridge.d.ts.map +1 -0
  93. package/dist/services/device-resource-metrics.d.ts.map +1 -0
  94. package/{src → dist}/services/device-tier.d.ts +19 -1
  95. package/dist/services/device-tier.d.ts.map +1 -0
  96. package/{src → dist}/services/downloader.d.ts +16 -4
  97. package/dist/services/downloader.d.ts.map +1 -0
  98. package/{src → dist}/services/engine.d.ts +43 -4
  99. package/dist/services/engine.d.ts.map +1 -0
  100. package/dist/services/ensure-local-artifacts.d.ts +82 -0
  101. package/dist/services/ensure-local-artifacts.d.ts.map +1 -0
  102. package/dist/services/external-scanner.d.ts.map +1 -0
  103. package/dist/services/ffi-llm-mock.d.ts +90 -0
  104. package/dist/services/ffi-llm-mock.d.ts.map +1 -0
  105. package/dist/services/ffi-llm-streaming-abi.d.ts +318 -0
  106. package/dist/services/ffi-llm-streaming-abi.d.ts.map +1 -0
  107. package/{src → dist}/services/ffi-streaming-backend.d.ts +28 -7
  108. package/dist/services/ffi-streaming-backend.d.ts.map +1 -0
  109. package/{src → dist}/services/ffi-streaming-runner.d.ts +24 -0
  110. package/dist/services/ffi-streaming-runner.d.ts.map +1 -0
  111. package/dist/services/gpu-autotune.d.ts +150 -0
  112. package/dist/services/gpu-autotune.d.ts.map +1 -0
  113. package/dist/services/gpu-detect.d.ts.map +1 -0
  114. package/dist/services/handler-registry.d.ts.map +1 -0
  115. package/dist/services/hardware.d.ts.map +1 -0
  116. package/dist/services/image-description-runtime.d.ts.map +1 -0
  117. package/dist/services/imagegen/aosp-unavailable.d.ts.map +1 -0
  118. package/dist/services/imagegen/backend-selector.d.ts.map +1 -0
  119. package/dist/services/imagegen/coreml-unavailable.d.ts.map +1 -0
  120. package/dist/services/imagegen/errors.d.ts.map +1 -0
  121. package/dist/services/imagegen/index.d.ts.map +1 -0
  122. package/dist/services/imagegen/mflux.d.ts.map +1 -0
  123. package/{src → dist}/services/imagegen/sd-cpp.d.ts +1 -0
  124. package/dist/services/imagegen/sd-cpp.d.ts.map +1 -0
  125. package/dist/services/imagegen/tensorrt-unavailable.d.ts.map +1 -0
  126. package/dist/services/imagegen/types.d.ts.map +1 -0
  127. package/{src → dist}/services/index.d.ts +3 -1
  128. package/dist/services/index.d.ts.map +1 -0
  129. package/dist/services/index.js +39453 -0
  130. package/dist/services/index.js.map +227 -0
  131. package/dist/services/inference-capabilities.d.ts.map +1 -0
  132. package/dist/services/inference-telemetry.d.ts.map +1 -0
  133. package/dist/services/ios-llama-streaming.d.ts +119 -0
  134. package/dist/services/ios-llama-streaming.d.ts.map +1 -0
  135. package/dist/services/kv-spill.d.ts.map +1 -0
  136. package/dist/services/latency-trace.d.ts.map +1 -0
  137. package/dist/services/lib-target.d.ts +55 -0
  138. package/dist/services/lib-target.d.ts.map +1 -0
  139. package/dist/services/live-signals.d.ts +86 -0
  140. package/dist/services/live-signals.d.ts.map +1 -0
  141. package/dist/services/llama-server-metrics.d.ts +114 -0
  142. package/dist/services/llama-server-metrics.d.ts.map +1 -0
  143. package/dist/services/llm-streaming-binding.d.ts.map +1 -0
  144. package/dist/services/load-args.d.ts.map +1 -0
  145. package/dist/services/manifest/index.d.ts +4 -0
  146. package/dist/services/manifest/index.d.ts.map +1 -0
  147. package/{src → dist}/services/manifest/schema.d.ts +196 -6
  148. package/dist/services/manifest/schema.d.ts.map +1 -0
  149. package/{src → dist}/services/manifest/types.d.ts +3 -1
  150. package/dist/services/manifest/types.d.ts.map +1 -0
  151. package/dist/services/manifest/validator.d.ts.map +1 -0
  152. package/{src → dist}/services/memory-arbiter.d.ts +33 -3
  153. package/dist/services/memory-arbiter.d.ts.map +1 -0
  154. package/dist/services/memory-benchmark.d.ts +76 -0
  155. package/dist/services/memory-benchmark.d.ts.map +1 -0
  156. package/{src → dist}/services/memory-monitor.d.ts +6 -0
  157. package/dist/services/memory-monitor.d.ts.map +1 -0
  158. package/dist/services/memory-pressure.d.ts.map +1 -0
  159. package/dist/services/mtp-doctor.d.ts.map +1 -0
  160. package/dist/services/network-policy.d.ts.map +1 -0
  161. package/dist/services/paths.d.ts.map +1 -0
  162. package/dist/services/planner-skeleton.d.ts.map +1 -0
  163. package/dist/services/providers.d.ts.map +1 -0
  164. package/dist/services/ram-budget.d.ts.map +1 -0
  165. package/dist/services/readiness.d.ts.map +1 -0
  166. package/dist/services/recommendation.d.ts.map +1 -0
  167. package/{src → dist}/services/registry.d.ts +11 -13
  168. package/dist/services/registry.d.ts.map +1 -0
  169. package/{src → dist}/services/router-handler.d.ts +2 -2
  170. package/dist/services/router-handler.d.ts.map +1 -0
  171. package/{src → dist}/services/routing-policy.d.ts +32 -9
  172. package/dist/services/routing-policy.d.ts.map +1 -0
  173. package/dist/services/routing-preferences.d.ts.map +1 -0
  174. package/dist/services/runtime-target.d.ts.map +1 -0
  175. package/{src → dist}/services/service.d.ts +1 -1
  176. package/dist/services/service.d.ts.map +1 -0
  177. package/dist/services/session-pool.d.ts.map +1 -0
  178. package/dist/services/structured-output/deterministic-repair.d.ts.map +1 -0
  179. package/dist/services/structured-output/index.d.ts +2 -0
  180. package/dist/services/structured-output/index.d.ts.map +1 -0
  181. package/dist/services/structured-output.d.ts.map +1 -0
  182. package/dist/services/system-memory.d.ts.map +1 -0
  183. package/{src → dist}/services/types.d.ts +1 -1
  184. package/dist/services/types.d.ts.map +1 -0
  185. package/dist/services/verify-on-device.d.ts.map +1 -0
  186. package/dist/services/verify.d.ts.map +1 -0
  187. package/dist/services/vision/aosp-unavailable.d.ts.map +1 -0
  188. package/dist/services/vision/capacitor-llama.d.ts.map +1 -0
  189. package/dist/services/vision/cloud-fallback.d.ts.map +1 -0
  190. package/dist/services/vision/hash.d.ts.map +1 -0
  191. package/{src → dist}/services/vision/index.d.ts +1 -1
  192. package/dist/services/vision/index.d.ts.map +1 -0
  193. package/dist/services/vision/llama-server.d.ts.map +1 -0
  194. package/{src → dist}/services/vision/types.d.ts +13 -4
  195. package/dist/services/vision/types.d.ts.map +1 -0
  196. package/dist/services/vision/vast-fallback.d.ts.map +1 -0
  197. package/{src → dist}/services/vision-embedding-cache.d.ts +1 -1
  198. package/dist/services/vision-embedding-cache.d.ts.map +1 -0
  199. package/dist/services/voice/__test-helpers__/fake-ffi.d.ts +27 -0
  200. package/dist/services/voice/__test-helpers__/fake-ffi.d.ts.map +1 -0
  201. package/dist/services/voice/__test-helpers__/synthetic-speech.d.ts +66 -0
  202. package/dist/services/voice/__test-helpers__/synthetic-speech.d.ts.map +1 -0
  203. package/dist/services/voice/acoustic-speaker-attribution.d.ts +61 -0
  204. package/dist/services/voice/acoustic-speaker-attribution.d.ts.map +1 -0
  205. package/{src → dist}/services/voice/audio-frame-consumer.d.ts +82 -0
  206. package/dist/services/voice/audio-frame-consumer.d.ts.map +1 -0
  207. package/dist/services/voice/barge-in.d.ts.map +1 -0
  208. package/dist/services/voice/cancellation-coordinator.d.ts.map +1 -0
  209. package/dist/services/voice/checkpoint-manager.d.ts.map +1 -0
  210. package/dist/services/voice/checkpoint-policy.d.ts +178 -0
  211. package/dist/services/voice/checkpoint-policy.d.ts.map +1 -0
  212. package/dist/services/voice/corpus-augment.d.ts +111 -0
  213. package/dist/services/voice/corpus-augment.d.ts.map +1 -0
  214. package/dist/services/voice/corpus-generator.d.ts +134 -0
  215. package/dist/services/voice/corpus-generator.d.ts.map +1 -0
  216. package/dist/services/voice/diarization-error-rate.d.ts +40 -0
  217. package/dist/services/voice/diarization-error-rate.d.ts.map +1 -0
  218. package/dist/services/voice/e2e-harness.d.ts +297 -0
  219. package/dist/services/voice/e2e-harness.d.ts.map +1 -0
  220. package/dist/services/voice/eager-context-builder.d.ts.map +1 -0
  221. package/dist/services/voice/echo-delay.d.ts +67 -0
  222. package/dist/services/voice/echo-delay.d.ts.map +1 -0
  223. package/dist/services/voice/echo-metrics.d.ts +7 -0
  224. package/dist/services/voice/echo-metrics.d.ts.map +1 -0
  225. package/dist/services/voice/echo-reference-buffer.d.ts +65 -0
  226. package/dist/services/voice/echo-reference-buffer.d.ts.map +1 -0
  227. package/{src → dist}/services/voice/eliza1-eot-scorer.d.ts +8 -8
  228. package/dist/services/voice/eliza1-eot-scorer.d.ts.map +1 -0
  229. package/dist/services/voice/embedding-server.d.ts +37 -0
  230. package/dist/services/voice/embedding-server.d.ts.map +1 -0
  231. package/{src → dist}/services/voice/embedding.d.ts +2 -3
  232. package/dist/services/voice/embedding.d.ts.map +1 -0
  233. package/dist/services/voice/emotion-attribution.d.ts.map +1 -0
  234. package/{src → dist}/services/voice/engine-bridge.d.ts +8 -5
  235. package/dist/services/voice/engine-bridge.d.ts.map +1 -0
  236. package/{src → dist}/services/voice/eot-classifier-ggml.d.ts +22 -22
  237. package/dist/services/voice/eot-classifier-ggml.d.ts.map +1 -0
  238. package/{src → dist}/services/voice/eot-classifier.d.ts +9 -12
  239. package/dist/services/voice/eot-classifier.d.ts.map +1 -0
  240. package/{src → dist}/services/voice/errors.d.ts +1 -1
  241. package/dist/services/voice/errors.d.ts.map +1 -0
  242. package/{src → dist}/services/voice/expressive-tags.d.ts +5 -5
  243. package/dist/services/voice/expressive-tags.d.ts.map +1 -0
  244. package/{src → dist}/services/voice/ffi-bindings.d.ts +26 -4
  245. package/dist/services/voice/ffi-bindings.d.ts.map +1 -0
  246. package/dist/services/voice/first-line-cache.d.ts.map +1 -0
  247. package/{src → dist}/services/voice/fused-eot-scorer.d.ts +6 -6
  248. package/dist/services/voice/fused-eot-scorer.d.ts.map +1 -0
  249. package/{src → dist}/services/voice/index.d.ts +8 -3
  250. package/dist/services/voice/index.d.ts.map +1 -0
  251. package/dist/services/voice/kokoro/index.d.ts +24 -0
  252. package/dist/services/voice/kokoro/index.d.ts.map +1 -0
  253. package/{src → dist}/services/voice/kokoro/kokoro-backend.d.ts +15 -0
  254. package/dist/services/voice/kokoro/kokoro-backend.d.ts.map +1 -0
  255. package/{src → dist}/services/voice/kokoro/kokoro-engine-discovery.d.ts +1 -1
  256. package/dist/services/voice/kokoro/kokoro-engine-discovery.d.ts.map +1 -0
  257. package/{src → dist}/services/voice/kokoro/kokoro-ffi-runtime.d.ts +3 -3
  258. package/dist/services/voice/kokoro/kokoro-ffi-runtime.d.ts.map +1 -0
  259. package/dist/services/voice/kokoro/kokoro-runtime.d.ts.map +1 -0
  260. package/dist/services/voice/kokoro/phoneme-stream.d.ts +51 -0
  261. package/dist/services/voice/kokoro/phoneme-stream.d.ts.map +1 -0
  262. package/dist/services/voice/kokoro/phonemizer.d.ts.map +1 -0
  263. package/{src → dist}/services/voice/kokoro/pick-runtime.d.ts +1 -1
  264. package/dist/services/voice/kokoro/pick-runtime.d.ts.map +1 -0
  265. package/dist/services/voice/kokoro/runtime-selection.d.ts +31 -0
  266. package/dist/services/voice/kokoro/runtime-selection.d.ts.map +1 -0
  267. package/dist/services/voice/kokoro/types.d.ts.map +1 -0
  268. package/dist/services/voice/kokoro/voice-presets.d.ts.map +1 -0
  269. package/dist/services/voice/kokoro/voices.d.ts.map +1 -0
  270. package/dist/services/voice/lifecycle.d.ts.map +1 -0
  271. package/dist/services/voice/live-diarization-session.d.ts +196 -0
  272. package/dist/services/voice/live-diarization-session.d.ts.map +1 -0
  273. package/dist/services/voice/metric-math.d.ts +10 -0
  274. package/dist/services/voice/metric-math.d.ts.map +1 -0
  275. package/{src → dist}/services/voice/mic-source.d.ts +1 -1
  276. package/dist/services/voice/mic-source.d.ts.map +1 -0
  277. package/dist/services/voice/nlms-echo-canceller.d.ts +137 -0
  278. package/dist/services/voice/nlms-echo-canceller.d.ts.map +1 -0
  279. package/dist/services/voice/optimistic-policy.d.ts.map +1 -0
  280. package/dist/services/voice/optimistic-rollback.d.ts +151 -0
  281. package/dist/services/voice/optimistic-rollback.d.ts.map +1 -0
  282. package/{src → dist}/services/voice/partial-stabilizer.d.ts +1 -1
  283. package/dist/services/voice/partial-stabilizer.d.ts.map +1 -0
  284. package/dist/services/voice/phoneme-tokenizer.d.ts.map +1 -0
  285. package/dist/services/voice/phrase-cache.d.ts.map +1 -0
  286. package/dist/services/voice/phrase-chunker.d.ts.map +1 -0
  287. package/dist/services/voice/pipeline-impls.d.ts.map +1 -0
  288. package/dist/services/voice/pipeline.d.ts.map +1 -0
  289. package/dist/services/voice/prefill-client.d.ts.map +1 -0
  290. package/dist/services/voice/prefix-preserving-queue.d.ts.map +1 -0
  291. package/dist/services/voice/profile-store.d.ts.map +1 -0
  292. package/dist/services/voice/ring-buffer.d.ts.map +1 -0
  293. package/dist/services/voice/rollback-queue.d.ts.map +1 -0
  294. package/dist/services/voice/samantha-preset-placeholder.d.ts.map +1 -0
  295. package/dist/services/voice/samantha-preset-regenerator.d.ts.map +1 -0
  296. package/dist/services/voice/scheduler.d.ts.map +1 -0
  297. package/dist/services/voice/self-voice-imprint.d.ts +33 -0
  298. package/dist/services/voice/self-voice-imprint.d.ts.map +1 -0
  299. package/{src → dist}/services/voice/shared-resources.d.ts +14 -0
  300. package/dist/services/voice/shared-resources.d.ts.map +1 -0
  301. package/dist/services/voice/speaker/attribution-pipeline.d.ts.map +1 -0
  302. package/dist/services/voice/speaker/diarizer-fused.d.ts.map +1 -0
  303. package/dist/services/voice/speaker/diarizer.d.ts.map +1 -0
  304. package/dist/services/voice/speaker/encoder-fused.d.ts.map +1 -0
  305. package/dist/services/voice/speaker/encoder-ggml.d.ts.map +1 -0
  306. package/dist/services/voice/speaker/encoder.d.ts.map +1 -0
  307. package/dist/services/voice/speaker-imprint.d.ts.map +1 -0
  308. package/dist/services/voice/speaker-preset-cache.d.ts.map +1 -0
  309. package/dist/services/voice/streaming-asr/streaming-pipeline-adapter.d.ts +160 -0
  310. package/dist/services/voice/streaming-asr/streaming-pipeline-adapter.d.ts.map +1 -0
  311. package/dist/services/voice/system-audio-sink.d.ts.map +1 -0
  312. package/{src → dist}/services/voice/transcriber.d.ts +4 -4
  313. package/dist/services/voice/transcriber.d.ts.map +1 -0
  314. package/dist/services/voice/transcript-knowledge.d.ts.map +1 -0
  315. package/{src → dist}/services/voice/transcript-service.d.ts +20 -1
  316. package/dist/services/voice/transcript-service.d.ts.map +1 -0
  317. package/{src → dist}/services/voice/transcript-store.d.ts +12 -1
  318. package/dist/services/voice/transcript-store.d.ts.map +1 -0
  319. package/dist/services/voice/turn-controller.d.ts.map +1 -0
  320. package/{src → dist}/services/voice/types.d.ts +6 -6
  321. package/dist/services/voice/types.d.ts.map +1 -0
  322. package/{src → dist}/services/voice/vad.d.ts +6 -5
  323. package/dist/services/voice/vad.d.ts.map +1 -0
  324. package/dist/services/voice/voice-budget.d.ts.map +1 -0
  325. package/dist/services/voice/voice-emotion-classifier.d.ts.map +1 -0
  326. package/dist/services/voice/voice-preload-predictor.d.ts +76 -0
  327. package/dist/services/voice/voice-preload-predictor.d.ts.map +1 -0
  328. package/{src → dist}/services/voice/voice-preset-format.d.ts +2 -2
  329. package/dist/services/voice/voice-preset-format.d.ts.map +1 -0
  330. package/dist/services/voice/voice-profile-artifact.d.ts.map +1 -0
  331. package/dist/services/voice/voice-profile-routes.d.ts.map +1 -0
  332. package/dist/services/voice/voice-scenario.d.ts +131 -0
  333. package/dist/services/voice/voice-scenario.d.ts.map +1 -0
  334. package/dist/services/voice/voice-state-machine.d.ts.map +1 -0
  335. package/dist/services/voice/voice-workbench-report.d.ts +117 -0
  336. package/dist/services/voice/voice-workbench-report.d.ts.map +1 -0
  337. package/{src → dist}/services/voice/wake-word-ggml.d.ts +8 -9
  338. package/dist/services/voice/wake-word-ggml.d.ts.map +1 -0
  339. package/dist/services/voice/wake-word.d.ts.map +1 -0
  340. package/dist/services/voice/wav-codec.d.ts +11 -0
  341. package/dist/services/voice/wav-codec.d.ts.map +1 -0
  342. package/dist/services/voice/workbench-entrypoint.d.ts +42 -0
  343. package/dist/services/voice/workbench-entrypoint.d.ts.map +1 -0
  344. package/dist/services/voice/workbench-headless-runner.d.ts +102 -0
  345. package/dist/services/voice/workbench-headless-runner.d.ts.map +1 -0
  346. package/dist/services/voice/workbench-logic-services.d.ts +36 -0
  347. package/dist/services/voice/workbench-logic-services.d.ts.map +1 -0
  348. package/dist/services/voice/workbench-real-services.d.ts +17 -0
  349. package/dist/services/voice/workbench-real-services.d.ts.map +1 -0
  350. package/dist/services/voice/workbench-scenarios.d.ts +24 -0
  351. package/dist/services/voice/workbench-scenarios.d.ts.map +1 -0
  352. package/dist/services/voice/wrap-with-first-line-cache.d.ts.map +1 -0
  353. package/dist/services/voice-model-updater.d.ts.map +1 -0
  354. package/dist/services/voice-prewarm.d.ts.map +1 -0
  355. package/dist/voice-workbench.d.ts +18 -0
  356. package/dist/voice-workbench.d.ts.map +1 -0
  357. package/dist/voice-workbench.js +5259 -0
  358. package/dist/voice-workbench.js.map +34 -0
  359. package/package.json +28 -9
  360. package/registry-entry.json +137 -0
  361. package/src/adapters/capacitor-llama/__tests__/voice-turn.test.ts +293 -0
  362. package/src/adapters/capacitor-llama/environment.ts +1 -1
  363. package/src/adapters/capacitor-llama/index.ts +28 -4
  364. package/src/adapters/capacitor-llama/native-voice-capture.ts +140 -0
  365. package/src/adapters/capacitor-llama/text-streaming.ts +2 -2
  366. package/src/adapters/capacitor-llama/voice-turn.ts +178 -0
  367. package/src/backends/apple-foundation.ts +1 -1
  368. package/src/local-inference-routes.test.ts +57 -11
  369. package/src/local-inference-routes.ts +90 -8
  370. package/src/provider.ts +32 -3
  371. package/src/routes/compat-helpers.ts +2 -1
  372. package/src/routes/index.ts +1 -0
  373. package/src/routes/live-diarization-route.test.ts +134 -0
  374. package/src/routes/live-diarization-route.ts +79 -3
  375. package/src/routes/local-inference-asr-route.test.ts +43 -2
  376. package/src/routes/local-inference-asr-route.ts +7 -4
  377. package/src/routes/local-inference-asr-transcribe.test.ts +4 -4
  378. package/src/routes/local-inference-asr-transcribe.ts +1 -1
  379. package/src/routes/local-inference-compat-routes.test.ts +3 -3
  380. package/src/routes/local-inference-compat-routes.ts +23 -56
  381. package/src/routes/native-pcm-turn-route.test.ts +136 -0
  382. package/src/routes/native-pcm-turn-route.ts +121 -0
  383. package/src/routes/transcripts-routes.test.ts +51 -0
  384. package/src/routes/transcripts-routes.ts +35 -3
  385. package/src/runtime/bionic-wire-encoding.test.ts +147 -0
  386. package/src/runtime/ensure-local-inference-handler.test.ts +203 -5
  387. package/src/runtime/ensure-local-inference-handler.ts +203 -11
  388. package/src/runtime/index.ts +4 -1
  389. package/src/runtime/mobile-local-inference-gate.test.ts +85 -2
  390. package/src/runtime/mobile-local-inference-gate.ts +60 -5
  391. package/src/runtime/voice-entity-binding.transcript.test.ts +29 -0
  392. package/src/runtime/voice-entity-binding.ts +46 -6
  393. package/src/runtime/voice-speaker-entity-contract.test.ts +149 -0
  394. package/src/services/README.md +2 -2
  395. package/src/services/__tests__/backend-selector.precedence.test.ts +333 -0
  396. package/src/services/active-model-context-fit.test.ts +125 -0
  397. package/src/services/active-model.ts +211 -8
  398. package/src/services/asr-provenance.ts +68 -0
  399. package/src/services/assignment-validation.test.ts +118 -0
  400. package/src/services/assignments.test.ts +26 -0
  401. package/src/services/assignments.ts +52 -4
  402. package/src/services/backend.test.ts +84 -0
  403. package/src/services/backend.ts +198 -19
  404. package/src/services/bionic-host-loader.test.ts +94 -1
  405. package/src/services/bionic-host-loader.ts +72 -0
  406. package/src/services/cache-bridge.test.ts +7 -7
  407. package/src/services/catalog.test.ts +32 -11
  408. package/src/services/catalog.ts +6 -0
  409. package/src/services/cloud-fallback.ts +1 -1
  410. package/src/services/context-fit.test.ts +121 -0
  411. package/src/services/context-fit.ts +113 -0
  412. package/src/services/desktop-fused-ffi-backend-runtime.ts +99 -7
  413. package/src/services/device-tier.test.ts +89 -2
  414. package/src/services/device-tier.ts +103 -11
  415. package/src/services/downloader.test.ts +199 -58
  416. package/src/services/downloader.ts +141 -27
  417. package/src/services/engine-direct-bundle.test.ts +38 -6
  418. package/src/services/engine.ts +291 -104
  419. package/src/services/ensure-local-artifacts.ts +1 -1
  420. package/src/services/ffi-llm-streaming-abi.ts +6 -3
  421. package/src/services/ffi-streaming-backend.ts +44 -8
  422. package/src/services/ffi-streaming-runner.test.ts +163 -3
  423. package/src/services/ffi-streaming-runner.ts +54 -1
  424. package/src/services/ffi-unload-ordering.test.ts +5 -1
  425. package/src/services/fused-eliza1-no-regression.test.ts +144 -0
  426. package/src/services/hardware.test.ts +7 -2
  427. package/src/services/hardware.ts +28 -0
  428. package/src/services/imagegen/backend-selector.test.ts +190 -0
  429. package/src/services/imagegen/sd-cpp.ts +6 -9
  430. package/src/services/index.ts +18 -0
  431. package/src/services/ios-llama-streaming.ts +1 -1
  432. package/src/services/kv-spill.ts +6 -5
  433. package/src/services/lib-target.test.ts +145 -0
  434. package/src/services/lib-target.ts +102 -0
  435. package/src/services/live-signals.test.ts +132 -0
  436. package/src/services/live-signals.ts +177 -0
  437. package/src/services/llama-server-metrics.test.ts +168 -0
  438. package/src/services/manifest/eliza-1.manifest.v1.json +84 -2
  439. package/src/services/manifest/index.ts +6 -0
  440. package/src/services/manifest/manifest.test.ts +156 -54
  441. package/src/services/manifest/schema.ts +160 -52
  442. package/src/services/manifest/types.ts +6 -0
  443. package/src/services/manifest/validator.ts +91 -25
  444. package/src/services/memory-arbiter.test.ts +139 -0
  445. package/src/services/memory-arbiter.ts +81 -15
  446. package/src/services/memory-benchmark.test.ts +91 -0
  447. package/src/services/memory-benchmark.ts +354 -0
  448. package/src/services/memory-monitor.test.ts +24 -0
  449. package/src/services/memory-monitor.ts +12 -0
  450. package/src/services/mtp-doctor.ts +10 -2
  451. package/src/services/network-policy.ts +5 -5
  452. package/src/services/ram-budget-cache.test.ts +2 -1
  453. package/src/services/ram-budget.ts +0 -0
  454. package/src/services/recommendation.test.ts +216 -0
  455. package/src/services/registry.ts +25 -19
  456. package/src/services/required-kernels-gate.test.ts +64 -0
  457. package/src/services/router-handler.ts +43 -24
  458. package/src/services/routing-policy.test.ts +211 -23
  459. package/src/services/routing-policy.ts +92 -22
  460. package/src/services/service.test.ts +3 -3
  461. package/src/services/service.ts +22 -7
  462. package/src/services/transcription-priority.test.ts +2 -2
  463. package/src/services/types.ts +4 -0
  464. package/src/services/verify-on-device.test.ts +2 -2
  465. package/src/services/vision/hash.ts +1 -1
  466. package/src/services/vision/index.ts +2 -2
  467. package/src/services/vision/llama-server.ts +1 -1
  468. package/src/services/vision/types.ts +13 -4
  469. package/src/services/vision-embedding-cache.ts +1 -1
  470. package/src/services/voice/VOICE_WORKBENCH.md +71 -26
  471. package/src/services/voice/__fixtures__/voice-workbench-logic-baseline.json +180 -0
  472. package/src/services/voice/__test-helpers__/synthetic-speech.ts +72 -2
  473. package/src/services/voice/__tests__/eliza1-eot-scorer.test.ts +29 -29
  474. package/src/services/voice/__tests__/streaming-asr.test.ts +1 -1
  475. package/src/services/voice/acoustic-speaker-attribution.test.ts +165 -0
  476. package/src/services/voice/acoustic-speaker-attribution.ts +336 -0
  477. package/src/services/voice/asr-timed.real.test.ts +6 -8
  478. package/src/services/voice/audio-frame-consumer.test.ts +327 -1
  479. package/src/services/voice/audio-frame-consumer.ts +165 -5
  480. package/src/services/voice/barge-in.ts +2 -3
  481. package/src/services/voice/corpus-augment.test.ts +276 -0
  482. package/src/services/voice/corpus-augment.ts +451 -0
  483. package/src/services/voice/corpus-generator.test.ts +201 -0
  484. package/src/services/voice/corpus-generator.ts +413 -0
  485. package/src/services/voice/diarization-error-rate.greedy.test.ts +140 -0
  486. package/src/services/voice/diarization-error-rate.test.ts +100 -0
  487. package/src/services/voice/diarization-error-rate.ts +249 -0
  488. package/src/services/voice/e2e-harness.der.test.ts +94 -0
  489. package/src/services/voice/e2e-harness.respond-eot-entity.test.ts +277 -0
  490. package/src/services/voice/e2e-harness.security-echo.test.ts +103 -0
  491. package/src/services/voice/e2e-harness.test.ts +2 -2
  492. package/src/services/voice/e2e-harness.ts +175 -16
  493. package/src/services/voice/echo-delay.test.ts +118 -0
  494. package/src/services/voice/echo-delay.ts +135 -0
  495. package/src/services/voice/echo-metrics.test.ts +17 -0
  496. package/src/services/voice/echo-metrics.ts +20 -0
  497. package/src/services/voice/echo-reference-buffer.test.ts +86 -0
  498. package/src/services/voice/echo-reference-buffer.ts +165 -0
  499. package/src/services/voice/eliza1-eot-scorer.ts +22 -22
  500. package/src/services/voice/embedding.ts +2 -3
  501. package/src/services/voice/engine-bridge-transcript-join.test.ts +278 -0
  502. package/src/services/voice/engine-bridge.ts +151 -110
  503. package/src/services/voice/eot-classifier-ggml.ts +42 -39
  504. package/src/services/voice/eot-classifier.test.ts +98 -0
  505. package/src/services/voice/eot-classifier.ts +11 -122
  506. package/src/services/voice/errors.ts +2 -0
  507. package/src/services/voice/expressive-tags.asr.test.ts +77 -0
  508. package/src/services/voice/expressive-tags.test.ts +102 -0
  509. package/src/services/voice/expressive-tags.ts +8 -8
  510. package/src/services/voice/ffi-bindings.test.ts +10 -3
  511. package/src/services/voice/ffi-bindings.ts +177 -15
  512. package/src/services/voice/fused-eot-scorer.ts +17 -13
  513. package/src/services/voice/index.ts +33 -12
  514. package/src/services/voice/kokoro/__tests__/kokoro-backend.test.ts +112 -1
  515. package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.real.test.ts +88 -3
  516. package/src/services/voice/kokoro/__tests__/runtime-selection.test.ts +37 -201
  517. package/src/services/voice/kokoro/kokoro-backend.ts +16 -0
  518. package/src/services/voice/kokoro/kokoro-engine-discovery.ts +1 -1
  519. package/src/services/voice/kokoro/kokoro-ffi-runtime.ts +3 -3
  520. package/src/services/voice/kokoro/pick-runtime.ts +1 -1
  521. package/src/services/voice/kokoro/runtime-selection.ts +28 -201
  522. package/src/services/voice/live-diarization-session.echo.test.ts +232 -0
  523. package/src/services/voice/live-diarization-session.ts +335 -2
  524. package/src/services/voice/metric-math.test.ts +61 -0
  525. package/src/services/voice/metric-math.ts +25 -0
  526. package/src/services/voice/mic-source.ts +1 -1
  527. package/src/services/voice/nlms-echo-canceller.test.ts +244 -0
  528. package/src/services/voice/nlms-echo-canceller.ts +317 -0
  529. package/src/services/voice/optimistic-policy.power-source.test.ts +36 -0
  530. package/src/services/voice/partial-stabilizer.ts +1 -1
  531. package/src/services/voice/pipeline.ts +3 -4
  532. package/src/services/voice/research/VOICE_8785_ASSESSMENT.md +141 -0
  533. package/src/services/voice/research/VOICE_PIPELINE_RESEARCH_2026.md +117 -0
  534. package/src/services/voice/research/VOICE_VALIDATION_RUNBOOK.md +135 -0
  535. package/src/services/voice/samantha-preset-regenerator.wav.test.ts +90 -0
  536. package/src/services/voice/self-voice-imprint.test.ts +59 -0
  537. package/src/services/voice/self-voice-imprint.ts +102 -0
  538. package/src/services/voice/shared-resources.ts +23 -0
  539. package/src/services/voice/speaker/attribution-pipeline.test.ts +221 -0
  540. package/src/services/voice/speaker/attribution-pipeline.ts +85 -22
  541. package/src/services/voice/speaker/encoder-ggml.test.ts +59 -0
  542. package/src/services/voice/transcriber.asr-backend.test.ts +76 -0
  543. package/src/services/voice/transcriber.ts +4 -4
  544. package/src/services/voice/transcript-service.test.ts +58 -0
  545. package/src/services/voice/transcript-service.ts +64 -0
  546. package/src/services/voice/transcript-store.test.ts +36 -0
  547. package/src/services/voice/transcript-store.ts +32 -0
  548. package/src/services/voice/types.ts +7 -7
  549. package/src/services/voice/vad.test.ts +33 -15
  550. package/src/services/voice/vad.ts +25 -20
  551. package/src/services/voice/voice-budget.test.ts +0 -3
  552. package/src/services/voice/voice-budget.ts +6 -6
  553. package/src/services/voice/voice-duet.test.ts +1 -1
  554. package/src/services/voice/voice-hardening.fuzz.test.ts +116 -0
  555. package/src/services/voice/voice-preload-predictor.test.ts +130 -0
  556. package/src/services/voice/voice-preload-predictor.ts +113 -0
  557. package/src/services/voice/voice-preset-format.fuzz.test.ts +89 -0
  558. package/src/services/voice/voice-preset-format.test.ts +75 -0
  559. package/src/services/voice/voice-preset-format.ts +17 -4
  560. package/src/services/voice/voice-scenario.test.ts +159 -0
  561. package/src/services/voice/voice-scenario.ts +133 -7
  562. package/src/services/voice/voice-scenario.turn-helpers.test.ts +77 -0
  563. package/src/services/voice/voice-workbench-report.ts +58 -17
  564. package/src/services/voice/wake-word-ggml.ts +12 -13
  565. package/src/services/voice/wav-codec.fuzz.test.ts +59 -0
  566. package/src/services/voice/wav-codec.test.ts +32 -0
  567. package/src/services/voice/wav-codec.ts +101 -0
  568. package/src/services/voice/workbench-entrypoint.test.ts +55 -0
  569. package/src/services/voice/workbench-entrypoint.ts +88 -0
  570. package/src/services/voice/workbench-headless-runner.test.ts +162 -0
  571. package/src/services/voice/workbench-headless-runner.ts +396 -0
  572. package/src/services/voice/workbench-logic-services.test.ts +225 -0
  573. package/src/services/voice/workbench-logic-services.ts +184 -0
  574. package/src/services/voice/workbench-real-services.ts +629 -0
  575. package/src/services/voice/workbench-scenarios.ts +407 -0
  576. package/src/services/voice-prewarm.ts +1 -1
  577. package/src/voice-workbench.ts +71 -0
  578. package/src/actions/generate-media.d.ts.map +0 -1
  579. package/src/actions/identify-speaker.d.ts.map +0 -1
  580. package/src/actions/transcription-control.d.ts.map +0 -1
  581. package/src/index.d.ts.map +0 -1
  582. package/src/local-inference-routes.d.ts.map +0 -1
  583. package/src/provider.d.ts.map +0 -1
  584. package/src/routes/compat-helpers.d.ts.map +0 -1
  585. package/src/routes/family-member-route.d.ts.map +0 -1
  586. package/src/routes/index.d.ts.map +0 -1
  587. package/src/routes/live-diarization-route.d.ts.map +0 -1
  588. package/src/routes/local-inference-asr-route.d.ts.map +0 -1
  589. package/src/routes/local-inference-asr-transcribe.d.ts.map +0 -1
  590. package/src/routes/local-inference-compat-routes.d.ts.map +0 -1
  591. package/src/routes/local-inference-tts-route.d.ts.map +0 -1
  592. package/src/routes/transcript-audio-store.d.ts.map +0 -1
  593. package/src/routes/transcripts-routes.d.ts.map +0 -1
  594. package/src/routes/voice-first-run-routes.d.ts.map +0 -1
  595. package/src/routes/voice-models-routes.d.ts.map +0 -1
  596. package/src/routes/voice-profile-plugin-routes.d.ts.map +0 -1
  597. package/src/routes/voice-profiles-management-routes.d.ts.map +0 -1
  598. package/src/routes/voice-speaker-profile-routes.d.ts.map +0 -1
  599. package/src/runtime/embedding-manager-support.d.ts.map +0 -1
  600. package/src/runtime/embedding-presets.d.ts.map +0 -1
  601. package/src/runtime/embedding-warmup-policy.d.ts.map +0 -1
  602. package/src/runtime/ensure-local-inference-handler.d.ts.map +0 -1
  603. package/src/runtime/index.d.ts.map +0 -1
  604. package/src/runtime/mobile-local-inference-gate.d.ts +0 -31
  605. package/src/runtime/mobile-local-inference-gate.d.ts.map +0 -1
  606. package/src/runtime/voice-entity-binding.d.ts.map +0 -1
  607. package/src/services/active-model.d.ts.map +0 -1
  608. package/src/services/assignments.d.ts.map +0 -1
  609. package/src/services/backend.d.ts.map +0 -1
  610. package/src/services/bionic-host-loader.d.ts.map +0 -1
  611. package/src/services/bundled-models.d.ts.map +0 -1
  612. package/src/services/cache-bridge.d.ts.map +0 -1
  613. package/src/services/catalog.d.ts +0 -10
  614. package/src/services/catalog.d.ts.map +0 -1
  615. package/src/services/checkpoint-client.d.ts.map +0 -1
  616. package/src/services/cloud-fallback.d.ts.map +0 -1
  617. package/src/services/conversation-registry.d.ts.map +0 -1
  618. package/src/services/desktop-fused-ffi-backend-runtime.d.ts.map +0 -1
  619. package/src/services/device-bridge.d.ts.map +0 -1
  620. package/src/services/device-resource-metrics.d.ts.map +0 -1
  621. package/src/services/device-tier.d.ts.map +0 -1
  622. package/src/services/downloader.d.ts.map +0 -1
  623. package/src/services/engine.d.ts.map +0 -1
  624. package/src/services/external-scanner.d.ts.map +0 -1
  625. package/src/services/ffi-streaming-backend.d.ts.map +0 -1
  626. package/src/services/ffi-streaming-runner.d.ts.map +0 -1
  627. package/src/services/gpu-detect.d.ts.map +0 -1
  628. package/src/services/handler-registry.d.ts.map +0 -1
  629. package/src/services/hardware.d.ts.map +0 -1
  630. package/src/services/hf-search.d.ts +0 -26
  631. package/src/services/hf-search.d.ts.map +0 -1
  632. package/src/services/hf-search.test.ts +0 -69
  633. package/src/services/hf-search.ts +0 -420
  634. package/src/services/image-description-runtime.d.ts.map +0 -1
  635. package/src/services/imagegen/aosp-unavailable.d.ts.map +0 -1
  636. package/src/services/imagegen/backend-selector.d.ts.map +0 -1
  637. package/src/services/imagegen/coreml-unavailable.d.ts.map +0 -1
  638. package/src/services/imagegen/errors.d.ts.map +0 -1
  639. package/src/services/imagegen/index.d.ts.map +0 -1
  640. package/src/services/imagegen/mflux.d.ts.map +0 -1
  641. package/src/services/imagegen/sd-cpp.d.ts.map +0 -1
  642. package/src/services/imagegen/tensorrt-unavailable.d.ts.map +0 -1
  643. package/src/services/imagegen/types.d.ts.map +0 -1
  644. package/src/services/index.d.ts.map +0 -1
  645. package/src/services/inference-capabilities.d.ts.map +0 -1
  646. package/src/services/inference-telemetry.d.ts.map +0 -1
  647. package/src/services/kv-spill.d.ts.map +0 -1
  648. package/src/services/latency-trace.d.ts.map +0 -1
  649. package/src/services/llm-streaming-binding.d.ts.map +0 -1
  650. package/src/services/load-args.d.ts.map +0 -1
  651. package/src/services/manifest/index.d.ts +0 -4
  652. package/src/services/manifest/index.d.ts.map +0 -1
  653. package/src/services/manifest/schema.d.ts.map +0 -1
  654. package/src/services/manifest/types.d.ts.map +0 -1
  655. package/src/services/manifest/validator.d.ts.map +0 -1
  656. package/src/services/memory-arbiter.d.ts.map +0 -1
  657. package/src/services/memory-monitor.d.ts.map +0 -1
  658. package/src/services/memory-pressure.d.ts.map +0 -1
  659. package/src/services/mtp-doctor.d.ts.map +0 -1
  660. package/src/services/network-policy.d.ts.map +0 -1
  661. package/src/services/paths.d.ts.map +0 -1
  662. package/src/services/planner-skeleton.d.ts.map +0 -1
  663. package/src/services/providers.d.ts.map +0 -1
  664. package/src/services/ram-budget.d.ts.map +0 -1
  665. package/src/services/readiness.d.ts.map +0 -1
  666. package/src/services/recommendation.d.ts.map +0 -1
  667. package/src/services/registry.d.ts.map +0 -1
  668. package/src/services/router-handler.d.ts.map +0 -1
  669. package/src/services/routing-policy.d.ts.map +0 -1
  670. package/src/services/routing-preferences.d.ts.map +0 -1
  671. package/src/services/runtime-target.d.ts.map +0 -1
  672. package/src/services/service.d.ts.map +0 -1
  673. package/src/services/session-pool.d.ts.map +0 -1
  674. package/src/services/structured-output/deterministic-repair.d.ts.map +0 -1
  675. package/src/services/structured-output.d.ts.map +0 -1
  676. package/src/services/system-memory.d.ts.map +0 -1
  677. package/src/services/types.d.ts.map +0 -1
  678. package/src/services/verify-on-device.d.ts.map +0 -1
  679. package/src/services/verify.d.ts.map +0 -1
  680. package/src/services/vision/aosp-unavailable.d.ts.map +0 -1
  681. package/src/services/vision/capacitor-llama.d.ts.map +0 -1
  682. package/src/services/vision/cloud-fallback.d.ts.map +0 -1
  683. package/src/services/vision/hash.d.ts.map +0 -1
  684. package/src/services/vision/index.d.ts.map +0 -1
  685. package/src/services/vision/llama-server.d.ts.map +0 -1
  686. package/src/services/vision/types.d.ts.map +0 -1
  687. package/src/services/vision/vast-fallback.d.ts.map +0 -1
  688. package/src/services/vision-embedding-cache.d.ts.map +0 -1
  689. package/src/services/voice/audio-frame-consumer.d.ts.map +0 -1
  690. package/src/services/voice/barge-in.d.ts.map +0 -1
  691. package/src/services/voice/cancellation-coordinator.d.ts.map +0 -1
  692. package/src/services/voice/checkpoint-manager.d.ts.map +0 -1
  693. package/src/services/voice/eager-context-builder.d.ts.map +0 -1
  694. package/src/services/voice/eliza1-eot-scorer.d.ts.map +0 -1
  695. package/src/services/voice/embedding.d.ts.map +0 -1
  696. package/src/services/voice/emotion-attribution.d.ts.map +0 -1
  697. package/src/services/voice/engine-bridge.d.ts.map +0 -1
  698. package/src/services/voice/eot-classifier-ggml.d.ts.map +0 -1
  699. package/src/services/voice/eot-classifier.d.ts.map +0 -1
  700. package/src/services/voice/errors.d.ts.map +0 -1
  701. package/src/services/voice/expressive-tags.d.ts.map +0 -1
  702. package/src/services/voice/ffi-bindings.d.ts.map +0 -1
  703. package/src/services/voice/first-line-cache.d.ts.map +0 -1
  704. package/src/services/voice/fused-eot-scorer.d.ts.map +0 -1
  705. package/src/services/voice/index.d.ts.map +0 -1
  706. package/src/services/voice/kokoro/kokoro-backend.d.ts.map +0 -1
  707. package/src/services/voice/kokoro/kokoro-engine-discovery.d.ts.map +0 -1
  708. package/src/services/voice/kokoro/kokoro-ffi-runtime.d.ts.map +0 -1
  709. package/src/services/voice/kokoro/kokoro-runtime.d.ts.map +0 -1
  710. package/src/services/voice/kokoro/phonemizer.d.ts.map +0 -1
  711. package/src/services/voice/kokoro/pick-runtime.d.ts.map +0 -1
  712. package/src/services/voice/kokoro/runtime-selection.d.ts +0 -92
  713. package/src/services/voice/kokoro/runtime-selection.d.ts.map +0 -1
  714. package/src/services/voice/kokoro/types.d.ts.map +0 -1
  715. package/src/services/voice/kokoro/voice-presets.d.ts.map +0 -1
  716. package/src/services/voice/kokoro/voices.d.ts.map +0 -1
  717. package/src/services/voice/lifecycle.d.ts.map +0 -1
  718. package/src/services/voice/live-diarization-session.d.ts +0 -96
  719. package/src/services/voice/live-diarization-session.d.ts.map +0 -1
  720. package/src/services/voice/mic-source.d.ts.map +0 -1
  721. package/src/services/voice/optimistic-policy.d.ts.map +0 -1
  722. package/src/services/voice/partial-stabilizer.d.ts.map +0 -1
  723. package/src/services/voice/phoneme-tokenizer.d.ts.map +0 -1
  724. package/src/services/voice/phrase-cache.d.ts.map +0 -1
  725. package/src/services/voice/phrase-chunker.d.ts.map +0 -1
  726. package/src/services/voice/pipeline-impls.d.ts.map +0 -1
  727. package/src/services/voice/pipeline.d.ts.map +0 -1
  728. package/src/services/voice/prefill-client.d.ts.map +0 -1
  729. package/src/services/voice/prefix-preserving-queue.d.ts.map +0 -1
  730. package/src/services/voice/profile-store.d.ts.map +0 -1
  731. package/src/services/voice/ring-buffer.d.ts.map +0 -1
  732. package/src/services/voice/rollback-queue.d.ts.map +0 -1
  733. package/src/services/voice/samantha-preset-placeholder.d.ts.map +0 -1
  734. package/src/services/voice/samantha-preset-regenerator.d.ts.map +0 -1
  735. package/src/services/voice/scheduler.d.ts.map +0 -1
  736. package/src/services/voice/shared-resources.d.ts.map +0 -1
  737. package/src/services/voice/speaker/attribution-pipeline.d.ts.map +0 -1
  738. package/src/services/voice/speaker/diarizer-fused.d.ts.map +0 -1
  739. package/src/services/voice/speaker/diarizer.d.ts.map +0 -1
  740. package/src/services/voice/speaker/encoder-fused.d.ts.map +0 -1
  741. package/src/services/voice/speaker/encoder-ggml.d.ts.map +0 -1
  742. package/src/services/voice/speaker/encoder.d.ts.map +0 -1
  743. package/src/services/voice/speaker-imprint.d.ts.map +0 -1
  744. package/src/services/voice/speaker-preset-cache.d.ts.map +0 -1
  745. package/src/services/voice/system-audio-sink.d.ts.map +0 -1
  746. package/src/services/voice/transcriber.d.ts.map +0 -1
  747. package/src/services/voice/transcript-knowledge.d.ts.map +0 -1
  748. package/src/services/voice/transcript-service.d.ts.map +0 -1
  749. package/src/services/voice/transcript-store.d.ts.map +0 -1
  750. package/src/services/voice/turn-controller.d.ts.map +0 -1
  751. package/src/services/voice/types.d.ts.map +0 -1
  752. package/src/services/voice/vad.d.ts.map +0 -1
  753. package/src/services/voice/voice-budget.d.ts.map +0 -1
  754. package/src/services/voice/voice-emotion-classifier.d.ts.map +0 -1
  755. package/src/services/voice/voice-preset-format.d.ts.map +0 -1
  756. package/src/services/voice/voice-profile-artifact.d.ts.map +0 -1
  757. package/src/services/voice/voice-profile-routes.d.ts.map +0 -1
  758. package/src/services/voice/voice-settings.d.ts +0 -82
  759. package/src/services/voice/voice-settings.d.ts.map +0 -1
  760. package/src/services/voice/voice-settings.ts +0 -172
  761. package/src/services/voice/voice-state-machine.d.ts.map +0 -1
  762. package/src/services/voice/wake-word-ggml.d.ts.map +0 -1
  763. package/src/services/voice/wake-word.d.ts.map +0 -1
  764. package/src/services/voice/wrap-with-first-line-cache.d.ts.map +0 -1
  765. package/src/services/voice-model-updater.d.ts.map +0 -1
  766. package/src/services/voice-prewarm.d.ts.map +0 -1
  767. /package/{src → dist}/actions/generate-media.d.ts +0 -0
  768. /package/{src → dist}/actions/identify-speaker.d.ts +0 -0
  769. /package/{src → dist}/actions/transcription-control.d.ts +0 -0
  770. /package/{src → dist}/index.d.ts +0 -0
  771. /package/{src → dist}/provider.d.ts +0 -0
  772. /package/{src → dist}/routes/family-member-route.d.ts +0 -0
  773. /package/{src → dist}/routes/local-inference-asr-route.d.ts +0 -0
  774. /package/{src → dist}/routes/local-inference-asr-transcribe.d.ts +0 -0
  775. /package/{src → dist}/routes/local-inference-compat-routes.d.ts +0 -0
  776. /package/{src → dist}/routes/local-inference-tts-route.d.ts +0 -0
  777. /package/{src → dist}/routes/transcript-audio-store.d.ts +0 -0
  778. /package/{src → dist}/routes/voice-first-run-routes.d.ts +0 -0
  779. /package/{src → dist}/routes/voice-models-routes.d.ts +0 -0
  780. /package/{src → dist}/routes/voice-profile-plugin-routes.d.ts +0 -0
  781. /package/{src → dist}/routes/voice-profiles-management-routes.d.ts +0 -0
  782. /package/{src → dist}/routes/voice-speaker-profile-routes.d.ts +0 -0
  783. /package/{src → dist}/runtime/embedding-manager-support.d.ts +0 -0
  784. /package/{src → dist}/runtime/embedding-presets.d.ts +0 -0
  785. /package/{src → dist}/runtime/embedding-warmup-policy.d.ts +0 -0
  786. /package/{src → dist}/services/bundled-models.d.ts +0 -0
  787. /package/{src → dist}/services/cache-bridge.d.ts +0 -0
  788. /package/{src → dist}/services/checkpoint-client.d.ts +0 -0
  789. /package/{src → dist}/services/cloud-fallback.d.ts +0 -0
  790. /package/{src → dist}/services/conversation-registry.d.ts +0 -0
  791. /package/{src → dist}/services/device-bridge.d.ts +0 -0
  792. /package/{src → dist}/services/device-resource-metrics.d.ts +0 -0
  793. /package/{src → dist}/services/external-scanner.d.ts +0 -0
  794. /package/{src → dist}/services/gpu-detect.d.ts +0 -0
  795. /package/{src → dist}/services/handler-registry.d.ts +0 -0
  796. /package/{src → dist}/services/hardware.d.ts +0 -0
  797. /package/{src → dist}/services/image-description-runtime.d.ts +0 -0
  798. /package/{src → dist}/services/imagegen/aosp-unavailable.d.ts +0 -0
  799. /package/{src → dist}/services/imagegen/backend-selector.d.ts +0 -0
  800. /package/{src → dist}/services/imagegen/coreml-unavailable.d.ts +0 -0
  801. /package/{src → dist}/services/imagegen/errors.d.ts +0 -0
  802. /package/{src → dist}/services/imagegen/index.d.ts +0 -0
  803. /package/{src → dist}/services/imagegen/mflux.d.ts +0 -0
  804. /package/{src → dist}/services/imagegen/tensorrt-unavailable.d.ts +0 -0
  805. /package/{src → dist}/services/imagegen/types.d.ts +0 -0
  806. /package/{src → dist}/services/inference-capabilities.d.ts +0 -0
  807. /package/{src → dist}/services/inference-telemetry.d.ts +0 -0
  808. /package/{src → dist}/services/kv-spill.d.ts +0 -0
  809. /package/{src → dist}/services/latency-trace.d.ts +0 -0
  810. /package/{src → dist}/services/llm-streaming-binding.d.ts +0 -0
  811. /package/{src → dist}/services/load-args.d.ts +0 -0
  812. /package/{src → dist}/services/manifest/validator.d.ts +0 -0
  813. /package/{src → dist}/services/memory-pressure.d.ts +0 -0
  814. /package/{src → dist}/services/mtp-doctor.d.ts +0 -0
  815. /package/{src → dist}/services/network-policy.d.ts +0 -0
  816. /package/{src → dist}/services/paths.d.ts +0 -0
  817. /package/{src → dist}/services/planner-skeleton.d.ts +0 -0
  818. /package/{src → dist}/services/providers.d.ts +0 -0
  819. /package/{src → dist}/services/ram-budget.d.ts +0 -0
  820. /package/{src → dist}/services/readiness.d.ts +0 -0
  821. /package/{src → dist}/services/recommendation.d.ts +0 -0
  822. /package/{src → dist}/services/routing-preferences.d.ts +0 -0
  823. /package/{src → dist}/services/runtime-target.d.ts +0 -0
  824. /package/{src → dist}/services/session-pool.d.ts +0 -0
  825. /package/{src → dist}/services/structured-output/deterministic-repair.d.ts +0 -0
  826. /package/{src → dist}/services/structured-output.d.ts +0 -0
  827. /package/{src → dist}/services/system-memory.d.ts +0 -0
  828. /package/{src → dist}/services/verify-on-device.d.ts +0 -0
  829. /package/{src → dist}/services/verify.d.ts +0 -0
  830. /package/{src → dist}/services/vision/aosp-unavailable.d.ts +0 -0
  831. /package/{src → dist}/services/vision/capacitor-llama.d.ts +0 -0
  832. /package/{src → dist}/services/vision/cloud-fallback.d.ts +0 -0
  833. /package/{src → dist}/services/vision/hash.d.ts +0 -0
  834. /package/{src → dist}/services/vision/llama-server.d.ts +0 -0
  835. /package/{src → dist}/services/vision/vast-fallback.d.ts +0 -0
  836. /package/{src → dist}/services/voice/barge-in.d.ts +0 -0
  837. /package/{src → dist}/services/voice/cancellation-coordinator.d.ts +0 -0
  838. /package/{src → dist}/services/voice/checkpoint-manager.d.ts +0 -0
  839. /package/{src → dist}/services/voice/eager-context-builder.d.ts +0 -0
  840. /package/{src → dist}/services/voice/emotion-attribution.d.ts +0 -0
  841. /package/{src → dist}/services/voice/first-line-cache.d.ts +0 -0
  842. /package/{src → dist}/services/voice/kokoro/kokoro-runtime.d.ts +0 -0
  843. /package/{src → dist}/services/voice/kokoro/phonemizer.d.ts +0 -0
  844. /package/{src → dist}/services/voice/kokoro/types.d.ts +0 -0
  845. /package/{src → dist}/services/voice/kokoro/voice-presets.d.ts +0 -0
  846. /package/{src → dist}/services/voice/kokoro/voices.d.ts +0 -0
  847. /package/{src → dist}/services/voice/lifecycle.d.ts +0 -0
  848. /package/{src → dist}/services/voice/optimistic-policy.d.ts +0 -0
  849. /package/{src → dist}/services/voice/phoneme-tokenizer.d.ts +0 -0
  850. /package/{src → dist}/services/voice/phrase-cache.d.ts +0 -0
  851. /package/{src → dist}/services/voice/phrase-chunker.d.ts +0 -0
  852. /package/{src → dist}/services/voice/pipeline-impls.d.ts +0 -0
  853. /package/{src → dist}/services/voice/pipeline.d.ts +0 -0
  854. /package/{src → dist}/services/voice/prefill-client.d.ts +0 -0
  855. /package/{src → dist}/services/voice/prefix-preserving-queue.d.ts +0 -0
  856. /package/{src → dist}/services/voice/profile-store.d.ts +0 -0
  857. /package/{src → dist}/services/voice/ring-buffer.d.ts +0 -0
  858. /package/{src → dist}/services/voice/rollback-queue.d.ts +0 -0
  859. /package/{src → dist}/services/voice/samantha-preset-placeholder.d.ts +0 -0
  860. /package/{src → dist}/services/voice/samantha-preset-regenerator.d.ts +0 -0
  861. /package/{src → dist}/services/voice/scheduler.d.ts +0 -0
  862. /package/{src → dist}/services/voice/speaker/attribution-pipeline.d.ts +0 -0
  863. /package/{src → dist}/services/voice/speaker/diarizer-fused.d.ts +0 -0
  864. /package/{src → dist}/services/voice/speaker/diarizer.d.ts +0 -0
  865. /package/{src → dist}/services/voice/speaker/encoder-fused.d.ts +0 -0
  866. /package/{src → dist}/services/voice/speaker/encoder-ggml.d.ts +0 -0
  867. /package/{src → dist}/services/voice/speaker/encoder.d.ts +0 -0
  868. /package/{src → dist}/services/voice/speaker-imprint.d.ts +0 -0
  869. /package/{src → dist}/services/voice/speaker-preset-cache.d.ts +0 -0
  870. /package/{src → dist}/services/voice/system-audio-sink.d.ts +0 -0
  871. /package/{src → dist}/services/voice/transcript-knowledge.d.ts +0 -0
  872. /package/{src → dist}/services/voice/turn-controller.d.ts +0 -0
  873. /package/{src → dist}/services/voice/voice-budget.d.ts +0 -0
  874. /package/{src → dist}/services/voice/voice-emotion-classifier.d.ts +0 -0
  875. /package/{src → dist}/services/voice/voice-profile-artifact.d.ts +0 -0
  876. /package/{src → dist}/services/voice/voice-profile-routes.d.ts +0 -0
  877. /package/{src → dist}/services/voice/voice-state-machine.d.ts +0 -0
  878. /package/{src → dist}/services/voice/wake-word.d.ts +0 -0
  879. /package/{src → dist}/services/voice/wrap-with-first-line-cache.d.ts +0 -0
  880. /package/{src → dist}/services/voice-model-updater.d.ts +0 -0
  881. /package/{src → dist}/services/voice-prewarm.d.ts +0 -0
@@ -0,0 +1,159 @@
1
+ // Coverage for the pure VoiceScenario validator + turn helpers (#9147). The
2
+ // validator gates every test-matrix scenario before the corpus build, so its
3
+ // id/participant/turn/agent/environment checks are worth pinning directly.
4
+
5
+ import { describe, expect, it } from "vitest";
6
+ import {
7
+ resolveTurnEnvironment,
8
+ turnReferenceTranscript,
9
+ turnSpeakerLabel,
10
+ type VoiceEnvironment,
11
+ type VoiceScenario,
12
+ validateVoiceScenario,
13
+ } from "./voice-scenario";
14
+
15
+ function validScenario(): VoiceScenario {
16
+ return {
17
+ id: "s1",
18
+ classes: ["diarization"],
19
+ participants: [{ label: "alice" }, { label: "bob" }],
20
+ turns: [
21
+ { speaker: "alice", text: "hello", expectRespond: true },
22
+ { speaker: "bob", text: "hi there", expectRespond: false },
23
+ ],
24
+ };
25
+ }
26
+
27
+ describe("validateVoiceScenario", () => {
28
+ it("accepts a well-formed scenario", () => {
29
+ expect(validateVoiceScenario(validScenario())).toEqual({
30
+ valid: true,
31
+ errors: [],
32
+ });
33
+ });
34
+
35
+ it("requires id, a non-empty classes array, participants, and turns", () => {
36
+ const r = validateVoiceScenario({
37
+ id: " ",
38
+ classes: [],
39
+ participants: [],
40
+ turns: [],
41
+ });
42
+ expect(r.valid).toBe(false);
43
+ expect(r.errors).toContain("scenario.id is required");
44
+ expect(r.errors).toContain("scenario.classes must be a non-empty array");
45
+ expect(r.errors).toContain("scenario.participants must be non-empty");
46
+ expect(r.errors).toContain("scenario.turns must be a non-empty array");
47
+ });
48
+
49
+ it("flags duplicate participant labels", () => {
50
+ const s = validScenario();
51
+ s.participants = [{ label: "alice" }, { label: "alice" }];
52
+ expect(validateVoiceScenario(s).errors).toContain(
53
+ "duplicate participant label: alice",
54
+ );
55
+ });
56
+
57
+ it("flags a turn whose speaker is not a participant", () => {
58
+ const s = validScenario();
59
+ s.turns = [{ speaker: "carol", text: "hi", expectRespond: true }];
60
+ expect(validateVoiceScenario(s).errors).toContain(
61
+ 'turn[0].speaker "carol" is not a participant',
62
+ );
63
+ });
64
+
65
+ it("requires each turn to carry text or audioRef and a boolean expectRespond", () => {
66
+ const s = validScenario();
67
+ // @ts-expect-error — exercising the runtime guard for a missing expectRespond
68
+ s.turns = [{ speaker: "alice" }];
69
+ const errors = validateVoiceScenario(s).errors;
70
+ expect(errors).toContain("turn[0] must have either text or audioRef");
71
+ expect(errors).toContain("turn[0].expectRespond must be a boolean");
72
+ });
73
+
74
+ it("flags an agent label that is not a participant", () => {
75
+ const s = validScenario();
76
+ s.agents = ["ghost"];
77
+ expect(validateVoiceScenario(s).errors).toContain(
78
+ 'agent "ghost" is not a participant',
79
+ );
80
+ });
81
+
82
+ it("validates acoustic environment ranges (reverb in [0,1], far-field >= 0)", () => {
83
+ const s = validScenario();
84
+ s.environment = { reverb: 2, farFieldDb: -3 } as VoiceEnvironment;
85
+ const errors = validateVoiceScenario(s).errors;
86
+ expect(errors).toContain("scenario.environment.reverb must be in [0, 1]");
87
+ expect(errors).toContain(
88
+ "scenario.environment.farFieldDb must be a non-negative dB attenuation",
89
+ );
90
+ });
91
+
92
+ it("collects every error at once instead of throwing on the first", () => {
93
+ const r = validateVoiceScenario({
94
+ id: "",
95
+ classes: [],
96
+ participants: [{ label: "alice" }],
97
+ turns: [{ speaker: "nope", text: "x", expectRespond: true }],
98
+ });
99
+ expect(r.valid).toBe(false);
100
+ expect(r.errors.length).toBeGreaterThanOrEqual(3);
101
+ });
102
+ });
103
+
104
+ describe("turn helpers", () => {
105
+ it("resolveTurnEnvironment merges turn over scenario (turn wins)", () => {
106
+ const s = validScenario();
107
+ s.environment = { reverb: 0.2, noiseSnrDb: 10 } as VoiceEnvironment;
108
+ const turn = {
109
+ speaker: "alice",
110
+ text: "hi",
111
+ expectRespond: true,
112
+ environment: { reverb: 0.8 } as VoiceEnvironment,
113
+ };
114
+ expect(resolveTurnEnvironment(s, turn)).toEqual({
115
+ reverb: 0.8,
116
+ noiseSnrDb: 10,
117
+ });
118
+ // Both absent → undefined.
119
+ expect(
120
+ resolveTurnEnvironment(validScenario(), {
121
+ speaker: "alice",
122
+ text: "hi",
123
+ expectRespond: true,
124
+ }),
125
+ ).toBeUndefined();
126
+ });
127
+
128
+ it("turnReferenceTranscript prefers the explicit override, else the text", () => {
129
+ expect(
130
+ turnReferenceTranscript({
131
+ speaker: "a",
132
+ text: "spoken",
133
+ expectedTranscript: " override ",
134
+ expectRespond: true,
135
+ }),
136
+ ).toBe("override");
137
+ expect(
138
+ turnReferenceTranscript({
139
+ speaker: "a",
140
+ text: " just text ",
141
+ expectRespond: true,
142
+ }),
143
+ ).toBe("just text");
144
+ });
145
+
146
+ it("turnSpeakerLabel prefers the explicit diarization label, else the speaker", () => {
147
+ expect(
148
+ turnSpeakerLabel({
149
+ speaker: "alice",
150
+ text: "x",
151
+ expectedSpeakerLabel: "SPEAKER_01",
152
+ expectRespond: true,
153
+ }),
154
+ ).toBe("SPEAKER_01");
155
+ expect(
156
+ turnSpeakerLabel({ speaker: "alice", text: "x", expectRespond: true }),
157
+ ).toBe("alice");
158
+ });
159
+ });
@@ -13,6 +13,17 @@
13
13
  * import from the runner, the player, and tests alike.
14
14
  */
15
15
 
16
+ import type { AugmentationSpec } from "./corpus-augment";
17
+
18
+ /**
19
+ * Acoustic environment for a scenario or a single turn: room noise, reverb,
20
+ * far-field attenuation, low-quality line, background talkers. Drives the
21
+ * corpus generator's degradation chain ({@link AugmentationSpec}). A turn's
22
+ * environment is merged over the scenario's, so a scenario can declare a noisy
23
+ * room once and an individual turn can override it (e.g. one talker steps away).
24
+ */
25
+ export type VoiceEnvironment = AugmentationSpec;
26
+
16
27
  /** A named voice/entity participating in the scenario. */
17
28
  export interface VoiceScenarioParticipant {
18
29
  /** Stable label used in turns + diarization ground truth (e.g. "alice"). */
@@ -39,12 +50,33 @@ export interface VoiceScenarioTurn {
39
50
  pausesMs?: number[];
40
51
  /** Ground truth: SHOULD the agent respond to this turn? */
41
52
  expectRespond: boolean;
53
+ /** Ground truth: is this segment a real end-of-turn boundary? */
54
+ expectEndOfTurn?: boolean;
42
55
  /** Expected ASR transcript (for WER scoring); defaults to `text`. */
43
56
  expectedTranscript?: string;
44
57
  /** Expected diarization label (defaults to `speaker`). */
45
58
  expectedSpeakerLabel?: string;
46
59
  /** Expected entity inferred/recognized from this turn (name extraction). */
47
60
  expectedEntity?: string;
61
+ /**
62
+ * Acoustic degradation for THIS turn, merged over the scenario environment.
63
+ * Use it to model one talker stepping away (far-field) or onto a bad line
64
+ * while the rest of the room stays clean.
65
+ */
66
+ environment?: VoiceEnvironment;
67
+ /**
68
+ * Ground truth for echo/self-voice rejection: this "turn" is the agent's own
69
+ * TTS bleeding back into the mic (not a real user turn). The respond gate
70
+ * MUST suppress it. Always implies `expectRespond: false`.
71
+ */
72
+ isAgentEcho?: boolean;
73
+ /**
74
+ * The agent's spoken reply to THIS turn (when it responds). The real-decision
75
+ * logic adapter uses it as the "recent agent reply" the echo gate compares a
76
+ * following `isAgentEcho` turn against — so echo rejection is tested against a
77
+ * genuine reply string, not a circular self-reference.
78
+ */
79
+ agentReplyText?: string;
48
80
  }
49
81
 
50
82
  /** Scenario-level pass/fail thresholds the benchmark layer enforces. */
@@ -62,6 +94,10 @@ export interface VoiceScenarioAssertions {
62
94
  /** Latency budgets (ms) — first-audio / time-to-first-token, etc. */
63
95
  maxFirstAudioMs?: number;
64
96
  maxTtftMs?: number;
97
+ /** Min echo/self-voice rejection rate (agent-echo turns correctly suppressed). */
98
+ minEchoRejectionRate?: number;
99
+ /** Min owner-vs-intruder accuracy for security scenarios. */
100
+ minOwnerAccuracy?: number;
65
101
  }
66
102
 
67
103
  export type VoiceScenarioClass =
@@ -75,7 +111,15 @@ export type VoiceScenarioClass =
75
111
  | "eot"
76
112
  | "transcription-mode"
77
113
  | "multi-agent-room"
78
- | "long-form-monologue";
114
+ | "long-form-monologue"
115
+ // Robustness: degraded acoustics (noise / reverb / far-field / low-quality).
116
+ | "robustness"
117
+ // Self-echo: the agent's own TTS must not be treated as a user turn.
118
+ | "echo-rejection"
119
+ // Security: owner vs. intruder / non-owner voice gating.
120
+ | "owner-security"
121
+ // Two voices overlapping / interrupting each other.
122
+ | "overlapping-speech";
79
123
 
80
124
  export interface VoiceScenario {
81
125
  /** Stable id (also the corpus subdirectory name). */
@@ -89,6 +133,15 @@ export interface VoiceScenario {
89
133
  assertions?: VoiceScenarioAssertions;
90
134
  /** Agent labels present in a multi-agent room (subset of participants). */
91
135
  agents?: string[];
136
+ /** Scenario-wide acoustic environment; per-turn `environment` overrides it. */
137
+ environment?: VoiceEnvironment;
138
+ /**
139
+ * Entity ids the agent answers WITHOUT a wake word (owner + enrolled
140
+ * speakers). The respond gate suppresses a confident speaker NOT in this set
141
+ * as a bystander. Defaults (in the runner) to every participant that has an
142
+ * `entityId`; set it explicitly to mark some bound voices as strangers.
143
+ */
144
+ knownSpeakerEntityIds?: string[];
92
145
  }
93
146
 
94
147
  export interface VoiceScenarioValidation {
@@ -102,17 +155,37 @@ export interface VoiceScenarioValidation {
102
155
  * exist as participants. Returns all errors (does not throw) so a corpus build
103
156
  * can report every problem at once.
104
157
  */
158
+ /** True when a value is not a non-empty string (so `.trim()` is never called on a non-string). */
159
+ function isBlank(v: unknown): boolean {
160
+ return typeof v !== "string" || v.trim().length === 0;
161
+ }
162
+
105
163
  export function validateVoiceScenario(
106
164
  scenario: VoiceScenario,
107
165
  ): VoiceScenarioValidation {
108
166
  const errors: string[] = [];
109
- if (!scenario.id?.trim()) errors.push("scenario.id is required");
167
+ // A malformed/empty scenario file can deserialize to a non-object; guard the
168
+ // boundary so the validator reports an error instead of throwing.
169
+ if (!scenario || typeof scenario !== "object" || Array.isArray(scenario)) {
170
+ return { valid: false, errors: ["scenario must be an object"] };
171
+ }
172
+ if (isBlank(scenario.id)) errors.push("scenario.id is required");
110
173
  if (!Array.isArray(scenario.classes) || scenario.classes.length === 0) {
111
174
  errors.push("scenario.classes must be a non-empty array");
112
175
  }
176
+ // Iterate defensively: a malformed scenario may carry non-array fields.
177
+ const participants = Array.isArray(scenario.participants)
178
+ ? scenario.participants
179
+ : [];
180
+ const turns = Array.isArray(scenario.turns) ? scenario.turns : [];
181
+ const agents = Array.isArray(scenario.agents) ? scenario.agents : [];
113
182
  const labels = new Set<string>();
114
- for (const p of scenario.participants ?? []) {
115
- if (!p.label?.trim()) {
183
+ for (const p of participants) {
184
+ if (!p || typeof p !== "object") {
185
+ errors.push("participant must be an object");
186
+ continue;
187
+ }
188
+ if (isBlank(p.label)) {
116
189
  errors.push("participant.label is required");
117
190
  continue;
118
191
  }
@@ -124,25 +197,78 @@ export function validateVoiceScenario(
124
197
  if (!Array.isArray(scenario.turns) || scenario.turns.length === 0) {
125
198
  errors.push("scenario.turns must be a non-empty array");
126
199
  }
127
- scenario.turns?.forEach((t, i) => {
200
+ turns.forEach((t, i) => {
201
+ if (!t || typeof t !== "object") {
202
+ errors.push(`turn[${i}] must be an object`);
203
+ return;
204
+ }
128
205
  if (!labels.has(t.speaker)) {
129
206
  errors.push(`turn[${i}].speaker "${t.speaker}" is not a participant`);
130
207
  }
131
- if (!t.text?.trim() && !t.audioRef?.trim()) {
208
+ if (isBlank(t.text) && isBlank(t.audioRef)) {
132
209
  errors.push(`turn[${i}] must have either text or audioRef`);
133
210
  }
134
211
  if (typeof t.expectRespond !== "boolean") {
135
212
  errors.push(`turn[${i}].expectRespond must be a boolean`);
136
213
  }
214
+ if (
215
+ t.expectEndOfTurn !== undefined &&
216
+ typeof t.expectEndOfTurn !== "boolean"
217
+ ) {
218
+ errors.push(`turn[${i}].expectEndOfTurn must be a boolean`);
219
+ }
137
220
  });
138
- for (const agent of scenario.agents ?? []) {
221
+ for (const agent of agents) {
139
222
  if (!labels.has(agent)) {
140
223
  errors.push(`agent "${agent}" is not a participant`);
141
224
  }
142
225
  }
226
+ validateEnvironment(scenario.environment, "scenario.environment", errors);
227
+ turns.forEach((t, i) => {
228
+ validateEnvironment(t?.environment, `turn[${i}].environment`, errors);
229
+ });
143
230
  return { valid: errors.length === 0, errors };
144
231
  }
145
232
 
233
+ /** Validate an acoustic environment's ranges (pure; appends to `errors`). */
234
+ function validateEnvironment(
235
+ env: VoiceEnvironment | undefined,
236
+ where: string,
237
+ errors: string[],
238
+ ): void {
239
+ if (!env) return;
240
+ if (
241
+ env.reverb !== undefined &&
242
+ (!Number.isFinite(env.reverb) || env.reverb < 0 || env.reverb > 1)
243
+ ) {
244
+ errors.push(`${where}.reverb must be in [0, 1]`);
245
+ }
246
+ if (env.noiseSnrDb !== undefined && !Number.isFinite(env.noiseSnrDb)) {
247
+ errors.push(`${where}.noiseSnrDb must be a finite number`);
248
+ }
249
+ if (
250
+ env.farFieldDb !== undefined &&
251
+ (!Number.isFinite(env.farFieldDb) || env.farFieldDb < 0)
252
+ ) {
253
+ errors.push(`${where}.farFieldDb must be a non-negative dB attenuation`);
254
+ }
255
+ if (
256
+ env.backgroundTalkersDb !== undefined &&
257
+ !Number.isFinite(env.backgroundTalkersDb)
258
+ ) {
259
+ errors.push(`${where}.backgroundTalkersDb must be a finite number`);
260
+ }
261
+ }
262
+
263
+ /** Merge a turn's environment over the scenario's (turn wins, field by field). */
264
+ export function resolveTurnEnvironment(
265
+ scenario: VoiceScenario,
266
+ turn: VoiceScenarioTurn,
267
+ ): VoiceEnvironment | undefined {
268
+ if (!scenario.environment && !turn.environment) return undefined;
269
+ return { ...scenario.environment, ...turn.environment };
270
+ }
271
+
146
272
  /** The expected ASR reference for a turn (explicit override or its text). */
147
273
  export function turnReferenceTranscript(turn: VoiceScenarioTurn): string {
148
274
  return (turn.expectedTranscript ?? turn.text ?? "").trim();
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Unit coverage for the voice-scenario per-turn resolvers (#9147 voice).
3
+ *
4
+ * resolveTurnEnvironment / turnReferenceTranscript / turnSpeakerLabel are the
5
+ * pure helpers that resolve a scenario turn's augmentation environment, its
6
+ * reference transcript, and its expected speaker label — the inputs the
7
+ * multi-speaker / noise-music / self-rejection scenario harness scores against.
8
+ * They were untested. No GGUF / audio.
9
+ */
10
+
11
+ import { describe, expect, it } from "vitest";
12
+ import {
13
+ resolveTurnEnvironment,
14
+ turnReferenceTranscript,
15
+ turnSpeakerLabel,
16
+ type VoiceScenario,
17
+ type VoiceScenarioTurn,
18
+ } from "./voice-scenario";
19
+
20
+ const turn = (over: Partial<VoiceScenarioTurn>): VoiceScenarioTurn =>
21
+ ({ speaker: "alice", text: "hi", ...over }) as VoiceScenarioTurn;
22
+ const scenario = (over: Partial<VoiceScenario>): VoiceScenario =>
23
+ ({ ...over }) as VoiceScenario;
24
+
25
+ describe("resolveTurnEnvironment", () => {
26
+ it("returns undefined when neither scenario nor turn set an environment", () => {
27
+ expect(resolveTurnEnvironment(scenario({}), turn({}))).toBeUndefined();
28
+ });
29
+
30
+ it("merges scenario + turn environment with the turn winning", () => {
31
+ const merged = resolveTurnEnvironment(
32
+ scenario({ environment: { noiseSnrDb: 20, reverb: 0.3 } }),
33
+ turn({ environment: { noiseSnrDb: 5 } }),
34
+ );
35
+ expect(merged).toEqual({ noiseSnrDb: 5, reverb: 0.3 });
36
+ });
37
+
38
+ it("uses the scenario environment alone when the turn has none", () => {
39
+ expect(
40
+ resolveTurnEnvironment(
41
+ scenario({ environment: { noiseSnrDb: 12 } }),
42
+ turn({}),
43
+ ),
44
+ ).toEqual({ noiseSnrDb: 12 });
45
+ });
46
+ });
47
+
48
+ describe("turnReferenceTranscript", () => {
49
+ it("prefers expectedTranscript, then text, then empty — trimmed", () => {
50
+ expect(
51
+ turnReferenceTranscript(turn({ expectedTranscript: " hello " })),
52
+ ).toBe("hello");
53
+ expect(
54
+ turnReferenceTranscript(
55
+ turn({ expectedTranscript: undefined, text: " hey " }),
56
+ ),
57
+ ).toBe("hey");
58
+ expect(
59
+ turnReferenceTranscript(
60
+ turn({ expectedTranscript: undefined, text: undefined }),
61
+ ),
62
+ ).toBe("");
63
+ });
64
+ });
65
+
66
+ describe("turnSpeakerLabel", () => {
67
+ it("prefers expectedSpeakerLabel, falls back to speaker", () => {
68
+ expect(
69
+ turnSpeakerLabel(turn({ speaker: "bob", expectedSpeakerLabel: "Bob" })),
70
+ ).toBe("Bob");
71
+ expect(
72
+ turnSpeakerLabel(
73
+ turn({ speaker: "carol", expectedSpeakerLabel: undefined }),
74
+ ),
75
+ ).toBe("carol");
76
+ });
77
+ });
@@ -13,11 +13,30 @@
13
13
  */
14
14
 
15
15
  import type { VoiceE2eCaseResult } from "./e2e-harness";
16
+ import { percentile, round4 } from "./metric-math";
16
17
  import type { VoiceScenarioClass } from "./voice-scenario";
17
18
 
18
19
  export type VoiceWorkbenchStatus = "ran" | "skipped";
19
20
  export type VoiceWorkbenchVerdict = "pass" | "fail" | "skipped";
20
21
 
22
+ /**
23
+ * A `.wav` artifact written for one scenario run when a capture sink is active.
24
+ * `path` is RELATIVE to the run dir the headless runner was told to write under,
25
+ * so the scenario run viewer (served from that dir) can reference it directly.
26
+ */
27
+ export interface VoiceAudioArtifact {
28
+ /** Turn index this artifact belongs to; the full corpus uses turn 0. */
29
+ turnIndex: number;
30
+ /** `generated` = the full synthesized corpus; `consumed` = a per-turn slice. */
31
+ kind: "generated" | "consumed";
32
+ /** Path to the `.wav`, relative to the run dir (forward-slash separated). */
33
+ path: string;
34
+ sampleRate: number;
35
+ durationMs?: number;
36
+ /** Diarization ground-truth speaker label for a consumed per-turn slice. */
37
+ speakerLabel?: string;
38
+ }
39
+
21
40
  /** One scenario's outcome in a workbench run. */
22
41
  export interface VoiceWorkbenchScenarioRun {
23
42
  scenarioId: string;
@@ -28,6 +47,8 @@ export interface VoiceWorkbenchScenarioRun {
28
47
  cases: VoiceE2eCaseResult[];
29
48
  /** Why the scenario was skipped (artifact/backend absence), if it was. */
30
49
  skipReason?: string;
50
+ /** `.wav` artifacts written when a capture sink was active (else absent). */
51
+ audioArtifacts?: VoiceAudioArtifact[];
31
52
  }
32
53
 
33
54
  export interface VoiceWorkbenchScenarioReport {
@@ -64,6 +85,12 @@ export interface VoiceWorkbenchMetrics {
64
85
  voiceEntityMatchRate: MetricRollup;
65
86
  /** First-audio latency ms (`worst` = max). */
66
87
  firstAudioMs: MetricRollup;
88
+ /** Self-echo rejection rate (`worst` = min). */
89
+ echoRejectionRate: MetricRollup;
90
+ /** Owner-vs-intruder accuracy (`worst` = min). */
91
+ ownerAccuracy: MetricRollup;
92
+ /** Impostor-accept rate (`worst` = max) — non-owner accepted as owner. */
93
+ impostorAcceptRate: MetricRollup;
67
94
  }
68
95
 
69
96
  export interface VoiceWorkbenchReport {
@@ -82,23 +109,6 @@ function mean(values: ReadonlyArray<number>): number | null {
82
109
  return round4(sum / values.length);
83
110
  }
84
111
 
85
- function round4(n: number): number {
86
- return Math.round(n * 1e4) / 1e4;
87
- }
88
-
89
- function round1(n: number): number {
90
- return Math.round(n * 10) / 10;
91
- }
92
-
93
- /** Nearest-rank percentile over a sample (null when empty). */
94
- function percentile(values: ReadonlyArray<number>, p: number): number | null {
95
- const finite = values.filter((v) => Number.isFinite(v));
96
- if (finite.length === 0) return null;
97
- const sorted = [...finite].sort((a, b) => a - b);
98
- const rank = Math.ceil((p / 100) * sorted.length);
99
- return round1(sorted[Math.min(sorted.length - 1, Math.max(0, rank - 1))]);
100
- }
101
-
102
112
  function rollupMax(values: ReadonlyArray<number>): MetricRollup {
103
113
  return {
104
114
  count: values.length,
@@ -154,6 +164,9 @@ export function buildVoiceWorkbenchReport(
154
164
  const entityF1: number[] = [];
155
165
  const voiceEntityMatchRate: number[] = [];
156
166
  const firstAudioMs: number[] = [];
167
+ const echoRejectionRate: number[] = [];
168
+ const ownerAccuracy: number[] = [];
169
+ const impostorAcceptRate: number[] = [];
157
170
 
158
171
  for (const c of allCases) {
159
172
  switch (c.kind) {
@@ -180,6 +193,13 @@ export function buildVoiceWorkbenchReport(
180
193
  case "first-response-latency":
181
194
  firstAudioMs.push(c.firstAudioMs);
182
195
  break;
196
+ case "echo-rejection":
197
+ echoRejectionRate.push(c.rejectionRate);
198
+ break;
199
+ case "owner-security":
200
+ ownerAccuracy.push(c.accuracy);
201
+ impostorAcceptRate.push(c.impostorAcceptRate);
202
+ break;
183
203
  default:
184
204
  break;
185
205
  }
@@ -211,6 +231,9 @@ export function buildVoiceWorkbenchReport(
211
231
  entityF1: rollupMin(entityF1),
212
232
  voiceEntityMatchRate: rollupMin(voiceEntityMatchRate),
213
233
  firstAudioMs: rollupMax(firstAudioMs),
234
+ echoRejectionRate: rollupMin(echoRejectionRate),
235
+ ownerAccuracy: rollupMin(ownerAccuracy),
236
+ impostorAcceptRate: rollupMax(impostorAcceptRate),
214
237
  },
215
238
  };
216
239
  }
@@ -242,6 +265,9 @@ export function formatVoiceWorkbenchMarkdown(
242
265
  `| Entity F1 | ${fmt(m.entityF1.mean)} | ${fmt(m.entityF1.worst)} | ${m.entityF1.count} |`,
243
266
  `| Voice→entity match | ${fmt(m.voiceEntityMatchRate.mean)} | ${fmt(m.voiceEntityMatchRate.worst)} | ${m.voiceEntityMatchRate.count} |`,
244
267
  `| First-audio (ms) | ${fmt(m.firstAudioMs.mean)} | ${fmt(m.firstAudioMs.worst)} | ${m.firstAudioMs.count} |`,
268
+ `| Echo rejection rate | ${fmt(m.echoRejectionRate.mean)} | ${fmt(m.echoRejectionRate.worst)} | ${m.echoRejectionRate.count} |`,
269
+ `| Owner accuracy | ${fmt(m.ownerAccuracy.mean)} | ${fmt(m.ownerAccuracy.worst)} | ${m.ownerAccuracy.count} |`,
270
+ `| Impostor-accept rate | ${fmt(m.impostorAcceptRate.mean)} | ${fmt(m.impostorAcceptRate.worst)} | ${m.impostorAcceptRate.count} |`,
245
271
  "",
246
272
  "## Scenarios",
247
273
  "",
@@ -295,6 +321,11 @@ export function regressionsAgainstBaseline(
295
321
  current.metrics.firstAudioMs.mean,
296
322
  baseline.metrics.firstAudioMs.mean,
297
323
  ],
324
+ [
325
+ "impostorAcceptRate",
326
+ current.metrics.impostorAcceptRate.mean,
327
+ baseline.metrics.impostorAcceptRate.mean,
328
+ ],
298
329
  ];
299
330
  const higherBetter: Array<[string, number | null, number | null]> = [
300
331
  [
@@ -308,6 +339,16 @@ export function regressionsAgainstBaseline(
308
339
  current.metrics.voiceEntityMatchRate.mean,
309
340
  baseline.metrics.voiceEntityMatchRate.mean,
310
341
  ],
342
+ [
343
+ "echoRejectionRate",
344
+ current.metrics.echoRejectionRate.mean,
345
+ baseline.metrics.echoRejectionRate.mean,
346
+ ],
347
+ [
348
+ "ownerAccuracy",
349
+ current.metrics.ownerAccuracy.mean,
350
+ baseline.metrics.ownerAccuracy.mean,
351
+ ],
311
352
  ];
312
353
  const out: MetricRegression[] = [];
313
354
  for (const [metric, cur, base] of lowerBetter) {
@@ -2,12 +2,15 @@
2
2
  * Wake-word detection — native runtime binding.
3
3
  *
4
4
  * Loads the standalone `packages/native/plugins/wakeword-cpp/`
5
- * library directly via `bun:ffi` and exposes the same `WakeWordModel`
6
- * interface as the previous `onnxruntime-node`-backed implementation
7
- * in `./wake-word.ts`, so the voice lifecycle can swap the two without
8
- * changing anything upstream.
5
+ * library directly via `bun:ffi` and exposes the `WakeWordModel`
6
+ * interface as `OpenWakeWordGgmlModel`. The sibling `./wake-word.ts`
7
+ * is the fused-`libelizainference` path (`GgmlWakeWordModel`, the
8
+ * `eliza_inference_wakeword_*` FFI surface) and selects between the two
9
+ * native backends; both implement the same interface so the voice
10
+ * lifecycle can swap them without changing anything upstream. There is
11
+ * NO ONNX path on either — `onnxruntime-node` was removed.
9
12
  *
10
- * Phase 2 status — this binding is now the default when the
13
+ * This binding is the standalone-library backend, used when the
11
14
  * `libwakeword.{so,dylib,dll}` shared library and three converted
12
15
  * GGUFs are present. The C runtime is a pure-fp32 reference
13
16
  * implementation of the openWakeWord three-stage pipeline (melspec
@@ -16,10 +19,6 @@
16
19
  * upstream openWakeWord ONNX graphs is gated by
17
20
  * `packages/native/plugins/wakeword-cpp/test/wakeword_parity_test.py`.
18
21
  *
19
- * The ONNX path in `./wake-word.ts` stays as the fallback while the
20
- * native binding shakes out. Once the migration is complete the ONNX
21
- * path can be removed alongside the `onnxruntime-node` dependency.
22
- *
23
22
  * Three GGUFs back one session, mirroring openWakeWord's three ONNX
24
23
  * graphs (the C library is the single source of truth on shapes —
25
24
  * see `packages/native/plugins/wakeword-cpp/include/wakeword/wakeword.h`):
@@ -112,11 +111,11 @@ interface BoundLibrary {
112
111
 
113
112
  /** Minimal shape of the bun:ffi module we use here. */
114
113
  interface BunFfiModule {
115
- dlopen(
114
+ dlopen<TSymbols>(
116
115
  path: string,
117
116
  def: Record<string, { args: number[]; returns: number }>,
118
117
  ): {
119
- symbols: Record<string, (...args: unknown[]) => unknown>;
118
+ symbols: TSymbols;
120
119
  close(): void;
121
120
  };
122
121
  ptr(value: ArrayBufferView): unknown;
@@ -169,7 +168,7 @@ function loadLibrary(libraryPath: string): BoundLibrary {
169
168
  }
170
169
  const bunFfi = loadBunFfiModule();
171
170
  const T = bunFfi.FFIType;
172
- const lib = bunFfi.dlopen(libraryPath, {
171
+ const lib = bunFfi.dlopen<WakeWordBindings>(libraryPath, {
173
172
  wakeword_open: {
174
173
  args: [T.ptr, T.ptr, T.ptr, T.ptr],
175
174
  returns: T.i32,
@@ -192,7 +191,7 @@ function loadLibrary(libraryPath: string): BoundLibrary {
192
191
  },
193
192
  });
194
193
  return {
195
- bindings: lib.symbols as unknown as WakeWordBindings,
194
+ bindings: lib.symbols,
196
195
  close: () => lib.close(),
197
196
  libraryPath,
198
197
  ptr: (v: ArrayBufferView) => bunFfi.ptr(v),