@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,533 @@
1
+ /**
2
+ * Semantic end-of-turn (EOT) classifier — Tier 3 of the three-tier VAD.
3
+ *
4
+ * Tier 1: RMS energy gate (~10 ms)
5
+ * Tier 2: Silero VAD (~32 ms hop)
6
+ * Tier 3: Semantic EOT classifier — P(turn_complete | transcript_so_far)
7
+ *
8
+ * The classifier operates on the partial transcript text emitted by streaming
9
+ * ASR, not on audio. It returns P(done) ∈ [0, 1]. The voice state machine
10
+ * uses it to:
11
+ *
12
+ * P(done) ≥ 0.9 AND silence ≥ 50 ms → commit immediately, skip hangover
13
+ * P(done) ≥ 0.6 AND silence ≥ 20 ms → enter PAUSE_TENTATIVE early (start drafter)
14
+ * P(done) < 0.4 → extend hangover by 50 ms (mid-clause)
15
+ *
16
+ * Three implementations ship:
17
+ *
18
+ * `HeuristicEotClassifier` — deterministic, zero-latency, no model load.
19
+ * This is the baseline; it is always available.
20
+ *
21
+ * `RemoteEotClassifier` — fail-closed HTTP adapter for a real model server.
22
+ * It throws on network/parse errors so callers never mistake a synthetic
23
+ * fallback for a measured turn signal.
24
+ *
25
+ * `Eliza1EotClassifier` — uses the already-loaded text model to compute
26
+ * P(`<|im_end|>` | partial transcript). Zero additional model weights.
27
+ *
28
+ * The GGUF-backed LiveKit detector lives in `eot-classifier-ggml.ts`.
29
+ *
30
+ * Cancellation contract (handshake with VoiceTurnController / R11): the
31
+ * classifier emits a `VoiceTurnSignal` per partial transcript. It NEVER
32
+ * aborts a turn directly — `signal()` is data, not a cancellation. The
33
+ * controller layer above consumes the signal and decides whether to
34
+ * suppress (via `BargeInCancelToken.signal` with reason `"turn-suppressed"`).
35
+ */
36
+
37
+ import type {
38
+ Eliza1EotScoreResult,
39
+ Eliza1EotScorerOptions,
40
+ } from "./eliza1-eot-scorer";
41
+ import { Eliza1EotScorer } from "./eliza1-eot-scorer";
42
+ import { FfiEotScorer, type FfiEotScorerOptions } from "./fused-eot-scorer";
43
+
44
+ // ---------------------------------------------------------------------------
45
+ // Interface
46
+ // ---------------------------------------------------------------------------
47
+
48
+ export type VoiceNextSpeaker = "agent" | "user" | "unknown";
49
+
50
+ export interface VoiceTurnSignal {
51
+ /** P(user turn complete | transcript/history). */
52
+ endOfTurnProbability: number;
53
+ /**
54
+ * The best turn-taking read from this signal. Text-only EOU models infer
55
+ * this from end-of-turn probability; audio/prosody models can set it
56
+ * directly.
57
+ */
58
+ nextSpeaker: VoiceNextSpeaker;
59
+ /** Whether the agent should begin a response now. */
60
+ agentShouldSpeak: boolean | null;
61
+ /** Implementation/source name for telemetry and trace records. */
62
+ source:
63
+ | "heuristic"
64
+ | "livekit-turn-detector"
65
+ | "eliza-1-drafter"
66
+ | "remote"
67
+ | "custom";
68
+ /** Optional model/version identifier for telemetry. */
69
+ model?: string;
70
+ /** Text actually scored after normalization/template truncation. */
71
+ transcript: string;
72
+ /** Wall-clock model latency, excluding caller queueing. */
73
+ latencyMs?: number;
74
+ }
75
+
76
+ /**
77
+ * End-of-turn classifier interface. Both implementations satisfy this contract
78
+ * so callers are backend-agnostic.
79
+ */
80
+ export interface EotClassifier {
81
+ /** Return P(turn_complete) ∈ [0, 1] for `partialTranscript`. */
82
+ score(partialTranscript: string): Promise<number>;
83
+ /** Return the structured turn signal when the implementation can provide it. */
84
+ signal?(partialTranscript: string): Promise<VoiceTurnSignal>;
85
+ }
86
+
87
+ export function clampProbability(value: number): number {
88
+ if (!Number.isFinite(value)) return 0.5;
89
+ return Math.max(0, Math.min(1, value));
90
+ }
91
+
92
+ export function turnSignalFromProbability(args: {
93
+ probability: number;
94
+ transcript: string;
95
+ source: VoiceTurnSignal["source"];
96
+ model?: string;
97
+ latencyMs?: number;
98
+ }): VoiceTurnSignal {
99
+ const p = clampProbability(args.probability);
100
+ const nextSpeaker: VoiceNextSpeaker =
101
+ p >= EOT_TENTATIVE_THRESHOLD
102
+ ? "agent"
103
+ : p < EOT_MID_CLAUSE_THRESHOLD
104
+ ? "user"
105
+ : "unknown";
106
+ return {
107
+ endOfTurnProbability: p,
108
+ nextSpeaker,
109
+ agentShouldSpeak:
110
+ nextSpeaker === "agent" ? true : nextSpeaker === "user" ? false : null,
111
+ source: args.source,
112
+ ...(args.model ? { model: args.model } : {}),
113
+ transcript: args.transcript,
114
+ ...(args.latencyMs !== undefined ? { latencyMs: args.latencyMs } : {}),
115
+ };
116
+ }
117
+
118
+ // ---------------------------------------------------------------------------
119
+ // Heuristic baseline
120
+ // ---------------------------------------------------------------------------
121
+
122
+ /**
123
+ * Rules-of-thumb EOT classifier. The rules fire in priority order; the first
124
+ * match wins.
125
+ *
126
+ * Priority Signal P(done)
127
+ * -------- ------------------------------------------- -------
128
+ * 1 Sentence-final punctuation (. ! ?) 0.95
129
+ * 2 Question-tag words ("right?", "yeah?", "ok?") 0.85
130
+ * 3 Short utterance (< 3 words) 0.70
131
+ * 4 Trailing conjunction (and/but/or/because/…) 0.15
132
+ * 5 Last word is a preposition or article 0.20
133
+ * 6 No signal 0.50
134
+ */
135
+ export class HeuristicEotClassifier implements EotClassifier {
136
+ /** Conjunctions that strongly suggest the user is mid-clause. */
137
+ private static readonly TRAILING_CONJUNCTIONS = new Set([
138
+ "and",
139
+ "but",
140
+ "or",
141
+ "nor",
142
+ "yet",
143
+ "so",
144
+ "because",
145
+ "although",
146
+ "though",
147
+ "while",
148
+ "whereas",
149
+ "if",
150
+ "unless",
151
+ "until",
152
+ "since",
153
+ "when",
154
+ "where",
155
+ "which",
156
+ "that",
157
+ "who",
158
+ "whom",
159
+ "whose",
160
+ ]);
161
+
162
+ /** Prepositions and articles that suggest an incomplete NP follows. */
163
+ private static readonly TRAILING_INCOMPLETE = new Set([
164
+ "a",
165
+ "an",
166
+ "the",
167
+ "to",
168
+ "of",
169
+ "in",
170
+ "on",
171
+ "at",
172
+ "by",
173
+ "for",
174
+ "with",
175
+ "from",
176
+ "into",
177
+ "about",
178
+ "through",
179
+ "between",
180
+ "against",
181
+ "during",
182
+ "before",
183
+ "after",
184
+ "without",
185
+ "under",
186
+ "over",
187
+ "above",
188
+ "below",
189
+ "around",
190
+ "beside",
191
+ "beyond",
192
+ "like",
193
+ "near",
194
+ "past",
195
+ "via",
196
+ ]);
197
+
198
+ /** Question-tag suffixes that end an utterance (case-insensitive). */
199
+ private static readonly QUESTION_TAGS = [
200
+ "right?",
201
+ "yeah?",
202
+ "ok?",
203
+ "okay?",
204
+ "right",
205
+ "yeah",
206
+ "correct?",
207
+ "correct",
208
+ "hm?",
209
+ "huh?",
210
+ "eh?",
211
+ ];
212
+
213
+ score(partialTranscript: string): Promise<number> {
214
+ const text = partialTranscript.trim();
215
+ if (text.length === 0) return Promise.resolve(0.5);
216
+
217
+ // Rule 1 — sentence-final punctuation.
218
+ if (/[.!?]$/.test(text)) {
219
+ return Promise.resolve(0.95);
220
+ }
221
+
222
+ // Rule 2 — question-tag words at the end.
223
+ const lower = text.toLowerCase();
224
+ for (const tag of HeuristicEotClassifier.QUESTION_TAGS) {
225
+ if (lower.endsWith(tag)) return Promise.resolve(0.85);
226
+ }
227
+
228
+ // Split into words for word-level checks.
229
+ const words = text
230
+ .toLowerCase()
231
+ .replace(/[^a-z0-9'\s-]/gi, "")
232
+ .split(/\s+/)
233
+ .filter(Boolean);
234
+ if (words.length === 0) return Promise.resolve(0.5);
235
+
236
+ const lastWord = words[words.length - 1].replace(/[',;:-]+$/, "");
237
+
238
+ // Rule 3 — short utterance (< 3 words) → likely complete.
239
+ if (words.length < 3) return Promise.resolve(0.7);
240
+
241
+ // Rule 4 — trailing conjunction → mid-clause.
242
+ if (HeuristicEotClassifier.TRAILING_CONJUNCTIONS.has(lastWord)) {
243
+ return Promise.resolve(0.15);
244
+ }
245
+
246
+ // Rule 5 — trailing preposition or article → incomplete NP.
247
+ if (HeuristicEotClassifier.TRAILING_INCOMPLETE.has(lastWord)) {
248
+ return Promise.resolve(0.2);
249
+ }
250
+
251
+ // Rule 6 — no signal.
252
+ return Promise.resolve(0.5);
253
+ }
254
+
255
+ async signal(partialTranscript: string): Promise<VoiceTurnSignal> {
256
+ return turnSignalFromProbability({
257
+ probability: await this.score(partialTranscript),
258
+ transcript: partialTranscript.trim(),
259
+ source: "heuristic",
260
+ model: "heuristic-v1",
261
+ });
262
+ }
263
+ }
264
+
265
+ // ---------------------------------------------------------------------------
266
+ // Tier-aware GGUF variant resolver (shared with eot-classifier-ggml.ts)
267
+ // ---------------------------------------------------------------------------
268
+
269
+ /**
270
+ * Resolve which upstream revision a given Eliza-1 tier should bundle.
271
+ * Mobile/small tiers (`2b`, the entry tier) get the English-only variant;
272
+ * desktop/server tiers (`4b`+) get the multilingual variant.
273
+ *
274
+ * Accepts both bare tier ids (`"4b"`) and prefixed catalog ids
275
+ * (`"eliza-1-4b"`).
276
+ */
277
+ export const LIVEKIT_TURN_DETECTOR_EN_REVISION = "v1.2.2-en";
278
+ export const LIVEKIT_TURN_DETECTOR_INTL_REVISION = "v0.4.1-intl";
279
+
280
+ export function turnDetectorRevisionForTier(
281
+ tierId: string,
282
+ ):
283
+ | typeof LIVEKIT_TURN_DETECTOR_EN_REVISION
284
+ | typeof LIVEKIT_TURN_DETECTOR_INTL_REVISION {
285
+ const bare = tierId.startsWith("eliza-1-")
286
+ ? tierId.slice("eliza-1-".length)
287
+ : tierId;
288
+ if (bare === "2b") {
289
+ return LIVEKIT_TURN_DETECTOR_EN_REVISION;
290
+ }
291
+ return LIVEKIT_TURN_DETECTOR_INTL_REVISION;
292
+ }
293
+
294
+ // ---------------------------------------------------------------------------
295
+ // Remote model adapter
296
+ // ---------------------------------------------------------------------------
297
+
298
+ export interface RemoteEotClassifierOptions {
299
+ /**
300
+ * HTTP endpoint to POST the partial transcript to. Expected to return JSON
301
+ * with a `p_done` field: `{ "p_done": 0.92 }`.
302
+ *
303
+ * Example: LiveKit turn-detector inference endpoint or a custom model server.
304
+ */
305
+ endpoint: string;
306
+ /**
307
+ * Timeout in milliseconds for each HTTP request. Default 200 ms — the
308
+ * classifier must be faster than the silence hangover it's trying to beat.
309
+ */
310
+ timeoutMs?: number;
311
+ /** Optional model label for telemetry. */
312
+ model?: string;
313
+ }
314
+
315
+ /**
316
+ * Remote EOT classifier. POSTs `{ transcript: string }` to `endpoint`
317
+ * and expects `{ p_done: number }` back.
318
+ *
319
+ * Intended to be wired to a real LiveKit turn-detector HTTP API or a custom
320
+ * model inference server. This adapter fails closed: no fallback score is
321
+ * manufactured on network or parse errors.
322
+ */
323
+ export class RemoteEotClassifier implements EotClassifier {
324
+ private readonly endpoint: string;
325
+ private readonly timeoutMs: number;
326
+ private readonly model: string;
327
+
328
+ constructor(opts: RemoteEotClassifierOptions) {
329
+ this.endpoint = opts.endpoint;
330
+ this.timeoutMs = opts.timeoutMs ?? 200;
331
+ this.model = opts.model ?? "remote-eot";
332
+ }
333
+
334
+ async score(partialTranscript: string): Promise<number> {
335
+ return (await this.signal(partialTranscript)).endOfTurnProbability;
336
+ }
337
+
338
+ async signal(partialTranscript: string): Promise<VoiceTurnSignal> {
339
+ const started = performance.now();
340
+ const controller = new AbortController();
341
+ const timer = setTimeout(() => controller.abort(), this.timeoutMs);
342
+ try {
343
+ const response = await fetch(this.endpoint, {
344
+ method: "POST",
345
+ headers: { "Content-Type": "application/json" },
346
+ body: JSON.stringify({ transcript: partialTranscript }),
347
+ signal: controller.signal,
348
+ });
349
+ if (!response.ok) {
350
+ throw new Error(
351
+ `[voice] Remote EOT classifier failed: HTTP ${response.status} ${response.statusText}`,
352
+ );
353
+ }
354
+ const json = (await response.json()) as unknown;
355
+ if (
356
+ typeof json === "object" &&
357
+ json !== null &&
358
+ "p_done" in json &&
359
+ typeof (json as Record<string, unknown>).p_done === "number"
360
+ ) {
361
+ const p = (json as { p_done: number }).p_done;
362
+ return turnSignalFromProbability({
363
+ probability: p,
364
+ transcript: partialTranscript.trim(),
365
+ source: "remote",
366
+ model: this.model,
367
+ latencyMs: performance.now() - started,
368
+ });
369
+ }
370
+ throw new Error(
371
+ "[voice] Remote EOT classifier response missing numeric p_done.",
372
+ );
373
+ } finally {
374
+ clearTimeout(timer);
375
+ }
376
+ }
377
+ }
378
+
379
+ // ---------------------------------------------------------------------------
380
+ // Thresholds (shared constants so tests and state machine stay in sync)
381
+ // ---------------------------------------------------------------------------
382
+
383
+ /** P(done) ≥ this AND silence ≥ EOT_COMMIT_SILENCE_MS → commit immediately. */
384
+ export const EOT_COMMIT_THRESHOLD = 0.9;
385
+
386
+ /** P(done) ≥ this AND silence ≥ EOT_TENTATIVE_SILENCE_MS → enter PAUSE_TENTATIVE early. */
387
+ export const EOT_TENTATIVE_THRESHOLD = 0.6;
388
+
389
+ /** P(done) < this → extend hangover by EOT_HANGOVER_EXTENSION_MS. */
390
+ export const EOT_MID_CLAUSE_THRESHOLD = 0.4;
391
+
392
+ /** Minimum silence (ms) required alongside P ≥ EOT_COMMIT_THRESHOLD to commit. */
393
+ export const EOT_COMMIT_SILENCE_MS = 50;
394
+
395
+ /** Minimum silence (ms) required alongside P ≥ EOT_TENTATIVE_THRESHOLD to start drafter. */
396
+ export const EOT_TENTATIVE_SILENCE_MS = 20;
397
+
398
+ /** How many ms to add to the pause hangover when P < EOT_MID_CLAUSE_THRESHOLD. */
399
+ export const EOT_HANGOVER_EXTENSION_MS = 50;
400
+
401
+ // ---------------------------------------------------------------------------
402
+ // Eliza-1 drafter EOT classifier
403
+ // ---------------------------------------------------------------------------
404
+
405
+ export type { Eliza1EotScoreResult, Eliza1EotScorerOptions };
406
+
407
+ /**
408
+ * Eliza-1 EOT classifier. Reuses the already-loaded text model (typically
409
+ * the eliza-1 drafter — same model MTP keeps warm for speculative
410
+ * decoding) to compute P(`<|im_end|>` | partial transcript). Optionally
411
+ * loads a fine-tuned EOT LoRA adapter on top of the base weights — see
412
+ * `packages/training/scripts/turn_detector/` for the training recipe.
413
+ *
414
+ * Unlike the GGUF-backed `LiveKitGgmlTurnDetector`, this classifier ships
415
+ * zero additional model weights — it leans on what's already in RAM.
416
+ */
417
+ export class Eliza1EotClassifier implements EotClassifier {
418
+ private readonly scorer: Eliza1EotScorer;
419
+
420
+ constructor(options: Eliza1EotScorerOptions | { scorer: Eliza1EotScorer }) {
421
+ this.scorer =
422
+ "scorer" in options ? options.scorer : new Eliza1EotScorer(options);
423
+ }
424
+
425
+ async score(partialTranscript: string): Promise<number> {
426
+ const { probability } = await this.scorer.score(partialTranscript);
427
+ return probability;
428
+ }
429
+
430
+ async signal(partialTranscript: string): Promise<VoiceTurnSignal> {
431
+ const result = await this.scorer.score(partialTranscript);
432
+ return turnSignalFromProbability({
433
+ probability: result.probability,
434
+ transcript: partialTranscript,
435
+ source: "eliza-1-drafter",
436
+ model: this.scorer.modelLabel,
437
+ latencyMs: result.latencyMs,
438
+ });
439
+ }
440
+
441
+ async dispose(): Promise<void> {
442
+ await this.scorer.dispose();
443
+ }
444
+ }
445
+
446
+ // ---------------------------------------------------------------------------
447
+ // Composite EOT classifier (fused semantic model + heuristic co-signal)
448
+ // ---------------------------------------------------------------------------
449
+
450
+ /**
451
+ * Above this heuristic confidence the heuristic's high-precision syntactic
452
+ * verdict is trusted outright and the model forward pass is skipped. Sentence-
453
+ * final punctuation, question tags, trailing conjunctions, and dangling
454
+ * prepositions all clear this bar (P ≤ 0.2 or ≥ 0.8 → confidence ≥ 0.6); short
455
+ * utterances and the no-signal case fall below it and defer to the model.
456
+ */
457
+ export const COMPOSITE_HEURISTIC_CONFIDENCE_CUTOFF = 0.6;
458
+
459
+ /**
460
+ * End-of-turn classifier that blends the fused semantic scorer
461
+ * (P(`<|im_end|>`) over the loaded text model) with the heuristic syntactic
462
+ * rules. The heuristic is NOT a fallback — it is a tuned co-signal: when it is
463
+ * confident (clear punctuation / mid-clause conjunction / dangling preposition)
464
+ * its verdict wins outright and the model pass is skipped; in the ambiguous
465
+ * middle (short utterance, no syntactic cue) the model's semantic judgment
466
+ * dominates, blended by the heuristic's residual confidence. Acoustic
467
+ * silence/VAD timing lives a tier below this (the VAD), so this layer is the
468
+ * pure text-completion read.
469
+ */
470
+ export class CompositeEotClassifier implements EotClassifier {
471
+ private readonly model: FfiEotScorer;
472
+ private readonly heuristic: HeuristicEotClassifier;
473
+ private readonly confidenceCutoff: number;
474
+
475
+ constructor(options: {
476
+ model: FfiEotScorer;
477
+ heuristic?: HeuristicEotClassifier;
478
+ confidenceCutoff?: number;
479
+ }) {
480
+ this.model = options.model;
481
+ this.heuristic = options.heuristic ?? new HeuristicEotClassifier();
482
+ this.confidenceCutoff =
483
+ options.confidenceCutoff ?? COMPOSITE_HEURISTIC_CONFIDENCE_CUTOFF;
484
+ }
485
+
486
+ private async blend(
487
+ partialTranscript: string,
488
+ ): Promise<{ probability: number; latencyMs: number; usedModel: boolean }> {
489
+ const heuristicP = await this.heuristic.score(partialTranscript);
490
+ const heuristicConfidence = Math.abs(heuristicP - 0.5) * 2;
491
+ // High-precision syntactic verdict — trust it and skip the model pass.
492
+ if (heuristicConfidence >= this.confidenceCutoff) {
493
+ return { probability: heuristicP, latencyMs: 0, usedModel: false };
494
+ }
495
+ const { probability: modelP, latencyMs } =
496
+ await this.model.score(partialTranscript);
497
+ const blended =
498
+ modelP * (1 - heuristicConfidence) + heuristicP * heuristicConfidence;
499
+ return {
500
+ probability: clampProbability(blended),
501
+ latencyMs,
502
+ usedModel: true,
503
+ };
504
+ }
505
+
506
+ async score(partialTranscript: string): Promise<number> {
507
+ return (await this.blend(partialTranscript)).probability;
508
+ }
509
+
510
+ async signal(partialTranscript: string): Promise<VoiceTurnSignal> {
511
+ const { probability, latencyMs, usedModel } =
512
+ await this.blend(partialTranscript);
513
+ return turnSignalFromProbability({
514
+ probability,
515
+ transcript: partialTranscript,
516
+ source: usedModel ? "eliza-1-drafter" : "heuristic",
517
+ model: usedModel ? `${this.model.modelLabel}+heuristic` : "heuristic-v1",
518
+ ...(latencyMs > 0 ? { latencyMs } : {}),
519
+ });
520
+ }
521
+ }
522
+
523
+ /**
524
+ * Build a composite EOT classifier backed by the fused FFI scorer, or null when
525
+ * the loaded fused build does not wire the v11 EOT symbol (a pre-v11 library) —
526
+ * the caller then falls back to a heuristic-only classifier.
527
+ */
528
+ export function tryBuildFusedEotClassifier(
529
+ options: FfiEotScorerOptions,
530
+ ): CompositeEotClassifier | null {
531
+ if (!FfiEotScorer.isSupported(options.ffi)) return null;
532
+ return new CompositeEotClassifier({ model: new FfiEotScorer(options) });
533
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Structured voice-startup failure.
3
+ *
4
+ * Per `packages/inference/AGENTS.md` §3 + §9 (no defensive code, no
5
+ * log-and-continue), the engine MUST throw one of these when voice mode
6
+ * is requested but cannot start (missing FFI, missing speaker preset,
7
+ * missing fused build, missing required region, manifest mismatch). The
8
+ * runtime then refuses to activate the model — never silently degrades to
9
+ * text-only.
10
+ *
11
+ * Lives in its own module (rather than `engine-bridge.ts`) so the voice
12
+ * sub-modules — `pipeline-impls.ts`, `vad.ts`, `embedding.ts` — can throw
13
+ * it without importing the bridge (which imports them in turn, which
14
+ * would be a cycle).
15
+ */
16
+ export declare class VoiceStartupError extends Error {
17
+ readonly code: "missing-ffi" | "missing-speaker-preset" | "missing-bundle-root" | "missing-fused-build" | "missing-turn-detector" | "already-started" | "not-started" | "invalid-options";
18
+ constructor(code: VoiceStartupError["code"], message: string);
19
+ }
20
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EACV,aAAa,GACb,wBAAwB,GACxB,qBAAqB,GACrB,qBAAqB,GACrB,uBAAuB,GACvB,iBAAiB,GACjB,aAAa,GACb,iBAAiB,CAAC;gBAET,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM;CAK5D"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Structured voice-startup failure.
3
+ *
4
+ * Per `packages/inference/AGENTS.md` §3 + §9 (no defensive code, no
5
+ * log-and-continue), the engine MUST throw one of these when voice mode
6
+ * is requested but cannot start (missing FFI, missing speaker preset,
7
+ * missing fused build, missing required region, manifest mismatch). The
8
+ * runtime then refuses to activate the model — never silently degrades to
9
+ * text-only.
10
+ *
11
+ * Lives in its own module (rather than `engine-bridge.ts`) so the voice
12
+ * sub-modules — `pipeline-impls.ts`, `vad.ts`, `embedding.ts` — can throw
13
+ * it without importing the bridge (which imports them in turn, which
14
+ * would be a cycle).
15
+ */
16
+ export class VoiceStartupError extends Error {
17
+ readonly code:
18
+ | "missing-ffi"
19
+ | "missing-speaker-preset"
20
+ | "missing-bundle-root"
21
+ | "missing-fused-build"
22
+ | "missing-turn-detector"
23
+ | "already-started"
24
+ | "not-started"
25
+ | "invalid-options";
26
+
27
+ constructor(code: VoiceStartupError["code"], message: string) {
28
+ super(message);
29
+ this.name = "VoiceStartupError";
30
+ this.code = code;
31
+ }
32
+ }