@elizaos/plugin-local-inference 2.0.0-beta.1 → 2.0.11-beta.7

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 (676) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +83 -0
  3. package/package.json +81 -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/adapters/capacitor-llama/__tests__/compat-behavior.test.ts +218 -0
  11. package/src/adapters/capacitor-llama/__tests__/index.test.ts +68 -0
  12. package/src/adapters/capacitor-llama/__tests__/structured-output.test.ts +215 -0
  13. package/src/adapters/capacitor-llama/__tests__/text-streaming.test.ts +174 -0
  14. package/src/adapters/capacitor-llama/environment.ts +71 -0
  15. package/src/adapters/capacitor-llama/index.browser.ts +83 -0
  16. package/src/adapters/capacitor-llama/index.ts +807 -0
  17. package/src/adapters/capacitor-llama/loader.ts +109 -0
  18. package/src/adapters/capacitor-llama/structured-output.ts +165 -0
  19. package/src/adapters/capacitor-llama/text-streaming.ts +227 -0
  20. package/src/adapters/capacitor-llama/types.ts +374 -0
  21. package/src/backends/apple-foundation.ts +127 -0
  22. package/src/index.d.ts +7 -0
  23. package/src/index.d.ts.map +1 -0
  24. package/src/index.ts +54 -0
  25. package/src/local-inference-routes.d.ts +38 -0
  26. package/src/local-inference-routes.d.ts.map +1 -0
  27. package/src/local-inference-routes.test.ts +344 -0
  28. package/src/local-inference-routes.ts +1543 -0
  29. package/src/provider.d.ts +21 -0
  30. package/src/provider.d.ts.map +1 -0
  31. package/src/provider.ts +1171 -0
  32. package/src/routes/compat-helpers.d.ts +18 -0
  33. package/src/routes/compat-helpers.d.ts.map +1 -0
  34. package/src/routes/compat-helpers.ts +274 -0
  35. package/src/routes/family-member-route.d.ts +62 -0
  36. package/src/routes/family-member-route.d.ts.map +1 -0
  37. package/src/routes/family-member-route.ts +353 -0
  38. package/src/routes/index.d.ts +19 -0
  39. package/src/routes/index.d.ts.map +1 -0
  40. package/src/routes/index.ts +60 -0
  41. package/src/routes/live-diarization-route.d.ts +26 -0
  42. package/src/routes/live-diarization-route.d.ts.map +1 -0
  43. package/src/routes/live-diarization-route.test.ts +213 -0
  44. package/src/routes/live-diarization-route.ts +122 -0
  45. package/src/routes/local-inference-asr-route.d.ts +4 -0
  46. package/src/routes/local-inference-asr-route.d.ts.map +1 -0
  47. package/src/routes/local-inference-asr-route.test.ts +190 -0
  48. package/src/routes/local-inference-asr-route.ts +213 -0
  49. package/src/routes/local-inference-compat-routes.d.ts +16 -0
  50. package/src/routes/local-inference-compat-routes.d.ts.map +1 -0
  51. package/src/routes/local-inference-compat-routes.test.ts +423 -0
  52. package/src/routes/local-inference-compat-routes.ts +782 -0
  53. package/src/routes/local-inference-tts-route.d.ts +7 -0
  54. package/src/routes/local-inference-tts-route.d.ts.map +1 -0
  55. package/src/routes/local-inference-tts-route.test.ts +179 -0
  56. package/src/routes/local-inference-tts-route.ts +230 -0
  57. package/src/routes/voice-first-run-routes.d.ts +62 -0
  58. package/src/routes/voice-first-run-routes.d.ts.map +1 -0
  59. package/src/routes/voice-first-run-routes.ts +524 -0
  60. package/src/routes/voice-models-routes.d.ts +62 -0
  61. package/src/routes/voice-models-routes.d.ts.map +1 -0
  62. package/src/routes/voice-models-routes.ts +554 -0
  63. package/src/routes/voice-profile-plugin-routes.d.ts +19 -0
  64. package/src/routes/voice-profile-plugin-routes.d.ts.map +1 -0
  65. package/src/routes/voice-profile-plugin-routes.ts +138 -0
  66. package/src/routes/voice-profiles-management-routes.d.ts +52 -0
  67. package/src/routes/voice-profiles-management-routes.d.ts.map +1 -0
  68. package/src/routes/voice-profiles-management-routes.ts +476 -0
  69. package/src/routes/voice-speaker-profile-routes.d.ts +57 -0
  70. package/src/routes/voice-speaker-profile-routes.d.ts.map +1 -0
  71. package/src/routes/voice-speaker-profile-routes.ts +199 -0
  72. package/src/runtime/aosp-llama-loader-selection.test.ts +80 -0
  73. package/src/runtime/capacitor-llama.d.ts +25 -0
  74. package/src/runtime/embedding-manager-support.d.ts +77 -0
  75. package/src/runtime/embedding-manager-support.d.ts.map +1 -0
  76. package/src/runtime/embedding-manager-support.ts +497 -0
  77. package/src/runtime/embedding-presets.d.ts +16 -0
  78. package/src/runtime/embedding-presets.d.ts.map +1 -0
  79. package/src/runtime/embedding-presets.ts +81 -0
  80. package/src/runtime/embedding-warmup-policy.d.ts +14 -0
  81. package/src/runtime/embedding-warmup-policy.d.ts.map +1 -0
  82. package/src/runtime/embedding-warmup-policy.test.ts +53 -0
  83. package/src/runtime/embedding-warmup-policy.ts +48 -0
  84. package/src/runtime/ensure-local-inference-handler.d.ts +53 -0
  85. package/src/runtime/ensure-local-inference-handler.d.ts.map +1 -0
  86. package/src/runtime/ensure-local-inference-handler.test.ts +528 -0
  87. package/src/runtime/ensure-local-inference-handler.ts +1398 -0
  88. package/src/runtime/index.d.ts +14 -0
  89. package/src/runtime/index.d.ts.map +1 -0
  90. package/src/runtime/index.ts +27 -0
  91. package/src/runtime/mobile-local-inference-gate.d.ts +31 -0
  92. package/src/runtime/mobile-local-inference-gate.d.ts.map +1 -0
  93. package/src/runtime/mobile-local-inference-gate.test.ts +69 -0
  94. package/src/runtime/mobile-local-inference-gate.ts +44 -0
  95. package/src/runtime/voice-entity-binding.d.ts +103 -0
  96. package/src/runtime/voice-entity-binding.d.ts.map +1 -0
  97. package/src/runtime/voice-entity-binding.transcript.test.ts +69 -0
  98. package/src/runtime/voice-entity-binding.ts +328 -0
  99. package/src/services/README.md +71 -0
  100. package/src/services/__tests__/backend-selector.test.ts +101 -0
  101. package/src/services/__tests__/checkpoint-manager.test.ts +376 -0
  102. package/src/services/__tests__/gpu-autotune.test.ts +400 -0
  103. package/src/services/__tests__/llm-streaming-binding.test.ts +85 -0
  104. package/src/services/__tests__/planner-grammar.test.ts +372 -0
  105. package/src/services/__tests__/runtime-target.test.ts +176 -0
  106. package/src/services/active-model-switch-rollback.test.ts +183 -0
  107. package/src/services/active-model.d.ts +282 -0
  108. package/src/services/active-model.d.ts.map +1 -0
  109. package/src/services/active-model.ts +1213 -0
  110. package/src/services/asr/errors.d.ts +21 -0
  111. package/src/services/asr/errors.d.ts.map +1 -0
  112. package/src/services/asr/errors.ts +50 -0
  113. package/src/services/asr/hash.d.ts +28 -0
  114. package/src/services/asr/hash.d.ts.map +1 -0
  115. package/src/services/asr/hash.ts +49 -0
  116. package/src/services/asr/index.d.ts +76 -0
  117. package/src/services/asr/index.d.ts.map +1 -0
  118. package/src/services/asr/index.ts +178 -0
  119. package/src/services/asr/types.d.ts +91 -0
  120. package/src/services/asr/types.d.ts.map +1 -0
  121. package/src/services/asr/types.ts +95 -0
  122. package/src/services/assignments.d.ts +71 -0
  123. package/src/services/assignments.d.ts.map +1 -0
  124. package/src/services/assignments.test.ts +80 -0
  125. package/src/services/assignments.ts +230 -0
  126. package/src/services/backend-selector.ts +95 -0
  127. package/src/services/backend.d.ts +346 -0
  128. package/src/services/backend.d.ts.map +1 -0
  129. package/src/services/backend.ts +612 -0
  130. package/src/services/bundled-models.d.ts +34 -0
  131. package/src/services/bundled-models.d.ts.map +1 -0
  132. package/src/services/bundled-models.ts +129 -0
  133. package/src/services/cache-bridge.d.ts +206 -0
  134. package/src/services/cache-bridge.d.ts.map +1 -0
  135. package/src/services/cache-bridge.test.ts +516 -0
  136. package/src/services/cache-bridge.ts +423 -0
  137. package/src/services/catalog.d.ts +10 -0
  138. package/src/services/catalog.d.ts.map +1 -0
  139. package/src/services/catalog.test.ts +240 -0
  140. package/src/services/catalog.ts +27 -0
  141. package/src/services/checkpoint-client.d.ts +109 -0
  142. package/src/services/checkpoint-client.d.ts.map +1 -0
  143. package/src/services/checkpoint-client.ts +258 -0
  144. package/src/services/checkpoint-manager.ts +474 -0
  145. package/src/services/cloud-fallback.d.ts +102 -0
  146. package/src/services/cloud-fallback.d.ts.map +1 -0
  147. package/src/services/cloud-fallback.ts +230 -0
  148. package/src/services/conversation-registry.d.ts +142 -0
  149. package/src/services/conversation-registry.d.ts.map +1 -0
  150. package/src/services/conversation-registry.test.ts +235 -0
  151. package/src/services/conversation-registry.ts +264 -0
  152. package/src/services/desktop-fused-ffi-backend-runtime.d.ts +92 -0
  153. package/src/services/desktop-fused-ffi-backend-runtime.d.ts.map +1 -0
  154. package/src/services/desktop-fused-ffi-backend-runtime.ts +333 -0
  155. package/src/services/device-bridge.d.ts +188 -0
  156. package/src/services/device-bridge.d.ts.map +1 -0
  157. package/src/services/device-bridge.ts +1237 -0
  158. package/src/services/device-resource-metrics.d.ts +149 -0
  159. package/src/services/device-resource-metrics.d.ts.map +1 -0
  160. package/src/services/device-resource-metrics.test.ts +98 -0
  161. package/src/services/device-resource-metrics.ts +346 -0
  162. package/src/services/device-tier.d.ts +115 -0
  163. package/src/services/device-tier.d.ts.map +1 -0
  164. package/src/services/device-tier.test.ts +371 -0
  165. package/src/services/device-tier.ts +410 -0
  166. package/src/services/downloader.d.ts +82 -0
  167. package/src/services/downloader.d.ts.map +1 -0
  168. package/src/services/downloader.test.ts +724 -0
  169. package/src/services/downloader.ts +899 -0
  170. package/src/services/engine-direct-bundle.test.ts +58 -0
  171. package/src/services/engine-streaming.test.ts +80 -0
  172. package/src/services/engine.d.ts +534 -0
  173. package/src/services/engine.d.ts.map +1 -0
  174. package/src/services/engine.ts +1891 -0
  175. package/src/services/ensure-local-artifacts.integration.test.ts +273 -0
  176. package/src/services/ensure-local-artifacts.test.ts +368 -0
  177. package/src/services/ensure-local-artifacts.ts +351 -0
  178. package/src/services/external-scanner.d.ts +17 -0
  179. package/src/services/external-scanner.d.ts.map +1 -0
  180. package/src/services/external-scanner.ts +312 -0
  181. package/src/services/ffi-llm-mock.ts +354 -0
  182. package/src/services/ffi-llm-streaming-abi.ts +442 -0
  183. package/src/services/ffi-streaming-backend.d.ts +180 -0
  184. package/src/services/ffi-streaming-backend.d.ts.map +1 -0
  185. package/src/services/ffi-streaming-backend.ts +382 -0
  186. package/src/services/ffi-streaming-runner.d.ts +122 -0
  187. package/src/services/ffi-streaming-runner.d.ts.map +1 -0
  188. package/src/services/ffi-streaming-runner.test.ts +60 -0
  189. package/src/services/ffi-streaming-runner.ts +354 -0
  190. package/src/services/ffi-unload-ordering.test.ts +162 -0
  191. package/src/services/gpu-autotune.ts +534 -0
  192. package/src/services/gpu-detect.ts +139 -0
  193. package/src/services/handler-registry.d.ts +72 -0
  194. package/src/services/handler-registry.d.ts.map +1 -0
  195. package/src/services/handler-registry.ts +240 -0
  196. package/src/services/hardware.d.ts +63 -0
  197. package/src/services/hardware.d.ts.map +1 -0
  198. package/src/services/hardware.test.ts +183 -0
  199. package/src/services/hardware.ts +404 -0
  200. package/src/services/hf-search.d.ts +26 -0
  201. package/src/services/hf-search.d.ts.map +1 -0
  202. package/src/services/hf-search.test.ts +69 -0
  203. package/src/services/hf-search.ts +420 -0
  204. package/src/services/image-description-runtime.d.ts +14 -0
  205. package/src/services/image-description-runtime.d.ts.map +1 -0
  206. package/src/services/image-description-runtime.test.ts +61 -0
  207. package/src/services/image-description-runtime.ts +118 -0
  208. package/src/services/imagegen/aosp-unavailable.d.ts +134 -0
  209. package/src/services/imagegen/aosp-unavailable.d.ts.map +1 -0
  210. package/src/services/imagegen/aosp-unavailable.ts +229 -0
  211. package/src/services/imagegen/backend-selector.d.ts +118 -0
  212. package/src/services/imagegen/backend-selector.d.ts.map +1 -0
  213. package/src/services/imagegen/backend-selector.ts +281 -0
  214. package/src/services/imagegen/coreml-unavailable.d.ts +105 -0
  215. package/src/services/imagegen/coreml-unavailable.d.ts.map +1 -0
  216. package/src/services/imagegen/coreml-unavailable.ts +237 -0
  217. package/src/services/imagegen/errors.d.ts +16 -0
  218. package/src/services/imagegen/errors.d.ts.map +1 -0
  219. package/src/services/imagegen/errors.ts +40 -0
  220. package/src/services/imagegen/index.d.ts +58 -0
  221. package/src/services/imagegen/index.d.ts.map +1 -0
  222. package/src/services/imagegen/index.ts +144 -0
  223. package/src/services/imagegen/mflux.d.ts +74 -0
  224. package/src/services/imagegen/mflux.d.ts.map +1 -0
  225. package/src/services/imagegen/mflux.ts +313 -0
  226. package/src/services/imagegen/sd-cpp.d.ts +180 -0
  227. package/src/services/imagegen/sd-cpp.d.ts.map +1 -0
  228. package/src/services/imagegen/sd-cpp.ts +718 -0
  229. package/src/services/imagegen/tensorrt-unavailable.d.ts +83 -0
  230. package/src/services/imagegen/tensorrt-unavailable.d.ts.map +1 -0
  231. package/src/services/imagegen/tensorrt-unavailable.ts +295 -0
  232. package/src/services/imagegen/types.d.ts +181 -0
  233. package/src/services/imagegen/types.d.ts.map +1 -0
  234. package/src/services/imagegen/types.ts +193 -0
  235. package/src/services/index.d.ts +30 -0
  236. package/src/services/index.d.ts.map +1 -0
  237. package/src/services/index.ts +225 -0
  238. package/src/services/inference-capabilities.d.ts +132 -0
  239. package/src/services/inference-capabilities.d.ts.map +1 -0
  240. package/src/services/inference-capabilities.test.ts +75 -0
  241. package/src/services/inference-capabilities.ts +204 -0
  242. package/src/services/inference-telemetry.d.ts +59 -0
  243. package/src/services/inference-telemetry.d.ts.map +1 -0
  244. package/src/services/inference-telemetry.ts +143 -0
  245. package/src/services/ios-llama-streaming.ts +248 -0
  246. package/src/services/kv-spill.d.ts +189 -0
  247. package/src/services/kv-spill.d.ts.map +1 -0
  248. package/src/services/kv-spill.test.ts +222 -0
  249. package/src/services/kv-spill.ts +356 -0
  250. package/src/services/latency-trace.d.ts +346 -0
  251. package/src/services/latency-trace.d.ts.map +1 -0
  252. package/src/services/latency-trace.test.ts +266 -0
  253. package/src/services/latency-trace.ts +844 -0
  254. package/src/services/llama-server-metrics.ts +304 -0
  255. package/src/services/llm-streaming-binding.d.ts +96 -0
  256. package/src/services/llm-streaming-binding.d.ts.map +1 -0
  257. package/src/services/llm-streaming-binding.ts +136 -0
  258. package/src/services/load-args.d.ts +82 -0
  259. package/src/services/load-args.d.ts.map +1 -0
  260. package/src/services/load-args.ts +81 -0
  261. package/src/services/manifest/eliza-1.manifest.v1.json +708 -0
  262. package/src/services/manifest/index.d.ts +4 -0
  263. package/src/services/manifest/index.d.ts.map +1 -0
  264. package/src/services/manifest/index.ts +66 -0
  265. package/src/services/manifest/manifest.test.ts +693 -0
  266. package/src/services/manifest/schema.d.ts +715 -0
  267. package/src/services/manifest/schema.d.ts.map +1 -0
  268. package/src/services/manifest/schema.ts +655 -0
  269. package/src/services/manifest/types.d.ts +30 -0
  270. package/src/services/manifest/types.d.ts.map +1 -0
  271. package/src/services/manifest/types.ts +55 -0
  272. package/src/services/manifest/validator.d.ts +66 -0
  273. package/src/services/manifest/validator.d.ts.map +1 -0
  274. package/src/services/manifest/validator.ts +569 -0
  275. package/src/services/memory-arbiter.d.ts +343 -0
  276. package/src/services/memory-arbiter.d.ts.map +1 -0
  277. package/src/services/memory-arbiter.test.ts +419 -0
  278. package/src/services/memory-arbiter.ts +1000 -0
  279. package/src/services/memory-monitor.d.ts +119 -0
  280. package/src/services/memory-monitor.d.ts.map +1 -0
  281. package/src/services/memory-monitor.test.ts +208 -0
  282. package/src/services/memory-monitor.ts +296 -0
  283. package/src/services/memory-pressure.d.ts +127 -0
  284. package/src/services/memory-pressure.d.ts.map +1 -0
  285. package/src/services/memory-pressure.ts +413 -0
  286. package/src/services/mtp-doctor.d.ts +13 -0
  287. package/src/services/mtp-doctor.d.ts.map +1 -0
  288. package/src/services/mtp-doctor.ts +78 -0
  289. package/src/services/network-policy.d.ts +127 -0
  290. package/src/services/network-policy.d.ts.map +1 -0
  291. package/src/services/network-policy.ts +346 -0
  292. package/src/services/paths.d.ts +6 -0
  293. package/src/services/paths.d.ts.map +1 -0
  294. package/src/services/paths.ts +25 -0
  295. package/src/services/planner-skeleton.d.ts +124 -0
  296. package/src/services/planner-skeleton.d.ts.map +1 -0
  297. package/src/services/planner-skeleton.ts +175 -0
  298. package/src/services/providers.d.ts +38 -0
  299. package/src/services/providers.d.ts.map +1 -0
  300. package/src/services/providers.ts +507 -0
  301. package/src/services/ram-budget-cache.test.ts +163 -0
  302. package/src/services/ram-budget.d.ts +110 -0
  303. package/src/services/ram-budget.d.ts.map +1 -0
  304. package/src/services/ram-budget.ts +0 -0
  305. package/src/services/readiness.d.ts +9 -0
  306. package/src/services/readiness.d.ts.map +1 -0
  307. package/src/services/readiness.test.ts +87 -0
  308. package/src/services/readiness.ts +238 -0
  309. package/src/services/recommendation.d.ts +111 -0
  310. package/src/services/recommendation.d.ts.map +1 -0
  311. package/src/services/recommendation.ts +672 -0
  312. package/src/services/registry.d.ts +35 -0
  313. package/src/services/registry.d.ts.map +1 -0
  314. package/src/services/registry.ts +151 -0
  315. package/src/services/router-handler.d.ts +92 -0
  316. package/src/services/router-handler.d.ts.map +1 -0
  317. package/src/services/router-handler.test.ts +45 -0
  318. package/src/services/router-handler.ts +376 -0
  319. package/src/services/routing-policy.d.ts +55 -0
  320. package/src/services/routing-policy.d.ts.map +1 -0
  321. package/src/services/routing-policy.ts +228 -0
  322. package/src/services/routing-preferences.d.ts +8 -0
  323. package/src/services/routing-preferences.d.ts.map +1 -0
  324. package/src/services/routing-preferences.ts +15 -0
  325. package/src/services/runtime-target.d.ts +98 -0
  326. package/src/services/runtime-target.d.ts.map +1 -0
  327. package/src/services/runtime-target.ts +154 -0
  328. package/src/services/service.d.ts +128 -0
  329. package/src/services/service.d.ts.map +1 -0
  330. package/src/services/service.test.ts +223 -0
  331. package/src/services/service.ts +735 -0
  332. package/src/services/session-pool.d.ts +72 -0
  333. package/src/services/session-pool.d.ts.map +1 -0
  334. package/src/services/session-pool.ts +153 -0
  335. package/src/services/structured-output/deterministic-repair.d.ts +23 -0
  336. package/src/services/structured-output/deterministic-repair.d.ts.map +1 -0
  337. package/src/services/structured-output/deterministic-repair.test.ts +169 -0
  338. package/src/services/structured-output/deterministic-repair.ts +443 -0
  339. package/src/services/structured-output/index.ts +4 -0
  340. package/src/services/structured-output.d.ts +311 -0
  341. package/src/services/structured-output.d.ts.map +1 -0
  342. package/src/services/structured-output.test.ts +483 -0
  343. package/src/services/structured-output.ts +712 -0
  344. package/src/services/transcription-priority.test.ts +211 -0
  345. package/src/services/tts/errors.ts +46 -0
  346. package/src/services/tts/index.ts +214 -0
  347. package/src/services/tts/tts-audio-cache.ts +235 -0
  348. package/src/services/tts/types.ts +157 -0
  349. package/src/services/types.d.ts +19 -0
  350. package/src/services/types.d.ts.map +1 -0
  351. package/src/services/types.ts +55 -0
  352. package/src/services/verify-on-device.d.ts +34 -0
  353. package/src/services/verify-on-device.d.ts.map +1 -0
  354. package/src/services/verify-on-device.test.ts +87 -0
  355. package/src/services/verify-on-device.ts +127 -0
  356. package/src/services/verify.d.ts +8 -0
  357. package/src/services/verify.d.ts.map +1 -0
  358. package/src/services/verify.ts +13 -0
  359. package/src/services/vision/aosp-unavailable.d.ts +115 -0
  360. package/src/services/vision/aosp-unavailable.d.ts.map +1 -0
  361. package/src/services/vision/aosp-unavailable.ts +163 -0
  362. package/src/services/vision/capacitor-llama.d.ts +99 -0
  363. package/src/services/vision/capacitor-llama.d.ts.map +1 -0
  364. package/src/services/vision/capacitor-llama.ts +255 -0
  365. package/src/services/vision/cloud-fallback.d.ts +47 -0
  366. package/src/services/vision/cloud-fallback.d.ts.map +1 -0
  367. package/src/services/vision/cloud-fallback.test.ts +243 -0
  368. package/src/services/vision/cloud-fallback.ts +268 -0
  369. package/src/services/vision/fallback-chain.test.ts +86 -0
  370. package/src/services/vision/hash.d.ts +71 -0
  371. package/src/services/vision/hash.d.ts.map +1 -0
  372. package/src/services/vision/hash.ts +157 -0
  373. package/src/services/vision/index.d.ts +95 -0
  374. package/src/services/vision/index.d.ts.map +1 -0
  375. package/src/services/vision/index.ts +251 -0
  376. package/src/services/vision/llama-server.d.ts +73 -0
  377. package/src/services/vision/llama-server.d.ts.map +1 -0
  378. package/src/services/vision/llama-server.ts +177 -0
  379. package/src/services/vision/types.d.ts +153 -0
  380. package/src/services/vision/types.d.ts.map +1 -0
  381. package/src/services/vision/types.ts +154 -0
  382. package/src/services/vision/vast-fallback.d.ts +18 -0
  383. package/src/services/vision/vast-fallback.d.ts.map +1 -0
  384. package/src/services/vision/vast-fallback.ts +127 -0
  385. package/src/services/vision-embedding-cache.d.ts +98 -0
  386. package/src/services/vision-embedding-cache.d.ts.map +1 -0
  387. package/src/services/vision-embedding-cache.ts +189 -0
  388. package/src/services/voice/VOICE_WORKBENCH.md +88 -0
  389. package/src/services/voice/__test-helpers__/fake-ffi.ts +92 -0
  390. package/src/services/voice/__test-helpers__/synthetic-speech.ts +124 -0
  391. package/src/services/voice/__tests__/checkpoint-manager.test.ts +241 -0
  392. package/src/services/voice/__tests__/checkpoint-policy.test.ts +270 -0
  393. package/src/services/voice/__tests__/eager-context-builder.test.ts +257 -0
  394. package/src/services/voice/__tests__/eliza1-eot-scorer.test.ts +288 -0
  395. package/src/services/voice/__tests__/eot-classifier.test.ts +431 -0
  396. package/src/services/voice/__tests__/optimistic-rollback.test.ts +312 -0
  397. package/src/services/voice/__tests__/prefill-client.test.ts +266 -0
  398. package/src/services/voice/__tests__/prefix-preserving-queue.test.ts +208 -0
  399. package/src/services/voice/__tests__/streaming-asr.test.ts +450 -0
  400. package/src/services/voice/__tests__/streaming-transcriber.test.ts +339 -0
  401. package/src/services/voice/__tests__/turn-detector-resolver.test.ts +197 -0
  402. package/src/services/voice/__tests__/voice-state-machine-prefill.test.ts +275 -0
  403. package/src/services/voice/__tests__/voice-state-machine.test.ts +354 -0
  404. package/src/services/voice/audio-frame-consumer.d.ts +212 -0
  405. package/src/services/voice/audio-frame-consumer.d.ts.map +1 -0
  406. package/src/services/voice/audio-frame-consumer.test.ts +343 -0
  407. package/src/services/voice/audio-frame-consumer.ts +491 -0
  408. package/src/services/voice/barge-in.d.ts +112 -0
  409. package/src/services/voice/barge-in.d.ts.map +1 -0
  410. package/src/services/voice/barge-in.test.ts +244 -0
  411. package/src/services/voice/barge-in.ts +336 -0
  412. package/src/services/voice/cancellation-coordinator.d.ts +127 -0
  413. package/src/services/voice/cancellation-coordinator.d.ts.map +1 -0
  414. package/src/services/voice/cancellation-coordinator.test.ts +196 -0
  415. package/src/services/voice/cancellation-coordinator.ts +269 -0
  416. package/src/services/voice/checkpoint-manager.d.ts +199 -0
  417. package/src/services/voice/checkpoint-manager.d.ts.map +1 -0
  418. package/src/services/voice/checkpoint-manager.ts +401 -0
  419. package/src/services/voice/checkpoint-policy.ts +336 -0
  420. package/src/services/voice/composite-eot-classifier.test.ts +59 -0
  421. package/src/services/voice/e2e-harness.test.ts +182 -0
  422. package/src/services/voice/e2e-harness.ts +743 -0
  423. package/src/services/voice/eager-context-builder.d.ts +170 -0
  424. package/src/services/voice/eager-context-builder.d.ts.map +1 -0
  425. package/src/services/voice/eager-context-builder.ts +262 -0
  426. package/src/services/voice/eliza1-eot-scorer.d.ts +124 -0
  427. package/src/services/voice/eliza1-eot-scorer.d.ts.map +1 -0
  428. package/src/services/voice/eliza1-eot-scorer.ts +242 -0
  429. package/src/services/voice/embedding-server.ts +200 -0
  430. package/src/services/voice/embedding.d.ts +133 -0
  431. package/src/services/voice/embedding.d.ts.map +1 -0
  432. package/src/services/voice/embedding.test.ts +148 -0
  433. package/src/services/voice/embedding.ts +244 -0
  434. package/src/services/voice/emotion-attribution.d.ts +68 -0
  435. package/src/services/voice/emotion-attribution.d.ts.map +1 -0
  436. package/src/services/voice/emotion-attribution.test.ts +129 -0
  437. package/src/services/voice/emotion-attribution.ts +361 -0
  438. package/src/services/voice/engine-bridge-cancellation.test.ts +422 -0
  439. package/src/services/voice/engine-bridge.d.ts +746 -0
  440. package/src/services/voice/engine-bridge.d.ts.map +1 -0
  441. package/src/services/voice/engine-bridge.test.ts +384 -0
  442. package/src/services/voice/engine-bridge.ts +2226 -0
  443. package/src/services/voice/eot-classifier-ggml.d.ts +179 -0
  444. package/src/services/voice/eot-classifier-ggml.d.ts.map +1 -0
  445. package/src/services/voice/eot-classifier-ggml.ts +566 -0
  446. package/src/services/voice/eot-classifier.d.ts +214 -0
  447. package/src/services/voice/eot-classifier.d.ts.map +1 -0
  448. package/src/services/voice/eot-classifier.ts +533 -0
  449. package/src/services/voice/errors.d.ts +20 -0
  450. package/src/services/voice/errors.d.ts.map +1 -0
  451. package/src/services/voice/errors.ts +32 -0
  452. package/src/services/voice/expressive-tags.d.ts +158 -0
  453. package/src/services/voice/expressive-tags.d.ts.map +1 -0
  454. package/src/services/voice/expressive-tags.ts +405 -0
  455. package/src/services/voice/ffi-bindings.d.ts +636 -0
  456. package/src/services/voice/ffi-bindings.d.ts.map +1 -0
  457. package/src/services/voice/ffi-bindings.test.ts +671 -0
  458. package/src/services/voice/ffi-bindings.ts +3050 -0
  459. package/src/services/voice/first-line-cache.d.ts +181 -0
  460. package/src/services/voice/first-line-cache.d.ts.map +1 -0
  461. package/src/services/voice/first-line-cache.ts +725 -0
  462. package/src/services/voice/fused-eot-scorer.d.ts +51 -0
  463. package/src/services/voice/fused-eot-scorer.d.ts.map +1 -0
  464. package/src/services/voice/fused-eot-scorer.ts +135 -0
  465. package/src/services/voice/index.d.ts +91 -0
  466. package/src/services/voice/index.d.ts.map +1 -0
  467. package/src/services/voice/index.ts +481 -0
  468. package/src/services/voice/kokoro/__tests__/kokoro-backend.test.ts +151 -0
  469. package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.real.test.ts +151 -0
  470. package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.test.ts +60 -0
  471. package/src/services/voice/kokoro/__tests__/kokoro-engine-discovery.test.ts +277 -0
  472. package/src/services/voice/kokoro/__tests__/kokoro-ffi-runtime.test.ts +235 -0
  473. package/src/services/voice/kokoro/__tests__/kokoro-runtime.test.ts +95 -0
  474. package/src/services/voice/kokoro/__tests__/phonemizer.test.ts +53 -0
  475. package/src/services/voice/kokoro/__tests__/runtime-selection.test.ts +231 -0
  476. package/src/services/voice/kokoro/__tests__/voices.test.ts +57 -0
  477. package/src/services/voice/kokoro/index.ts +79 -0
  478. package/src/services/voice/kokoro/kokoro-backend.d.ts +72 -0
  479. package/src/services/voice/kokoro/kokoro-backend.d.ts.map +1 -0
  480. package/src/services/voice/kokoro/kokoro-backend.ts +207 -0
  481. package/src/services/voice/kokoro/kokoro-engine-discovery.d.ts +58 -0
  482. package/src/services/voice/kokoro/kokoro-engine-discovery.d.ts.map +1 -0
  483. package/src/services/voice/kokoro/kokoro-engine-discovery.ts +177 -0
  484. package/src/services/voice/kokoro/kokoro-ffi-runtime.d.ts +75 -0
  485. package/src/services/voice/kokoro/kokoro-ffi-runtime.d.ts.map +1 -0
  486. package/src/services/voice/kokoro/kokoro-ffi-runtime.ts +233 -0
  487. package/src/services/voice/kokoro/kokoro-runtime.d.ts +100 -0
  488. package/src/services/voice/kokoro/kokoro-runtime.d.ts.map +1 -0
  489. package/src/services/voice/kokoro/kokoro-runtime.ts +170 -0
  490. package/src/services/voice/kokoro/phoneme-stream.ts +123 -0
  491. package/src/services/voice/kokoro/phonemizer.d.ts +50 -0
  492. package/src/services/voice/kokoro/phonemizer.d.ts.map +1 -0
  493. package/src/services/voice/kokoro/phonemizer.ts +344 -0
  494. package/src/services/voice/kokoro/pick-runtime.d.ts +61 -0
  495. package/src/services/voice/kokoro/pick-runtime.d.ts.map +1 -0
  496. package/src/services/voice/kokoro/pick-runtime.test.ts +91 -0
  497. package/src/services/voice/kokoro/pick-runtime.ts +130 -0
  498. package/src/services/voice/kokoro/runtime-selection.d.ts +92 -0
  499. package/src/services/voice/kokoro/runtime-selection.d.ts.map +1 -0
  500. package/src/services/voice/kokoro/runtime-selection.ts +237 -0
  501. package/src/services/voice/kokoro/types.d.ts +82 -0
  502. package/src/services/voice/kokoro/types.d.ts.map +1 -0
  503. package/src/services/voice/kokoro/types.ts +95 -0
  504. package/src/services/voice/kokoro/voice-presets.d.ts +23 -0
  505. package/src/services/voice/kokoro/voice-presets.d.ts.map +1 -0
  506. package/src/services/voice/kokoro/voice-presets.ts +129 -0
  507. package/src/services/voice/kokoro/voices.d.ts +30 -0
  508. package/src/services/voice/kokoro/voices.d.ts.map +1 -0
  509. package/src/services/voice/kokoro/voices.ts +64 -0
  510. package/src/services/voice/lifecycle.d.ts +135 -0
  511. package/src/services/voice/lifecycle.d.ts.map +1 -0
  512. package/src/services/voice/lifecycle.test.ts +315 -0
  513. package/src/services/voice/lifecycle.ts +301 -0
  514. package/src/services/voice/live-diarization-session.d.ts +96 -0
  515. package/src/services/voice/live-diarization-session.d.ts.map +1 -0
  516. package/src/services/voice/live-diarization-session.ts +289 -0
  517. package/src/services/voice/mic-source.d.ts +136 -0
  518. package/src/services/voice/mic-source.d.ts.map +1 -0
  519. package/src/services/voice/mic-source.test.ts +210 -0
  520. package/src/services/voice/mic-source.ts +503 -0
  521. package/src/services/voice/optimistic-policy.d.ts +109 -0
  522. package/src/services/voice/optimistic-policy.d.ts.map +1 -0
  523. package/src/services/voice/optimistic-policy.test.ts +101 -0
  524. package/src/services/voice/optimistic-policy.ts +192 -0
  525. package/src/services/voice/optimistic-rollback.ts +343 -0
  526. package/src/services/voice/partial-stabilizer.d.ts +73 -0
  527. package/src/services/voice/partial-stabilizer.d.ts.map +1 -0
  528. package/src/services/voice/partial-stabilizer.test.ts +68 -0
  529. package/src/services/voice/partial-stabilizer.ts +140 -0
  530. package/src/services/voice/phoneme-tokenizer.d.ts +49 -0
  531. package/src/services/voice/phoneme-tokenizer.d.ts.map +1 -0
  532. package/src/services/voice/phoneme-tokenizer.ts +158 -0
  533. package/src/services/voice/phrase-cache.d.ts +76 -0
  534. package/src/services/voice/phrase-cache.d.ts.map +1 -0
  535. package/src/services/voice/phrase-cache.test.ts +242 -0
  536. package/src/services/voice/phrase-cache.ts +186 -0
  537. package/src/services/voice/phrase-chunker.d.ts +62 -0
  538. package/src/services/voice/phrase-chunker.d.ts.map +1 -0
  539. package/src/services/voice/phrase-chunker.test.ts +239 -0
  540. package/src/services/voice/phrase-chunker.ts +281 -0
  541. package/src/services/voice/pipeline-impls.d.ts +151 -0
  542. package/src/services/voice/pipeline-impls.d.ts.map +1 -0
  543. package/src/services/voice/pipeline-impls.l6.test.ts +110 -0
  544. package/src/services/voice/pipeline-impls.test.ts +292 -0
  545. package/src/services/voice/pipeline-impls.ts +315 -0
  546. package/src/services/voice/pipeline.d.ts +216 -0
  547. package/src/services/voice/pipeline.d.ts.map +1 -0
  548. package/src/services/voice/pipeline.ts +505 -0
  549. package/src/services/voice/prefill-client.d.ts +123 -0
  550. package/src/services/voice/prefill-client.d.ts.map +1 -0
  551. package/src/services/voice/prefill-client.ts +316 -0
  552. package/src/services/voice/prefix-preserving-queue.d.ts +113 -0
  553. package/src/services/voice/prefix-preserving-queue.d.ts.map +1 -0
  554. package/src/services/voice/prefix-preserving-queue.ts +162 -0
  555. package/src/services/voice/profile-store.d.ts +248 -0
  556. package/src/services/voice/profile-store.d.ts.map +1 -0
  557. package/src/services/voice/profile-store.ts +887 -0
  558. package/src/services/voice/ring-buffer.d.ts +40 -0
  559. package/src/services/voice/ring-buffer.d.ts.map +1 -0
  560. package/src/services/voice/ring-buffer.ts +105 -0
  561. package/src/services/voice/rollback-queue.d.ts +24 -0
  562. package/src/services/voice/rollback-queue.d.ts.map +1 -0
  563. package/src/services/voice/rollback-queue.ts +74 -0
  564. package/src/services/voice/samantha-preset-placeholder.d.ts +67 -0
  565. package/src/services/voice/samantha-preset-placeholder.d.ts.map +1 -0
  566. package/src/services/voice/samantha-preset-placeholder.test.ts +97 -0
  567. package/src/services/voice/samantha-preset-placeholder.ts +148 -0
  568. package/src/services/voice/samantha-preset-regenerator.d.ts +87 -0
  569. package/src/services/voice/samantha-preset-regenerator.d.ts.map +1 -0
  570. package/src/services/voice/samantha-preset-regenerator.ts +393 -0
  571. package/src/services/voice/scheduler.d.ts +146 -0
  572. package/src/services/voice/scheduler.d.ts.map +1 -0
  573. package/src/services/voice/scheduler.t2.test.ts +141 -0
  574. package/src/services/voice/scheduler.ts +927 -0
  575. package/src/services/voice/shared-resources.d.ts +190 -0
  576. package/src/services/voice/shared-resources.d.ts.map +1 -0
  577. package/src/services/voice/shared-resources.ts +320 -0
  578. package/src/services/voice/speaker/attribution-pipeline.d.ts +74 -0
  579. package/src/services/voice/speaker/attribution-pipeline.d.ts.map +1 -0
  580. package/src/services/voice/speaker/attribution-pipeline.ts +386 -0
  581. package/src/services/voice/speaker/diarizer-fused.d.ts +59 -0
  582. package/src/services/voice/speaker/diarizer-fused.d.ts.map +1 -0
  583. package/src/services/voice/speaker/diarizer-fused.real.test.ts +100 -0
  584. package/src/services/voice/speaker/diarizer-fused.ts +154 -0
  585. package/src/services/voice/speaker/diarizer.d.ts +75 -0
  586. package/src/services/voice/speaker/diarizer.d.ts.map +1 -0
  587. package/src/services/voice/speaker/diarizer.ts +218 -0
  588. package/src/services/voice/speaker/encoder-fused.d.ts +60 -0
  589. package/src/services/voice/speaker/encoder-fused.d.ts.map +1 -0
  590. package/src/services/voice/speaker/encoder-fused.real.test.ts +113 -0
  591. package/src/services/voice/speaker/encoder-fused.ts +138 -0
  592. package/src/services/voice/speaker/encoder-ggml.d.ts +33 -0
  593. package/src/services/voice/speaker/encoder-ggml.d.ts.map +1 -0
  594. package/src/services/voice/speaker/encoder-ggml.ts +79 -0
  595. package/src/services/voice/speaker/encoder.d.ts +37 -0
  596. package/src/services/voice/speaker/encoder.d.ts.map +1 -0
  597. package/src/services/voice/speaker/encoder.ts +105 -0
  598. package/src/services/voice/speaker-imprint.d.ts +83 -0
  599. package/src/services/voice/speaker-imprint.d.ts.map +1 -0
  600. package/src/services/voice/speaker-imprint.test.ts +185 -0
  601. package/src/services/voice/speaker-imprint.ts +312 -0
  602. package/src/services/voice/speaker-preset-cache.d.ts +77 -0
  603. package/src/services/voice/speaker-preset-cache.d.ts.map +1 -0
  604. package/src/services/voice/speaker-preset-cache.test.ts +154 -0
  605. package/src/services/voice/speaker-preset-cache.ts +195 -0
  606. package/src/services/voice/streaming-asr/streaming-pipeline-adapter.ts +292 -0
  607. package/src/services/voice/system-audio-sink.d.ts +73 -0
  608. package/src/services/voice/system-audio-sink.d.ts.map +1 -0
  609. package/src/services/voice/system-audio-sink.test.ts +29 -0
  610. package/src/services/voice/system-audio-sink.ts +366 -0
  611. package/src/services/voice/transcriber.d.ts +244 -0
  612. package/src/services/voice/transcriber.d.ts.map +1 -0
  613. package/src/services/voice/transcriber.test.ts +392 -0
  614. package/src/services/voice/transcriber.ts +704 -0
  615. package/src/services/voice/turn-controller.d.ts +183 -0
  616. package/src/services/voice/turn-controller.d.ts.map +1 -0
  617. package/src/services/voice/turn-controller.test.ts +575 -0
  618. package/src/services/voice/turn-controller.ts +596 -0
  619. package/src/services/voice/types.d.ts +643 -0
  620. package/src/services/voice/types.d.ts.map +1 -0
  621. package/src/services/voice/types.ts +699 -0
  622. package/src/services/voice/vad.d.ts +282 -0
  623. package/src/services/voice/vad.d.ts.map +1 -0
  624. package/src/services/voice/vad.test.ts +480 -0
  625. package/src/services/voice/vad.ts +827 -0
  626. package/src/services/voice/vad.v1-v4.test.ts +222 -0
  627. package/src/services/voice/voice-budget.d.ts +241 -0
  628. package/src/services/voice/voice-budget.d.ts.map +1 -0
  629. package/src/services/voice/voice-budget.test.ts +420 -0
  630. package/src/services/voice/voice-budget.ts +656 -0
  631. package/src/services/voice/voice-duet.test.ts +375 -0
  632. package/src/services/voice/voice-emotion-classifier.d.ts +95 -0
  633. package/src/services/voice/voice-emotion-classifier.d.ts.map +1 -0
  634. package/src/services/voice/voice-emotion-classifier.test.ts +210 -0
  635. package/src/services/voice/voice-emotion-classifier.ts +273 -0
  636. package/src/services/voice/voice-preset-format.d.ts +158 -0
  637. package/src/services/voice/voice-preset-format.d.ts.map +1 -0
  638. package/src/services/voice/voice-preset-format.ts +700 -0
  639. package/src/services/voice/voice-preset-generator.test.ts +89 -0
  640. package/src/services/voice/voice-profile-artifact.d.ts +116 -0
  641. package/src/services/voice/voice-profile-artifact.d.ts.map +1 -0
  642. package/src/services/voice/voice-profile-artifact.test.ts +138 -0
  643. package/src/services/voice/voice-profile-artifact.ts +518 -0
  644. package/src/services/voice/voice-profile-routes.d.ts +83 -0
  645. package/src/services/voice/voice-profile-routes.d.ts.map +1 -0
  646. package/src/services/voice/voice-profile-routes.test.ts +429 -0
  647. package/src/services/voice/voice-profile-routes.ts +425 -0
  648. package/src/services/voice/voice-scenario.ts +154 -0
  649. package/src/services/voice/voice-settings.d.ts +82 -0
  650. package/src/services/voice/voice-settings.d.ts.map +1 -0
  651. package/src/services/voice/voice-settings.ts +172 -0
  652. package/src/services/voice/voice-state-machine.d.ts +364 -0
  653. package/src/services/voice/voice-state-machine.d.ts.map +1 -0
  654. package/src/services/voice/voice-state-machine.ts +727 -0
  655. package/src/services/voice/voice-workbench-report.test.ts +168 -0
  656. package/src/services/voice/voice-workbench-report.ts +326 -0
  657. package/src/services/voice/voice-workbench.test.ts +158 -0
  658. package/src/services/voice/voice.test.ts +1070 -0
  659. package/src/services/voice/wake-word-ggml.d.ts +101 -0
  660. package/src/services/voice/wake-word-ggml.d.ts.map +1 -0
  661. package/src/services/voice/wake-word-ggml.ts +320 -0
  662. package/src/services/voice/wake-word.d.ts +255 -0
  663. package/src/services/voice/wake-word.d.ts.map +1 -0
  664. package/src/services/voice/wake-word.test.ts +298 -0
  665. package/src/services/voice/wake-word.ts +554 -0
  666. package/src/services/voice/wrap-with-first-line-cache.d.ts +70 -0
  667. package/src/services/voice/wrap-with-first-line-cache.d.ts.map +1 -0
  668. package/src/services/voice/wrap-with-first-line-cache.ts +267 -0
  669. package/src/services/voice-model-updater.d.ts +240 -0
  670. package/src/services/voice-model-updater.d.ts.map +1 -0
  671. package/src/services/voice-model-updater.ts +724 -0
  672. package/src/services/voice-prewarm.d.ts +3 -0
  673. package/src/services/voice-prewarm.d.ts.map +1 -0
  674. package/src/services/voice-prewarm.ts +51 -0
  675. package/dist/index.d.ts +0 -37
  676. package/dist/index.js +0 -1098
@@ -0,0 +1,242 @@
1
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import path from "node:path";
4
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
5
+ import { EngineVoiceBridge, StubOmniVoiceBackend } from "./engine-bridge";
6
+ import type { VoiceLifecycleLoaders } from "./lifecycle";
7
+ import {
8
+ canonicalizePhraseText,
9
+ DEFAULT_PHRASE_CACHE_SEED,
10
+ estimatePhraseTokenCount,
11
+ FIRST_AUDIO_FILLERS,
12
+ PhraseCache,
13
+ } from "./phrase-cache";
14
+ import type { MmapRegionHandle, RefCountedResource } from "./shared-resources";
15
+ import type {
16
+ AudioChunk,
17
+ OmniVoiceBackend,
18
+ Phrase,
19
+ SpeakerPreset,
20
+ } from "./types";
21
+ import { writeVoicePresetFile } from "./voice-preset-format";
22
+
23
+ // --- the canonical seed/filler constants -----------------------------------
24
+
25
+ describe("DEFAULT_PHRASE_CACHE_SEED", () => {
26
+ it("is non-empty and stored in canonical form (lowercase, single-spaced, trimmed)", () => {
27
+ expect(DEFAULT_PHRASE_CACHE_SEED.length).toBeGreaterThan(5);
28
+ for (const text of DEFAULT_PHRASE_CACHE_SEED) {
29
+ expect(text).toBe(canonicalizePhraseText(text));
30
+ }
31
+ });
32
+
33
+ it("has no duplicates", () => {
34
+ expect(new Set(DEFAULT_PHRASE_CACHE_SEED).size).toBe(
35
+ DEFAULT_PHRASE_CACHE_SEED.length,
36
+ );
37
+ });
38
+
39
+ it("includes the documented common openers/acks", () => {
40
+ for (const phrase of ["okay", "got it", "one sec", "hmm", "okay so"]) {
41
+ expect(DEFAULT_PHRASE_CACHE_SEED).toContain(phrase);
42
+ }
43
+ });
44
+ });
45
+
46
+ describe("FIRST_AUDIO_FILLERS", () => {
47
+ it("is a non-empty subset of DEFAULT_PHRASE_CACHE_SEED", () => {
48
+ expect(FIRST_AUDIO_FILLERS.length).toBeGreaterThan(0);
49
+ const seed = new Set(DEFAULT_PHRASE_CACHE_SEED);
50
+ for (const filler of FIRST_AUDIO_FILLERS) {
51
+ expect(seed.has(filler)).toBe(true);
52
+ }
53
+ });
54
+ });
55
+
56
+ // --- PhraseCache LRU semantics (new symbols) -------------------------------
57
+
58
+ describe("PhraseCache LRU", () => {
59
+ it("estimates short acknowledgement token counts", () => {
60
+ expect(estimatePhraseTokenCount(" Got it! ")).toBe(2);
61
+ expect(estimatePhraseTokenCount("")).toBe(0);
62
+ });
63
+
64
+ it("get() promotes an entry to most-recently-used", () => {
65
+ const c = new PhraseCache({ maxEntries: 2 });
66
+ c.put({ text: "a", pcm: new Float32Array([1]), sampleRate: 24000 });
67
+ c.put({ text: "b", pcm: new Float32Array([2]), sampleRate: 24000 });
68
+ // Touch "a" — now "b" is the LRU.
69
+ expect(c.get("a")).toBeDefined();
70
+ c.put({ text: "c", pcm: new Float32Array([3]), sampleRate: 24000 });
71
+ expect(c.has("a")).toBe(true);
72
+ expect(c.has("b")).toBe(false);
73
+ expect(c.has("c")).toBe(true);
74
+ });
75
+
76
+ it("keeps live phrase caching focused on sub-10-token first sentences", () => {
77
+ const c = new PhraseCache();
78
+ expect(
79
+ c.put({
80
+ text: "one two three four five six seven eight nine",
81
+ pcm: new Float32Array([1]),
82
+ sampleRate: 24000,
83
+ }),
84
+ ).toBe(true);
85
+ expect(
86
+ c.put({
87
+ text: "one two three four five six seven eight nine ten",
88
+ pcm: new Float32Array([2]),
89
+ sampleRate: 24000,
90
+ }),
91
+ ).toBe(false);
92
+ expect(c.has("one two three four five six seven eight nine")).toBe(true);
93
+ expect(c.has("one two three four five six seven eight nine ten")).toBe(
94
+ false,
95
+ );
96
+ });
97
+ });
98
+
99
+ // --- engine-bridge prewarm / filler gating ---------------------------------
100
+
101
+ class RecordingBackend implements OmniVoiceBackend {
102
+ readonly synthesized: string[] = [];
103
+ async synthesize(args: {
104
+ phrase: Phrase;
105
+ preset: SpeakerPreset;
106
+ cancelSignal: { cancelled: boolean };
107
+ onKernelTick?: () => void;
108
+ }): Promise<AudioChunk> {
109
+ this.synthesized.push(args.phrase.text);
110
+ args.onKernelTick?.();
111
+ // Distinct non-zero PCM so the phrase cache holds real audio.
112
+ return {
113
+ phraseId: args.phrase.id,
114
+ fromIndex: args.phrase.fromIndex,
115
+ toIndex: args.phrase.toIndex,
116
+ pcm: new Float32Array([0.3, -0.3, 0.2]),
117
+ sampleRate: 24000,
118
+ };
119
+ }
120
+ }
121
+
122
+ function lifecycleLoadersOk(): VoiceLifecycleLoaders {
123
+ const region: MmapRegionHandle = {
124
+ id: "region-ok",
125
+ path: "/tmp/region-ok",
126
+ sizeBytes: 1024,
127
+ async evictPages() {},
128
+ async release() {},
129
+ };
130
+ const refc: RefCountedResource = { id: "refc-ok", async release() {} };
131
+ return {
132
+ loadTtsRegion: async () => region,
133
+ loadAsrRegion: async () => region,
134
+ loadVoiceCaches: async () => refc,
135
+ loadVoiceSchedulerNodes: async () => refc,
136
+ };
137
+ }
138
+
139
+ function writePresetBundle(root: string): void {
140
+ mkdirSync(path.join(root, "cache"), { recursive: true });
141
+ const embedding = new Float32Array(8);
142
+ for (let i = 0; i < embedding.length; i++) embedding[i] = (i + 1) / 100;
143
+ writeFileSync(
144
+ path.join(root, "cache", "voice-preset-default.bin"),
145
+ Buffer.from(writeVoicePresetFile({ embedding, phrases: [] })),
146
+ );
147
+ }
148
+
149
+ describe("EngineVoiceBridge phrase prewarm + first-audio filler", () => {
150
+ let bundleRoot: string;
151
+
152
+ beforeEach(() => {
153
+ bundleRoot = mkdtempSync(path.join(tmpdir(), "eliza-phrase-cache-"));
154
+ writePresetBundle(bundleRoot);
155
+ });
156
+
157
+ afterEach(() => {
158
+ rmSync(bundleRoot, { recursive: true, force: true });
159
+ });
160
+
161
+ it("hasRealTtsBackend() is false for the silent backend", () => {
162
+ const bridge = EngineVoiceBridge.start({
163
+ bundleRoot,
164
+ useFfiBackend: false,
165
+ });
166
+ expect(bridge.backend).toBeInstanceOf(StubOmniVoiceBackend);
167
+ expect(bridge.hasRealTtsBackend()).toBe(false);
168
+ });
169
+
170
+ it("prewarmIdlePhrases() is a no-op without a real backend (never caches zeros)", async () => {
171
+ const bridge = EngineVoiceBridge.start({
172
+ bundleRoot,
173
+ useFfiBackend: false,
174
+ lifecycleLoaders: lifecycleLoadersOk(),
175
+ });
176
+ await bridge.arm();
177
+ const result = await bridge.prewarmIdlePhrases();
178
+ expect(result).toEqual({ warmed: 0, cached: 0 });
179
+ });
180
+
181
+ it("playFirstAudioFiller() is a no-op without a real backend", async () => {
182
+ const bridge = EngineVoiceBridge.start({
183
+ bundleRoot,
184
+ useFfiBackend: false,
185
+ lifecycleLoaders: lifecycleLoadersOk(),
186
+ });
187
+ await bridge.arm();
188
+ expect(bridge.playFirstAudioFiller()).toBeNull();
189
+ });
190
+
191
+ it("prewarmIdlePhrases() is a no-op when voice is not armed", async () => {
192
+ const backend = new RecordingBackend();
193
+ const bridge = EngineVoiceBridge.start({
194
+ bundleRoot,
195
+ useFfiBackend: false,
196
+ backendOverride: backend,
197
+ });
198
+ // Not armed.
199
+ const result = await bridge.prewarmIdlePhrases();
200
+ expect(result).toEqual({ warmed: 0, cached: 0 });
201
+ expect(backend.synthesized).toHaveLength(0);
202
+ });
203
+
204
+ it("prewarmIdlePhrases() synthesizes the seed list with a real backend", async () => {
205
+ const backend = new RecordingBackend();
206
+ const bridge = EngineVoiceBridge.start({
207
+ bundleRoot,
208
+ useFfiBackend: false,
209
+ backendOverride: backend,
210
+ lifecycleLoaders: lifecycleLoadersOk(),
211
+ });
212
+ expect(bridge.hasRealTtsBackend()).toBe(true);
213
+ await bridge.arm();
214
+ const result = await bridge.prewarmIdlePhrases();
215
+ expect(result.warmed).toBe(DEFAULT_PHRASE_CACHE_SEED.length);
216
+ expect(result.cached).toBe(0);
217
+ expect(new Set(backend.synthesized)).toEqual(
218
+ new Set(DEFAULT_PHRASE_CACHE_SEED),
219
+ );
220
+ // A second pass is fully cached.
221
+ const second = await bridge.prewarmIdlePhrases();
222
+ expect(second.cached).toBe(DEFAULT_PHRASE_CACHE_SEED.length);
223
+ expect(second.warmed).toBe(0);
224
+ });
225
+
226
+ it("playFirstAudioFiller() plays a cached filler once a real backend prewarmed it", async () => {
227
+ const backend = new RecordingBackend();
228
+ const bridge = EngineVoiceBridge.start({
229
+ bundleRoot,
230
+ useFfiBackend: false,
231
+ backendOverride: backend,
232
+ lifecycleLoaders: lifecycleLoadersOk(),
233
+ });
234
+ await bridge.arm();
235
+ // No filler cached yet.
236
+ expect(bridge.playFirstAudioFiller()).toBeNull();
237
+ await bridge.prewarmIdlePhrases();
238
+ const played = bridge.playFirstAudioFiller();
239
+ expect(played).not.toBeNull();
240
+ expect(FIRST_AUDIO_FILLERS).toContain(played);
241
+ });
242
+ });
@@ -0,0 +1,186 @@
1
+ export interface CachedPhraseAudio {
2
+ text: string;
3
+ pcm: Float32Array;
4
+ sampleRate: number;
5
+ }
6
+
7
+ /**
8
+ * Canonical seed list for the voice phrase cache: short openers, fillers, and
9
+ * acknowledgements the assistant emits constantly. Pre-synthesizing these and
10
+ * holding their PCM in `PhraseCache` removes the TTS forward pass from the
11
+ * critical path for the most common first utterances — `dispatchPhrase` hits
12
+ * the cache and writes audio to the ring buffer on the same tick.
13
+ *
14
+ * Used by:
15
+ * - the preset generator (`scripts/voice-preset/build-default-voice-preset.mjs`),
16
+ * which synthesizes these against a real OmniVoice TTS backend and writes
17
+ * the PCM into `cache/voice-preset-default.bin` — the seeded source of truth.
18
+ * - `EngineVoiceBridge.start()` indirectly: the bundle's preset ships these
19
+ * phrases with their PCM, which `PhraseCache.seed(...)` loads at startup.
20
+ * - the idle-time auto-prewarm hook (`EngineVoiceBridge.prewarmIdlePhrases`),
21
+ * which only runs when a real TTS backend is present — never against the
22
+ * silent backend (caching zeros is not a phrase cache).
23
+ * - the first-audio filler (`FIRST_AUDIO_FILLERS` is a subset).
24
+ *
25
+ * Entries are kept here in canonical form (lowercase, single-spaced, trimmed)
26
+ * so the preset generator and the runtime agree byte-for-byte on the keys.
27
+ */
28
+ export const DEFAULT_PHRASE_CACHE_SEED: ReadonlyArray<string> = [
29
+ // Immediate acknowledgements — "I heard you, working on it".
30
+ "okay",
31
+ "got it",
32
+ "sure",
33
+ "right",
34
+ "on it",
35
+ "one sec",
36
+ "one second",
37
+ "let me check",
38
+ "let me see",
39
+ "give me a moment",
40
+ // Conversational openers / fillers — natural sentence starters the planner
41
+ // emits before the substantive answer streams in.
42
+ "okay so",
43
+ "so",
44
+ "hmm",
45
+ "well",
46
+ "alright",
47
+ "sure thing",
48
+ "of course",
49
+ "no problem",
50
+ "good question",
51
+ "let me think",
52
+ ];
53
+
54
+ /**
55
+ * The subset of `DEFAULT_PHRASE_CACHE_SEED` suitable to play the instant VAD
56
+ * fires `speech-start`, masking first-token latency (AGENTS.md §4 / H4). Kept
57
+ * short and uncommitted — anything that takes a stance ("of course") is
58
+ * excluded so the filler never contradicts the eventual reply. The first
59
+ * entry found in the phrase cache wins.
60
+ */
61
+ export const FIRST_AUDIO_FILLERS: ReadonlyArray<string> = [
62
+ "one sec",
63
+ "okay",
64
+ "let me check",
65
+ "hmm",
66
+ "got it",
67
+ ];
68
+
69
+ export interface PhraseCacheOptions {
70
+ /** Maximum distinct phrase texts retained. Older non-accessed entries
71
+ * are evicted first. */
72
+ maxEntries?: number;
73
+ /**
74
+ * Opportunistic live-cache guardrail. Voice mode primarily benefits from
75
+ * cached acknowledgements and first sentence fragments; longer text is less
76
+ * likely to repeat and can evict useful hot phrases.
77
+ */
78
+ maxEstimatedTokensPerEntry?: number;
79
+ /**
80
+ * Guardrail for live opportunistic caching. Long-form direct TTS can be
81
+ * megabytes of PCM and is not a good phrase-cache resident.
82
+ */
83
+ maxPcmSamplesPerEntry?: number;
84
+ }
85
+
86
+ export function canonicalizePhraseText(text: string): string {
87
+ return text.trim().toLowerCase().replace(/\s+/g, " ");
88
+ }
89
+
90
+ export function estimatePhraseTokenCount(text: string): number {
91
+ const normalized = canonicalizePhraseText(text);
92
+ if (!normalized) return 0;
93
+ return normalized.split(/\s+/).length;
94
+ }
95
+
96
+ const DEFAULT_MAX_ENTRIES = 128;
97
+ const DEFAULT_MAX_ESTIMATED_TOKENS_PER_ENTRY = 9;
98
+ const DEFAULT_MAX_PCM_SAMPLES_PER_ENTRY = 24000 * 8;
99
+
100
+ export class PhraseCache {
101
+ private readonly entries = new Map<string, CachedPhraseAudio>();
102
+ private readonly maxEntries: number;
103
+ private readonly maxEstimatedTokensPerEntry: number;
104
+ private readonly maxPcmSamplesPerEntry: number;
105
+
106
+ constructor(opts: PhraseCacheOptions = {}) {
107
+ this.maxEntries = Math.max(
108
+ 1,
109
+ Math.floor(opts.maxEntries ?? DEFAULT_MAX_ENTRIES),
110
+ );
111
+ this.maxEstimatedTokensPerEntry = Math.max(
112
+ 1,
113
+ Math.floor(
114
+ opts.maxEstimatedTokensPerEntry ??
115
+ DEFAULT_MAX_ESTIMATED_TOKENS_PER_ENTRY,
116
+ ),
117
+ );
118
+ this.maxPcmSamplesPerEntry = Math.max(
119
+ 1,
120
+ Math.floor(
121
+ opts.maxPcmSamplesPerEntry ?? DEFAULT_MAX_PCM_SAMPLES_PER_ENTRY,
122
+ ),
123
+ );
124
+ }
125
+
126
+ put(entry: CachedPhraseAudio): boolean {
127
+ const key = canonicalizePhraseText(entry.text);
128
+ if (!key) return false;
129
+ if (entry.pcm.length > this.maxPcmSamplesPerEntry) return false;
130
+ if (
131
+ estimatePhraseTokenCount(entry.text) > this.maxEstimatedTokensPerEntry
132
+ ) {
133
+ return false;
134
+ }
135
+ this.entries.delete(key);
136
+ this.entries.set(key, entry);
137
+ this.evictOverflow();
138
+ return true;
139
+ }
140
+
141
+ /**
142
+ * Pre-populate the cache from a voice-preset seed list. Texts are stored
143
+ * verbatim — callers (the format reader) are responsible for canonicalizing
144
+ * before serialization, but we re-canonicalize on insert to be safe.
145
+ */
146
+ seed(
147
+ entries: ReadonlyArray<{
148
+ text: string;
149
+ pcm: Float32Array;
150
+ sampleRate: number;
151
+ }>,
152
+ ): void {
153
+ for (const e of entries) {
154
+ this.put({
155
+ text: e.text,
156
+ pcm: e.pcm,
157
+ sampleRate: e.sampleRate,
158
+ });
159
+ }
160
+ }
161
+
162
+ get(text: string): CachedPhraseAudio | undefined {
163
+ const key = canonicalizePhraseText(text);
164
+ const entry = this.entries.get(key);
165
+ if (!entry) return undefined;
166
+ this.entries.delete(key);
167
+ this.entries.set(key, entry);
168
+ return entry;
169
+ }
170
+
171
+ has(text: string): boolean {
172
+ return this.entries.has(canonicalizePhraseText(text));
173
+ }
174
+
175
+ size(): number {
176
+ return this.entries.size;
177
+ }
178
+
179
+ private evictOverflow(): void {
180
+ while (this.entries.size > this.maxEntries) {
181
+ const oldest = this.entries.keys().next().value;
182
+ if (oldest === undefined) return;
183
+ this.entries.delete(oldest);
184
+ }
185
+ }
186
+ }
@@ -0,0 +1,62 @@
1
+ import type { PhonemeTokenizer } from "./phoneme-tokenizer";
2
+ import type { AcceptedToken, Phrase, PhraseChunkerConfig, TextToken } from "./types";
3
+ /** Wall-clock source the chunker uses. Tests inject a deterministic clock. */
4
+ export type ClockMs = () => number;
5
+ export declare class PhraseChunker {
6
+ private buffer;
7
+ private nextPhraseId;
8
+ private readonly terminators;
9
+ private readonly chunkOn;
10
+ private readonly phonemesPerChunk;
11
+ private readonly maxTokensPerPhrase;
12
+ private readonly tokenizer;
13
+ private phonemeCount;
14
+ /**
15
+ * T3 — time-budget flush. `firstTokenAtMs` is captured on the first
16
+ * `push()` after an empty buffer; once `clock() - firstTokenAtMs >=
17
+ * maxAccumulationMs` the chunker force-flushes even without a
18
+ * punctuation / phoneme / cap boundary. `maxAccumulationMs <= 0`
19
+ * disables the time budget.
20
+ */
21
+ private readonly maxAccumulationMs;
22
+ /** Shorter budget applied only while no phrase has flushed yet this reply. */
23
+ private readonly firstPhraseMaxAccumulationMs;
24
+ private readonly clock;
25
+ private firstTokenAtMs;
26
+ /** Phrases emitted since the last {@link reset}; gates the first-phrase budget. */
27
+ private phrasesEmitted;
28
+ constructor(config: PhraseChunkerConfig, tokenizer?: PhonemeTokenizer | null, clock?: ClockMs);
29
+ push(token: AcceptedToken): Phrase | null;
30
+ /** Active time budget: the shorter first-phrase budget until the reply's
31
+ * first phrase has flushed, then the full budget. */
32
+ private currentBudgetMs;
33
+ /**
34
+ * T3 — caller-driven check. Returns a phrase when the time budget has
35
+ * elapsed for the current buffer, otherwise null. The scheduler polls
36
+ * this from a `setTimeout` so even a producer that goes silent before
37
+ * pushing the next token still gets its in-flight phrase flushed.
38
+ */
39
+ flushIfTimeBudgetExceeded(): Phrase | null;
40
+ /**
41
+ * T3 — milliseconds remaining until the time budget elapses for the
42
+ * current buffer. Negative when the budget has already been exceeded;
43
+ * `Number.POSITIVE_INFINITY` when the buffer is empty or the budget is
44
+ * disabled. Callers compute their flush timer off this.
45
+ */
46
+ msUntilTimeBudget(): number;
47
+ flushPending(): Phrase | null;
48
+ /**
49
+ * Drop buffered tokens that have not flushed whose token index is ≥
50
+ * `fromIndex`. Used by the pipeline's rollback path: when the target
51
+ * verifier rejects a draft tail, any draft tokens still sitting in the
52
+ * chunker's buffer before phrase packing MUST be discarded so
53
+ * the verifier's correction does not get glued onto stale text.
54
+ * Phonemes are recounted from scratch over what remains.
55
+ */
56
+ dropPendingFrom(fromIndex: number): void;
57
+ reset(): void;
58
+ private endsWithTerminator;
59
+ private flushAs;
60
+ }
61
+ export declare function chunkTokens(tokens: TextToken[], config: PhraseChunkerConfig, acceptedAt?: number, tokenizer?: PhonemeTokenizer | null): Phrase[];
62
+ //# sourceMappingURL=phrase-chunker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phrase-chunker.d.ts","sourceRoot":"","sources":["phrase-chunker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EACX,aAAa,EACb,MAAM,EACN,mBAAmB,EACnB,SAAS,EACT,MAAM,SAAS,CAAC;AA8DjB,8EAA8E;AAC9E,MAAM,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC;AAInC,qBAAa,aAAa;IACzB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;IACpD,OAAO,CAAC,YAAY,CAAK;IACzB;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,8EAA8E;IAC9E,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAS;IACtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;IAChC,OAAO,CAAC,cAAc,CAAK;IAC3B,mFAAmF;IACnF,OAAO,CAAC,cAAc,CAAK;gBAG1B,MAAM,EAAE,mBAAmB,EAC3B,SAAS,GAAE,gBAAgB,GAAG,IAAW,EACzC,KAAK,GAAE,OAAuB;IAgC/B,IAAI,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI;IAmCzC;yDACqD;IACrD,OAAO,CAAC,eAAe;IAMvB;;;;;OAKG;IACH,yBAAyB,IAAI,MAAM,GAAG,IAAI;IAU1C;;;;;OAKG;IACH,iBAAiB,IAAI,MAAM;IAO3B,YAAY,IAAI,MAAM,GAAG,IAAI;IAK7B;;;;;;;OAOG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAexC,KAAK,IAAI,IAAI;IAOb,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,OAAO;CAkBf;AAED,wBAAgB,WAAW,CAC1B,MAAM,EAAE,SAAS,EAAE,EACnB,MAAM,EAAE,mBAAmB,EAC3B,UAAU,SAAI,EACd,SAAS,GAAE,gBAAgB,GAAG,IAAW,GACvC,MAAM,EAAE,CAUV"}